Merge "[Concurrent Camera] Add data models and bindToLifecycle API for concurrent camera" into androidx-main
diff --git a/README.md b/README.md
index b3d9f3e..659405f 100644
--- a/README.md
+++ b/README.md
@@ -66,4 +66,4 @@
 * Add an appropriate reviewer (use git log to find who did most modifications on the file you are fixing or check the OWNERS file in the project's directory)
 
 ## Handling binary dependencies
-AndroidX uses git to store all the binary Gradle dependencies. They are stored in `prebuilts/androidx/internal` and `prebuilts/androidx/external` directories in your checkout. All the dependencies in these directories are also available from `google()`, `jcenter()`, or `mavenCentral()`. We store copies of these dependencies to have hermetic builds. You can pull in [a new dependency using our importMaven tool](development/importMaven/README.md).
+AndroidX uses git to store all the binary Gradle dependencies. They are stored in `prebuilts/androidx/internal` and `prebuilts/androidx/external` directories in your checkout. All the dependencies in these directories are also available from `google()`, or `mavenCentral()`. We store copies of these dependencies to have hermetic builds. You can pull in [a new dependency using our importMaven tool](development/importMaven/README.md).
diff --git a/activity/OWNERS b/activity/OWNERS
index 9f8a7ba..b4eba7b 100644
--- a/activity/OWNERS
+++ b/activity/OWNERS
@@ -1,4 +1,4 @@
-# Bug component: 527362
+# Bug component: 530242
 ilake@google.com
 jbwoods@google.com
 
diff --git a/activity/activity-compose-lint/src/main/java/androidx/activity/compose/lint/ActivityComposeIssueRegistry.kt b/activity/activity-compose-lint/src/main/java/androidx/activity/compose/lint/ActivityComposeIssueRegistry.kt
index 656270a..76b1f3e 100644
--- a/activity/activity-compose-lint/src/main/java/androidx/activity/compose/lint/ActivityComposeIssueRegistry.kt
+++ b/activity/activity-compose-lint/src/main/java/androidx/activity/compose/lint/ActivityComposeIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class ActivityComposeIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ActivityResultLaunchDetector.LaunchDuringComposition
diff --git a/activity/activity-compose/api/1.7.0-beta01.txt b/activity/activity-compose/api/1.7.0-beta01.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/1.7.0-beta01.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/1.7.0-beta02.txt b/activity/activity-compose/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/1.7.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/current.ignore b/activity/activity-compose/api/current.ignore
new file mode 100644
index 0000000..a0610ef
--- /dev/null
+++ b/activity/activity-compose/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.activity.compose.ActivityComposeUtilsKt:
+    Removed class androidx.activity.compose.ActivityComposeUtilsKt
diff --git a/activity/activity-compose/api/current.txt b/activity/activity-compose/api/current.txt
index d51f9f5..ff9df4f 100644
--- a/activity/activity-compose/api/current.txt
+++ b/activity/activity-compose/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.activity.compose {
 
-  public final class ActivityComposeUtilsKt {
-  }
-
   public final class ActivityResultRegistryKt {
     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);
   }
diff --git a/activity/activity-compose/api/public_plus_experimental_1.7.0-beta01.txt b/activity/activity-compose/api/public_plus_experimental_1.7.0-beta01.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/public_plus_experimental_1.7.0-beta01.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/public_plus_experimental_1.7.0-beta02.txt b/activity/activity-compose/api/public_plus_experimental_1.7.0-beta02.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/public_plus_experimental_current.txt b/activity/activity-compose/api/public_plus_experimental_current.txt
index d51f9f5..ff9df4f 100644
--- a/activity/activity-compose/api/public_plus_experimental_current.txt
+++ b/activity/activity-compose/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.activity.compose {
 
-  public final class ActivityComposeUtilsKt {
-  }
-
   public final class ActivityResultRegistryKt {
     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);
   }
diff --git a/activity/activity-compose/api/res-1.7.0-beta01.txt b/activity/activity-compose/api/res-1.7.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity-compose/api/res-1.7.0-beta01.txt
diff --git a/activity/activity-compose/api/res-1.7.0-beta02.txt b/activity/activity-compose/api/res-1.7.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity-compose/api/res-1.7.0-beta02.txt
diff --git a/activity/activity-compose/api/restricted_1.7.0-beta01.txt b/activity/activity-compose/api/restricted_1.7.0-beta01.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/restricted_1.7.0-beta01.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/restricted_1.7.0-beta02.txt b/activity/activity-compose/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..ff9df4f
--- /dev/null
+++ b/activity/activity-compose/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+  public final class ActivityResultRegistryKt {
+    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 {
+    method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+  }
+
+  public final class ComponentActivityKt {
+    method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class LocalActivityResultRegistryOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+    field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+  }
+
+  public final class LocalFullyDrawnReporterOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.FullyDrawnReporterOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.FullyDrawnReporterOwner> provides(androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.FullyDrawnReporterOwner? current;
+    field public static final androidx.activity.compose.LocalFullyDrawnReporterOwner INSTANCE;
+  }
+
+  public final class LocalOnBackPressedDispatcherOwner {
+    method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+    property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+    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();
+  }
+
+  public final class ReportDrawnKt {
+    method @androidx.compose.runtime.Composable public static void ReportDrawn();
+    method @androidx.compose.runtime.Composable public static void ReportDrawnAfter(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable public static void ReportDrawnWhen(kotlin.jvm.functions.Function0<java.lang.Boolean> predicate);
+  }
+
+}
+
diff --git a/activity/activity-compose/api/restricted_current.ignore b/activity/activity-compose/api/restricted_current.ignore
new file mode 100644
index 0000000..a0610ef
--- /dev/null
+++ b/activity/activity-compose/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.activity.compose.ActivityComposeUtilsKt:
+    Removed class androidx.activity.compose.ActivityComposeUtilsKt
diff --git a/activity/activity-compose/api/restricted_current.txt b/activity/activity-compose/api/restricted_current.txt
index d51f9f5..ff9df4f 100644
--- a/activity/activity-compose/api/restricted_current.txt
+++ b/activity/activity-compose/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.activity.compose {
 
-  public final class ActivityComposeUtilsKt {
-  }
-
   public final class ActivityResultRegistryKt {
     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);
   }
diff --git a/activity/activity-ktx/api/1.7.0-beta01.txt b/activity/activity-ktx/api/1.7.0-beta01.txt
new file mode 100644
index 0000000..a1c4a4d
--- /dev/null
+++ b/activity/activity-ktx/api/1.7.0-beta01.txt
@@ -0,0 +1,32 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  public final class PipHintTrackerKt {
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/1.7.0-beta02.txt b/activity/activity-ktx/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..4023c72
--- /dev/null
+++ b/activity/activity-ktx/api/1.7.0-beta02.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/current.ignore b/activity/activity-ktx/api/current.ignore
index d23680b..f970b04 100644
--- a/activity/activity-ktx/api/current.ignore
+++ b/activity/activity-ktx/api/current.ignore
@@ -1,3 +1,9 @@
 // Baseline format: 1.0
 RemovedClass: androidx.activity.OnBackPressedDispatcherKt:
     Removed class androidx.activity.OnBackPressedDispatcherKt
+RemovedClass: androidx.activity.PipHintTrackerKt:
+    Removed class androidx.activity.PipHintTrackerKt
+
+
+RemovedPackage: androidx.activity.contextaware:
+    Removed package androidx.activity.contextaware
diff --git a/activity/activity-ktx/api/current.txt b/activity/activity-ktx/api/current.txt
index ba9fdc3..4023c72 100644
--- a/activity/activity-ktx/api/current.txt
+++ b/activity/activity-ktx/api/current.txt
@@ -6,17 +6,6 @@
     method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
   }
 
-  public final class PipHintTrackerKt {
-  }
-
-}
-
-package androidx.activity.contextaware {
-
-  public final class ContextAwareKt {
-    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
-  }
-
 }
 
 package androidx.activity.result {
diff --git a/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta01.txt b/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta01.txt
new file mode 100644
index 0000000..980229c
--- /dev/null
+++ b/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  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>);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta02.txt b/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta02.txt
new file mode 100644
index 0000000..980229c
--- /dev/null
+++ b/activity/activity-ktx/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  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>);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/public_plus_experimental_current.txt b/activity/activity-ktx/api/public_plus_experimental_current.txt
index cece293..980229c 100644
--- a/activity/activity-ktx/api/public_plus_experimental_current.txt
+++ b/activity/activity-ktx/api/public_plus_experimental_current.txt
@@ -12,14 +12,6 @@
 
 }
 
-package androidx.activity.contextaware {
-
-  public final class ContextAwareKt {
-    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
-  }
-
-}
-
 package androidx.activity.result {
 
   public final class ActivityResultCallerKt {
diff --git a/activity/activity-ktx/api/res-1.7.0-beta01.txt b/activity/activity-ktx/api/res-1.7.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity-ktx/api/res-1.7.0-beta01.txt
diff --git a/activity/activity-ktx/api/res-1.7.0-beta02.txt b/activity/activity-ktx/api/res-1.7.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity-ktx/api/res-1.7.0-beta02.txt
diff --git a/activity/activity-ktx/api/restricted_1.7.0-beta01.txt b/activity/activity-ktx/api/restricted_1.7.0-beta01.txt
new file mode 100644
index 0000000..a1c4a4d
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.7.0-beta01.txt
@@ -0,0 +1,32 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  public final class PipHintTrackerKt {
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/restricted_1.7.0-beta02.txt b/activity/activity-ktx/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..4023c72
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResultCallerKt {
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+  }
+
+  public final class ActivityResultKt {
+    method public static operator int component1(androidx.activity.result.ActivityResult);
+    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+  }
+
+  public final class ActivityResultLauncherKt {
+    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+  }
+
+}
+
diff --git a/activity/activity-ktx/api/restricted_current.ignore b/activity/activity-ktx/api/restricted_current.ignore
index d23680b..f970b04 100644
--- a/activity/activity-ktx/api/restricted_current.ignore
+++ b/activity/activity-ktx/api/restricted_current.ignore
@@ -1,3 +1,9 @@
 // Baseline format: 1.0
 RemovedClass: androidx.activity.OnBackPressedDispatcherKt:
     Removed class androidx.activity.OnBackPressedDispatcherKt
+RemovedClass: androidx.activity.PipHintTrackerKt:
+    Removed class androidx.activity.PipHintTrackerKt
+
+
+RemovedPackage: androidx.activity.contextaware:
+    Removed package androidx.activity.contextaware
diff --git a/activity/activity-ktx/api/restricted_current.txt b/activity/activity-ktx/api/restricted_current.txt
index ba9fdc3..4023c72 100644
--- a/activity/activity-ktx/api/restricted_current.txt
+++ b/activity/activity-ktx/api/restricted_current.txt
@@ -6,17 +6,6 @@
     method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
   }
 
-  public final class PipHintTrackerKt {
-  }
-
-}
-
-package androidx.activity.contextaware {
-
-  public final class ContextAwareKt {
-    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R>);
-  }
-
 }
 
 package androidx.activity.result {
diff --git a/activity/activity-ktx/src/androidTest/java/androidx/activity/contextaware/ContextAwareTest.kt b/activity/activity-ktx/src/androidTest/java/androidx/activity/contextaware/ContextAwareTest.kt
deleted file mode 100644
index d56602a..0000000
--- a/activity/activity-ktx/src/androidTest/java/androidx/activity/contextaware/ContextAwareTest.kt
+++ /dev/null
@@ -1,81 +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.activity.contextaware
-
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class ContextAwareTest {
-
-    @Test
-    fun alreadyAvailable() = runBlocking(Dispatchers.Main) {
-        val contextAware = TestContextAware()
-        contextAware.dispatchOnContextAvailable()
-        var result = "initial"
-        val receivedResult = contextAware.withContextAvailable {
-            result
-        }
-        result = "after"
-        assertThat(receivedResult).isEqualTo("initial")
-    }
-
-    @Test
-    fun suspending() = runBlocking(Dispatchers.Main) {
-        val contextAware = TestContextAware()
-        var result = "initial"
-        launch {
-            contextAware.dispatchOnContextAvailable()
-            result = "post dispatch"
-        }
-        val receivedResult = contextAware.withContextAvailable {
-            result
-        }
-        contextAware.addOnContextAvailableListener {
-            result = "after"
-        }
-        assertThat(receivedResult).isEqualTo("initial")
-    }
-}
-
-private class TestContextAware : ContextAware {
-    private val contextAwareHelper = ContextAwareHelper()
-
-    override fun peekAvailableContext() = contextAwareHelper.peekAvailableContext()
-
-    override fun addOnContextAvailableListener(listener: OnContextAvailableListener) {
-        contextAwareHelper.addOnContextAvailableListener(listener)
-    }
-
-    override fun removeOnContextAvailableListener(listener: OnContextAvailableListener) {
-        contextAwareHelper.removeOnContextAvailableListener(listener)
-    }
-
-    fun dispatchOnContextAvailable() {
-        contextAwareHelper.dispatchOnContextAvailable(
-            ApplicationProvider.getApplicationContext()
-        )
-    }
-}
diff --git a/activity/activity-ktx/src/main/java/androidx/activity/contextaware/ContextAware.kt b/activity/activity-ktx/src/main/java/androidx/activity/contextaware/ContextAware.kt
deleted file mode 100644
index 163820d..0000000
--- a/activity/activity-ktx/src/main/java/androidx/activity/contextaware/ContextAware.kt
+++ /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.activity.contextaware
-
-import android.content.Context
-import kotlinx.coroutines.suspendCancellableCoroutine
-
-/**
- * Run [onContextAvailable] when the [Context] becomes available and
- * resume with the result.
- *
- * If the [Context] is already available, [onContextAvailable] will be
- * synchronously called on the current coroutine context. Otherwise,
- * [onContextAvailable] will be called on the UI thread immediately when
- * the Context becomes available.
- */
-public suspend inline fun <R> ContextAware.withContextAvailable(
-    crossinline onContextAvailable: (Context) -> R
-): R {
-    val availableContext = peekAvailableContext()
-    return if (availableContext != null) {
-        onContextAvailable(availableContext)
-    } else {
-        suspendCancellableCoroutine { co ->
-            val listener = object : OnContextAvailableListener {
-                override fun onContextAvailable(context: Context) {
-                    co.resumeWith(runCatching { onContextAvailable(context) })
-                }
-            }
-            addOnContextAvailableListener(listener)
-            co.invokeOnCancellation {
-                removeOnContextAvailableListener(listener)
-            }
-        }
-    }
-}
diff --git a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityIssueRegistry.kt b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityIssueRegistry.kt
index 794624c..168ec91 100644
--- a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityIssueRegistry.kt
+++ b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityIssueRegistry.kt
@@ -26,7 +26,7 @@
 @Suppress("UnstableApiUsage")
 class ActivityIssueRegistry : IssueRegistry() {
     // tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ActivityResultFragmentVersionDetector.ISSUE
diff --git a/activity/activity/api/1.7.0-beta01.txt b/activity/activity/api/1.7.0-beta01.txt
new file mode 100644
index 0000000..bf98034
--- /dev/null
+++ b/activity/activity/api/1.7.0-beta01.txt
@@ -0,0 +1,418 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/1.7.0-beta02.txt b/activity/activity/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..bf98034
--- /dev/null
+++ b/activity/activity/api/1.7.0-beta02.txt
@@ -0,0 +1,418 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index 688b1a0..bf98034 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -119,22 +119,26 @@
 package androidx.activity.contextaware {
 
   public interface ContextAware {
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
   public final class ContextAwareHelper {
     ctor public ContextAwareHelper();
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public void clearAvailableContext();
-    method public void dispatchOnContextAvailable(android.content.Context);
+    method public void dispatchOnContextAvailable(android.content.Context context);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
-  public interface OnContextAvailableListener {
-    method public void onContextAvailable(android.content.Context);
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
   }
 
 }
diff --git a/activity/activity/api/public_plus_experimental_1.7.0-beta01.txt b/activity/activity/api/public_plus_experimental_1.7.0-beta01.txt
new file mode 100644
index 0000000..bf98034
--- /dev/null
+++ b/activity/activity/api/public_plus_experimental_1.7.0-beta01.txt
@@ -0,0 +1,418 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/public_plus_experimental_1.7.0-beta02.txt b/activity/activity/api/public_plus_experimental_1.7.0-beta02.txt
new file mode 100644
index 0000000..bf98034
--- /dev/null
+++ b/activity/activity/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,418 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index 688b1a0..bf98034 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -119,22 +119,26 @@
 package androidx.activity.contextaware {
 
   public interface ContextAware {
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
   public final class ContextAwareHelper {
     ctor public ContextAwareHelper();
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public void clearAvailableContext();
-    method public void dispatchOnContextAvailable(android.content.Context);
+    method public void dispatchOnContextAvailable(android.content.Context context);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
-  public interface OnContextAvailableListener {
-    method public void onContextAvailable(android.content.Context);
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
   }
 
 }
diff --git a/activity/activity/api/res-1.7.0-beta01.txt b/activity/activity/api/res-1.7.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity/api/res-1.7.0-beta01.txt
diff --git a/activity/activity/api/res-1.7.0-beta02.txt b/activity/activity/api/res-1.7.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/activity/activity/api/res-1.7.0-beta02.txt
diff --git a/activity/activity/api/restricted_1.7.0-beta01.txt b/activity/activity/api/restricted_1.7.0-beta01.txt
new file mode 100644
index 0000000..7561e11
--- /dev/null
+++ b/activity/activity/api/restricted_1.7.0-beta01.txt
@@ -0,0 +1,417 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/restricted_1.7.0-beta02.txt b/activity/activity/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..7561e11
--- /dev/null
+++ b/activity/activity/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,417 @@
+// Signature format: 4.0
+package androidx.activity {
+
+  public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public void invalidateMenu();
+    method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+    method @MainThread public void onBackPressed();
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+    method public android.content.Context? peekAvailableContext();
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
+    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo!>);
+    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
+    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo!>);
+    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+  }
+
+  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
+    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
+    ctor public ComponentDialog(android.content.Context context);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method @CallSuper public void onBackPressed();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
+  }
+
+  public final class FullyDrawnReporter {
+    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
+    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void addReporter();
+    method public boolean isFullyDrawnReported();
+    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method public void removeReporter();
+    property public final boolean isFullyDrawnReported;
+  }
+
+  public final class FullyDrawnReporterKt {
+    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public interface FullyDrawnReporterOwner {
+    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
+    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean enabled);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+    property @MainThread public final boolean isEnabled;
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
+    ctor public OnBackPressedDispatcher();
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    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 interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
+  }
+
+  public final class ViewTreeFullyDrawnReporterOwner {
+    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
+  }
+
+  public final class ViewTreeOnBackPressedDispatcherOwner {
+    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
+  }
+
+}
+
+package androidx.activity.contextaware {
+
+  public interface ContextAware {
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareHelper {
+    ctor public ContextAwareHelper();
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+    method public void clearAvailableContext();
+    method public void dispatchOnContextAvailable(android.content.Context context);
+    method public android.content.Context? peekAvailableContext();
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
+  }
+
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
+  }
+
+}
+
+package androidx.activity.result {
+
+  public final class ActivityResult implements android.os.Parcelable {
+    ctor public ActivityResult(int, android.content.Intent?);
+    method public int describeContents();
+    method public android.content.Intent? getData();
+    method public int getResultCode();
+    method public static String resultCodeToString(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+  }
+
+  public fun interface ActivityResultCallback<O> {
+    method public void onActivityResult(O? result);
+  }
+
+  public interface ActivityResultCaller {
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public abstract class ActivityResultLauncher<I> {
+    ctor public ActivityResultLauncher();
+    method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+    method public void launch(I!);
+    method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+    method @MainThread public abstract void unregister();
+  }
+
+  public abstract class ActivityResultRegistry {
+    ctor public ActivityResultRegistry();
+    method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+    method @MainThread public final <O> boolean dispatchResult(int, O!);
+    method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+    method public final void onRestoreInstanceState(android.os.Bundle?);
+    method public final void onSaveInstanceState(android.os.Bundle);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+  }
+
+  public interface ActivityResultRegistryOwner {
+    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
+  }
+
+  public final class IntentSenderRequest implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.content.Intent? getFillInIntent();
+    method public int getFlagsMask();
+    method public int getFlagsValues();
+    method public android.content.IntentSender getIntentSender();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final android.content.Intent? fillInIntent;
+    property public final int flagsMask;
+    property public final int flagsValues;
+    property public final android.content.IntentSender intentSender;
+    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
+    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
+  }
+
+  public static final class IntentSenderRequest.Builder {
+    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
+    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
+    method public androidx.activity.result.IntentSenderRequest build();
+    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
+    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
+  }
+
+  public static final class IntentSenderRequest.Companion {
+  }
+
+  public final class PickVisualMediaRequest {
+    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
+    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
+  }
+
+  public static final class PickVisualMediaRequest.Builder {
+    ctor public PickVisualMediaRequest.Builder();
+    method public androidx.activity.result.PickVisualMediaRequest build();
+    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+  public final class PickVisualMediaRequestKt {
+    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
+  }
+
+}
+
+package androidx.activity.result.contract {
+
+  public abstract class ActivityResultContract<I, O> {
+    ctor public ActivityResultContract();
+    method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+    method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContract.SynchronousResult<T> {
+    ctor public ActivityResultContract.SynchronousResult(T? value);
+    method public T! getValue();
+    property public final T! value;
+  }
+
+  public final class ActivityResultContracts {
+  }
+
+  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 context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.CreateDocument(String mimeType);
+    ctor @Deprecated public ActivityResultContracts.CreateDocument();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+    ctor public ActivityResultContracts.GetContent();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, android.net.Uri? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @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 context, String![] input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+    ctor public ActivityResultContracts.PickContact();
+    method public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
+    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
+    ctor public ActivityResultContracts.PickVisualMedia();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
+    method @Deprecated public static final boolean isPhotoPickerAvailable();
+    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
+    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.Companion {
+    method @Deprecated public boolean isPhotoPickerAvailable();
+    method public boolean isPhotoPickerAvailable(android.content.Context context);
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
+    method public String getMimeType();
+    property public final String mimeType;
+  }
+
+  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
+    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
+  }
+
+  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+    ctor public ActivityResultContracts.RequestMultiplePermissions();
+    method public android.content.Intent createIntent(android.content.Context context, String![] input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+  }
+
+  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+  }
+
+  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+    ctor public ActivityResultContracts.RequestPermission();
+    method public android.content.Intent createIntent(android.content.Context context, String input);
+    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartActivityForResult();
+    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+  }
+
+  public static final class ActivityResultContracts.StartActivityForResult.Companion {
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+    ctor public ActivityResultContracts.StartIntentSenderForResult();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+  }
+
+  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+  }
+
+  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.TakePicture();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+    ctor public ActivityResultContracts.TakePicturePreview();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? 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 context, android.net.Uri input);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+  }
+
+}
+
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 1d24b8c..7561e11 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -118,22 +118,26 @@
 package androidx.activity.contextaware {
 
   public interface ContextAware {
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
   public final class ContextAwareHelper {
     ctor public ContextAwareHelper();
-    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
     method public void clearAvailableContext();
-    method public void dispatchOnContextAvailable(android.content.Context);
+    method public void dispatchOnContextAvailable(android.content.Context context);
     method public android.content.Context? peekAvailableContext();
-    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
   }
 
-  public interface OnContextAvailableListener {
-    method public void onContextAvailable(android.content.Context);
+  public final class ContextAwareKt {
+    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
+  }
+
+  public fun interface OnContextAvailableListener {
+    method public void onContextAvailable(android.content.Context context);
   }
 
 }
diff --git a/activity/activity/src/androidTest/java/androidx/activity/contextaware/ContextAwareHelperTest.kt b/activity/activity/src/androidTest/java/androidx/activity/contextaware/ContextAwareHelperTest.kt
index e3bbb87..e579938 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/contextaware/ContextAwareHelperTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/contextaware/ContextAwareHelperTest.kt
@@ -21,6 +21,9 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 import leakcanary.DetectLeaksAfterTestSuccess
 import org.junit.Rule
 import org.junit.Test
@@ -110,6 +113,35 @@
 
         assertThat(callbackCount).isEqualTo(0)
     }
+
+    @Test
+    fun alreadyAvailable() = runBlocking(Dispatchers.Main) {
+        val contextAware = TestContextAware()
+        contextAware.dispatchOnContextAvailable()
+        var result = "initial"
+        val receivedResult = contextAware.withContextAvailable {
+            result
+        }
+        result = "after"
+        assertThat(receivedResult).isEqualTo("initial")
+    }
+
+    @Test
+    fun suspending() = runBlocking(Dispatchers.Main) {
+        val contextAware = TestContextAware()
+        var result = "initial"
+        launch {
+            contextAware.dispatchOnContextAvailable()
+            result = "post dispatch"
+        }
+        val receivedResult = contextAware.withContextAvailable {
+            result
+        }
+        contextAware.addOnContextAvailableListener {
+            result = "after"
+        }
+        assertThat(receivedResult).isEqualTo("initial")
+    }
 }
 
 class TestContextAware : ContextAware {
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.java b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.java
deleted file mode 100644
index 4e0b4c7..0000000
--- a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.java
+++ /dev/null
@@ -1,69 +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.activity.contextaware;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * A <code>ContextAware</code> class is associated with a {@link Context} sometime after
- * the class is instantiated. By adding a {@link OnContextAvailableListener}, you can
- * receive a callback for that event.
- * <p>
- * Classes implementing {@link ContextAware} are strongly recommended to also implement
- * {@link androidx.lifecycle.LifecycleOwner} for providing a more general purpose API for
- * listening for creation and destruction events.
- *
- * @see ContextAwareHelper
- */
-public interface ContextAware {
-
-    /**
-     * Get the {@link Context} if it is currently available. If this returns
-     * <code>null</code>, you can use
-     * {@link #addOnContextAvailableListener(OnContextAvailableListener)} to receive
-     * a callback for when it available.
-     *
-     * @return the Context if it is currently available.
-     */
-    @Nullable
-    Context peekAvailableContext();
-
-    /**
-     * Add a new {@link OnContextAvailableListener} for receiving a callback for when
-     * this class is associated with a {@link android.content.Context}.
-     * <p>
-     * Listeners are triggered in the order they are added when added before the Context is
-     * available. Listeners added after the context has been made available will have the Context
-     * synchronously delivered to them as part of this call.
-     *
-     * @param listener The listener that should be added.
-     * @see #removeOnContextAvailableListener(OnContextAvailableListener)
-     */
-    void addOnContextAvailableListener(@NonNull OnContextAvailableListener listener);
-
-    /**
-     * Remove a {@link OnContextAvailableListener} previously added via
-     * {@link #addOnContextAvailableListener(OnContextAvailableListener)}.
-     *
-     * @param listener The listener that should be removed.
-     * @see #addOnContextAvailableListener(OnContextAvailableListener)
-     */
-    void removeOnContextAvailableListener(@NonNull OnContextAvailableListener listener);
-}
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.kt b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.kt
new file mode 100644
index 0000000..7f43714
--- /dev/null
+++ b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAware.kt
@@ -0,0 +1,93 @@
+/*
+ * 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.contextaware
+
+import android.content.Context
+import kotlinx.coroutines.suspendCancellableCoroutine
+
+/**
+ * A `ContextAware` class is associated with a [Context] sometime after
+ * the class is instantiated. By adding a [OnContextAvailableListener], you can
+ * receive a callback for that event.
+ *
+ * Classes implementing [ContextAware] are strongly recommended to also implement
+ * [androidx.lifecycle.LifecycleOwner] for providing a more general purpose API for
+ * listening for creation and destruction events.
+ *
+ * @see ContextAwareHelper
+ */
+interface ContextAware {
+    /**
+     * Get the [Context] if it is currently available. If this returns
+     * `null`, you can use [addOnContextAvailableListener] to receive
+     * a callback for when it available.
+     *
+     * @return the Context if it is currently available.
+     */
+    fun peekAvailableContext(): Context?
+
+    /**
+     * Add a new [OnContextAvailableListener] for receiving a callback for when
+     * this class is associated with a [android.content.Context].
+     *
+     * Listeners are triggered in the order they are added when added before the Context is
+     * available. Listeners added after the context has been made available will have the Context
+     * synchronously delivered to them as part of this call.
+     *
+     * @param listener The listener that should be added.
+     * @see removeOnContextAvailableListener
+     */
+    fun addOnContextAvailableListener(listener: OnContextAvailableListener)
+
+    /**
+     * Remove a [OnContextAvailableListener] previously added via
+     * [addOnContextAvailableListener].
+     *
+     * @param listener The listener that should be removed.
+     * @see addOnContextAvailableListener
+     */
+    fun removeOnContextAvailableListener(listener: OnContextAvailableListener)
+}
+
+/**
+ * Run [onContextAvailable] when the [Context] becomes available and
+ * resume with the result.
+ *
+ * If the [Context] is already available, [onContextAvailable] will be
+ * synchronously called on the current coroutine context. Otherwise,
+ * [onContextAvailable] will be called on the UI thread immediately when
+ * the Context becomes available.
+ */
+suspend inline fun <R> ContextAware.withContextAvailable(
+    crossinline onContextAvailable: (@JvmSuppressWildcards Context) -> @JvmSuppressWildcards R
+): @JvmSuppressWildcards R {
+    val availableContext = peekAvailableContext()
+    return if (availableContext != null) {
+        onContextAvailable(availableContext)
+    } else {
+        suspendCancellableCoroutine { co ->
+            val listener = object : OnContextAvailableListener {
+                override fun onContextAvailable(context: Context) {
+                    co.resumeWith(runCatching { onContextAvailable(context) })
+                }
+            }
+            addOnContextAvailableListener(listener)
+            co.invokeOnCancellation {
+                removeOnContextAvailableListener(listener)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.java b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.java
deleted file mode 100644
index c29b7a3..0000000
--- a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.java
+++ /dev/null
@@ -1,110 +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.activity.contextaware;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
-/**
- * Helper class for implementing {@link ContextAware}. Classes using this helper should
- * call {@link #addOnContextAvailableListener(OnContextAvailableListener)} and
- * {@link #removeOnContextAvailableListener(OnContextAvailableListener)} as the respective
- * methods of {@link ContextAware} are called.
- * <p>
- * You must call {@link #dispatchOnContextAvailable(Context)} once the
- * {@link Context} is available to dispatch the callbacks to all registered listeners.
- * <p>
- * Listeners added after the context has been made available via
- * {@link #dispatchOnContextAvailable(Context)} will have the Context synchronously
- * delivered to them up until {@link #clearAvailableContext()} is called.
- */
-public final class ContextAwareHelper {
-
-    private final Set<OnContextAvailableListener> mListeners = new CopyOnWriteArraySet<>();
-
-    private volatile Context mContext;
-
-    /**
-     * Construct a new ContextAwareHelper.
-     */
-    public ContextAwareHelper() {
-    }
-
-    /**
-     * Get the {@link Context} if it is currently available. If this returns
-     * <code>null</code>, you can use
-     * {@link #addOnContextAvailableListener(OnContextAvailableListener)} to receive
-     * a callback for when it available.
-     *
-     * @return the Context if it is currently available.
-     */
-    @Nullable
-    public Context peekAvailableContext() {
-        return mContext;
-    }
-
-    /**
-     * Add a new {@link OnContextAvailableListener} for receiving a callback for when
-     * this class is associated with a {@link android.content.Context}.
-     *
-     * @param listener The listener that should be added.
-     * @see #removeOnContextAvailableListener(OnContextAvailableListener)
-     */
-    public void addOnContextAvailableListener(@NonNull OnContextAvailableListener listener) {
-        if (mContext != null) {
-            listener.onContextAvailable(mContext);
-        }
-        mListeners.add(listener);
-    }
-
-    /**
-     * Remove a {@link OnContextAvailableListener} previously added via
-     * {@link #addOnContextAvailableListener(OnContextAvailableListener)}.
-     *
-     * @param listener The listener that should be removed.
-     * @see #addOnContextAvailableListener(OnContextAvailableListener)
-     */
-    public void removeOnContextAvailableListener(@NonNull OnContextAvailableListener listener) {
-        mListeners.remove(listener);
-    }
-
-    /**
-     * Dispatch the callback of {@link OnContextAvailableListener#onContextAvailable} to
-     * all currently added listeners in the order they were added.
-     *
-     * @param context The {@link Context} the {@link ContextAware} object is now associated with.
-     */
-    public void dispatchOnContextAvailable(@NonNull Context context) {
-        mContext = context;
-        for (OnContextAvailableListener listener : mListeners) {
-            listener.onContextAvailable(context);
-        }
-    }
-
-    /**
-     * Clear any {@link Context} previously made available via
-     * {@link #dispatchOnContextAvailable(Context)}.
-     */
-    public void clearAvailableContext() {
-        mContext = null;
-    }
-}
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.kt b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.kt
new file mode 100644
index 0000000..0a76e42
--- /dev/null
+++ b/activity/activity/src/main/java/androidx/activity/contextaware/ContextAwareHelper.kt
@@ -0,0 +1,95 @@
+/*
+ * 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.contextaware
+
+import android.content.Context
+import java.util.concurrent.CopyOnWriteArraySet
+
+/**
+ * Helper class for implementing [ContextAware]. Classes using this helper should
+ * call [addOnContextAvailableListener] and [removeOnContextAvailableListener] as the respective
+ * methods of [ContextAware] are called.
+ *
+ * You must call [dispatchOnContextAvailable] once the
+ * [Context] is available to dispatch the callbacks to all registered listeners.
+ *
+ * Listeners added after the context has been made available via
+ * [dispatchOnContextAvailable] will have the Context synchronously
+ * delivered to them up until [clearAvailableContext] is called.
+ */
+class ContextAwareHelper {
+    private val listeners: MutableSet<OnContextAvailableListener> = CopyOnWriteArraySet()
+
+    @Volatile
+    private var context: Context? = null
+
+    /**
+     * Get the [Context] if it is currently available. If this returns
+     * `null`, you can use [addOnContextAvailableListener] to receive
+     * a callback for when it available.
+     *
+     * @return the Context if it is currently available.
+     */
+    fun peekAvailableContext(): Context? {
+        return context
+    }
+
+    /**
+     * Add a new [OnContextAvailableListener] for receiving a callback for when
+     * this class is associated with a [android.content.Context].
+     *
+     * @param listener The listener that should be added.
+     * @see removeOnContextAvailableListener
+     */
+    fun addOnContextAvailableListener(listener: OnContextAvailableListener) {
+        context?.let {
+            listener.onContextAvailable(it)
+        }
+        listeners.add(listener)
+    }
+
+    /**
+     * Remove a [OnContextAvailableListener] previously added via
+     * [addOnContextAvailableListener].
+     *
+     * @param listener The listener that should be removed.
+     * @see addOnContextAvailableListener
+     */
+    fun removeOnContextAvailableListener(listener: OnContextAvailableListener) {
+        listeners.remove(listener)
+    }
+
+    /**
+     * Dispatch the callback of [OnContextAvailableListener.onContextAvailable] to
+     * all currently added listeners in the order they were added.
+     *
+     * @param context The [Context] the [ContextAware] object is now associated with.
+     */
+    fun dispatchOnContextAvailable(context: Context) {
+        this.context = context
+        for (listener in listeners) {
+            listener.onContextAvailable(context)
+        }
+    }
+
+    /**
+     * Clear any [Context] previously made available via
+     * [dispatchOnContextAvailable].
+     */
+    fun clearAvailableContext() {
+        context = null
+    }
+}
\ No newline at end of file
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.java b/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.java
deleted file mode 100644
index 99a299c..0000000
--- a/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.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.activity.contextaware;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-
-/**
- * Listener for receiving a callback at the first moment a {@link Context} is made
- * available to the {@link ContextAware} class.
- *
- * @see ContextAware#addOnContextAvailableListener(OnContextAvailableListener)
- */
-public interface OnContextAvailableListener {
-
-    /**
-     * Called when the {@link ContextAware} object this listener was added to is associated to a
-     * {@link Context}.
-     *
-     * @param context The {@link Context} the {@link ContextAware} object is now associated with.
-     */
-    void onContextAvailable(@NonNull Context context);
-}
diff --git a/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.kt b/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.kt
new file mode 100644
index 0000000..e5e8f1f
--- /dev/null
+++ b/activity/activity/src/main/java/androidx/activity/contextaware/OnContextAvailableListener.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.contextaware
+
+import android.content.Context
+
+/**
+ * Listener for receiving a callback at the first moment a [Context] is made
+ * available to the [ContextAware] class.
+ *
+ * @see ContextAware.addOnContextAvailableListener
+ */
+fun interface OnContextAvailableListener {
+    /**
+     * Called when the [ContextAware] object this listener was added to is associated to a
+     * [Context].
+     *
+     * @param context The [Context] the [ContextAware] object is now associated with.
+     */
+    fun onContextAvailable(context: Context)
+}
\ No newline at end of file
diff --git a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
index 7e78252..81d62c5 100644
--- a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
+++ b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
@@ -20,6 +20,7 @@
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
+import android.content.pm.ResolveInfo
 import android.graphics.Bitmap
 import android.net.Uri
 import android.os.Build
@@ -33,6 +34,7 @@
 import androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.Companion.getClipDataUris
 import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion.GMS_ACTION_PICK_IMAGES
 import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion.GMS_EXTRA_PICK_IMAGES_MAX
+import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion.getGmsPicker
 import androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion.ACTION_INTENT_SENDER_REQUEST
 import androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion.EXTRA_SEND_INTENT_EXCEPTION
 import androidx.annotation.CallSuper
@@ -671,13 +673,18 @@
                 }
             }
 
-            @Suppress("DEPRECATION")
             @JvmStatic
             internal fun isGmsPickerAvailable(context: Context): Boolean {
+                return getGmsPicker(context) != null
+            }
+
+            @Suppress("DEPRECATION")
+            @JvmStatic
+            internal fun getGmsPicker(context: Context): ResolveInfo? {
                 return context.packageManager.resolveActivity(
                     Intent(GMS_ACTION_PICK_IMAGES),
-                    PackageManager.MATCH_DEFAULT_ONLY
-                ) != null
+                    PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
+                )
             }
 
             internal fun getVisualMimeType(input: VisualMediaType): String? {
@@ -724,7 +731,9 @@
                     type = getVisualMimeType(input.mediaType)
                 }
             } else if (isGmsPickerAvailable(context)) {
+                val gmsPicker = checkNotNull(getGmsPicker(context)).activityInfo
                 Intent(GMS_ACTION_PICK_IMAGES).apply {
+                    setClassName(gmsPicker.applicationInfo.packageName, gmsPicker.name)
                     type = getVisualMimeType(input.mediaType)
                 }
             } else {
@@ -800,8 +809,9 @@
                     putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxItems)
                 }
             } else if (PickVisualMedia.isGmsPickerAvailable(context)) {
+                val gmsPicker = checkNotNull(getGmsPicker(context)).activityInfo
                 Intent(GMS_ACTION_PICK_IMAGES).apply {
-                    type = PickVisualMedia.getVisualMimeType(input.mediaType)
+                    setClassName(gmsPicker.applicationInfo.packageName, gmsPicker.name)
                     putExtra(GMS_EXTRA_PICK_IMAGES_MAX, maxItems)
                 }
             } else {
diff --git a/ads/ads-identifier-benchmark/build.gradle b/ads/ads-identifier-benchmark/build.gradle
index 1bc05c2..527e2f5 100644
--- a/ads/ads-identifier-benchmark/build.gradle
+++ b/ads/ads-identifier-benchmark/build.gradle
@@ -28,6 +28,7 @@
     androidTestImplementation(project(":ads:ads-identifier-testing"))
     androidTestImplementation("androidx.work:work-runtime:2.7.0")
     androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
@@ -38,5 +39,9 @@
 
 android {
     namespace "androidx.ads.identifier.benchmark"
+
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
 
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 0f6ff59..1cf3f9a 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
@@ -23,7 +23,7 @@
 @Suppress("UnstableApiUsage")
 class ExperimentalIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues get() = ExperimentalDetector.ISSUES + AnnotationRetentionDetector.ISSUES
     override val vendor = Vendor(
         feedbackUrl = "https://issuetracker.google.com/issues/new?component=459778",
diff --git a/annotation/annotation-experimental/build.gradle b/annotation/annotation-experimental/build.gradle
index 0b75e9a..7608693 100644
--- a/annotation/annotation-experimental/build.gradle
+++ b/annotation/annotation-experimental/build.gradle
@@ -31,6 +31,7 @@
     name = "Experimental annotation"
     publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.ANNOTATION_EXPERIMENTAL
+    mavenMultiplatformVersion = LibraryVersions.ANNOTATION_EXPERIMENTAL_KMP
     inceptionYear = "2019"
     description = "Java annotation for use on unstable Android API surfaces. When used in " +
             "conjunction with the Experimental annotation lint checks, this annotation provides " +
diff --git a/annotation/annotation/OWNERS b/annotation/annotation/OWNERS
index e980177..d9e833e 100644
--- a/annotation/annotation/OWNERS
+++ b/annotation/annotation/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461276
 tnorbye@google.com
\ No newline at end of file
diff --git a/annotation/annotation/build.gradle b/annotation/annotation/build.gradle
index b34c118..e821397 100644
--- a/annotation/annotation/build.gradle
+++ b/annotation/annotation/build.gradle
@@ -9,9 +9,7 @@
 }
 
 androidXMultiplatform {
-    jvm {
-        withJava() // Remove after b/247980072
-    }
+    jvm()
     mac()
     linux()
     ios()
@@ -46,7 +44,6 @@
 }
 
 jvmJar {
-    from sourceSets.main.output
     // Strip out typedef classes. For Android libraries, this is done
     // automatically by the Gradle plugin, but the Annotation library is a
     // plain jar, built by the regular Gradle java plugin. The typedefs
@@ -72,6 +69,7 @@
     name = "Android Support Library Annotations"
     type = LibraryType.PUBLISHED_LIBRARY
     mavenVersion = LibraryVersions.ANNOTATION
+    mavenMultiplatformVersion = LibraryVersions.ANNOTATION_KMP
     inceptionYear = "2013"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs."
 }
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt
index 9fe46b6..ec42ed7 100644
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt
@@ -56,7 +56,7 @@
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
 @java.lang.annotation.Target(
     PACKAGE, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, METHOD, FIELD
 )
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt
index 1586c4a..ddacdc2 100644
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt
@@ -41,7 +41,7 @@
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
 @java.lang.annotation.Target(
     METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE
 )
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt
index c19118f..9a3373c 100644
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt
@@ -48,6 +48,6 @@
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
 @java.lang.annotation.Target(METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE)
 public annotation class Nullable
\ No newline at end of file
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
index 5bfd2d5..33953b1 100644
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
@@ -43,7 +43,7 @@
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
 @java.lang.annotation.Target(TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE)
 public annotation class RequiresApi(
     /**
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
index d64d5e3..8f189b7 100644
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
@@ -54,7 +54,7 @@
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
 @java.lang.annotation.Target(
     ElementType.ANNOTATION_TYPE,
     ElementType.TYPE,
diff --git a/appactions/interaction/OWNERS b/appactions/interaction/OWNERS
index 18b6f56..7dbb814 100644
--- a/appactions/interaction/OWNERS
+++ b/appactions/interaction/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1292315
 aliibrahim@google.com
 jaazm@google.com
 mkucharski@google.com
\ No newline at end of file
diff --git a/appactions/interaction/interaction-capabilities-core/build.gradle b/appactions/interaction/interaction-capabilities-core/build.gradle
index 57dc092..fdb938f 100644
--- a/appactions/interaction/interaction-capabilities-core/build.gradle
+++ b/appactions/interaction/interaction-capabilities-core/build.gradle
@@ -20,15 +20,19 @@
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("org.jetbrains.kotlin.android")
 }
 
 dependencies {
     api(libs.autoValueAnnotations)
+    api(libs.kotlinStdlib)
     annotationProcessor(libs.autoValue)
     implementation(libs.protobufLite)
     implementation(libs.guavaListenableFuture)
     implementation("androidx.concurrent:concurrent-futures:1.1.0")
     implementation(project(":appactions:interaction:interaction-proto"))
+
+    testAnnotationProcessor(libs.autoValue)
     testImplementation(libs.junit)
     testImplementation(libs.truth)
     testImplementation(libs.testCore)
@@ -38,13 +42,16 @@
     testImplementation(libs.androidLintTests)
     testImplementation(libs.autoValueAnnotations)
     testImplementation(libs.testRunner)
-    testAnnotationProcessor(libs.autoValue)
 }
 
 android {
+    buildFeatures {
+        resValues = true
+    }
     defaultConfig {
         // TODO(b/266649259): lower minSdk version to 19.
         minSdkVersion 33
+        resValue "string", "appactions_interaction_library_version", androidx.LibraryVersions.APPACTIONS_INTERACTION.toString()
     }
 
     lintOptions {
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.java
index 7f1b4e5..6e1f4c3 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionCapability.java
@@ -17,6 +17,11 @@
 package androidx.appactions.interaction.capabilities.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.appactions.interaction.capabilities.core.impl.ArgumentsWrapper;
+import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
+import androidx.appactions.interaction.capabilities.core.impl.TouchEventCallback;
+import androidx.appactions.interaction.proto.AppActionsContext.AppAction;
 
 import java.util.Optional;
 
@@ -32,4 +37,33 @@
     /** Returns the unique Id of this capability declaration. */
     @NonNull
     Optional<String> getId();
+
+    /**
+     * Returns an app action proto describing how to fulfill this capability.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @NonNull
+    AppAction getAppAction();
+
+    /**
+     * Executes the action and returns the result of execution.
+     *
+     * @param argumentsWrapper The arguments send from assistant to the activity.
+     * @param callback The callback to receive app action result.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    void execute(@NonNull ArgumentsWrapper argumentsWrapper, @NonNull CallbackInternal callback);
+
+    /**
+     * Support for manual input. This method should be invoked by AppInteraction SDKs
+     * (background/foreground), so the developers have a way to report state updates back to
+     * Assistant.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    default void setTouchEventCallback(@NonNull TouchEventCallback callback) {}
 }
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionExecutor.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionExecutor.java
index c0c32f5..99e7d0b 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionExecutor.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/ActionExecutor.java
@@ -18,6 +18,8 @@
 
 import androidx.annotation.NonNull;
 
+import com.google.common.util.concurrent.ListenableFuture;
+
 /**
  * An interface of executing the action.
  *
@@ -29,39 +31,8 @@
      * Calls to execute the action.
      *
      * @param argument the argument for this action.
-     * @param callback the callback to send back the action execution result.
+     * @return A ListenableFuture containing the ExecutionResult
      */
-    void execute(@NonNull ArgumentT argument, @NonNull ActionCallback<OutputT> callback);
-
-    /** Reasons for the action execution error. */
-    enum ErrorStatus {
-        CANCELLED,
-        /** The action execution error was caused by a timeout. */
-        TIMEOUT,
-    }
-
-    /**
-     * An interface for receiving the result of action.
-     *
-     * @param <OutputT>
-     */
-    interface ActionCallback<OutputT> {
-
-        /** Invoke to set an action result upon success. */
-        void onSuccess(@NonNull ExecutionResult<OutputT> executionResult);
-
-        /** Invoke to set an action result upon success. */
-        default void onSuccess() {
-            onSuccess(ExecutionResult.<OutputT>newBuilderWithOutput().build());
-        }
-
-        /**
-         * Invokes to set an error status for the action.
-         *
-         * @deprecated
-         */
-        @Deprecated
-        void onError(@NonNull ErrorStatus errorStatus);
-    }
-
+    @NonNull
+    ListenableFuture<ExecutionResult<OutputT>> execute(@NonNull ArgumentT argument);
 }
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/LibInfo.kt b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/LibInfo.kt
new file mode 100644
index 0000000..fb27353
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/LibInfo.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appactions.interaction.capabilities.core
+
+import android.content.Context
+import androidx.annotation.RestrictTo
+
+import java.util.regex.Pattern
+import java.util.Objects.requireNonNull
+
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+internal data class LibInfo(val context: Context) {
+  fun getVersion(): Version {
+    return Version.parse(
+            context.getResources().getString(R.string.appactions_interaction_library_version))
+  }
+
+  data class Version(
+    val major: Int,
+    val minor: Int,
+    val patch: Int,
+    val preReleaseId: String? = null,
+  ) : Comparable<Version> {
+
+    override fun compareTo(other: Version) = compareValuesBy(
+        this, other,
+        { it.major },
+        { it.minor },
+        { it.patch },
+        { it.preReleaseId == null }, // False (no preReleaseId) sorts above true (has preReleaseId)
+        { it.preReleaseId } // gradle uses lexicographic ordering
+    )
+
+    override fun toString(): String {
+        return if (preReleaseId != null) {
+            "$major.$minor.$patch-$preReleaseId"
+        } else "$major.$minor.$patch"
+    }
+
+    companion object {
+      private val VERSION_REGEX = Pattern.compile("^(\\d+)\\.(\\d+)\\.(\\d+)(-.+)?$")
+
+      fun parse(versionString: String): Version {
+        val matcher = VERSION_REGEX.matcher(versionString)
+        if (!matcher.matches()) {
+          throw IllegalArgumentException("Can not parse version: $versionString")
+        }
+        return Version(
+          Integer.parseInt(requireNonNull(matcher.group(1))),
+          Integer.parseInt(requireNonNull(matcher.group(2))),
+          Integer.parseInt(requireNonNull(matcher.group(3))),
+          if (matcher.groupCount() == 4) requireNonNull(matcher.group(4)).drop(1) else null
+        )
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilityInternal.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilityInternal.java
deleted file mode 100644
index 10ffa4b..0000000
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/ActionCapabilityInternal.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appactions.interaction.capabilities.core.impl;
-
-import androidx.annotation.NonNull;
-import androidx.appactions.interaction.capabilities.core.ActionCapability;
-import androidx.appactions.interaction.proto.AppActionsContext.AppAction;
-
-/** An interface that represents the capability of an app action. */
-public interface ActionCapabilityInternal extends ActionCapability {
-
-    /** Returns an app action proto describing how to fulfill this capability. */
-    @NonNull
-    AppAction getAppAction();
-
-    /**
-     * Executes the action and returns the result of execution.
-     *
-     * @param argumentsWrapper The arguments send from assistant to the activity.
-     * @param callback         The callback to receive app action result.
-     */
-    void execute(@NonNull ArgumentsWrapper argumentsWrapper, @NonNull CallbackInternal callback);
-
-    /**
-     * Support for manual input. This method should be invoked by AppInteraction SDKs
-     * (background/foreground), so the developers have a way to report state updates back to
-     * Assistant.
-     */
-    default void setTouchEventCallback(@NonNull TouchEventCallback callback) {
-    }
-}
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImpl.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImpl.java
index b4f281b..a6bfaad 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImpl.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImpl.java
@@ -20,12 +20,14 @@
 import static androidx.appactions.interaction.capabilities.core.impl.utils.ImmutableCollectors.toImmutableMap;
 
 import androidx.annotation.NonNull;
+import androidx.appactions.interaction.capabilities.core.ActionCapability;
 import androidx.appactions.interaction.capabilities.core.ActionExecutor;
 import androidx.appactions.interaction.capabilities.core.ExecutionResult;
-import androidx.appactions.interaction.capabilities.core.impl.ActionCapabilityInternal;
 import androidx.appactions.interaction.capabilities.core.impl.ArgumentsWrapper;
 import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
 import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
+import androidx.appactions.interaction.capabilities.core.impl.concurrent.FutureCallback;
+import androidx.appactions.interaction.capabilities.core.impl.concurrent.Futures;
 import androidx.appactions.interaction.capabilities.core.impl.exceptions.StructConversionException;
 import androidx.appactions.interaction.capabilities.core.impl.utils.CapabilityLogger;
 import androidx.appactions.interaction.capabilities.core.impl.utils.LoggerInternal;
@@ -45,8 +47,7 @@
  * @param <ArgumentT>
  * @param <OutputT>
  */
-public final class ActionCapabilityImpl<PropertyT, ArgumentT, OutputT>
-        implements ActionCapabilityInternal {
+public final class ActionCapabilityImpl<PropertyT, ArgumentT, OutputT> implements ActionCapability {
 
     private static final String LOG_TAG = "ActionCapability";
     private final ActionSpec<PropertyT, ArgumentT, OutputT> mActionSpec;
@@ -97,7 +98,20 @@
                                                         .map(FulfillmentValue::getValue)
                                                         .collect(toImmutableList())));
         try {
-            mActionExecutor.execute(mActionSpec.buildArgument(args), convertCallback(callback));
+            Futures.addCallback(
+                    mActionExecutor.execute(mActionSpec.buildArgument(args)),
+                    new FutureCallback<ExecutionResult<OutputT>>() {
+                        @Override
+                        public void onSuccess(ExecutionResult<OutputT> executionResult) {
+                            callback.onSuccess(convertToFulfillmentResponse(executionResult));
+                        }
+
+                        @Override
+                        public void onFailure(Throwable t) {
+                            callback.onError(ErrorStatusInternal.CANCELLED);
+                        }
+                    },
+                    Runnable::run);
         } catch (StructConversionException e) {
             if (e.getMessage() != null) {
                 LoggerInternal.log(CapabilityLogger.LogLevel.ERROR, LOG_TAG, e.getMessage());
@@ -106,32 +120,11 @@
         }
     }
 
-    /** Converts {@link CallbackInternal} to {@link ActionExecutor.ActionCallback}. */
-    private ActionExecutor.ActionCallback<OutputT> convertCallback(CallbackInternal callback) {
-        return new ActionExecutor.ActionCallback<OutputT>() {
-            @Override
-            public void onSuccess(ExecutionResult<OutputT> executionResult) {
-                callback.onSuccess(convertToFulfillmentResponse(executionResult));
-            }
-
-            @Override
-            public void onError(ActionExecutor.ErrorStatus errorStatus) {
-                switch (errorStatus) {
-                    case CANCELLED:
-                        callback.onError(ErrorStatusInternal.CANCELLED);
-                        break;
-                    case TIMEOUT:
-                        callback.onError(ErrorStatusInternal.TIMEOUT);
-                }
-            }
-        };
-    }
-
     /** Converts typed {@link ExecutionResult} to {@link FulfillmentResponse} proto. */
     FulfillmentResponse convertToFulfillmentResponse(ExecutionResult<OutputT> executionResult) {
         FulfillmentResponse.Builder fulfillmentResponseBuilder =
-                FulfillmentResponse.newBuilder().setStartDictation(
-                        executionResult.getStartDictation());
+                FulfillmentResponse.newBuilder()
+                        .setStartDictation(executionResult.getStartDictation());
         OutputT output = executionResult.getOutput();
         if (output != null && !(output instanceof Void)) {
             fulfillmentResponseBuilder.setExecutionOutput(mActionSpec.convertOutputToProto(output));
diff --git a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImpl.java b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImpl.java
index 6c7ecd1..2655700 100644
--- a/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImpl.java
+++ b/appactions/interaction/interaction-capabilities-core/src/main/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImpl.java
@@ -19,7 +19,7 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appactions.interaction.capabilities.core.impl.ActionCapabilityInternal;
+import androidx.appactions.interaction.capabilities.core.ActionCapability;
 import androidx.appactions.interaction.capabilities.core.impl.ArgumentsWrapper;
 import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
 import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
@@ -54,7 +54,7 @@
                 OutputT,
                 ConfirmationT,
                 TaskUpdaterT extends AbstractTaskUpdater>
-        implements ActionCapabilityInternal, TaskUpdateHandler {
+        implements ActionCapability, TaskUpdateHandler {
 
     private final String mIdentifier;
     private final Executor mExecutor;
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/LibInfoTest.kt b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/LibInfoTest.kt
new file mode 100644
index 0000000..8bed86d
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/LibInfoTest.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appactions.interaction.capabilities.core
+
+import androidx.appactions.interaction.capabilities.core.LibInfo.Version
+
+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 LibInfoTest {
+    @Test
+    fun getVersion_fromValidString_returnsVersion() {
+        val versionString = "1.0.0-alpha01"
+        val version: Version = Version.parse(versionString)
+        assertThat(version.major).isEqualTo(1)
+        assertThat(version.minor).isEqualTo(0)
+        assertThat(version.patch).isEqualTo(0)
+        assertThat(version.preReleaseId).isEqualTo("alpha01")
+    }
+
+    @Test
+    fun getVersion_fromInvalidString_throwsException() {
+        val versionString = "1A"
+        var version: Version? = null
+        var exceptionMsg: String? = null
+        try {
+            version = Version.parse(versionString)
+        } catch (e: IllegalArgumentException) {
+            exceptionMsg = e.message
+        }
+        assertThat(version).isNull()
+        assertThat(exceptionMsg).isEqualTo("Can not parse version: 1A")
+    }
+}
\ No newline at end of file
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImplTest.java b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImplTest.java
index 4e2e5b8..47d20b5 100644
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImplTest.java
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionCapabilityImplTest.java
@@ -23,6 +23,7 @@
 import androidx.appactions.interaction.capabilities.core.ExecutionResult;
 import androidx.appactions.interaction.capabilities.core.impl.ArgumentsWrapper;
 import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
+import androidx.appactions.interaction.capabilities.core.impl.concurrent.Futures;
 import androidx.appactions.interaction.capabilities.core.impl.converters.TypeConverters;
 import androidx.appactions.interaction.capabilities.core.properties.EntityProperty;
 import androidx.appactions.interaction.capabilities.core.testing.spec.Argument;
@@ -60,25 +61,25 @@
                             Property::requiredEntityField,
                             Argument.Builder::setRequiredEntityField)
                     .bindOptionalOutput(
-                            "optionalStringOutput", Output::optionalStringField,
+                            "optionalStringOutput",
+                            Output::optionalStringField,
                             TypeConverters::toParamValue)
                     .bindRepeatedOutput(
-                            "repeatedStringOutput", Output::repeatedStringField,
+                            "repeatedStringOutput",
+                            Output::repeatedStringField,
                             TypeConverters::toParamValue)
                     .build();
-    @Rule
-    public final MockitoRule mockito = MockitoJUnit.rule();
-    @Captor
-    ArgumentCaptor<FulfillmentResponse> mCaptor;
-    @Mock
-    private CallbackInternal mCallbackInternal;
+    @Rule public final MockitoRule mockito = MockitoJUnit.rule();
+    @Captor ArgumentCaptor<FulfillmentResponse> mCaptor;
+    @Mock private CallbackInternal mCallbackInternal;
 
     @Test
     @SuppressWarnings("JdkImmutableCollections")
     public void execute_convertExecutionResult() {
         Property property =
-                Property.newBuilder().setRequiredEntityField(
-                        EntityProperty.newBuilder().build()).build();
+                Property.newBuilder()
+                        .setRequiredEntityField(EntityProperty.newBuilder().build())
+                        .build();
 
         ExecutionResult<Output> executionResult =
                 ExecutionResult.<Output>newBuilderWithOutput()
@@ -93,27 +94,33 @@
                         ACTION_SPEC,
                         Optional.of("id"),
                         property,
-                        (argument, callback) -> callback.onSuccess(executionResult));
+                        (argument) -> Futures.immediateFuture(executionResult));
         StructuredOutput expectedExecutionOutput =
                 StructuredOutput.newBuilder()
                         .addOutputValues(
                                 OutputValue.newBuilder()
                                         .setName("optionalStringOutput")
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test2").build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test2")
+                                                        .build())
                                         .build())
                         .addOutputValues(
                                 OutputValue.newBuilder()
                                         .setName("repeatedStringOutput")
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test3").build())
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test4").build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test3")
+                                                        .build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test4")
+                                                        .build())
                                         .build())
                         .build();
 
-        capability.execute(ArgumentsWrapper.create(Fulfillment.getDefaultInstance()),
-                mCallbackInternal);
+        capability.execute(
+                ArgumentsWrapper.create(Fulfillment.getDefaultInstance()), mCallbackInternal);
 
         verify(mCallbackInternal).onSuccess(mCaptor.capture());
         assertThat(mCaptor.getValue().getExecutionOutput().getOutputValuesList())
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecTest.java b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecTest.java
index f2cc5b8..341351f 100644
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecTest.java
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/impl/spec/ActionSpecTest.java
@@ -21,13 +21,13 @@
 import androidx.annotation.NonNull;
 import androidx.appactions.interaction.capabilities.core.ActionCapability;
 import androidx.appactions.interaction.capabilities.core.ActionExecutor;
-import androidx.appactions.interaction.capabilities.core.impl.ActionCapabilityInternal;
 import androidx.appactions.interaction.capabilities.core.impl.BuilderOf;
 import androidx.appactions.interaction.capabilities.core.impl.converters.TypeConverters;
 import androidx.appactions.interaction.capabilities.core.properties.Entity;
 import androidx.appactions.interaction.capabilities.core.properties.EntityProperty;
 import androidx.appactions.interaction.capabilities.core.properties.EnumProperty;
 import androidx.appactions.interaction.capabilities.core.properties.StringProperty;
+import androidx.appactions.interaction.capabilities.core.testing.TestingUtils;
 import androidx.appactions.interaction.capabilities.core.testing.spec.Output;
 import androidx.appactions.interaction.capabilities.core.values.EntityValue;
 import androidx.appactions.interaction.proto.AppActionsContext.AppAction;
@@ -83,10 +83,12 @@
                             Property::repeatedStringField,
                             Argument.Builder::setRepeatedStringField)
                     .bindOptionalOutput(
-                            "optionalStringOutput", Output::optionalStringField,
+                            "optionalStringOutput",
+                            Output::optionalStringField,
                             TypeConverters::toParamValue)
                     .bindRepeatedOutput(
-                            "repeatedStringOutput", Output::repeatedStringField,
+                            "repeatedStringOutput",
+                            Output::repeatedStringField,
                             TypeConverters::toParamValue)
                     .build();
 
@@ -110,9 +112,8 @@
                                 .build(),
                         StringProperty.EMPTY);
 
-        ActionCapabilityInternal capability =
-                (ActionCapabilityInternal) createCapability("id", property, (arg, callback) -> {
-                });
+        ActionCapability capability =
+                        createCapability("id", property, TestingUtils.createFakeActionExecutor());
 
         assertThat(capability.getAppAction())
                 .isEqualTo(
@@ -123,7 +124,8 @@
                                         IntentParameter.newBuilder()
                                                 .setName("requiredEntity")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("contact_2")
                                                                 .setName("Donald")
                                                                 .addAlternateNames("Duck")
@@ -163,11 +165,15 @@
                         Optional.of(
                                 EntityProperty.newBuilder()
                                         .addPossibleEntity(
-                                                Entity.newBuilder().setId("entity1").setName(
-                                                        "repeated entity1").build())
+                                                Entity.newBuilder()
+                                                        .setId("entity1")
+                                                        .setName("repeated entity1")
+                                                        .build())
                                         .addPossibleEntity(
-                                                Entity.newBuilder().setId("entity2").setName(
-                                                        "repeated entity2").build())
+                                                Entity.newBuilder()
+                                                        .setId("entity2")
+                                                        .setName("repeated entity2")
+                                                        .build())
                                         .setIsRequired(true)
                                         .build()),
                         StringProperty.EMPTY,
@@ -179,9 +185,8 @@
                                         .build()),
                         Optional.of(StringProperty.PROHIBITED));
 
-        ActionCapabilityInternal capability =
-                (ActionCapabilityInternal) createCapability("id", property, (arg, callback) -> {
-                });
+        ActionCapability capability =
+                        createCapability("id", property, TestingUtils.createFakeActionExecutor());
 
         assertThat(capability.getAppAction())
                 .isEqualTo(
@@ -192,7 +197,8 @@
                                         IntentParameter.newBuilder()
                                                 .setName("requiredEntity")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("contact_2")
                                                                 .setName("Donald")
                                                                 .addAlternateNames("Duck")
@@ -203,7 +209,8 @@
                                         IntentParameter.newBuilder()
                                                 .setName("optionalEntity")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("entity1")
                                                                 .setName("optional possible entity")
                                                                 .build())
@@ -213,7 +220,8 @@
                                         IntentParameter.newBuilder()
                                                 .setName("optionalEnum")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier(
                                                                         TestEnum.VALUE_1.toString())
                                                                 .build())
@@ -223,12 +231,14 @@
                                         IntentParameter.newBuilder()
                                                 .setName("repeatedEntity")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("entity1")
                                                                 .setName("repeated entity1")
                                                                 .build())
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("entity2")
                                                                 .setName("repeated entity2")
                                                                 .build())
@@ -239,15 +249,17 @@
                                         IntentParameter.newBuilder()
                                                 .setName("optionalString")
                                                 .addPossibleEntities(
-                                                        androidx.appactions.interaction.proto.Entity.newBuilder()
+                                                        androidx.appactions.interaction.proto.Entity
+                                                                .newBuilder()
                                                                 .setIdentifier("value1")
                                                                 .setName("value1")
                                                                 .build())
                                                 .setIsRequired(true)
                                                 .setEntityMatchRequired(true))
                                 .addParams(
-                                        IntentParameter.newBuilder().setName(
-                                                "repeatedString").setIsProhibited(true))
+                                        IntentParameter.newBuilder()
+                                                .setName("repeatedString")
+                                                .setIsProhibited(true))
                                 .build());
     }
 
@@ -265,16 +277,22 @@
                         .addOutputValues(
                                 OutputValue.newBuilder()
                                         .setName("optionalStringOutput")
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test2").build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test2")
+                                                        .build())
                                         .build())
                         .addOutputValues(
                                 OutputValue.newBuilder()
                                         .setName("repeatedStringOutput")
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test3").build())
-                                        .addValues(ParamValue.newBuilder().setStringValue(
-                                                "test4").build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test3")
+                                                        .build())
+                                        .addValues(
+                                                ParamValue.newBuilder()
+                                                        .setStringValue("test4")
+                                                        .build())
                                         .build())
                         .build();
 
@@ -354,8 +372,8 @@
                     repeatedStringField);
         }
 
-        static Property create(EntityProperty requiredEntityField,
-                StringProperty requiredStringField) {
+        static Property create(
+                EntityProperty requiredEntityField, StringProperty requiredStringField) {
             return create(
                     requiredEntityField,
                     Optional.empty(),
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImplTest.java b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImplTest.java
index 89df7ba..b73adf6 100644
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImplTest.java
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/task/impl/TaskCapabilityImplTest.java
@@ -39,9 +39,9 @@
 import androidx.annotation.NonNull;
 import androidx.appactions.interaction.capabilities.core.AbstractCapabilityBuilder;
 import androidx.appactions.interaction.capabilities.core.AbstractTaskHandlerBuilder;
+import androidx.appactions.interaction.capabilities.core.ActionCapability;
 import androidx.appactions.interaction.capabilities.core.ConfirmationOutput;
 import androidx.appactions.interaction.capabilities.core.ExecutionResult;
-import androidx.appactions.interaction.capabilities.core.impl.ActionCapabilityInternal;
 import androidx.appactions.interaction.capabilities.core.impl.ErrorStatusInternal;
 import androidx.appactions.interaction.capabilities.core.impl.TouchEventCallback;
 import androidx.appactions.interaction.capabilities.core.impl.concurrent.Futures;
@@ -90,7 +90,6 @@
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -232,7 +231,7 @@
 
     @Test
     public void getAppAction_executeNeverCalled_taskIsUninitialized() {
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -258,7 +257,7 @@
     @Test
     public void onInitInvoked_invokedOnce() throws Exception {
         AtomicInteger onSuccessInvocationCount = new AtomicInteger(0);
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -297,7 +296,7 @@
 
     @Test
     public void fulfillmentType_terminate_taskStateCleared() throws Exception {
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -341,7 +340,7 @@
     @Test
     public void fulfillmentType_cancel_taskStateCleared() throws Exception {
         SettableFutureWrapper<RequiredTaskUpdater> taskUpdaterCb = new SettableFutureWrapper<>();
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -381,7 +380,7 @@
 
     @Test
     public void fulfillmentType_unknown_errorReported() throws Exception {
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -527,7 +526,7 @@
                                         .setIsRequired(true)
                                         .build())
                         .build();
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         property,
                         TaskParamRegistry.builder().build(),
@@ -604,7 +603,7 @@
                 DISAMBIG_ENTITY_CONVERTER,
                 Optional.of(unused -> SearchAction.<EntityValue>newBuilder().build()),
                 TypeConverters::toEntityValue);
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         paramRegistry.build(),
@@ -854,8 +853,8 @@
                                                                 Arrays.asList("bar1", "bar2"))
                                                         .build())
                                         .build());
-        ActionCapabilityInternal capability =
-                (ActionCapabilityInternal)
+        ActionCapability capability =
+                (ActionCapability)
                         new CapabilityBuilder()
                                 .setTaskHandlerBuilder(
                                         new TaskHandlerBuilder()
@@ -910,7 +909,7 @@
         SettableFutureWrapper<FulfillmentResponse> touchEventResponse =
                 new SettableFutureWrapper<>();
 
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -956,7 +955,7 @@
         EntityValue slotValue = EntityValue.newBuilder().setId("id1").setValue("value").build();
         SettableFutureWrapper<RequiredTaskUpdater> updaterFuture = new SettableFutureWrapper<>();
         SettableFutureWrapper<Argument> onFinishFuture = new SettableFutureWrapper<>();
-        ActionCapabilityInternal capability =
+        ActionCapability capability =
                 createTaskCapability(
                         SINGLE_REQUIRED_FIELD_PROPERTY,
                         TaskParamRegistry.builder().build(),
@@ -1141,8 +1140,8 @@
                                                                 Arrays.asList("baz1", "baz2"))
                                                         .build())
                                         .build());
-        ActionCapabilityInternal capability =
-                (ActionCapabilityInternal)
+        ActionCapability capability =
+                (ActionCapability)
                         new CapabilityBuilderWithRequiredConfirmation()
                                 .setTaskHandlerBuilder(
                                         new TaskHandlerBuilderWithRequiredConfirmation()
@@ -1202,8 +1201,8 @@
                                                                 Arrays.asList("baz1", "baz2"))
                                                         .build())
                                         .build());
-        ActionCapabilityInternal capability =
-                (ActionCapabilityInternal)
+        ActionCapability capability =
+                (ActionCapability)
                         new CapabilityBuilderWithRequiredConfirmation()
                                 .setTaskHandlerBuilder(
                                         new TaskHandlerBuilderWithRequiredConfirmation()
@@ -1703,7 +1702,6 @@
             return RequiredTaskUpdater::new;
         }
 
-        @CanIgnoreReturnValue
         public TaskHandlerBuilder setOnReadyToConfirmListener(
                 OnReadyToConfirmListenerInternal<Confirmation> listener) {
             return super.setOnReadyToConfirmListenerInternal(listener);
@@ -1761,7 +1759,6 @@
             return RequiredTaskUpdater::new;
         }
 
-        @CanIgnoreReturnValue
         public TaskHandlerBuilderWithRequiredConfirmation setOnReadyToConfirmListener(
                 OnReadyToConfirmListenerInternal<Confirmation> listener) {
             return super.setOnReadyToConfirmListenerInternal(listener);
diff --git a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/TestingUtils.java b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/TestingUtils.java
index da5a952..77a56b6 100644
--- a/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/TestingUtils.java
+++ b/appactions/interaction/interaction-capabilities-core/src/test/java/androidx/appactions/interaction/capabilities/core/testing/TestingUtils.java
@@ -17,6 +17,7 @@
 package androidx.appactions.interaction.capabilities.core.testing;
 
 import androidx.annotation.NonNull;
+import androidx.appactions.interaction.capabilities.core.ActionExecutor;
 import androidx.appactions.interaction.capabilities.core.ConfirmationOutput;
 import androidx.appactions.interaction.capabilities.core.ExecutionResult;
 import androidx.appactions.interaction.capabilities.core.impl.CallbackInternal;
@@ -200,4 +201,10 @@
             return mResultRef.get();
         }
     }
+
+    public static <ArgumentT, OutputT>
+            ActionExecutor<ArgumentT, OutputT> createFakeActionExecutor() {
+        return (args) ->
+                Futures.immediateFuture(ExecutionResult.<OutputT>getDefaultInstanceWithOutput());
+    }
 }
diff --git a/appactions/interaction/interaction-capabilities-safety/api/current.txt b/appactions/interaction/interaction-capabilities-safety/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/appactions/interaction/interaction-capabilities-safety/api/public_plus_experimental_current.txt b/appactions/interaction/interaction-capabilities-safety/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/appactions/interaction/interaction-capabilities-safety/api/res-current.txt b/appactions/interaction/interaction-capabilities-safety/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/api/res-current.txt
diff --git a/appactions/interaction/interaction-capabilities-safety/api/restricted_current.txt b/appactions/interaction/interaction-capabilities-safety/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/appactions/interaction/interaction-capabilities-safety/build.gradle b/appactions/interaction/interaction-capabilities-safety/build.gradle
new file mode 100644
index 0000000..b9dae92
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+android {
+    namespace "androidx.appactions.interaction.capabilities.safety"
+}
+
+androidx {
+    name = "androidx.appactions.interaction:interaction-capabilities-safety"
+    type = LibraryType.PUBLISHED_LIBRARY
+    inceptionYear = "2023"
+    description = "Capability APIs for Safety vertical."
+}
diff --git a/appactions/interaction/interaction-capabilities-safety/src/main/java/androidx/appactions/interaction/capabilities/safety/androidx-appactions-interaction-interaction-capabilities-safety-documentation.md b/appactions/interaction/interaction-capabilities-safety/src/main/java/androidx/appactions/interaction/capabilities/safety/androidx-appactions-interaction-interaction-capabilities-safety-documentation.md
new file mode 100644
index 0000000..1346660
--- /dev/null
+++ b/appactions/interaction/interaction-capabilities-safety/src/main/java/androidx/appactions/interaction/capabilities/safety/androidx-appactions-interaction-interaction-capabilities-safety-documentation.md
@@ -0,0 +1,7 @@
+# Module root
+
+androidx.appactions.interaction interaction-capabilities-safety
+
+# Package androidx.appactions.interaction.capabilities.safety
+
+Insert package level documentation here
diff --git a/appcompat/appcompat-lint/integration-tests/OWNERS b/appcompat/appcompat-lint/integration-tests/OWNERS
index 20eea7c..7928c5c 100644
--- a/appcompat/appcompat-lint/integration-tests/OWNERS
+++ b/appcompat/appcompat-lint/integration-tests/OWNERS
@@ -1 +1,2 @@
+# Bug components: 461199
 alanv@google.com
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
index ffb51ab..65f052b 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
@@ -32,7 +32,7 @@
 @Suppress("UnstableApiUsage")
 class AppCompatIssueRegistry : IssueRegistry() {
     override val minApi = 10 // Only compatible with the latest lint
-    override val api = 13
+    override val api = 14
     override val issues get() = listOf(
         SetActionBarDetector.USING_CORE_ACTION_BAR,
         ColorStateListAlphaDetector.NOT_USING_ANDROID_ALPHA,
diff --git a/appcompat/appcompat-resources/OWNERS b/appcompat/appcompat-resources/OWNERS
index bef3eaf..4a87ade 100644
--- a/appcompat/appcompat-resources/OWNERS
+++ b/appcompat/appcompat-resources/OWNERS
@@ -1,5 +1,4 @@
-chrisbanes@google.com
-
+# Bug component: 461199
 # For vector related files
 tianliu@google.com
 ilake@google.com
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeForegroundDialogTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeForegroundDialogTestCase.kt
index a0e190b..10e01e6 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeForegroundDialogTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeForegroundDialogTestCase.kt
@@ -27,6 +27,7 @@
 import androidx.test.filters.LargeTest
 import androidx.testutils.LifecycleOwnerUtils.waitUntilState
 import junit.framework.TestCase.assertNotSame
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,6 +38,7 @@
     @get:Rule
     val rule = NightModeActivityTestRule(NightModeActivity::class.java)
 
+    @Ignore // b/266748645
     @Test
     fun testNightModeChangeWithForegroundDialog() {
         val firstActivity = rule.activity
diff --git a/appcompat/appcompat/src/main/res/values-or/strings.xml b/appcompat/appcompat/src/main/res/values-or/strings.xml
index 735f4ea..2ce1a310 100644
--- a/appcompat/appcompat/src/main/res/values-or/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-or/strings.xml
@@ -21,19 +21,19 @@
     <string name="abc_action_bar_up_description" msgid="8388173803310557296">"ଉପରକୁ ନେଭିଗେଟ୍ କରନ୍ତୁ"</string>
     <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"ଅଧିକ ବିକଳ୍ପ"</string>
     <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"ସଂକୁଚିତ କରନ୍ତୁ"</string>
-    <string name="abc_searchview_description_search" msgid="3417662926640357176">"ସନ୍ଧାନ କରନ୍ତୁ"</string>
+    <string name="abc_searchview_description_search" msgid="3417662926640357176">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
     <string name="abc_search_hint" msgid="7208076849092622260">"ସର୍ଚ୍ଚ କରନ୍ତୁ…"</string>
     <string name="abc_searchview_description_query" msgid="693312494995508443">"ସର୍ଚ୍ଚ କ୍ୱେରୀ"</string>
     <string name="abc_searchview_description_clear" msgid="3741173234950517107">"କ୍ୱେରୀ ଖାଲି କରନ୍ତୁ"</string>
     <string name="abc_searchview_description_submit" msgid="1486535517437947103">"କ୍ୱେରୀ ଦାଖଲ କରନ୍ତୁ"</string>
-    <string name="abc_searchview_description_voice" msgid="2293578557972875415">"ଭଏସ୍‌ ସର୍ଚ୍ଚ"</string>
+    <string name="abc_searchview_description_voice" msgid="2293578557972875415">"ଭଏସ ସର୍ଚ୍ଚ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2165779757652331008">"ଗୋଟିଏ ଆପ୍‍ ବାଛନ୍ତୁ"</string>
     <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="search_menu_title" msgid="6264217191555673260">"ସନ୍ଧାନ କରନ୍ତୁ"</string>
+    <string name="search_menu_title" msgid="6264217191555673260">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
     <string name="abc_prepend_shortcut_label" msgid="5520303668377388990">"ମେନୁ"</string>
     <string name="abc_menu_meta_shortcut_label" msgid="4192209724446364286">"Meta+"</string>
     <string name="abc_menu_ctrl_shortcut_label" msgid="2223301931652355242">"Ctrl+"</string>
diff --git a/appsearch/appsearch-builtin-types/OWNERS b/appsearch/appsearch-builtin-types/OWNERS
index e863f7d..c0af237 100644
--- a/appsearch/appsearch-builtin-types/OWNERS
+++ b/appsearch/appsearch-builtin-types/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 754644
 ddong@google.com
 saurabhkb@google.com
 quazi@google.com
diff --git a/appsearch/appsearch-builtin-types/build.gradle b/appsearch/appsearch-builtin-types/build.gradle
index 2850a0e..892b427 100644
--- a/appsearch/appsearch-builtin-types/build.gradle
+++ b/appsearch/appsearch-builtin-types/build.gradle
@@ -30,6 +30,7 @@
     androidTestImplementation project(':appsearch:appsearch')
     androidTestImplementation project(':appsearch:appsearch-local-storage')
     androidTestImplementation project(':appsearch:appsearch-test-util')
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
@@ -51,4 +52,8 @@
 
 android {
     namespace "androidx.appsearch.builtintypes"
+
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
diff --git a/appsearch/appsearch-ktx/build.gradle b/appsearch/appsearch-ktx/build.gradle
index 1f00bf2..fd812db 100644
--- a/appsearch/appsearch-ktx/build.gradle
+++ b/appsearch/appsearch-ktx/build.gradle
@@ -30,6 +30,7 @@
     androidTestImplementation project(':appsearch:appsearch')
     androidTestImplementation project(':appsearch:appsearch-local-storage')
     androidTestImplementation project(':appsearch:appsearch-test-util')
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.truth)
@@ -44,4 +45,8 @@
 
 android {
     namespace "androidx.appsearch.ktx"
+
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedFeatures.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedFeatures.java
index f8c6226..2eba5ee 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedFeatures.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedFeatures.java
@@ -46,6 +46,8 @@
                 // fall through
             case Features.VERBATIM_SEARCH:
                 // fall through
+            case Features.LIST_FILTER_QUERY_LANGUAGE:
+                // fall through
             case Features.SEARCH_RESULT_MATCH_INFO_SUBMATCH:
                 // fall through
             case Features.SEARCH_SPEC_PROPERTY_WEIGHTS:
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
index 69019b5..0e80ebe 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
@@ -204,6 +204,19 @@
             protoBuilder.setJoinSpec(joinSpecProtoBuilder);
         }
 
+        // TODO(b/208654892) Remove this field once EXPERIMENTAL_ICING_ADVANCED_QUERY is fully
+        //  supported.
+        boolean turnOnIcingAdvancedQuery =
+                mSearchSpec.isNumericSearchEnabled() || mSearchSpec.isVerbatimSearchEnabled()
+                        || mSearchSpec.isListFilterQueryLanguageEnabled();
+        if (turnOnIcingAdvancedQuery) {
+            protoBuilder.setSearchType(
+                    SearchSpecProto.SearchType.Code.EXPERIMENTAL_ICING_ADVANCED_QUERY);
+        }
+
+        // Set enabled features
+        protoBuilder.addAllEnabledFeatures(mSearchSpec.getEnabledFeatures());
+
         return protoBuilder.build();
     }
 
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
index 9e70974..2f9336e 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/FeaturesImpl.java
@@ -67,6 +67,10 @@
             case Features.VERBATIM_SEARCH:
                 // TODO(b/204333391) : Update to reflect support in Android U+ once this feature is
                 // synced over into service-appsearch.
+                // fall through
+            case Features.LIST_FILTER_QUERY_LANGUAGE:
+                // TODO(b/208654892) : Update to reflect support in Android U+ once this feature is
+                // synced over into service-appsearch.
                 return false;
             default:
                 return false;
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
index 6fc1d0b..cc2bd0a 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java
@@ -70,6 +70,8 @@
                 .setSnippetCount(jetpackSearchSpec.getSnippetCount())
                 .setSnippetCountPerProperty(jetpackSearchSpec.getSnippetCountPerProperty())
                 .setMaxSnippetSize(jetpackSearchSpec.getMaxSnippetSize());
+        //TODO(b/262512396): add the enabledFeatures set from the SearchSpec once it is synced
+        // across to platform.
         if (jetpackSearchSpec.getResultGroupingTypeFlags() != 0) {
             platformBuilder.setResultGrouping(
                     jetpackSearchSpec.getResultGroupingTypeFlags(),
diff --git a/appsearch/appsearch-test-util/build.gradle b/appsearch/appsearch-test-util/build.gradle
index 0896d14..d6395cf 100644
--- a/appsearch/appsearch-test-util/build.gradle
+++ b/appsearch/appsearch-test-util/build.gradle
@@ -29,6 +29,7 @@
     implementation('androidx.collection:collection:1.1.0')
     implementation(libs.truth)
 
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.truth)
@@ -45,4 +46,8 @@
 
 android {
     namespace "androidx.appsearch.testutil"
+
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
diff --git a/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index f747bf5..289cdbf 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -216,6 +216,7 @@
     field public static final String GLOBAL_SEARCH_SESSION_GET_SCHEMA = "GLOBAL_SEARCH_SESSION_GET_SCHEMA";
     field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
     field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
+    field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
     field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
     field public static final String SEARCH_RESULT_MATCH_INFO_SUBMATCH = "SEARCH_RESULT_MATCH_INFO_SUBMATCH";
     field public static final String SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION = "SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION";
@@ -489,6 +490,9 @@
     method public int getSnippetCount();
     method public int getSnippetCountPerProperty();
     method public int getTermMatch();
+    method public boolean isListFilterQueryLanguageEnabled();
+    method public boolean isNumericSearchEnabled();
+    method public boolean isVerbatimSearchEnabled();
     field public static final int GROUPING_TYPE_PER_NAMESPACE = 2; // 0x2
     field public static final int GROUPING_TYPE_PER_PACKAGE = 1; // 0x1
     field public static final int ORDER_ASCENDING = 1; // 0x1
@@ -524,7 +528,9 @@
     method public androidx.appsearch.app.SearchSpec.Builder addProjectionsForDocumentClass(Class<?>, java.util.Collection<java.lang.String!>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SearchSpec build();
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.JOIN_SPEC_AND_QUALIFIED_ID) public androidx.appsearch.app.SearchSpec.Builder setJoinSpec(androidx.appsearch.app.JoinSpec);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.LIST_FILTER_QUERY_LANGUAGE) public androidx.appsearch.app.SearchSpec.Builder setListFilterQueryLanguageEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.NUMERIC_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setNumericSearchEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPaths(String, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPathsForDocumentClass(Class<?>, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>) throws androidx.appsearch.exceptions.AppSearchException;
@@ -537,6 +543,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCount(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCountPerProperty(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setTermMatch(int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.VERBATIM_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setVerbatimSearchEnabled(boolean);
   }
 
   public class SearchSuggestionResult {
diff --git a/appsearch/appsearch/api/public_plus_experimental_current.txt b/appsearch/appsearch/api/public_plus_experimental_current.txt
index f747bf5..289cdbf 100644
--- a/appsearch/appsearch/api/public_plus_experimental_current.txt
+++ b/appsearch/appsearch/api/public_plus_experimental_current.txt
@@ -216,6 +216,7 @@
     field public static final String GLOBAL_SEARCH_SESSION_GET_SCHEMA = "GLOBAL_SEARCH_SESSION_GET_SCHEMA";
     field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
     field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
+    field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
     field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
     field public static final String SEARCH_RESULT_MATCH_INFO_SUBMATCH = "SEARCH_RESULT_MATCH_INFO_SUBMATCH";
     field public static final String SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION = "SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION";
@@ -489,6 +490,9 @@
     method public int getSnippetCount();
     method public int getSnippetCountPerProperty();
     method public int getTermMatch();
+    method public boolean isListFilterQueryLanguageEnabled();
+    method public boolean isNumericSearchEnabled();
+    method public boolean isVerbatimSearchEnabled();
     field public static final int GROUPING_TYPE_PER_NAMESPACE = 2; // 0x2
     field public static final int GROUPING_TYPE_PER_PACKAGE = 1; // 0x1
     field public static final int ORDER_ASCENDING = 1; // 0x1
@@ -524,7 +528,9 @@
     method public androidx.appsearch.app.SearchSpec.Builder addProjectionsForDocumentClass(Class<?>, java.util.Collection<java.lang.String!>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SearchSpec build();
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.JOIN_SPEC_AND_QUALIFIED_ID) public androidx.appsearch.app.SearchSpec.Builder setJoinSpec(androidx.appsearch.app.JoinSpec);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.LIST_FILTER_QUERY_LANGUAGE) public androidx.appsearch.app.SearchSpec.Builder setListFilterQueryLanguageEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.NUMERIC_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setNumericSearchEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPaths(String, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPathsForDocumentClass(Class<?>, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>) throws androidx.appsearch.exceptions.AppSearchException;
@@ -537,6 +543,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCount(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCountPerProperty(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setTermMatch(int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.VERBATIM_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setVerbatimSearchEnabled(boolean);
   }
 
   public class SearchSuggestionResult {
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index f747bf5..289cdbf 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -216,6 +216,7 @@
     field public static final String GLOBAL_SEARCH_SESSION_GET_SCHEMA = "GLOBAL_SEARCH_SESSION_GET_SCHEMA";
     field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
     field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
+    field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
     field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
     field public static final String SEARCH_RESULT_MATCH_INFO_SUBMATCH = "SEARCH_RESULT_MATCH_INFO_SUBMATCH";
     field public static final String SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION = "SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION";
@@ -489,6 +490,9 @@
     method public int getSnippetCount();
     method public int getSnippetCountPerProperty();
     method public int getTermMatch();
+    method public boolean isListFilterQueryLanguageEnabled();
+    method public boolean isNumericSearchEnabled();
+    method public boolean isVerbatimSearchEnabled();
     field public static final int GROUPING_TYPE_PER_NAMESPACE = 2; // 0x2
     field public static final int GROUPING_TYPE_PER_PACKAGE = 1; // 0x1
     field public static final int ORDER_ASCENDING = 1; // 0x1
@@ -524,7 +528,9 @@
     method public androidx.appsearch.app.SearchSpec.Builder addProjectionsForDocumentClass(Class<?>, java.util.Collection<java.lang.String!>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SearchSpec build();
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.JOIN_SPEC_AND_QUALIFIED_ID) public androidx.appsearch.app.SearchSpec.Builder setJoinSpec(androidx.appsearch.app.JoinSpec);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.LIST_FILTER_QUERY_LANGUAGE) public androidx.appsearch.app.SearchSpec.Builder setListFilterQueryLanguageEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setMaxSnippetSize(@IntRange(from=0, to=0x2710) int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.NUMERIC_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setNumericSearchEnabled(boolean);
     method public androidx.appsearch.app.SearchSpec.Builder setOrder(int);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPaths(String, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>);
     method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.SEARCH_SPEC_PROPERTY_WEIGHTS) public androidx.appsearch.app.SearchSpec.Builder setPropertyWeightPathsForDocumentClass(Class<?>, java.util.Map<androidx.appsearch.app.PropertyPath!,java.lang.Double!>) throws androidx.appsearch.exceptions.AppSearchException;
@@ -537,6 +543,7 @@
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCount(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setSnippetCountPerProperty(@IntRange(from=0, to=0x2710) int);
     method public androidx.appsearch.app.SearchSpec.Builder setTermMatch(int);
+    method @RequiresFeature(enforcement="androidx.appsearch.app.Features#isFeatureSupported", name=androidx.appsearch.app.Features.VERBATIM_SEARCH) public androidx.appsearch.app.SearchSpec.Builder setVerbatimSearchEnabled(boolean);
   }
 
   public class SearchSuggestionResult {
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
index 42de090..106c244 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
@@ -38,6 +38,9 @@
                 .setResultCountPerPage(42)
                 .setOrder(SearchSpec.ORDER_ASCENDING)
                 .setRankingStrategy(SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE)
+                .setNumericSearchEnabled(true)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
                 .build();
 
         Bundle bundle = searchSpec.getBundle();
@@ -56,5 +59,27 @@
         assertThat(bundle.getInt(SearchSpec.ORDER_FIELD)).isEqualTo(SearchSpec.ORDER_ASCENDING);
         assertThat(bundle.getInt(SearchSpec.RANKING_STRATEGY_FIELD))
                 .isEqualTo(SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE);
+        assertThat(bundle.getStringArrayList(SearchSpec.ENABLED_FEATURES_FIELD)).containsExactly(
+                Features.NUMERIC_SEARCH, Features.VERBATIM_SEARCH,
+                Features.LIST_FILTER_QUERY_LANGUAGE);
+    }
+
+    @Test
+    public void testBuildMultipleSearchSpecs() {
+        SearchSpec.Builder builder = new SearchSpec.Builder();
+        SearchSpec searchSpec1 = builder.build();
+        assertThat(searchSpec1.getEnabledFeatures()).isEmpty();
+
+        SearchSpec searchSpec2 = builder.setNumericSearchEnabled(true).build();
+        // Check that reusing the builder for new SearchSpec does not change old built SearchSpec.
+        assertThat(searchSpec1.getEnabledFeatures()).isEmpty();
+        assertThat(searchSpec2.getEnabledFeatures()).containsExactly(Features.NUMERIC_SEARCH);
+
+        SearchSpec searchSpec3 = builder.setNumericSearchEnabled(false)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
+                .build();
+        assertThat(searchSpec3.getEnabledFeatures()).containsExactly(
+                Features.VERBATIM_SEARCH, Features.LIST_FILTER_QUERY_LANGUAGE);
     }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index fb31d2e..acb2ed1 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -3718,6 +3718,72 @@
     }
 
     @Test
+    public void testQuery_verbatimSearch() throws Exception {
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.VERBATIM_SEARCH));
+        AppSearchSchema verbatimSchema = new AppSearchSchema.Builder("VerbatimSchema")
+                .addProperty(new StringPropertyConfig.Builder("verbatimProp")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
+                        .setTokenizerType(StringPropertyConfig.TOKENIZER_TYPE_VERBATIM)
+                        .build()
+                ).build();
+        mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
+                .setForceOverride(true).addSchemas(verbatimSchema).build()).get();
+
+        GenericDocument email = new GenericDocument.Builder<>(
+                "namespace1", "id1", "VerbatimSchema")
+                .setPropertyString("verbatimProp", "Hello, world!")
+                .build();
+        mDb1.putAsync(new PutDocumentsRequest.Builder().addGenericDocuments(email).build()).get();
+
+        SearchResults sr = mDb1.search("\"Hello, world!\"",
+                new SearchSpec.Builder().setVerbatimSearchEnabled(true).build());
+        List<SearchResult> page = sr.getNextPageAsync().get();
+
+        // Verbatim tokenization would produce one token 'Hello, world!'.
+        assertThat(page).hasSize(1);
+        assertThat(page.get(0).getGenericDocument().getId()).isEqualTo("id1");
+    }
+
+    @Test
+    public void testQuery_verbatimSearchWithoutEnablingFeatureFails() throws Exception {
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.VERBATIM_SEARCH));
+        AppSearchSchema verbatimSchema = new AppSearchSchema.Builder("VerbatimSchema")
+                .addProperty(new StringPropertyConfig.Builder("verbatimProp")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
+                        .setTokenizerType(StringPropertyConfig.TOKENIZER_TYPE_VERBATIM)
+                        .build()
+                ).build();
+        mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
+                .setForceOverride(true).addSchemas(verbatimSchema).build()).get();
+
+        GenericDocument email = new GenericDocument.Builder<>(
+                "namespace1", "id1", "VerbatimSchema")
+                .setPropertyString("verbatimProp", "Hello, world!")
+                .build();
+        mDb1.putAsync(new PutDocumentsRequest.Builder().addGenericDocuments(email).build()).get();
+
+        // TODO(b/208654892) Disable ListFilterQueryLanguage once EXPERIMENTAL_ICING_ADVANCED_QUERY
+        //  is fully supported.
+        // ListFilterQueryLanguage is enabled so that EXPERIMENTAL_ICING_ADVANCED_QUERY gets enabled
+        // in IcingLib.
+        // Disable VERBATIM_SEARCH in the SearchSpec.
+        SearchResults searchResults = mDb1.search("\"Hello, world!\"",
+                new SearchSpec.Builder()
+                        .setListFilterQueryLanguageEnabled(true)
+                        .setVerbatimSearchEnabled(false)
+                        .build());
+        Throwable throwable = assertThrows(ExecutionException.class,
+                () -> searchResults.getNextPageAsync().get()).getCause();
+        assertThat(throwable).isInstanceOf(AppSearchException.class);
+        AppSearchException exception = (AppSearchException) throwable;
+        assertThat(exception.getResultCode()).isEqualTo(RESULT_INVALID_ARGUMENT);
+        assertThat(exception).hasMessageThat().contains("Attempted use of unenabled feature");
+        assertThat(exception).hasMessageThat().contains(Features.VERBATIM_SEARCH);
+    }
+
+    @Test
     public void testQuery_propertyWeights() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.SEARCH_SPEC_PROPERTY_WEIGHTS));
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
index 6a2a8f8..038cd56 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
@@ -75,6 +75,9 @@
                 .addProjection("schemaType2", expectedPropertyPaths2)
                 .setPropertyWeights("schemaType1", expectedPropertyWeights)
                 .setPropertyWeightPaths("schemaType2", expectedPropertyWeightPaths)
+                .setNumericSearchEnabled(true)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
                 .build();
 
         assertThat(searchSpec.getTermMatch()).isEqualTo(SearchSpec.TERM_MATCH_PREFIX);
@@ -109,6 +112,9 @@
                         new PropertyPath("property2"), 2.0);
         assertThat(searchSpec.getPropertyWeightPaths().get("schemaType2"))
                 .containsExactly(new PropertyPath("property1.nested"), 1.0);
+        assertThat(searchSpec.isNumericSearchEnabled()).isTrue();
+        assertThat(searchSpec.isVerbatimSearchEnabled()).isTrue();
+        assertThat(searchSpec.isListFilterQueryLanguageEnabled()).isTrue();
     }
 
     @Test
@@ -333,6 +339,27 @@
     }
 
     @Test
+    public void testSetFeatureEnabledToFalse() {
+        SearchSpec.Builder builder = new SearchSpec.Builder();
+        SearchSpec searchSpec = builder.setNumericSearchEnabled(true)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
+                .build();
+        assertThat(searchSpec.isNumericSearchEnabled()).isTrue();
+        assertThat(searchSpec.isVerbatimSearchEnabled()).isTrue();
+        assertThat(searchSpec.isListFilterQueryLanguageEnabled()).isTrue();
+
+        searchSpec = builder.setNumericSearchEnabled(false)
+                .setVerbatimSearchEnabled(false)
+                .setListFilterQueryLanguageEnabled(false)
+                .build();
+        assertThat(searchSpec.isNumericSearchEnabled()).isFalse();
+        assertThat(searchSpec.isVerbatimSearchEnabled()).isFalse();
+        assertThat(searchSpec.isListFilterQueryLanguageEnabled()).isFalse();
+    }
+
+
+    @Test
     public void testInvalidAdvancedRanking() {
         assertThrows(IllegalArgumentException.class,
                 () -> new SearchSpec.Builder().setRankingStrategy(""));
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
index d3fcbba..21c1ce4 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
@@ -91,7 +91,34 @@
      */
     String VERBATIM_SEARCH = "VERBATIM_SEARCH";
 
-    /** Feature for {@link #isFeatureSupported}. This feature covers
+    /**
+     * Feature for {@link #isFeatureSupported(String)}. This feature covers the
+     * expansion of the query language to conform to the definition of the list
+     * filters language (https://aip.dev/160). This includes:
+     * <ul>
+     * <li>addition of explicit 'AND' and 'NOT' operators</li>
+     * <li>property restricts are allowed with grouping (ex. "prop:(a OR b)")</li>
+     * <li>addition of custom functions to control matching</li>
+     * </ul>
+     *
+     * <p>The newly added custom functions covered by this feature are:
+     * <ul>
+     * <li>createList(String...)</li>
+     * <li>termSearch(String, List<String>)</li>
+     * </ul>
+     *
+     * <p>createList takes a variable number of strings and returns a list of strings.
+     * It is for use with termSearch.
+     *
+     * <p>termSearch takes a query string that will be parsed according to the supported
+     * query language and an optional list of strings that specify the properties to be
+     * restricted to. This exists as a convenience for multiple property restricts. So,
+     * for example, the query "(subject:foo OR body:foo) (subject:bar OR body:bar)"
+     * could be rewritten as "termSearch(\"foo bar\", createList(\"subject\", \"bar\"))"
+     */
+    String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
+
+    /** Feature for {@link #isFeatureSupported(String)}. This feature covers
      * {@link SearchSpec.Builder#setPropertyWeights}.
      */
     String SEARCH_SPEC_PROPERTY_WEIGHTS = "SEARCH_SPEC_PROPERTY_WEIGHTS";
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
index b469087..bfb9609 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
@@ -29,6 +29,7 @@
 import androidx.appsearch.exceptions.AppSearchException;
 import androidx.appsearch.util.BundleUtil;
 import androidx.collection.ArrayMap;
+import androidx.collection.ArraySet;
 import androidx.core.util.Preconditions;
 
 import java.lang.annotation.Retention;
@@ -69,6 +70,7 @@
     static final String TYPE_PROPERTY_WEIGHTS_FIELD = "typePropertyWeightsField";
     static final String JOIN_SPEC = "joinSpec";
     static final String ADVANCED_RANKING_EXPRESSION = "advancedRankingExpression";
+    static final String ENABLED_FEATURES_FIELD = "enabledFeatures";
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -448,11 +450,54 @@
         return mBundle.getString(ADVANCED_RANKING_EXPRESSION, "");
     }
 
+    /**
+     * Returns whether the {@link Features#NUMERIC_SEARCH} feature is enabled.
+     *
+     * TODO(b/259744228): add more documentation about the numeric search feature and when it
+     * needs to be enabled.
+     */
+    public boolean isNumericSearchEnabled() {
+        return getEnabledFeatures().contains(Features.NUMERIC_SEARCH);
+    }
+
+    /**
+     * Returns whether the {@link Features#VERBATIM_SEARCH} feature is enabled.
+     *
+     * TODO(b/204333391): add more documentation about the verbatim search feature and when it
+     * needs to be enabled.
+     */
+    public boolean isVerbatimSearchEnabled() {
+        return getEnabledFeatures().contains(Features.VERBATIM_SEARCH);
+    }
+
+    /**
+     * Returns whether the {@link Features#LIST_FILTER_QUERY_LANGUAGE} feature is enabled.
+     *
+     * TODO(b/208654892): add more documentation about the list filter query language feature and
+     * when it needs to be enabled.
+     */
+    public boolean isListFilterQueryLanguageEnabled() {
+        return getEnabledFeatures().contains(Features.LIST_FILTER_QUERY_LANGUAGE);
+    }
+
+    /**
+     * Get the list of enabled features that the caller is intending to use in this search call.
+     *
+     * @return the set of {@link Features} enabled in this {@link SearchSpec} Entry.
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @NonNull
+    public List<String> getEnabledFeatures() {
+        return mBundle.getStringArrayList(ENABLED_FEATURES_FIELD);
+    }
+
     /** Builder for {@link SearchSpec objects}. */
     public static final class Builder {
         private ArrayList<String> mSchemas = new ArrayList<>();
         private ArrayList<String> mNamespaces = new ArrayList<>();
         private ArrayList<String> mPackageNames = new ArrayList<>();
+        private ArraySet<String> mEnabledFeatures = new ArraySet<>();
         private Bundle mProjectionTypePropertyMasks = new Bundle();
         private Bundle mTypePropertyWeights = new Bundle();
 
@@ -1233,6 +1278,60 @@
 // @exportToFramework:endStrip()
 
         /**
+         * Sets the {@link Features#NUMERIC_SEARCH} feature as enabled/disabled according to the
+         * enabled parameter.
+         *
+         * @param enabled Enables the feature if true, otherwise disables it.
+         *
+         * TODO(b/259744228): add more documentation about the numeric search feature and when it
+         *               needs to be enabled.
+         */
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.NUMERIC_SEARCH)
+        @NonNull
+        public Builder setNumericSearchEnabled(boolean enabled) {
+            modifyEnabledFeature(Features.NUMERIC_SEARCH, enabled);
+            return this;
+        }
+
+        /**
+         * Sets the {@link Features#VERBATIM_SEARCH} feature as enabled/disabled according to the
+         * enabled parameter.
+         *
+         * @param enabled Enables the feature if true, otherwise disables it
+         *
+         * TODO(b/204333391): add more documentation about the verbatim search feature and when
+         *                it needs to be enabled.
+         */
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.VERBATIM_SEARCH)
+        @NonNull
+        public Builder setVerbatimSearchEnabled(boolean enabled) {
+            modifyEnabledFeature(Features.VERBATIM_SEARCH, enabled);
+            return this;
+        }
+
+        /**
+         * Sets the {@link Features#LIST_FILTER_QUERY_LANGUAGE} feature as enabled/disabled
+         * according to the enabled parameter.
+         *
+         * @param enabled Enables the feature if true, otherwise disables it.
+         *
+         * TODO(b/208654892): add more documentation about the list filter query language feature
+         *               and when it needs to be enabled.
+         */
+        @RequiresFeature(
+                enforcement = "androidx.appsearch.app.Features#isFeatureSupported",
+                name = Features.LIST_FILTER_QUERY_LANGUAGE)
+        @NonNull
+        public Builder setListFilterQueryLanguageEnabled(boolean enabled) {
+            modifyEnabledFeature(Features.LIST_FILTER_QUERY_LANGUAGE, enabled);
+            return this;
+        }
+
+        /**
          * Constructs a new {@link SearchSpec} from the contents of this builder.
          *
          * @throws IllegalArgumentException if property weights are provided with a
@@ -1265,6 +1364,7 @@
             bundle.putStringArrayList(SCHEMA_FIELD, mSchemas);
             bundle.putStringArrayList(NAMESPACE_FIELD, mNamespaces);
             bundle.putStringArrayList(PACKAGE_NAME_FIELD, mPackageNames);
+            bundle.putStringArrayList(ENABLED_FEATURES_FIELD, new ArrayList<>(mEnabledFeatures));
             bundle.putBundle(PROJECTION_TYPE_PROPERTY_PATHS_FIELD, mProjectionTypePropertyMasks);
             bundle.putInt(NUM_PER_PAGE_FIELD, mResultCountPerPage);
             bundle.putInt(TERM_MATCH_TYPE_FIELD, mTermMatchType);
@@ -1296,5 +1396,14 @@
                 mBuilt = false;
             }
         }
+
+        private void modifyEnabledFeature(@NonNull String feature, boolean enabled) {
+            resetIfBuilt();
+            if (enabled) {
+                mEnabledFeatures.add(feature);
+            } else {
+                mEnabledFeatures.remove(feature);
+            }
+        }
     }
 }
diff --git a/asynclayoutinflater/OWNERS b/asynclayoutinflater/OWNERS
index 249dcb0..cecc689 100644
--- a/asynclayoutinflater/OWNERS
+++ b/asynclayoutinflater/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461277
 jreck@google.com
diff --git a/autofill/OWNERS b/autofill/OWNERS
index c3c9dc4..76bee66 100644
--- a/autofill/OWNERS
+++ b/autofill/OWNERS
@@ -1,8 +1,6 @@
-adamhe@google.com
+# Bug component: 697479
 augale@google.com
-fengcao@google.com
 jcivelli@google.com
 joannechung@google.com
 lpeter@google.com
-svetoslavganov@google.com
 tymtsai@google.com
\ No newline at end of file
diff --git a/benchmark/OWNERS b/benchmark/OWNERS
index eeaf357..42bca6c 100644
--- a/benchmark/OWNERS
+++ b/benchmark/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1229612
 ccraik@google.com
 dustinlam@google.com
 jgielzak@google.com
diff --git a/benchmark/benchmark-common/api/current.ignore b/benchmark/benchmark-common/api/current.ignore
new file mode 100644
index 0000000..3de172d
--- /dev/null
+++ b/benchmark/benchmark-common/api/current.ignore
@@ -0,0 +1,21 @@
+// Baseline format: 1.0
+RemovedClass: androidx.benchmark.Api21Kt:
+    Removed class androidx.benchmark.Api21Kt
+RemovedClass: androidx.benchmark.Api24Kt:
+    Removed class androidx.benchmark.Api24Kt
+RemovedClass: androidx.benchmark.Api27Kt:
+    Removed class androidx.benchmark.Api27Kt
+RemovedClass: androidx.benchmark.Api29Kt:
+    Removed class androidx.benchmark.Api29Kt
+RemovedClass: androidx.benchmark.ConfigurationErrorKt:
+    Removed class androidx.benchmark.ConfigurationErrorKt
+RemovedClass: androidx.benchmark.MetricNameUtilsKt:
+    Removed class androidx.benchmark.MetricNameUtilsKt
+RemovedClass: androidx.benchmark.ProfilerKt:
+    Removed class androidx.benchmark.ProfilerKt
+RemovedClass: androidx.benchmark.UserspaceTracingKt:
+    Removed class androidx.benchmark.UserspaceTracingKt
+
+
+RemovedPackage: androidx.benchmark.perfetto:
+    Removed package androidx.benchmark.perfetto
diff --git a/benchmark/benchmark-common/api/current.txt b/benchmark/benchmark-common/api/current.txt
index 421c7d0..fbecc64 100644
--- a/benchmark/benchmark-common/api/current.txt
+++ b/benchmark/benchmark-common/api/current.txt
@@ -1,18 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark {
 
-  @RequiresApi(21) public final class Api21Kt {
-  }
-
-  @RequiresApi(24) public final class Api24Kt {
-  }
-
-  @RequiresApi(27) public final class Api27Kt {
-  }
-
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   public final class ArgumentsKt {
   }
 
@@ -26,30 +14,5 @@
   public static final class BenchmarkState.Companion {
   }
 
-  public final class ConfigurationErrorKt {
-  }
-
-  public final class MetricNameUtilsKt {
-  }
-
-  public final class ProfilerKt {
-  }
-
-  public final class ShellKt {
-  }
-
-  public final class UserspaceTracingKt {
-  }
-
-}
-
-package androidx.benchmark.perfetto {
-
-  public final class PerfettoConfigKt {
-  }
-
-  public final class UiStateKt {
-  }
-
 }
 
diff --git a/benchmark/benchmark-common/api/public_plus_experimental_current.txt b/benchmark/benchmark-common/api/public_plus_experimental_current.txt
index 07ca9f6..1d9e4cd 100644
--- a/benchmark/benchmark-common/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-common/api/public_plus_experimental_current.txt
@@ -1,18 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark {
 
-  @RequiresApi(21) public final class Api21Kt {
-  }
-
-  @RequiresApi(24) public final class Api24Kt {
-  }
-
-  @RequiresApi(27) public final class Api27Kt {
-  }
-
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   public final class ArgumentsKt {
   }
 
@@ -33,24 +21,9 @@
   @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public static @interface BenchmarkState.Companion.ExperimentalExternalReport {
   }
 
-  public final class ConfigurationErrorKt {
-  }
-
   @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalBenchmarkStateApi {
   }
 
-  public final class MetricNameUtilsKt {
-  }
-
-  public final class ProfilerKt {
-  }
-
-  public final class ShellKt {
-  }
-
-  public final class UserspaceTracingKt {
-  }
-
 }
 
 package androidx.benchmark.perfetto {
@@ -58,9 +31,6 @@
   @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalPerfettoCaptureApi {
   }
 
-  public final class PerfettoConfigKt {
-  }
-
   @RequiresApi(21) @androidx.benchmark.perfetto.ExperimentalPerfettoCaptureApi public final class PerfettoTrace {
     ctor public PerfettoTrace(String path);
     method public String getPath();
@@ -79,8 +49,5 @@
     method public void record(String fileLabel, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public final class UiStateKt {
-  }
-
 }
 
diff --git a/benchmark/benchmark-common/api/restricted_current.ignore b/benchmark/benchmark-common/api/restricted_current.ignore
new file mode 100644
index 0000000..3de172d
--- /dev/null
+++ b/benchmark/benchmark-common/api/restricted_current.ignore
@@ -0,0 +1,21 @@
+// Baseline format: 1.0
+RemovedClass: androidx.benchmark.Api21Kt:
+    Removed class androidx.benchmark.Api21Kt
+RemovedClass: androidx.benchmark.Api24Kt:
+    Removed class androidx.benchmark.Api24Kt
+RemovedClass: androidx.benchmark.Api27Kt:
+    Removed class androidx.benchmark.Api27Kt
+RemovedClass: androidx.benchmark.Api29Kt:
+    Removed class androidx.benchmark.Api29Kt
+RemovedClass: androidx.benchmark.ConfigurationErrorKt:
+    Removed class androidx.benchmark.ConfigurationErrorKt
+RemovedClass: androidx.benchmark.MetricNameUtilsKt:
+    Removed class androidx.benchmark.MetricNameUtilsKt
+RemovedClass: androidx.benchmark.ProfilerKt:
+    Removed class androidx.benchmark.ProfilerKt
+RemovedClass: androidx.benchmark.UserspaceTracingKt:
+    Removed class androidx.benchmark.UserspaceTracingKt
+
+
+RemovedPackage: androidx.benchmark.perfetto:
+    Removed package androidx.benchmark.perfetto
diff --git a/benchmark/benchmark-common/api/restricted_current.txt b/benchmark/benchmark-common/api/restricted_current.txt
index eb3307a..df789c6 100644
--- a/benchmark/benchmark-common/api/restricted_current.txt
+++ b/benchmark/benchmark-common/api/restricted_current.txt
@@ -1,18 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark {
 
-  @RequiresApi(21) public final class Api21Kt {
-  }
-
-  @RequiresApi(24) public final class Api24Kt {
-  }
-
-  @RequiresApi(27) public final class Api27Kt {
-  }
-
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   public final class ArgumentsKt {
   }
 
@@ -28,30 +16,5 @@
   public static final class BenchmarkState.Companion {
   }
 
-  public final class ConfigurationErrorKt {
-  }
-
-  public final class MetricNameUtilsKt {
-  }
-
-  public final class ProfilerKt {
-  }
-
-  public final class ShellKt {
-  }
-
-  public final class UserspaceTracingKt {
-  }
-
-}
-
-package androidx.benchmark.perfetto {
-
-  public final class PerfettoConfigKt {
-  }
-
-  public final class UiStateKt {
-  }
-
 }
 
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Shell.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Shell.kt
index b0b4ad3..9b279ae 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Shell.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Shell.kt
@@ -301,6 +301,18 @@
     }
 
     /**
+     * Direct execution of executeShellCommand which doesn't account for scripting functionality,
+     * and doesn't capture stderr.
+     *
+     * Only use this function if you do not care about failure / errors.
+     */
+    @RequiresApi(21)
+    @CheckResult
+    fun executeCommandCaptureStdoutOnly(command: String): String {
+        return ShellImpl.executeCommandUnsafe(command)
+    }
+
+    /**
      * Creates a executable shell script that can be started. Similar to [executeScriptCaptureStdoutStderr]
      * but allows deferring and caching script execution.
      *
diff --git a/benchmark/benchmark-macro/api/current.ignore b/benchmark/benchmark-macro/api/current.ignore
new file mode 100644
index 0000000..12f722e
--- /dev/null
+++ b/benchmark/benchmark-macro/api/current.ignore
@@ -0,0 +1,23 @@
+// Baseline format: 1.0
+RemovedClass: androidx.benchmark.macro.Api29Kt:
+    Removed class androidx.benchmark.macro.Api29Kt
+RemovedClass: androidx.benchmark.macro.BaselineProfilesKt:
+    Removed class androidx.benchmark.macro.BaselineProfilesKt
+RemovedClass: androidx.benchmark.macro.CompilationModeKt:
+    Removed class androidx.benchmark.macro.CompilationModeKt
+RemovedClass: androidx.benchmark.macro.IdeSummaryStringKt:
+    Removed class androidx.benchmark.macro.IdeSummaryStringKt
+RemovedClass: androidx.benchmark.macro.IterationResultKt:
+    Removed class androidx.benchmark.macro.IterationResultKt
+RemovedClass: androidx.benchmark.macro.MacrobenchmarkKt:
+    Removed class androidx.benchmark.macro.MacrobenchmarkKt
+RemovedClass: androidx.benchmark.macro.MetricKt:
+    Removed class androidx.benchmark.macro.MetricKt
+RemovedClass: androidx.benchmark.macro.MetricResultExtensionsKt:
+    Removed class androidx.benchmark.macro.MetricResultExtensionsKt
+RemovedClass: androidx.benchmark.macro.TagKt:
+    Removed class androidx.benchmark.macro.TagKt
+
+
+RemovedPackage: androidx.benchmark.macro.perfetto:
+    Removed package androidx.benchmark.macro.perfetto
diff --git a/benchmark/benchmark-macro/api/current.txt b/benchmark/benchmark-macro/api/current.txt
index 7840107..79e6202 100644
--- a/benchmark/benchmark-macro/api/current.txt
+++ b/benchmark/benchmark-macro/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark.macro {
 
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   public enum BaselineProfileMode {
     method public static androidx.benchmark.macro.BaselineProfileMode valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.benchmark.macro.BaselineProfileMode[] values();
@@ -12,9 +9,6 @@
     enum_constant public static final androidx.benchmark.macro.BaselineProfileMode UseIfAvailable;
   }
 
-  public final class BaselineProfilesKt {
-  }
-
   public abstract sealed class CompilationMode {
     field public static final androidx.benchmark.macro.CompilationMode.Companion Companion;
     field public static final androidx.benchmark.macro.CompilationMode DEFAULT;
@@ -41,22 +35,10 @@
     property public final int warmupIterations;
   }
 
-  public final class CompilationModeKt {
-  }
-
   public final class FrameTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public FrameTimingMetric();
   }
 
-  public final class IdeSummaryStringKt {
-  }
-
-  public final class IterationResultKt {
-  }
-
-  public final class MacrobenchmarkKt {
-  }
-
   public final class MacrobenchmarkScope {
     ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
     method public void dropKernelPageCache();
@@ -79,12 +61,6 @@
   public abstract sealed class Metric {
   }
 
-  public final class MetricKt {
-  }
-
-  public final class MetricResultExtensionsKt {
-  }
-
   public enum StartupMode {
     method public static androidx.benchmark.macro.StartupMode valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.benchmark.macro.StartupMode[] values();
@@ -97,24 +73,5 @@
     ctor public StartupTimingMetric();
   }
 
-  public final class TagKt {
-  }
-
-}
-
-package androidx.benchmark.macro.perfetto {
-
-  public final class ForceTracingKt {
-  }
-
-  public final class PerfettoTraceProcessorKt {
-  }
-
-  public final class SliceKt {
-  }
-
-  public final class StringHelperKt {
-  }
-
 }
 
diff --git a/benchmark/benchmark-macro/api/public_plus_experimental_current.txt b/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
index 8f5b8c0..23fad4a 100644
--- a/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark.macro {
 
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   @androidx.benchmark.macro.ExperimentalMetricApi public final class AudioUnderrunMetric extends androidx.benchmark.macro.Metric {
     ctor public AudioUnderrunMetric();
   }
@@ -16,9 +13,6 @@
     enum_constant public static final androidx.benchmark.macro.BaselineProfileMode UseIfAvailable;
   }
 
-  public final class BaselineProfilesKt {
-  }
-
   public abstract sealed class CompilationMode {
     field public static final androidx.benchmark.macro.CompilationMode.Companion Companion;
     field public static final androidx.benchmark.macro.CompilationMode DEFAULT;
@@ -49,9 +43,6 @@
     property public final int warmupIterations;
   }
 
-  public final class CompilationModeKt {
-  }
-
   @kotlin.RequiresOptIn(message="This Macrobenchmark API is experimental.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalMacrobenchmarkApi {
   }
 
@@ -65,15 +56,6 @@
     ctor public FrameTimingMetric();
   }
 
-  public final class IdeSummaryStringKt {
-  }
-
-  public final class IterationResultKt {
-  }
-
-  public final class MacrobenchmarkKt {
-  }
-
   public final class MacrobenchmarkScope {
     ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
     method public void dropKernelPageCache();
@@ -96,12 +78,6 @@
   public abstract sealed class Metric {
   }
 
-  public final class MetricKt {
-  }
-
-  public final class MetricResultExtensionsKt {
-  }
-
   @androidx.benchmark.macro.ExperimentalMetricApi public enum PowerCategory {
     method public static androidx.benchmark.macro.PowerCategory valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.benchmark.macro.PowerCategory[] values();
@@ -166,9 +142,6 @@
     ctor public StartupTimingMetric();
   }
 
-  public final class TagKt {
-  }
-
   @androidx.benchmark.macro.ExperimentalMetricApi public final class TraceSectionMetric extends androidx.benchmark.macro.Metric {
     ctor public TraceSectionMetric(String sectionName, optional androidx.benchmark.macro.TraceSectionMetric.Mode mode);
   }
@@ -182,19 +155,3 @@
 
 }
 
-package androidx.benchmark.macro.perfetto {
-
-  public final class ForceTracingKt {
-  }
-
-  public final class PerfettoTraceProcessorKt {
-  }
-
-  public final class SliceKt {
-  }
-
-  public final class StringHelperKt {
-  }
-
-}
-
diff --git a/benchmark/benchmark-macro/api/restricted_current.ignore b/benchmark/benchmark-macro/api/restricted_current.ignore
index 809ffe7..870da85 100644
--- a/benchmark/benchmark-macro/api/restricted_current.ignore
+++ b/benchmark/benchmark-macro/api/restricted_current.ignore
@@ -1,7 +1,25 @@
 // Baseline format: 1.0
+RemovedClass: androidx.benchmark.macro.Api29Kt:
+    Removed class androidx.benchmark.macro.Api29Kt
 RemovedClass: androidx.benchmark.macro.FrameTimingGfxInfoMetric:
     Removed class androidx.benchmark.macro.FrameTimingGfxInfoMetric
+RemovedClass: androidx.benchmark.macro.IdeSummaryStringKt:
+    Removed class androidx.benchmark.macro.IdeSummaryStringKt
+RemovedClass: androidx.benchmark.macro.IterationResultKt:
+    Removed class androidx.benchmark.macro.IterationResultKt
+RemovedClass: androidx.benchmark.macro.MacrobenchmarkKt:
+    Removed class androidx.benchmark.macro.MacrobenchmarkKt
+RemovedClass: androidx.benchmark.macro.MetricKt:
+    Removed class androidx.benchmark.macro.MetricKt
+RemovedClass: androidx.benchmark.macro.MetricResultExtensionsKt:
+    Removed class androidx.benchmark.macro.MetricResultExtensionsKt
+RemovedClass: androidx.benchmark.macro.TagKt:
+    Removed class androidx.benchmark.macro.TagKt
 
 
 RemovedMethod: androidx.benchmark.macro.BaselineProfilesKt#collectBaselineProfile(String, String, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>):
     Removed method androidx.benchmark.macro.BaselineProfilesKt.collectBaselineProfile(String,String,kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>)
+
+
+RemovedPackage: androidx.benchmark.macro.perfetto:
+    Removed package androidx.benchmark.macro.perfetto
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index 91151e5..6c99860 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.benchmark.macro {
 
-  @RequiresApi(29) public final class Api29Kt {
-  }
-
   public enum BaselineProfileMode {
     method public static androidx.benchmark.macro.BaselineProfileMode valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.benchmark.macro.BaselineProfileMode[] values();
@@ -59,15 +56,6 @@
     ctor public FrameTimingMetric();
   }
 
-  public final class IdeSummaryStringKt {
-  }
-
-  public final class IterationResultKt {
-  }
-
-  public final class MacrobenchmarkKt {
-  }
-
   public final class MacrobenchmarkScope {
     ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
     method public void dropKernelPageCache();
@@ -90,12 +78,6 @@
   public abstract sealed class Metric {
   }
 
-  public final class MetricKt {
-  }
-
-  public final class MetricResultExtensionsKt {
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class PowerRail {
     method public boolean hasMetrics(optional boolean throwOnMissingMetrics);
     field public static final androidx.benchmark.macro.PowerRail INSTANCE;
@@ -117,24 +99,5 @@
     ctor public StartupTimingMetric();
   }
 
-  public final class TagKt {
-  }
-
-}
-
-package androidx.benchmark.macro.perfetto {
-
-  public final class ForceTracingKt {
-  }
-
-  public final class PerfettoTraceProcessorKt {
-  }
-
-  public final class SliceKt {
-  }
-
-  public final class StringHelperKt {
-  }
-
 }
 
diff --git a/benchmark/benchmark-macro/build.gradle b/benchmark/benchmark-macro/build.gradle
index 134b4df..9edcc9e 100644
--- a/benchmark/benchmark-macro/build.gradle
+++ b/benchmark/benchmark-macro/build.gradle
@@ -59,6 +59,7 @@
     api("androidx.annotation:annotation:1.1.0")
 
     implementation(project(":benchmark:benchmark-common"))
+    implementation("androidx.core:core:1.9.0")
     implementation("androidx.profileinstaller:profileinstaller:1.0.3")
     implementation("androidx.tracing:tracing-ktx:1.1.0-rc01")
     implementation(libs.testCore)
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/PowerRailTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/PowerRailTest.kt
index 7da4d03..5cf3d0a 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/PowerRailTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/PowerRailTest.kt
@@ -40,6 +40,15 @@
     }
 
     @Test
+    fun hasMetrics_oldDevice() {
+        assumeTrue(Build.VERSION.SDK_INT <= 29) // powerstats didn't exist
+        assertFalse(PowerRail.hasMetrics(throwOnMissingMetrics = false))
+        assertFailsWith<UnsupportedOperationException> {
+            PowerRail.hasMetrics(throwOnMissingMetrics = true)
+        }
+    }
+
+    @Test
     fun hasMetrics_false() {
         // The test is using a mocked output of `dumpsys powerstats`
         val output = """
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
index 57dc30b..ea90dac 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
@@ -47,6 +47,7 @@
     val scope = buildMacrobenchmarkScope(packageName)
     val startTime = System.nanoTime()
     val killProcessBlock = scope.killProcessBlock()
+    val finalIterations = if (Arguments.dryRunMode) 1 else iterations
 
     // always kill the process at beginning of a collection.
     killProcessBlock.invoke()
@@ -56,9 +57,10 @@
             // Disable because we're *creating* a baseline profile, not using it yet
             CompilationMode.Partial(
                 baselineProfileMode = BaselineProfileMode.Disable,
-                warmupIterations = iterations
+                warmupIterations = finalIterations
             ).resetAndCompile(
                 packageName = packageName,
+                allowCompilationSkipping = false,
                 killProcessBlock = killProcessBlock
             ) {
                 scope.iteration = iteration++
@@ -115,8 +117,9 @@
         var stableCount = 1
         var lastProfile: String? = null
         var iteration = 1
+        val finalMaxIterations = if (Arguments.dryRunMode) 1 else maxIterations
 
-        while (iteration <= maxIterations) {
+        while (iteration <= finalMaxIterations) {
             userspaceTrace("generate profile for $packageName ($iteration)") {
                 val mode = CompilationMode.Partial(
                     baselineProfileMode = BaselineProfileMode.Disable,
@@ -126,6 +129,7 @@
                     Log.d(TAG, "Resetting compiled state for $packageName for stable profiles.")
                     mode.resetAndCompile(
                         packageName = packageName,
+                        allowCompilationSkipping = false,
                         killProcessBlock = killProcessBlock
                     ) {
                         scope.iteration = iteration
@@ -172,7 +176,7 @@
             iteration += 1
         }
 
-        if (strictStability) {
+        if (strictStability && !Arguments.dryRunMode) {
             check(stableCount == stableIterations) {
                 "Baseline profiles for $packageName are not stable after $maxIterations."
             }
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
index a40e56f..7603faa 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt
@@ -29,6 +29,7 @@
 import androidx.benchmark.macro.CompilationMode.None
 import androidx.benchmark.macro.CompilationMode.Partial
 import androidx.benchmark.userspaceTrace
+import androidx.core.os.BuildCompat
 import androidx.profileinstaller.ProfileInstallReceiver
 import org.junit.AssumptionViolatedException
 
@@ -72,13 +73,15 @@
  * to compile the target app).
  */
 sealed class CompilationMode {
+    @androidx.annotation.OptIn(markerClass = [BuildCompat.PrereleaseSdkCheck::class])
     internal fun resetAndCompile(
         packageName: String,
+        allowCompilationSkipping: Boolean = true,
         killProcessBlock: () -> Unit,
         warmupBlock: () -> Unit
     ) {
         if (Build.VERSION.SDK_INT >= 24) {
-            if (Arguments.enableCompilation) {
+            if (Arguments.enableCompilation || !allowCompilationSkipping) {
                 Log.d(TAG, "Resetting $packageName")
                 // The compilation mode chooses whether a reset is required or not.
                 // Currently the only compilation mode that does not perform a reset is
@@ -88,7 +91,7 @@
                     // The flag `enablePackageReset` can be set to `true` on `userdebug` builds in
                     // order to speed-up the profile reset. When set to false, reset is performed
                     // uninstalling and reinstalling the app.
-                    if (Shell.isSessionRooted()) {
+                    if (BuildCompat.isAtLeastU() || Shell.isSessionRooted()) {
                         // Package reset enabled
                         Log.d(TAG, "Re-compiling $packageName")
                         // cmd package compile --reset returns a "Success" or a "Failure" to stdout.
@@ -102,7 +105,7 @@
                             "Unable to recompile $packageName ($output)"
                         }
                     } else {
-                        // User builds. Kick off a full uninstall-reinstall
+                        // User builds pre-U. Kick off a full uninstall-reinstall
                         Log.d(TAG, "Reinstalling $packageName")
                         reinstallPackage(packageName)
                     }
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
index dfd14e1..9bf649f 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
@@ -238,7 +238,10 @@
         val androidStartup = traceMetrics.android_startup
             ?: throw IllegalStateException("No android_startup metric found.")
         val appStartup =
-            androidStartup.startup.first { it.package_name == captureInfo.targetPackageName }
+            androidStartup.startup.firstOrNull { it.package_name == captureInfo.targetPackageName }
+                ?: throw IllegalStateException("Didn't find startup for pkg " +
+                    "${captureInfo.targetPackageName}, found startups for pkgs: " +
+                    "${androidStartup.startup.map {it.package_name}}")
 
         // Extract app startup
         val metricMap = mutableMapOf<String, Double>()
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/PowerRail.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/PowerRail.kt
index 69f0fb6..1013b84 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/PowerRail.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/PowerRail.kt
@@ -43,7 +43,9 @@
      * @Throws UnsupportedOperationException if `hasException == true` and no rail metrics are found.
      */
     fun hasMetrics(throwOnMissingMetrics: Boolean = false): Boolean {
-        val output = Shell.executeScriptCaptureStdout(DUMPSYS_POWERSTATS)
+        // Note - we don't capture stderr, since if dumpsys fails due to missing
+        // service, we'll correctly fail to find channels in stdout
+        val output = Shell.executeCommandCaptureStdoutOnly(DUMPSYS_POWERSTATS)
         return hasMetrics(output, throwOnMissingMetrics)
     }
 
diff --git a/biometric/OWNERS b/biometric/OWNERS
index 570673b..d39f34b 100644
--- a/biometric/OWNERS
+++ b/biometric/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 483659
 jbolinger@google.com
 curtislb@google.com
 
diff --git a/bluetooth/OWNERS b/bluetooth/OWNERS
index 3ca2e7e..72e2675 100644
--- a/bluetooth/OWNERS
+++ b/bluetooth/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1190076
 sungsoo@google.com
 hallstrom@google.com
 hdmoon@google.com
diff --git a/bluetooth/integration-tests/testapp/build.gradle b/bluetooth/integration-tests/testapp/build.gradle
index 7f79127..07c8703 100644
--- a/bluetooth/integration-tests/testapp/build.gradle
+++ b/bluetooth/integration-tests/testapp/build.gradle
@@ -24,12 +24,11 @@
 
 android {
     defaultConfig {
-        minSdkVersion 21
+        minSdkVersion 28
         targetSdkVersion 31
         versionCode 1
         versionName "1.0"
     }
-
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
@@ -40,7 +39,6 @@
     buildFeatures {
         viewBinding true
     }
-
     namespace "androidx.bluetooth.integration.testapp"
 }
 
@@ -49,15 +47,19 @@
 
     implementation(project(":bluetooth:bluetooth"))
 
-//    Removing temporarily because core-ktx:1.8.0 is using activity:1.1.0 instead of activity:1.4.0
-//    implementation("androidx.core:core-ktx:1.8.0")
-//    implementation("androidx.appcompat:appcompat:1.4.2")
+    implementation("androidx.core:core-ktx:1.9.0")
+    implementation("androidx.appcompat:appcompat:1.6.0")
 
-    implementation("androidx.activity:activity-ktx:1.4.0")
-    implementation("androidx.fragment:fragment-ktx:1.4.1")
+    implementation(libs.material)
+
+    implementation("androidx.activity:activity-ktx:1.6.1")
+    implementation("androidx.fragment:fragment-ktx:1.5.5")
 
     implementation(libs.constraintLayout)
 
-    implementation("androidx.navigation:navigation-fragment-ktx:2.4.2")
-    implementation("androidx.navigation:navigation-ui-ktx:2.4.2")
+    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.5.1")
+    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1")
+
+    implementation("androidx.navigation:navigation-fragment-ktx:2.5.3")
+    implementation("androidx.navigation:navigation-ui-ktx:2.5.3")
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml b/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
index f6c02c5..4fd7629 100644
--- a/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/bluetooth/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -5,7 +5,7 @@
     <application
         android:allowBackup="false"
         android:label="@string/app_name"
-        android:theme="@style/Theme.AppCompat.Light"
+        android:theme="@style/Theme.TestApp"
         tools:ignore="GoogleAppIndexingWarning,MissingApplicationIcon">
         <activity
             android:name=".MainActivity"
@@ -21,7 +21,8 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 
-    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
+    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
+    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
 
 </manifest>
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
index 3e27ff9..9f655fb 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
@@ -22,11 +22,11 @@
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AppCompatActivity
 import androidx.bluetooth.integration.testapp.databinding.ActivityMainBinding
-import androidx.core.view.WindowCompat
 import androidx.navigation.findNavController
 import androidx.navigation.ui.AppBarConfiguration
-import androidx.navigation.ui.navigateUp
 import androidx.navigation.ui.setupActionBarWithNavController
+import androidx.navigation.ui.setupWithNavController
+import com.google.android.material.bottomnavigation.BottomNavigationView
 
 class MainActivity : AppCompatActivity() {
 
@@ -41,19 +41,22 @@
             }
         }
 
-    private lateinit var appBarConfiguration: AppBarConfiguration
     private lateinit var binding: ActivityMainBinding
 
     override fun onCreate(savedInstanceState: Bundle?) {
-        WindowCompat.setDecorFitsSystemWindows(window, false)
         super.onCreate(savedInstanceState)
 
         binding = ActivityMainBinding.inflate(layoutInflater)
         setContentView(binding.root)
 
-        val navController = findNavController(R.id.nav_host_fragment)
-        appBarConfiguration = AppBarConfiguration(navController.graph)
+        val navView: BottomNavigationView = binding.navView
+
+        val navController = findNavController(R.id.nav_host_fragment_activity_main)
+        val appBarConfiguration = AppBarConfiguration(
+            setOf(R.id.navigation_fwk, R.id.navigation_btx)
+        )
         setupActionBarWithNavController(navController, appBarConfiguration)
+        navView.setupWithNavController(navController)
     }
 
     override fun onResume() {
@@ -63,13 +66,9 @@
             arrayOf(
                 Manifest.permission.ACCESS_FINE_LOCATION,
                 Manifest.permission.BLUETOOTH_ADVERTISE,
+                Manifest.permission.BLUETOOTH_CONNECT,
                 Manifest.permission.BLUETOOTH_SCAN,
             )
         )
     }
-
-    override fun onSupportNavigateUp(): Boolean {
-        val navController = findNavController(R.id.nav_host_fragment)
-        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
-    }
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/AdvertiseResult.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/AdvertiseResult.kt
new file mode 100644
index 0000000..f2fb27d
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/AdvertiseResult.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.integration.testapp.experimental
+
+enum class AdvertiseResult {
+    ADVERTISE_STARTED,
+    ADVERTISE_FAILED_ALREADY_STARTED,
+    ADVERTISE_FAILED_DATA_TOO_LARGE,
+    ADVERTISE_FAILED_FEATURE_UNSUPPORTED,
+    ADVERTISE_FAILED_INTERNAL_ERROR,
+    ADVERTISE_FAILED_TOO_MANY_ADVERTISERS
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/BluetoothLe.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/BluetoothLe.kt
new file mode 100644
index 0000000..c6555f4
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/BluetoothLe.kt
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.integration.testapp.experimental
+
+import android.annotation.SuppressLint
+import android.bluetooth.BluetoothDevice
+import android.bluetooth.BluetoothGattCharacteristic
+import android.bluetooth.BluetoothGattDescriptor
+import android.bluetooth.BluetoothGattServerCallback
+import android.bluetooth.BluetoothGattService
+import android.bluetooth.BluetoothManager
+import android.bluetooth.le.AdvertiseCallback
+import android.bluetooth.le.AdvertiseData
+import android.bluetooth.le.AdvertiseSettings
+import android.content.Context
+import android.util.Log
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+
+/**
+ * Singleton class. Entry point for BLE related operations.
+ */
+class BluetoothLe(private val context: Context) {
+
+    companion object {
+        const val TAG = "BluetoothLe"
+    }
+
+    private val bluetoothManager =
+        context.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    fun advertise(
+        settings: AdvertiseSettings,
+        data: AdvertiseData
+    ): Flow<AdvertiseResult> =
+        callbackFlow {
+            val callback = object : AdvertiseCallback() {
+                override fun onStartFailure(errorCode: Int) {
+                    trySend(AdvertiseResult.ADVERTISE_FAILED_INTERNAL_ERROR)
+                }
+
+                override fun onStartSuccess(settingsInEffect: AdvertiseSettings?) {
+                    trySend(AdvertiseResult.ADVERTISE_STARTED)
+                }
+            }
+
+            val bluetoothAdapter = bluetoothManager?.adapter
+            val bleAdvertiser = bluetoothAdapter?.bluetoothLeAdvertiser
+
+            bleAdvertiser?.startAdvertising(settings, data, callback)
+
+            awaitClose {
+                Log.d(TAG, "awaitClose() called")
+                bleAdvertiser?.stopAdvertising(callback)
+            }
+        }
+
+    @SuppressLint("MissingPermission")
+    fun gattServer(): Flow<GattServerCallback> =
+        callbackFlow {
+            val callback = object : BluetoothGattServerCallback() {
+                override fun onConnectionStateChange(
+                    device: BluetoothDevice?,
+                    status: Int,
+                    newState: Int
+                ) {
+                    trySend(
+                        GattServerCallback.OnConnectionStateChange(device, status, newState)
+                    )
+                }
+
+                override fun onServiceAdded(status: Int, service: BluetoothGattService?) {
+                    trySend(
+                        GattServerCallback.OnServiceAdded(status, service)
+                    )
+                }
+
+                override fun onCharacteristicReadRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    offset: Int,
+                    characteristic: BluetoothGattCharacteristic?
+                ) {
+                    trySend(
+                        GattServerCallback.OnCharacteristicReadRequest(
+                            device,
+                            requestId,
+                            offset,
+                            characteristic
+                        )
+                    )
+                }
+
+                override fun onCharacteristicWriteRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    characteristic: BluetoothGattCharacteristic?,
+                    preparedWrite: Boolean,
+                    responseNeeded: Boolean,
+                    offset: Int,
+                    value: ByteArray?
+                ) {
+                    trySend(
+                        GattServerCallback.OnCharacteristicWriteRequest(
+                            device,
+                            requestId,
+                            characteristic,
+                            preparedWrite,
+                            responseNeeded,
+                            offset,
+                            value
+                        )
+                    )
+                }
+
+                override fun onDescriptorReadRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    offset: Int,
+                    descriptor: BluetoothGattDescriptor?
+                ) {
+                    trySend(
+                        GattServerCallback.OnDescriptorReadRequest(
+                            device,
+                            requestId,
+                            offset,
+                            descriptor
+                        )
+                    )
+                }
+
+                override fun onDescriptorWriteRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    descriptor: BluetoothGattDescriptor?,
+                    preparedWrite: Boolean,
+                    responseNeeded: Boolean,
+                    offset: Int,
+                    value: ByteArray?
+                ) {
+                    trySend(
+                        GattServerCallback.OnDescriptorWriteRequest(
+                            device,
+                            requestId,
+                            descriptor,
+                            preparedWrite,
+                            responseNeeded,
+                            offset,
+                            value
+                        )
+                    )
+                }
+
+                override fun onExecuteWrite(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    execute: Boolean
+                ) {
+                    trySend(
+                        GattServerCallback.OnExecuteWrite(device, requestId, execute)
+                    )
+                }
+
+                override fun onNotificationSent(device: BluetoothDevice?, status: Int) {
+                    trySend(
+                        GattServerCallback.OnNotificationSent(device, status)
+                    )
+                }
+
+                override fun onMtuChanged(device: BluetoothDevice?, mtu: Int) {
+                    trySend(
+                        GattServerCallback.OnMtuChanged(device, mtu)
+                    )
+                }
+
+                override fun onPhyUpdate(
+                    device: BluetoothDevice?,
+                    txPhy: Int,
+                    rxPhy: Int,
+                    status: Int
+                ) {
+                    trySend(
+                        GattServerCallback.OnPhyUpdate(device, txPhy, rxPhy, status)
+                    )
+                }
+
+                override fun onPhyRead(
+                    device: BluetoothDevice?,
+                    txPhy: Int,
+                    rxPhy: Int,
+                    status: Int
+                ) {
+                    trySend(
+                        GattServerCallback.OnPhyRead(device, txPhy, rxPhy, status)
+                    )
+                }
+            }
+
+            val bluetoothGattServer = bluetoothManager?.openGattServer(context, callback)
+
+            awaitClose {
+                Log.d(TAG, "awaitClose() called")
+                bluetoothGattServer?.close()
+            }
+        }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/GattServerCallback.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/GattServerCallback.kt
new file mode 100644
index 0000000..317e917
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/experimental/GattServerCallback.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.integration.testapp.experimental
+
+import android.bluetooth.BluetoothDevice
+import android.bluetooth.BluetoothGattCharacteristic
+import android.bluetooth.BluetoothGattDescriptor
+import android.bluetooth.BluetoothGattService
+
+sealed interface GattServerCallback {
+    data class OnConnectionStateChange(
+        val device: BluetoothDevice?,
+        val status: Int,
+        val newState: Int
+    ) : GattServerCallback
+
+    data class OnServiceAdded(
+        val status: Int,
+        val service: BluetoothGattService?
+    ) : GattServerCallback
+
+    data class OnCharacteristicReadRequest(
+        val device: BluetoothDevice?,
+        val requestId: Int,
+        val offset: Int,
+        val characteristic: BluetoothGattCharacteristic?
+    ) : GattServerCallback
+
+    data class OnCharacteristicWriteRequest(
+        val device: BluetoothDevice?,
+        val requestId: Int,
+        val characteristic: BluetoothGattCharacteristic?,
+        val preparedWrite: Boolean,
+        val responseNeeded: Boolean,
+        val offset: Int,
+        val value: ByteArray?
+    ) : GattServerCallback
+
+    data class OnDescriptorReadRequest(
+        val device: BluetoothDevice?,
+        val requestId: Int,
+        val offset: Int,
+        val descriptor: BluetoothGattDescriptor?
+    ) : GattServerCallback
+
+    data class OnDescriptorWriteRequest(
+        val device: BluetoothDevice?,
+        val requestId: Int,
+        val descriptor: BluetoothGattDescriptor?,
+        val preparedWrite: Boolean,
+        val responseNeeded: Boolean,
+        val offset: Int,
+        val value: ByteArray?
+    ) : GattServerCallback
+
+    data class OnExecuteWrite(
+        val device: BluetoothDevice?,
+        val requestId: Int,
+        val execute: Boolean
+    ) : GattServerCallback
+
+    data class OnNotificationSent(
+        val device: BluetoothDevice?,
+        val status: Int
+    ) : GattServerCallback
+
+    data class OnMtuChanged(
+        val device: BluetoothDevice?,
+        val mtu: Int
+    ) : GattServerCallback
+
+    data class OnPhyUpdate(
+        val device: BluetoothDevice?,
+        val txPhy: Int,
+        val rxPhy: Int,
+        val status: Int
+    ) : GattServerCallback
+
+    data class OnPhyRead(
+        val device: BluetoothDevice?,
+        val txPhy: Int,
+        val rxPhy: Int,
+        val status: Int
+    ) : GattServerCallback
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxFragment.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxFragment.kt
index 8edffdd..800098e 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxFragment.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxFragment.kt
@@ -16,17 +16,38 @@
 
 package androidx.bluetooth.integration.testapp.ui.bluetoothx
 
+import android.annotation.SuppressLint
+import android.bluetooth.BluetoothManager
+import android.bluetooth.le.AdvertiseData
+import android.bluetooth.le.AdvertiseSettings
+import android.bluetooth.le.ScanCallback
+import android.bluetooth.le.ScanResult
+import android.bluetooth.le.ScanSettings
+import android.content.Context
 import android.os.Bundle
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Toast
 
-import androidx.bluetooth.core.BluetoothManager
 import androidx.bluetooth.integration.testapp.R
 import androidx.bluetooth.integration.testapp.databinding.FragmentBtxBinding
+import androidx.bluetooth.integration.testapp.experimental.AdvertiseResult
+import androidx.bluetooth.integration.testapp.experimental.BluetoothLe
+import androidx.bluetooth.integration.testapp.experimental.GattServerCallback
+import androidx.bluetooth.integration.testapp.ui.framework.FwkFragment
 import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
+import androidx.lifecycle.ViewModelProvider
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.take
+import kotlinx.coroutines.launch
 
 class BtxFragment : Fragment() {
 
@@ -34,6 +55,10 @@
         const val TAG = "BtxFragment"
     }
 
+    private lateinit var bluetoothLe: BluetoothLe
+
+    private lateinit var btxViewModel: BtxViewModel
+
     private var _binding: FragmentBtxBinding? = null
 
     // This property is only valid between onCreateView and onDestroyView.
@@ -44,6 +69,12 @@
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
+        Log.d(
+            TAG, "onCreateView() called with: inflater = $inflater, " +
+                "container = $container, savedInstanceState = $savedInstanceState"
+        )
+        btxViewModel = ViewModelProvider(this).get(BtxViewModel::class.java)
+
         _binding = FragmentBtxBinding.inflate(inflater, container, false)
         return binding.root
     }
@@ -51,39 +82,229 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        binding.buttonPrevious.setOnClickListener {
-            findNavController().navigate(R.id.action_BtxFragment_to_FwkFragment)
-        }
+        bluetoothLe = BluetoothLe(requireContext())
 
         binding.buttonScan.setOnClickListener {
-            scan()
+            startScan()
+        }
+
+        binding.switchAdvertise.setOnCheckedChangeListener { _, isChecked ->
+            if (isChecked) startAdvertise()
+            else advertiseJob?.cancel()
+        }
+
+        binding.switchGattServer.setOnCheckedChangeListener { _, isChecked ->
+            if (isChecked) openGattServer()
+            else gattServerJob?.cancel()
         }
     }
 
     override fun onDestroyView() {
         super.onDestroyView()
         _binding = null
+        scanJob?.cancel()
+        advertiseJob?.cancel()
+        gattServerJob?.cancel()
     }
 
-    private fun scan() {
-        Log.d(TAG, "scan() called")
+    private val scanScope = CoroutineScope(Dispatchers.Main + Job())
+    private var scanJob: Job? = null
 
-        val bluetoothManager = BluetoothManager(requireContext())
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    fun scan(settings: ScanSettings): Flow<ScanResult> = callbackFlow {
+        val callback = object : ScanCallback() {
+            override fun onScanResult(callbackType: Int, result: ScanResult) {
+                trySend(result)
+            }
 
-        @Suppress("UNUSED_VARIABLE")
-        // TODO(ofy) Use below
-        val bluetoothAdapter = bluetoothManager.getAdapter()
+            override fun onScanFailed(errorCode: Int) {
+                Log.d(TAG, "scan failed")
+            }
+        }
 
-        // TODO(ofy) Convert to BluetoothX classes
-//        val bleScanner = bluetoothAdapter?.bluetoothLeScanner
-//
-//        val scanSettings = ScanSettings.Builder()
-//            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
-//            .build()
-//
-//        bleScanner?.startScan(null, scanSettings, scanCallback)
-//
-//        Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_LONG)
-//            .show()
+        val bluetoothManager =
+            context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+        val bluetoothAdapter = bluetoothManager?.adapter
+        val bleScanner = bluetoothAdapter?.bluetoothLeScanner
+
+        bleScanner?.startScan(null, settings, callback)
+
+        awaitClose {
+            Log.d(TAG, "awaitClose() called")
+            bleScanner?.stopScan(callback)
+        }
+    }
+
+    private fun startScan() {
+        Log.d(TAG, "startScan() called")
+
+        val scanSettings = ScanSettings.Builder()
+            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+            .build()
+
+        scanJob = scanScope.launch {
+            Toast.makeText(context, getString(R.string.scan_start_message), Toast.LENGTH_LONG)
+                .show()
+            scan(scanSettings).take(1).collect {
+                Log.d(TAG, "ScanResult collected")
+            }
+        }
+    }
+
+    private val advertiseScope = CoroutineScope(Dispatchers.Main + Job())
+    private var advertiseJob: Job? = null
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun startAdvertise() {
+        Log.d(TAG, "startAdvertise() called")
+
+        val advertiseSettings = AdvertiseSettings.Builder()
+            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
+            .setTimeout(0)
+            .build()
+
+        val advertiseData = AdvertiseData.Builder()
+            .addServiceUuid(FwkFragment.ServiceUUID)
+            .setIncludeDeviceName(true)
+            .build()
+
+        advertiseJob = advertiseScope.launch {
+            bluetoothLe.advertise(advertiseSettings, advertiseData)
+                .collect {
+                    Log.d(TAG, "advertiseResult received: $it")
+
+                    when (it) {
+                        AdvertiseResult.ADVERTISE_STARTED -> {
+                            Toast.makeText(
+                                context,
+                                getString(R.string.advertise_start_message), Toast.LENGTH_SHORT
+                            )
+                                .show()
+                        }
+                        AdvertiseResult.ADVERTISE_FAILED_ALREADY_STARTED -> TODO()
+                        AdvertiseResult.ADVERTISE_FAILED_DATA_TOO_LARGE -> TODO()
+                        AdvertiseResult.ADVERTISE_FAILED_FEATURE_UNSUPPORTED -> TODO()
+                        AdvertiseResult.ADVERTISE_FAILED_INTERNAL_ERROR -> TODO()
+                        AdvertiseResult.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS -> TODO()
+                    }
+                }
+        }
+    }
+
+    private val gattServerScope = CoroutineScope(Dispatchers.Main + Job())
+    private var gattServerJob: Job? = null
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun openGattServer() {
+        Log.d(TAG, "openGattServer() called")
+
+        gattServerJob = gattServerScope.launch {
+            bluetoothLe.gattServer().collect { gattServerCallback ->
+                when (gattServerCallback) {
+                    is GattServerCallback.OnCharacteristicReadRequest -> {
+                        val onCharacteristicReadRequest:
+                            GattServerCallback.OnCharacteristicReadRequest = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onCharacteristicReadRequest = $onCharacteristicReadRequest"
+                        )
+                    }
+                    is GattServerCallback.OnCharacteristicWriteRequest -> {
+                        val onCharacteristicWriteRequest:
+                            GattServerCallback.OnCharacteristicWriteRequest = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onCharacteristicWriteRequest = $onCharacteristicWriteRequest"
+                        )
+                    }
+                    is GattServerCallback.OnConnectionStateChange -> {
+                        val onConnectionStateChange:
+                            GattServerCallback.OnConnectionStateChange = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onConnectionStateChange = $onConnectionStateChange"
+                        )
+                    }
+                    is GattServerCallback.OnDescriptorReadRequest -> {
+                        val onDescriptorReadRequest:
+                            GattServerCallback.OnDescriptorReadRequest = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onDescriptorReadRequest = $onDescriptorReadRequest"
+                        )
+                    }
+                    is GattServerCallback.OnDescriptorWriteRequest -> {
+                        val onDescriptorWriteRequest:
+                            GattServerCallback.OnDescriptorWriteRequest = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onDescriptorWriteRequest = $onDescriptorWriteRequest"
+                        )
+                    }
+                    is GattServerCallback.OnExecuteWrite -> {
+                        val onExecuteWrite:
+                            GattServerCallback.OnExecuteWrite = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onExecuteWrite = $onExecuteWrite"
+                        )
+                    }
+                    is GattServerCallback.OnMtuChanged -> {
+                        val onMtuChanged:
+                            GattServerCallback.OnMtuChanged = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onMtuChanged = $onMtuChanged"
+                        )
+                    }
+                    is GattServerCallback.OnNotificationSent -> {
+                        val onNotificationSent:
+                            GattServerCallback.OnNotificationSent = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onNotificationSent = $onNotificationSent"
+                        )
+                    }
+                    is GattServerCallback.OnPhyRead -> {
+                        val onPhyRead:
+                            GattServerCallback.OnPhyRead = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onPhyRead = $onPhyRead"
+                        )
+                    }
+                    is GattServerCallback.OnPhyUpdate -> {
+                        val onPhyUpdate:
+                            GattServerCallback.OnPhyUpdate = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onPhyUpdate = $onPhyUpdate"
+                        )
+                    }
+                    is GattServerCallback.OnServiceAdded -> {
+                        val onServiceAdded:
+                            GattServerCallback.OnServiceAdded = gattServerCallback
+                        Log.d(
+                            TAG,
+                            "openGattServer() called with: " +
+                                "onServiceAdded = $onServiceAdded"
+                        )
+                    }
+                }
+            }
+        }
     }
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxViewModel.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxViewModel.kt
new file mode 100644
index 0000000..587047c
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/bluetoothx/BtxViewModel.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.integration.testapp.ui.bluetoothx
+
+import android.util.Log
+import androidx.lifecycle.ViewModel
+
+class BtxViewModel : ViewModel() {
+
+    companion object {
+        const val TAG = "BtxViewModel"
+    }
+
+    init {
+        Log.d(TAG, "init called")
+    }
+
+    override fun onCleared() {
+        Log.d(TAG, "onCleared() called")
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkFragment.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkFragment.kt
index 5257eae..46e8e17 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkFragment.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkFragment.kt
@@ -17,6 +17,12 @@
 package androidx.bluetooth.integration.testapp.ui.framework
 
 import android.annotation.SuppressLint
+import android.bluetooth.BluetoothDevice
+import android.bluetooth.BluetoothGattCharacteristic
+import android.bluetooth.BluetoothGattDescriptor
+import android.bluetooth.BluetoothGattServer
+import android.bluetooth.BluetoothGattServerCallback
+import android.bluetooth.BluetoothGattService
 import android.bluetooth.BluetoothManager
 import android.bluetooth.le.AdvertiseCallback
 import android.bluetooth.le.AdvertiseData
@@ -35,7 +41,7 @@
 import androidx.bluetooth.integration.testapp.R
 import androidx.bluetooth.integration.testapp.databinding.FragmentFwkBinding
 import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
+import androidx.lifecycle.ViewModelProvider
 
 class FwkFragment : Fragment() {
 
@@ -68,6 +74,8 @@
         }
     }
 
+    private lateinit var fwkViewModel: FwkViewModel
+
     private var _binding: FragmentFwkBinding? = null
 
     // This property is only valid between onCreateView and onDestroyView.
@@ -78,6 +86,12 @@
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
+        Log.d(
+            TAG, "onCreateView() called with: inflater = $inflater, " +
+                "container = $container, savedInstanceState = $savedInstanceState"
+        )
+        fwkViewModel = ViewModelProvider(this)[FwkViewModel::class.java]
+
         _binding = FragmentFwkBinding.inflate(inflater, container, false)
         return binding.root
     }
@@ -85,22 +99,27 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        binding.buttonNext.setOnClickListener {
-            findNavController().navigate(R.id.action_FwkFragment_to_BtxFragment)
-        }
-
         binding.buttonScan.setOnClickListener {
             scan()
         }
 
-        binding.switchAdvertise.setOnClickListener {
-            if (binding.switchAdvertise.isChecked) startAdvertise()
+        binding.switchAdvertise.setOnCheckedChangeListener { _, isChecked ->
+            if (isChecked) startAdvertise()
+            else stopAdvertise()
+        }
+
+        binding.switchGattServer.setOnCheckedChangeListener { _, isChecked ->
+            if (isChecked) openGattServer()
+            else closeGattServer()
         }
     }
 
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
     override fun onDestroyView() {
         super.onDestroyView()
         _binding = null
+        bluetoothGattServer?.close()
     }
 
     // Permissions are handled by MainActivity requestBluetoothPermissions
@@ -149,7 +168,172 @@
 
         bleAdvertiser?.startAdvertising(advertiseSettings, advertiseData, advertiseCallback)
 
-        Toast.makeText(context, getString(R.string.advertise_start_message), Toast.LENGTH_LONG)
+        Toast.makeText(context, getString(R.string.advertise_start_message), Toast.LENGTH_SHORT)
             .show()
     }
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun stopAdvertise() {
+        Log.d(TAG, "stopAdvertise() called")
+
+        val bluetoothManager =
+            context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+
+        val bluetoothAdapter = bluetoothManager?.adapter
+
+        val bleAdvertiser = bluetoothAdapter?.bluetoothLeAdvertiser
+
+        bleAdvertiser?.stopAdvertising(advertiseCallback)
+    }
+
+    private var bluetoothGattServer: BluetoothGattServer? = null
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun openGattServer() {
+        Log.d(TAG, "openGattServer() called")
+
+        val bluetoothManager =
+            context?.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager
+
+        bluetoothGattServer = bluetoothManager?.openGattServer(
+            requireContext(),
+            object : BluetoothGattServerCallback() {
+                override fun onConnectionStateChange(
+                    device: BluetoothDevice?,
+                    status: Int,
+                    newState: Int
+                ) {
+                    Log.d(
+                        TAG,
+                        "onConnectionStateChange() called with: device = $device" +
+                            ", status = $status, newState = $newState"
+                    )
+                }
+
+                override fun onServiceAdded(status: Int, service: BluetoothGattService?) {
+                    Log.d(TAG, "onServiceAdded() called with: status = $status, service = $service")
+                }
+
+                override fun onCharacteristicReadRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    offset: Int,
+                    characteristic: BluetoothGattCharacteristic?
+                ) {
+                    Log.d(
+                        TAG,
+                        "onCharacteristicReadRequest() called with: device = $device" +
+                            ", requestId = $requestId, offset = $offset" +
+                            ", characteristic = $characteristic"
+                    )
+                }
+
+                override fun onCharacteristicWriteRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    characteristic: BluetoothGattCharacteristic?,
+                    preparedWrite: Boolean,
+                    responseNeeded: Boolean,
+                    offset: Int,
+                    value: ByteArray?
+                ) {
+                    Log.d(
+                        TAG,
+                        "onCharacteristicWriteRequest() called with: device = $device" +
+                            ", requestId = $requestId, characteristic = $characteristic" +
+                            ", preparedWrite = $preparedWrite, responseNeeded = $responseNeeded" +
+                            ", offset = $offset, value = $value"
+                    )
+                }
+
+                override fun onDescriptorReadRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    offset: Int,
+                    descriptor: BluetoothGattDescriptor?
+                ) {
+                    Log.d(
+                        TAG,
+                        "onDescriptorReadRequest() called with: device = $device" +
+                            ", requestId = $requestId, offset = $offset, descriptor = $descriptor"
+                    )
+                }
+
+                override fun onDescriptorWriteRequest(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    descriptor: BluetoothGattDescriptor?,
+                    preparedWrite: Boolean,
+                    responseNeeded: Boolean,
+                    offset: Int,
+                    value: ByteArray?
+                ) {
+                    Log.d(
+                        TAG,
+                        "onDescriptorWriteRequest() called with: device = $device" +
+                            ", requestId = $requestId, descriptor = $descriptor" +
+                            ", preparedWrite = $preparedWrite, responseNeeded = $responseNeeded" +
+                            ", offset = $offset, value = $value"
+                    )
+                }
+
+                override fun onExecuteWrite(
+                    device: BluetoothDevice?,
+                    requestId: Int,
+                    execute: Boolean
+                ) {
+                    Log.d(
+                        TAG,
+                        "onExecuteWrite() called with: device = $device, requestId = $requestId" +
+                            ", execute = $execute"
+                    )
+                }
+
+                override fun onNotificationSent(device: BluetoothDevice?, status: Int) {
+                    Log.d(
+                        TAG,
+                        "onNotificationSent() called with: device = $device, status = $status"
+                    )
+                }
+
+                override fun onMtuChanged(device: BluetoothDevice?, mtu: Int) {
+                    Log.d(TAG, "onMtuChanged() called with: device = $device, mtu = $mtu")
+                }
+
+                override fun onPhyUpdate(
+                    device: BluetoothDevice?,
+                    txPhy: Int,
+                    rxPhy: Int,
+                    status: Int
+                ) {
+                    Log.d(
+                        TAG, "onPhyUpdate() called with: device = $device, txPhy = $txPhy" +
+                            ", rxPhy = $rxPhy, status = $status"
+                    )
+                }
+
+                override fun onPhyRead(
+                    device: BluetoothDevice?,
+                    txPhy: Int,
+                    rxPhy: Int,
+                    status: Int
+                ) {
+                    Log.d(
+                        TAG,
+                        "onPhyRead() called with: device = $device, txPhy = $txPhy" +
+                            ", rxPhy = $rxPhy, status = $status"
+                    )
+                }
+            })
+    }
+
+    // Permissions are handled by MainActivity requestBluetoothPermissions
+    @SuppressLint("MissingPermission")
+    private fun closeGattServer() {
+        Log.d(TAG, "closeGattServer() called")
+
+        bluetoothGattServer?.close()
+    }
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkViewModel.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkViewModel.kt
new file mode 100644
index 0000000..d72fa738
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/framework/FwkViewModel.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.bluetooth.integration.testapp.ui.framework
+
+import android.util.Log
+import androidx.lifecycle.ViewModel
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+
+class FwkViewModel(
+    private val coroutineScope: CoroutineScope =
+        CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
+) : ViewModel() {
+
+    companion object {
+        const val TAG = "FwkViewModel"
+    }
+
+    init {
+        Log.d(TAG, "init called")
+    }
+
+    override fun onCleared() {
+        Log.d(TAG, "onCleared() called")
+
+        coroutineScope.cancel()
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_bluetooth_24.xml b/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_bluetooth_24.xml
new file mode 100644
index 0000000..34e9311
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_bluetooth_24.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/>
+</vector>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_filter_frames_24.xml b/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_filter_frames_24.xml
new file mode 100644
index 0000000..244584b1
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/drawable/ic_filter_frames_24.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M20,4h-4l-4,-4 -4,4L4,4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,20L4,20L4,6h4.52l3.52,-3.5L15.52,6L20,6v14zM18,8L6,8v10h12"/>
+</vector>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/activity_main.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/activity_main.xml
index 8f063c6..5d9372f 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/layout/activity_main.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/activity_main.xml
@@ -14,22 +14,37 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
-<androidx.coordinatorlayout.widget.CoordinatorLayout
+<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:fitsSystemWindows="true"
     tools:context=".MainActivity">
 
+    <com.google.android.material.bottomnavigation.BottomNavigationView
+        android:id="@+id/nav_view"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="0dp"
+        android:layout_marginEnd="0dp"
+        android:background="?android:attr/windowBackground"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:menu="@menu/bottom_nav_menu" />
+
     <fragment
-        android:id="@+id/nav_host_fragment"
+        android:id="@+id/nav_host_fragment_activity_main"
         android:name="androidx.navigation.fragment.NavHostFragment"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
         app:defaultNavHost="true"
+        app:layout_constraintBottom_toTopOf="@id/nav_view"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
         app:navGraph="@navigation/nav_graph" />
 
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_btx.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_btx.xml
index 0e75c18..1a750d7 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_btx.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_btx.xml
@@ -14,33 +14,42 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
 <androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="16dp"
     tools:context=".ui.bluetoothx.BtxFragment">
 
     <Button
-        android:id="@+id/button_previous"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
-        android:layout_marginEnd="16dp"
-        android:text="@string/previous"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <Button
         android:id="@+id/button_scan"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
+        android:layout_marginTop="16dp"
         android:text="@string/scan_using_btx"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/switch_advertise"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="@string/advertise_using_btx"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/button_scan" />
+
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/switch_gatt_server"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="@string/open_gatt_server_using_btx"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/switch_advertise" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_fwk.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_fwk.xml
index 0b9be5f..48c20bf 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_fwk.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_fwk.xml
@@ -14,41 +14,42 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
 <androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="16dp"
     tools:context=".ui.framework.FwkFragment">
 
     <Button
-        android:id="@+id/button_next"
+        android:id="@+id/button_scan"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
-        android:layout_marginEnd="16dp"
-        android:text="@string/next"
+        android:layout_marginTop="16dp"
+        android:text="@string/scan_using_fwk"
         app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
     <androidx.appcompat.widget.SwitchCompat
         android:id="@+id/switch_advertise"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
         android:text="@string/advertise_using_fwk"
-        app:layout_constraintBottom_toTopOf="@+id/button_scan"
-        app:layout_constraintEnd_toEndOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/button_scan" />
 
-    <Button
-        android:id="@+id/button_scan"
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/switch_gatt_server"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
-        android:text="@string/scan_using_fwk"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent" />
+        android:layout_marginTop="16dp"
+        android:text="@string/open_gatt_server_using_fwk"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/switch_advertise" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml b/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml
new file mode 100644
index 0000000..b5bcafb
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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/navigation_fwk"
+        android:icon="@drawable/ic_filter_frames_24"
+        android:title="@string/title_fwk" />
+
+    <item
+        android:id="@+id/navigation_btx"
+        android:icon="@drawable/ic_bluetooth_24"
+        android:title="@string/title_btx" />
+
+</menu>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml b/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
index 8cb583c..6fb7139 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
@@ -14,31 +14,22 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
 <navigation xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/nav_graph"
-    app:startDestination="@id/FwkFragment">
+    app:startDestination="@id/navigation_fwk">
 
     <fragment
-        android:id="@+id/FwkFragment"
+        android:id="@+id/navigation_fwk"
         android:name="androidx.bluetooth.integration.testapp.ui.framework.FwkFragment"
-        android:label="@string/fwk_fragment_label"
-        tools:layout="@layout/fragment_fwk">
-        <action
-            android:id="@+id/action_FwkFragment_to_BtxFragment"
-            app:destination="@id/BtxFragment" />
-    </fragment>
+        android:label="@string/title_fwk"
+        tools:layout="@layout/fragment_fwk" />
 
     <fragment
-        android:id="@+id/BtxFragment"
+        android:id="@+id/navigation_btx"
         android:name="androidx.bluetooth.integration.testapp.ui.bluetoothx.BtxFragment"
-        android:label="@string/btx_fragment_label"
-        tools:layout="@layout/fragment_btx">
-        <action
-            android:id="@+id/action_BtxFragment_to_FwkFragment"
-            app:destination="@id/FwkFragment" />
-    </fragment>
+        android:label="@string/title_btx"
+        tools:layout="@layout/fragment_btx" />
 
 </navigation>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/values/colors.xml b/bluetooth/integration-tests/testapp/src/main/res/values/colors.xml
new file mode 100644
index 0000000..6d70d3a
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/values/colors.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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="purple_200">#FFBB86FC</color>
+    <color name="purple_500">#FF6200EE</color>
+    <color name="purple_700">#FF3700B3</color>
+    <color name="teal_200">#FF03DAC5</color>
+    <color name="teal_700">#FF018786</color>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+</resources>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml b/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
index ff75011..913a1bb 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
@@ -14,21 +14,21 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
 <resources>
     <string name="app_name">BluetoothX Test App</string>
 
-    <!-- Strings used for fragments for navigation -->
-    <string name="fwk_fragment_label">Framework Bluetooth Fragment</string>
-    <string name="btx_fragment_label">BluetoothX Fragment</string>
-    <string name="next">Next</string>
-    <string name="previous">Previous</string>
+    <string name="title_fwk">Framework</string>
+    <string name="title_btx">BluetoothX</string>
 
     <string name="scan_using_fwk">Scan using Framework Bluetooth APIs</string>
     <string name="scan_using_btx">Scan using BluetoothX APIs</string>
-
-    <string name="scan_start_message">Scan should have started. Results are in Logcat</string>
+    <string name="scan_start_message">Scan started. Results are in Logcat</string>
 
     <string name="advertise_using_fwk">Advertise using Framework Bluetooth APIs</string>
+    <string name="advertise_using_btx">Advertise using BluetoothX APIs</string>
     <string name="advertise_start_message">Advertise started</string>
+
+    <string name="open_gatt_server_using_fwk">Open GATT Server using Framework Bluetooth APIs</string>
+    <string name="open_gatt_server_using_btx">Open GATT Server using BluetoothX APIs</string>
+    <string name="gatt_server_open">GATT Server open</string>
 </resources>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/values/themes.xml b/bluetooth/integration-tests/testapp/src/main/res/values/themes.xml
new file mode 100644
index 0000000..2373b57c
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/values/themes.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.TestApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_500</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/white</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_700</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>
diff --git a/browser/OWNERS b/browser/OWNERS
index af78ac1..a8919b3 100644
--- a/browser/OWNERS
+++ b/browser/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461302
 peconn@google.com
 eirage@google.com
diff --git a/buildSrc-tests/max-dep-versions/buildSrc-tests-max-dep-versions-main/build.gradle b/buildSrc-tests/max-dep-versions/buildSrc-tests-max-dep-versions-main/build.gradle
index c4eed3c5..cfbfab5 100644
--- a/buildSrc-tests/max-dep-versions/buildSrc-tests-max-dep-versions-main/build.gradle
+++ b/buildSrc-tests/max-dep-versions/buildSrc-tests-max-dep-versions-main/build.gradle
@@ -6,7 +6,7 @@
 }
 
 dependencies {
-    implementation("androidx.buildSrc-tests:buildSrc-tests-max-dep-versions-dep:1.0.0")
+    implementation("androidx.buildSrc-tests-max-dep-versions-dep:buildSrc-tests-max-dep-versions-dep:1.0.0")
 }
 
 android {
diff --git a/buildSrc-tests/project-subsets/src/test/kotlin/androidx/build/ProjectSubsetsTest.kt b/buildSrc-tests/project-subsets/src/test/kotlin/androidx/build/ProjectSubsetsTest.kt
index 15c073f..5bfe120 100644
--- a/buildSrc-tests/project-subsets/src/test/kotlin/androidx/build/ProjectSubsetsTest.kt
+++ b/buildSrc-tests/project-subsets/src/test/kotlin/androidx/build/ProjectSubsetsTest.kt
@@ -96,9 +96,13 @@
         // dependencies during these tests, it is already handled by the main build.
         // Having it validate here breaks in androidx-studio-integration case where we
         // might get new dependencies from AGP that are missinng signatures.
+
+        // Run buildOnServer to validate project dependencies and constraints
         GradleRunner.create()
             .withProjectDir(projectDir)
-            .withArguments("-Pandroidx.projects=$name", "tasks", "--dependency-verification=off")
+            .withArguments(
+                "-Pandroidx.projects=$name", "buildOnServer", "-m", "--dependency-verification=off"
+            )
             .withTestKitDir(File(outDir, ".gradle-testkit"))
             .build(); // fails the test if the build fails
     }
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt
new file mode 100644
index 0000000..47ae5ff
--- /dev/null
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilderTest.kt
@@ -0,0 +1,339 @@
+/*
+ * 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.testConfiguration
+
+import org.hamcrest.CoreMatchers
+import org.hamcrest.MatcherAssert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.xml.sax.InputSource
+import org.xml.sax.helpers.DefaultHandler
+import java.io.StringReader
+import javax.xml.parsers.SAXParserFactory
+
+/**
+ * Simple check that the test config templates are able to be parsed as valid xml.
+ */
+@RunWith(JUnit4::class)
+class AndroidTestConfigBuilderTest {
+
+    private lateinit var builder: ConfigBuilder
+    private lateinit var mediaBuilder: MediaConfigBuilder
+
+    @Before
+    fun init() {
+        builder = ConfigBuilder()
+        builder.configName("placeHolderAndroidTest.xml")
+            .isBenchmark(false)
+            .applicationId("com.androidx.placeholder.Placeholder")
+            .isPostsubmit(true)
+            .minSdk("15")
+            .tag("placeholder_tag")
+            .testApkName("placeholder.apk")
+            .testApkSha256("123456")
+            .testRunner("com.example.Runner")
+        mediaBuilder = MediaConfigBuilder()
+        mediaBuilder.clientApplicationId("com.androidx.client.Placeholder")
+            .clientApkName("clientPlaceholder.apk")
+            .serviceApplicationId("com.androidx.service.Placeholder")
+            .serviceApkName("servicePlaceholder.apk")
+            .minSdk("15")
+            .tag("placeholder_tag")
+            .tag("media_compat")
+            .testRunner("com.example.Runner")
+            .isClientPrevious(true)
+            .isServicePrevious(false)
+    }
+
+    @Test
+    fun testXmlAgainstGoldenDefault() {
+        MatcherAssert.assertThat(
+            builder.buildXml(),
+            CoreMatchers.`is`(goldenDefaultConfig)
+        )
+    }
+
+    @Test
+    fun testJsonAgainstGoldenDefault() {
+        MatcherAssert.assertThat(
+            builder.buildJson(),
+            CoreMatchers.`is`("""
+                {
+                  "name": "placeHolderAndroidTest.xml",
+                  "minSdkVersion": "15",
+                  "testSuiteTags": [
+                    "placeholder_tag"
+                  ],
+                  "testApk": "placeholder.apk",
+                  "testApkSha256": "123456",
+                  "instrumentationArgs": [
+                    {
+                      "key": "notAnnotation",
+                      "value": "androidx.test.filters.FlakyTest"
+                    }
+                  ],
+                  "additionalApkKeys": []
+                }
+            """.trimIndent()
+            )
+        )
+    }
+
+    @Test
+    fun testJsonAgainstGoldenAdditionalApkKey() {
+        builder.additionalApkKeys(listOf("customKey"))
+        MatcherAssert.assertThat(
+            builder.buildJson(),
+            CoreMatchers.`is`("""
+                {
+                  "name": "placeHolderAndroidTest.xml",
+                  "minSdkVersion": "15",
+                  "testSuiteTags": [
+                    "placeholder_tag"
+                  ],
+                  "testApk": "placeholder.apk",
+                  "testApkSha256": "123456",
+                  "instrumentationArgs": [
+                    {
+                      "key": "notAnnotation",
+                      "value": "androidx.test.filters.FlakyTest"
+                    }
+                  ],
+                  "additionalApkKeys": [
+                    "customKey"
+                  ]
+                }
+            """.trimIndent()
+            )
+        )
+    }
+
+    @Test
+    fun testJsonAgainstGoldenPresubmitBenchmark() {
+        builder.isBenchmark(true)
+            .isPostsubmit(false)
+        MatcherAssert.assertThat(
+            builder.buildJson(),
+            CoreMatchers.`is`("""
+                {
+                  "name": "placeHolderAndroidTest.xml",
+                  "minSdkVersion": "15",
+                  "testSuiteTags": [
+                    "placeholder_tag"
+                  ],
+                  "testApk": "placeholder.apk",
+                  "testApkSha256": "123456",
+                  "instrumentationArgs": [
+                    {
+                      "key": "notAnnotation",
+                      "value": "androidx.test.filters.FlakyTest"
+                    },
+                    {
+                      "key": "androidx.benchmark.dryRunMode.enable",
+                      "value": "true"
+                    }
+                  ],
+                  "additionalApkKeys": []
+                }
+            """.trimIndent()
+            )
+        )
+    }
+
+    @Test
+    fun testJsonAgainstAppTestGolden() {
+        builder.appApkName("app-placeholder.apk")
+            .appApkSha256("654321")
+        MatcherAssert.assertThat(
+            builder.buildJson(),
+            CoreMatchers.`is`("""
+                {
+                  "name": "placeHolderAndroidTest.xml",
+                  "minSdkVersion": "15",
+                  "testSuiteTags": [
+                    "placeholder_tag"
+                  ],
+                  "testApk": "placeholder.apk",
+                  "testApkSha256": "123456",
+                  "appApk": "app-placeholder.apk",
+                  "appApkSha256": "654321",
+                  "instrumentationArgs": [
+                    {
+                      "key": "notAnnotation",
+                      "value": "androidx.test.filters.FlakyTest"
+                    }
+                  ],
+                  "additionalApkKeys": []
+                }
+            """.trimIndent()
+            )
+        )
+    }
+
+    @Test
+    fun testAgainstMediaGoldenDefault() {
+        MatcherAssert.assertThat(
+            mediaBuilder.build(),
+            CoreMatchers.`is`(goldenMediaDefaultConfig)
+        )
+    }
+
+    @Test
+    fun testValidTestConfigXml_default() {
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_benchmarkTrue() {
+        builder.isBenchmark(true)
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_withAppApk() {
+        builder.appApkName("Placeholder.apk")
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_presubmitWithAppApk() {
+        builder.isPostsubmit(false)
+            .appApkName("Placeholder.apk")
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_runAllTests() {
+        builder.runAllTests(false)
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_multipleTags() {
+        builder.tag("another_tag")
+        MatcherAssert.assertThat(builder.tags.size, CoreMatchers.`is`(2))
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_presubmit() {
+        builder.isPostsubmit(false)
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidTestConfigXml_presubmitBenchmark() {
+        builder.isPostsubmit(false)
+            .isBenchmark(true)
+        validate(builder.buildXml())
+    }
+
+    @Test
+    fun testValidMediaConfigXml_default() {
+        validate(mediaBuilder.build())
+    }
+
+    private fun validate(xml: String) {
+        val parser = SAXParserFactory.newInstance().newSAXParser()
+        return parser.parse(
+            InputSource(
+                StringReader(
+                    xml
+                )
+            ),
+            DefaultHandler()
+        )
+    }
+}
+
+private val goldenDefaultConfig = """
+    <?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.-->
+    <configuration description="Runs tests for the module">
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
+    <option name="min-api-level" value="15" />
+    </object>
+    <option name="test-suite-tag" value="placeholder_tag" />
+    <option name="config-descriptor:metadata" key="applicationId" value="com.androidx.placeholder.Placeholder" />
+    <option name="wifi:disable" value="true" />
+    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
+    <include name="google/unbundled/common/setup" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+    <option name="cleanup-apks" value="true" />
+    <option name="install-arg" value="-t" />
+    <option name="test-file-name" value="placeholder.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+    <option name="runner" value="com.example.Runner"/>
+    <option name="package" value="com.androidx.placeholder.Placeholder" />
+    </test>
+    </configuration>
+""".trimIndent()
+
+private val goldenMediaDefaultConfig = """
+    <?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.-->
+    <configuration description="Runs tests for the module">
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
+    <option name="min-api-level" value="15" />
+    </object>
+    <option name="test-suite-tag" value="placeholder_tag" />
+    <option name="test-suite-tag" value="media_compat" />
+    <option name="config-descriptor:metadata" key="applicationId" value="com.androidx.client.Placeholder;com.androidx.service.Placeholder" />
+    <option name="wifi:disable" value="true" />
+    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
+    <include name="google/unbundled/common/setup" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+    <option name="cleanup-apks" value="true" />
+    <option name="install-arg" value="-t" />
+    <option name="test-file-name" value="clientPlaceholder.apk" />
+    <option name="test-file-name" value="servicePlaceholder.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+    <option name="runner" value="com.example.Runner"/>
+    <option name="package" value="com.androidx.client.Placeholder" />
+    <option name="instrumentation-arg" key="client_version" value="previous" />
+    <option name="instrumentation-arg" key="service_version" value="tot" />
+    </test>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+    <option name="runner" value="com.example.Runner"/>
+    <option name="package" value="com.androidx.service.Placeholder" />
+    <option name="instrumentation-arg" key="client_version" value="previous" />
+    <option name="instrumentation-arg" key="service_version" value="tot" />
+    </test>
+    </configuration>
+""".trimIndent()
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilderTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilderTest.kt
deleted file mode 100644
index 4485180..0000000
--- a/buildSrc-tests/src/test/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilderTest.kt
+++ /dev/null
@@ -1,250 +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.testConfiguration
-
-import org.hamcrest.CoreMatchers
-import org.hamcrest.MatcherAssert
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import org.xml.sax.InputSource
-import org.xml.sax.helpers.DefaultHandler
-import java.io.StringReader
-import javax.xml.parsers.SAXParserFactory
-
-/**
- * Simple check that the test config templates are able to be parsed as valid xml.
- */
-@RunWith(JUnit4::class)
-class AndroidTestXmlBuilderTest {
-
-    private lateinit var builder: ConfigBuilder
-    private lateinit var mediaBuilder: MediaConfigBuilder
-
-    @Before
-    fun init() {
-        builder = ConfigBuilder()
-        builder.isBenchmark(false)
-            .applicationId("com.androidx.placeholder.Placeholder")
-            .isPostsubmit(true)
-            .minSdk("15")
-            .tag("placeholder_tag")
-            .testApkName("placeholder.apk")
-            .testRunner("com.example.Runner")
-        mediaBuilder = MediaConfigBuilder()
-        mediaBuilder.clientApplicationId("com.androidx.client.Placeholder")
-            .clientApkName("clientPlaceholder.apk")
-            .serviceApplicationId("com.androidx.service.Placeholder")
-            .serviceApkName("servicePlaceholder.apk")
-            .minSdk("15")
-            .tag("placeholder_tag")
-            .tag("media_compat")
-            .testRunner("com.example.Runner")
-            .isClientPrevious(true)
-            .isServicePrevious(false)
-    }
-
-    @Test
-    fun testAgainstGoldenDefault() {
-        MatcherAssert.assertThat(
-            builder.build(),
-            CoreMatchers.`is`(goldenDefaultConfig)
-        )
-    }
-
-    @Test
-    fun testAgainstMediaGoldenDefault() {
-        MatcherAssert.assertThat(
-            mediaBuilder.build(),
-            CoreMatchers.`is`(goldenMediaDefaultConfig)
-        )
-    }
-
-    @Test
-    fun testValidTestConfigXml_default() {
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_benchmarkTrue() {
-        builder.isBenchmark(true)
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_withAppApk() {
-        builder.appApkName("Placeholder.apk")
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_presubmitWithAppApk() {
-        builder.isPostsubmit(false)
-            .appApkName("Placeholder.apk")
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_runAllTests() {
-        builder.runAllTests(false)
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_multipleTags() {
-        builder.tag("another_tag")
-        MatcherAssert.assertThat(builder.tags.size, CoreMatchers.`is`(2))
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_presubmit() {
-        builder.isPostsubmit(false)
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_presubmitBenchmark() {
-        builder.isPostsubmit(false)
-            .isBenchmark(true)
-        validate(builder.build())
-    }
-
-    @Test
-    fun testValidTestConfigXml_disableDeviceTests() {
-        builder.disableDeviceTests(true)
-        MatcherAssert.assertThat(
-            builder.build(),
-            CoreMatchers.`is`(disableDeviceTestsConfig)
-        )
-    }
-
-    @Test
-    fun testValidMediaConfigXml_default() {
-        validate(mediaBuilder.build())
-    }
-
-    @Test
-    fun testValidMediaConfigXml_presubmit() {
-        mediaBuilder.isPostsubmit(false)
-        validate(mediaBuilder.build())
-    }
-
-    private fun validate(xml: String) {
-        val parser = SAXParserFactory.newInstance().newSAXParser()
-        return parser.parse(
-            InputSource(
-                StringReader(
-                    xml
-                )
-            ),
-            DefaultHandler()
-        )
-    }
-}
-
-private val disableDeviceTestsConfig = """
-    <?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.-->
-
-""".trimIndent()
-
-private val goldenDefaultConfig = """
-    <?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.-->
-    <configuration description="Runs tests for the module">
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
-    <option name="min-api-level" value="15" />
-    </object>
-    <option name="test-suite-tag" value="placeholder_tag" />
-    <option name="config-descriptor:metadata" key="applicationId" value="com.androidx.placeholder.Placeholder" />
-    <option name="wifi:disable" value="true" />
-    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
-    <include name="google/unbundled/common/setup" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-    <option name="cleanup-apks" value="true" />
-    <option name="install-arg" value="-t" />
-    <option name="test-file-name" value="placeholder.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
-    <option name="runner" value="com.example.Runner"/>
-    <option name="package" value="com.androidx.placeholder.Placeholder" />
-    </test>
-    </configuration>
-""".trimIndent()
-
-private val goldenMediaDefaultConfig = """
-    <?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.-->
-    <configuration description="Runs tests for the module">
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
-    <option name="min-api-level" value="15" />
-    </object>
-    <option name="test-suite-tag" value="placeholder_tag" />
-    <option name="test-suite-tag" value="media_compat" />
-    <option name="config-descriptor:metadata" key="applicationId" value="com.androidx.client.Placeholder;com.androidx.service.Placeholder" />
-    <option name="wifi:disable" value="true" />
-    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
-    <include name="google/unbundled/common/setup" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-    <option name="cleanup-apks" value="true" />
-    <option name="install-arg" value="-t" />
-    <option name="test-file-name" value="clientPlaceholder.apk" />
-    <option name="test-file-name" value="servicePlaceholder.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
-    <option name="runner" value="com.example.Runner"/>
-    <option name="package" value="com.androidx.client.Placeholder" />
-    <option name="instrumentation-arg" key="client_version" value="previous" />
-    <option name="instrumentation-arg" key="service_version" value="tot" />
-    </test>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
-    <option name="runner" value="com.example.Runner"/>
-    <option name="package" value="com.androidx.service.Placeholder" />
-    <option name="instrumentation-arg" key="client_version" value="previous" />
-    <option name="instrumentation-arg" key="service_version" value="tot" />
-    </test>
-    </configuration>
-""".trimIndent()
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
index d6ec9a5..b5e2ada 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
@@ -342,6 +342,8 @@
 
     var disableDeviceTests = false
 
+    val additionalDeviceTestApkKeys = mutableListOf<String>()
+
     fun shouldEnforceKotlinStrictApiMode(): Boolean {
         return !legacyDisableKotlinStrictApiMode &&
             shouldConfigureApiTasks()
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
index 56668f8..72b5897 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
@@ -21,6 +21,21 @@
 import org.gradle.api.Project
 
 /**
+ * Whether to enable constraints for projects in same-version groups
+ *
+ * This is expected to be true during builds that publish artifacts externally
+ * This is expected to be false during most other builds because:
+ *   Developers may be interested in including only a subset of projects in ANDROIDX_PROJECTS to
+ *     make Studio run more quickly.
+ *   If a build contains only a subset of projects, we cannot necessarily add constraints between
+ *     all pairs of projects in the same group.
+ *   We want most builds to have high remote cache usage, so we want constraints to be
+ *     similar across most builds
+ * See go/androidx-group-constraints for more information
+ */
+const val ADD_GROUP_CONSTRAINTS = "androidx.constraints"
+
+/**
  * Setting this property makes Test tasks succeed even if there
  * are some failing tests. Useful when running tests in CI where build
  * passes test results as XML to test reporter.
@@ -142,6 +157,7 @@
 const val ALLOW_CUSTOM_COMPILE_SDK = "androidx.allowCustomCompileSdk"
 
 val ALL_ANDROIDX_PROPERTIES = setOf(
+    ADD_GROUP_CONSTRAINTS,
     ALTERNATIVE_PROJECT_URL,
     VERSION_EXTRA_CHECK_ENABLED,
     VALIDATE_PROJECT_STRUCTURE,
@@ -172,6 +188,13 @@
 )
 
 /**
+ * Whether to enable constraints for projects in same-version groups
+ * See the property definition for more details
+ */
+fun Project.shouldAddGroupConstraints(): Boolean =
+    findBooleanProperty(ADD_GROUP_CONSTRAINTS) ?: false
+
+/**
  * Returns alternative project url that will be used as "url" property
  * in publishing maven artifact metadata.
  *
@@ -262,4 +285,4 @@
 fun Project.isCustomCompileSdkAllowed(): Boolean =
     findBooleanProperty(ALLOW_CUSTOM_COMPILE_SDK) ?: true
 
-fun Project.findBooleanProperty(propName: String) = (findProperty(propName) as? String)?.toBoolean()
\ No newline at end of file
+fun Project.findBooleanProperty(propName: String) = (findProperty(propName) as? String)?.toBoolean()
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index edf3185..6d46882 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -154,6 +154,7 @@
         project.tasks.register("printCoordinates", PrintProjectCoordinatesTask::class.java) {
             it.configureWithAndroidXExtension(extension)
         }
+        project.configureConstraintsWithinGroup(extension)
     }
 
     private fun Project.registerProjectOrArtifact() {
@@ -321,6 +322,7 @@
             }
             project.configureKmpTests()
             project.configureSourceJarForMultiplatform()
+            project.configureLintForMultiplatform(extension)
         }
     }
 
@@ -526,7 +528,9 @@
         }
 
         // Standard lint, docs, and Metalava configuration for AndroidX projects.
-        project.configureNonAndroidProjectForLint(extension)
+        if (project.multiplatformExtension == null) {
+            project.configureNonAndroidProjectForLint(extension)
+        }
         val apiTaskConfig = if (project.multiplatformExtension != null) {
             KmpApiTaskConfig
         } else {
@@ -749,14 +753,18 @@
 
             config.dependencyConstraints.configureEach { dependencyConstraint ->
                 dependencyConstraint.apply {
-                    // Remove strict constraints on test dependencies and listenablefuture:1.0
-                    if (isTestConfig ||
-                        group == "com.google.guava" &&
-                        name == "listenablefuture" &&
-                        version == "1.0"
-                    ) {
-                        version { versionConstraint ->
-                            versionConstraint.strictly("")
+                    // Clear strict constraints on test dependencies and listenablefuture:1.0
+                    // Don't clear non-strict constraints because they might refer to projects,
+                    // and clearing their versions might be unsupported and unnecessary
+                    if (versionConstraint.strictVersion != "") {
+                        if (isTestConfig ||
+                            (group == "com.google.guava" &&
+                            name == "listenablefuture" &&
+                            version == "1.0")
+                        ) {
+                            version { versionConstraint ->
+                                versionConstraint.strictly("")
+                            }
                         }
                     }
                 }
@@ -869,6 +877,71 @@
         }
     }
 
+    // If this project wants other project in the same group to have the same version,
+    // this function configures those constraints.
+    private fun Project.configureConstraintsWithinGroup(
+        extension: AndroidXExtension
+    ) {
+        if (!project.shouldAddGroupConstraints()) {
+            return
+        }
+        project.afterEvaluate {
+            // make sure that the project has a group
+            val projectGroup = extension.mavenGroup
+            if (projectGroup == null)
+                return@afterEvaluate
+            // make sure that this group is configured to use a single version
+            val requiredVersion = projectGroup.atomicGroupVersion
+            if (requiredVersion == null)
+                return@afterEvaluate
+
+            // We don't want to emit the same constraint into our .module file more than once,
+            // and we don't want to try to apply a constraint to a configuration that doesn't accept them,
+            // so we create a configuration to hold the constraints and make each other constraint extend it
+            val constraintConfiguration = project.configurations.create("groupConstraints")
+            project.configurations.configureEach { configuration ->
+                if (configuration != constraintConfiguration)
+                    configuration.extendsFrom(constraintConfiguration)
+            }
+
+            val otherProjectPathsInSameGroup = extension.getAllProjectPathsInSameGroup()
+            val constraints = project.dependencies.constraints
+            val allProjectsExist = buildContainsAllStandardProjects()
+            for (otherPath in otherProjectPathsInSameGroup) {
+                // don't need a constraint pointing at self
+                if (otherPath == project.path)
+                    continue
+                // We only enable constraints for builds that we intend to be able to publish from.
+                //   If a project isn't included in a build we intend to be able to publish from,
+                //   the project isn't going to be published.
+                // Sometimes this can happen when a project subset is enabled:
+                //   The KMP project subset enabled by androidx_multiplatform_mac.sh contains
+                //   :benchmark:benchmark-common but not :benchmark:benchmark-benchmark
+                //   This is ok because we don't intend to publish that artifact from that build
+                val otherProjectShouldExist = allProjectsExist || findProject(otherPath) != null
+                if (otherProjectShouldExist) {
+                    val dependencyConstraint = project(otherPath)
+                    constraints.add(
+                        constraintConfiguration.name,
+                        dependencyConstraint
+                    )
+                }
+            }
+        }
+    }
+
+    /**
+     * Tells whether this build contains the usual set of all projects (`./gradlew projects`)
+     * Sometimes developers request to include fewer projects because this may run more quickly
+     */
+    private fun Project.buildContainsAllStandardProjects(): Boolean {
+        if (getProjectSubset() != null)
+            return false
+        if (ProjectLayoutType.isPlayground(this))
+            return false
+        return true
+    }
+
     companion object {
         const val BUILD_TEST_APKS_TASK = "buildTestApks"
         const val CREATE_LIBRARY_BUILD_INFO_FILES_TASK = "createLibraryBuildInfoFiles"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index 963ed8d..6fd8e08 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -107,9 +107,6 @@
             buildOnServerTask.dependsOn(it)
         }
 
-        val createArchiveTask = Release.getGlobalFullZipTask(this)
-        buildOnServerTask.dependsOn(createArchiveTask)
-
         extra.set("projects", ConcurrentHashMap<String, String>())
         subprojects { project ->
             project.afterEvaluate {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
index 980df6f..62d83d0 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
@@ -58,7 +58,6 @@
     fun getRequiredFiles(): List<File> {
         return mutableListOf(
             "androidx_aggregate_build_info.txt",
-            "top-of-tree-m2repository-all-$buildId.zip"
         ).map { fileName -> File(distributionDirectory, fileName) }
     }
 
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index c6cb420..6334db6 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -24,6 +24,7 @@
 import org.gradle.api.GradleException
 import org.gradle.api.Project
 import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.plugins.JavaPluginExtension
 import org.gradle.api.services.BuildService
 import org.gradle.api.services.BuildServiceParameters
 import org.gradle.kotlin.dsl.getByType
@@ -272,5 +273,50 @@
     }
 }
 
+/**
+ * Lint on multiplatform  projects is only applied to Java code and android source sets. To force it
+ * to run on JVM code, we add the java source sets that lint looks for, but use the sources
+ * directories of the JVM source sets if they exist.
+ */
+fun Project.configureLintForMultiplatform(extension: AndroidXExtension) = afterEvaluate {
+    // if lint has been applied through some other mechanism, this step is unnecessary
+    runCatching { project.tasks.named("lint") }.onSuccess { return@afterEvaluate }
+    val jvmTarget = project.multiplatformExtension?.targets?.findByName("jvm")
+        ?: return@afterEvaluate
+    val runtimeConfiguration = project.configurations.findByName("jvmRuntimeElements")
+        ?: return@afterEvaluate
+    val apiConfiguration = project.configurations.findByName("jvmApiElements")
+        ?: return@afterEvaluate
+    val javaExtension = project.extensions.findByType(JavaPluginExtension::class.java)
+        ?: return@afterEvaluate
+    project.configurations.maybeCreate("runtimeElements").apply {
+        extendsFrom(runtimeConfiguration)
+    }
+    project.configurations.maybeCreate("apiElements").apply {
+        extendsFrom(apiConfiguration)
+    }
+    val mainSourceSets = jvmTarget
+        .compilations
+        .getByName("main")
+        .kotlinSourceSets
+    val testSourceSets = jvmTarget
+        .compilations
+        .getByName("test")
+        .kotlinSourceSets
+    javaExtension.sourceSets.maybeCreate("main").apply {
+        java.setSrcDirs(mainSourceSets.flatMap { it.kotlin.srcDirs })
+        java.classesDirectory
+    }
+    javaExtension.sourceSets.maybeCreate("test").apply {
+        java.srcDirs.addAll(testSourceSets.flatMap { it.kotlin.srcDirs })
+    }
+    project.configureNonAndroidProjectForLint(extension)
+
+    // Disable classfile based checks because lint cannot find the classfiles for multiplatform
+    // projects, and SourceSet.java.classesDirectory is not configurable. This is not ideal, but
+    // better than having no lint checks at all.
+    extensions.getByType<Lint>().disable.add("LintError")
+}
+
 val Project.lintBaseline: RegularFileProperty get() =
     project.objects.fileProperty().fileValue(File(projectDir, "/lint-baseline.xml"))
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/ProjectResolver.kt b/buildSrc/private/src/main/kotlin/androidx/build/ProjectResolver.kt
index 7858465..4b207e8 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/ProjectResolver.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/ProjectResolver.kt
@@ -38,7 +38,13 @@
     }
 }
 
-private fun Project.getProjectSubset(): String? {
+/**
+ * Returns the name of the subset of projects participating in the build.
+ *
+ * Project subsets are defined in settings.gradle and allow including only a subset of projects
+ * in the build, to make project configuration run more quickly.
+ */
+fun Project.getProjectSubset(): String? {
     val prop = project.providers.gradleProperty("androidx.projects")
     if (prop.isPresent()) {
         return prop.get().uppercase()
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
index 571e78f..40daa4e 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
@@ -17,7 +17,9 @@
 
 import com.android.build.gradle.LibraryExtension
 import org.gradle.api.Action
+import org.gradle.api.GradleException
 import org.gradle.api.Project
+import org.gradle.api.Task
 import org.gradle.api.file.DuplicatesStrategy
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.Internal
@@ -52,6 +54,21 @@
     init {
         // multiple artifacts in the same group might have the same maven-metadata.xml
         duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+        if (!project.shouldAddGroupConstraints()) {
+            doFirst {
+                throw GradleException(
+                    """
+                    Cannot publish artifacts without setting -P$ADD_GROUP_CONSTRAINTS=true
+
+                    This property is required when building artifacts to publish
+
+                    (but this property can reduce remote cache usage so it is disabled by default)
+
+                    See AndroidXGradleProperties.kt for more information about this property
+                    """.trimIndent()
+                )
+            }
+        }
     }
 
     /**
@@ -141,6 +158,7 @@
     const val PROJECT_ARCHIVE_ZIP_TASK_NAME = "createProjectZip"
     const val DIFF_TASK_PREFIX = "createDiffArchive"
     const val FULL_ARCHIVE_TASK_NAME = "createArchive"
+    const val ALL_ARCHIVES_TASK_NAME = "createAllArchives"
     const val DEFAULT_PUBLISH_CONFIG = "release"
     const val GROUP_ZIPS_FOLDER = "per-group-zips"
     const val PROJECT_ZIPS_FOLDER = "per-project-zips"
@@ -250,9 +268,27 @@
     }
 
     /**
+     * Registers an archive task as a dependency of the anchor task
+     */
+    private fun Project.addToAnchorTask(task: TaskProvider<GMavenZipTask>) {
+        val archiveAnchorTask = project.rootProject.maybeRegister(
+            name = ALL_ARCHIVES_TASK_NAME,
+            onConfigure = { archiveTask: Task ->
+                archiveTask.group = "Distribution"
+                archiveTask.description = "Builds all archives for publishing"
+            },
+            onRegister = {
+            }
+        )
+        archiveAnchorTask.configure {
+            it.dependsOn(task)
+        }
+    }
+
+    /**
      * Creates and returns the task that includes all projects regardless of their release status.
      */
-    fun getGlobalFullZipTask(project: Project): TaskProvider<GMavenZipTask> {
+    private fun getGlobalFullZipTask(project: Project): TaskProvider<GMavenZipTask> {
         return project.rootProject.maybeRegister(
             name = FULL_ARCHIVE_TASK_NAME,
             onConfigure = {
@@ -266,7 +302,8 @@
                     )
                 ).execute(it)
             },
-            onRegister = {
+            onRegister = { taskProvider: TaskProvider<GMavenZipTask> ->
+                project.addToAnchorTask(taskProvider)
             }
         )
     }
@@ -278,9 +315,9 @@
         project: Project,
         group: String
     ): TaskProvider<GMavenZipTask> {
-        val taskProvider: TaskProvider<GMavenZipTask> = project.rootProject.maybeRegister(
+        return project.rootProject.maybeRegister(
             name = "${DIFF_TASK_PREFIX}For${groupToTaskNameSuffix(group)}",
-            onConfigure = {
+            onConfigure = { task: GMavenZipTask ->
                 GMavenZipTask.ConfigAction(
                     getParams(
                         project = project,
@@ -288,13 +325,12 @@
                         fileNamePrefix = GROUP_ZIP_PREFIX,
                         group = group
                     )
-                ).execute(it)
+                ).execute(task)
             },
-            onRegister = {
+            onRegister = { taskProvider ->
+                project.addToAnchorTask(taskProvider)
             }
         )
-        project.addToBuildOnServer(taskProvider)
-        return taskProvider
     }
 
     private fun getProjectZipTask(
@@ -303,7 +339,7 @@
         val taskProvider = project.tasks.register(
             PROJECT_ARCHIVE_ZIP_TASK_NAME,
             GMavenZipTask::class.java
-        ) {
+        ) { task: GMavenZipTask ->
             GMavenZipTask.ConfigAction(
                 getParams(
                     project = project,
@@ -312,9 +348,9 @@
                 ).copy(
                     includeMetadata = true
                 )
-            ).execute(it)
+            ).execute(task)
         }
-        project.addToBuildOnServer(taskProvider)
+        project.addToAnchorTask(taskProvider)
         return taskProvider
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
index e126ddc..ac9e5a3 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
@@ -56,10 +56,10 @@
 import org.gradle.api.file.RegularFile
 import org.gradle.api.model.ObjectFactory
 import org.gradle.api.plugins.JavaBasePlugin
-import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
 import org.gradle.api.provider.Provider
 import org.gradle.api.tasks.CacheableTask
-import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Classpath
 import org.gradle.api.tasks.OutputDirectory
 import org.gradle.api.tasks.InputFiles
 import org.gradle.api.tasks.OutputFile
@@ -663,8 +663,8 @@
 @CacheableTask
 abstract class UnzipMultiplatformSourcesTask() : DefaultTask() {
 
-    @get:Input
-    abstract val inputJars: ListProperty<File>
+    @get:Classpath
+    abstract val inputJars: Property<FileCollection>
 
     @OutputDirectory
     lateinit var metadataOutput: File
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dokka/kmpDocs/DokkaWorkAction.kt b/buildSrc/private/src/main/kotlin/androidx/build/dokka/kmpDocs/DokkaWorkAction.kt
index 002f029..2536678 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dokka/kmpDocs/DokkaWorkAction.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dokka/kmpDocs/DokkaWorkAction.kt
@@ -60,6 +60,7 @@
             it.errorOutput = errorStream
             it.classpath = parameters.classpath
             it.args(parameters.inputFile.get().asFile.canonicalPath)
+            it.isIgnoreExitValue = true
         }
         if (result.exitValue != 0) {
             throw GradleException("Failed to run Dokka.\n ${errorStream.toString(Charsets.UTF_8)}")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt
new file mode 100644
index 0000000..f7bcd5c
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestConfigBuilder.kt
@@ -0,0 +1,439 @@
+/*
+ * 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.testConfiguration
+
+import com.google.gson.GsonBuilder
+
+class ConfigBuilder {
+    lateinit var configName: String
+    var appApkName: String? = null
+    var appApkSha256: String? = null
+    lateinit var applicationId: String
+    var isBenchmark: Boolean = false
+    var isPostsubmit: Boolean = true
+    lateinit var minSdk: String
+    var runAllTests: Boolean = true
+    var cleanupApks: Boolean = true
+    val tags = mutableListOf<String>()
+    lateinit var testApkName: String
+    lateinit var testApkSha256: String
+    lateinit var testRunner: String
+    val additionalApkKeys = mutableListOf<String>()
+
+    fun configName(configName: String) = apply { this.configName = configName }
+    fun appApkName(appApkName: String) = apply { this.appApkName = appApkName }
+    fun appApkSha256(appApkSha256: String) = apply { this.appApkSha256 = appApkSha256 }
+    fun applicationId(applicationId: String) = apply { this.applicationId = applicationId }
+    fun isBenchmark(isBenchmark: Boolean) = apply { this.isBenchmark = isBenchmark }
+    fun isPostsubmit(isPostsubmit: Boolean) = apply { this.isPostsubmit = isPostsubmit }
+    fun minSdk(minSdk: String) = apply { this.minSdk = minSdk }
+    fun runAllTests(runAllTests: Boolean) = apply { this.runAllTests = runAllTests }
+    fun cleanupApks(cleanupApks: Boolean) = apply { this.cleanupApks = cleanupApks }
+    fun tag(tag: String) = apply { this.tags.add(tag) }
+    fun additionalApkKeys(keys: List<String>) = apply { additionalApkKeys.addAll(keys) }
+    fun testApkName(testApkName: String) = apply { this.testApkName = testApkName }
+    fun testApkSha256(testApkSha256: String) = apply { this.testApkSha256 = testApkSha256 }
+    fun testRunner(testRunner: String) = apply { this.testRunner = testRunner }
+
+    fun buildJson(): String {
+        val gson = GsonBuilder().setPrettyPrinting().create()
+        val instrumentationArgs = if (isBenchmark && !isPostsubmit) {
+            listOf(
+                InstrumentationArg("notAnnotation", "androidx.test.filters.FlakyTest"),
+                InstrumentationArg("androidx.benchmark.dryRunMode.enable", "true"),
+            )
+        } else {
+            listOf(
+                InstrumentationArg("notAnnotation", "androidx.test.filters.FlakyTest")
+            )
+        }
+        val values = mapOf(
+            "name" to configName,
+            "minSdkVersion" to minSdk,
+            "testSuiteTags" to tags,
+            "testApk" to testApkName,
+            "testApkSha256" to testApkSha256,
+            "appApk" to appApkName,
+            "appApkSha256" to appApkSha256,
+            "instrumentationArgs" to instrumentationArgs,
+            "additionalApkKeys" to additionalApkKeys
+        )
+        return gson.toJson(values)
+    }
+
+    fun buildXml(): String {
+        val sb = StringBuilder()
+        sb.append(XML_HEADER_AND_LICENSE)
+        sb.append(CONFIGURATION_OPEN)
+            .append(MIN_API_LEVEL_CONTROLLER_OBJECT.replace("MIN_SDK", minSdk))
+        tags.forEach { tag ->
+            sb.append(TEST_SUITE_TAG_OPTION.replace("TEST_SUITE_TAG", tag))
+        }
+        sb.append(MODULE_METADATA_TAG_OPTION.replace("APPLICATION_ID", applicationId))
+            .append(WIFI_DISABLE_OPTION)
+            .append(FLAKY_TEST_OPTION)
+        if (isBenchmark) {
+            if (isPostsubmit) {
+                sb.append(BENCHMARK_POSTSUBMIT_OPTIONS)
+            } else {
+                sb.append(BENCHMARK_PRESUBMIT_OPTION)
+            }
+        }
+        sb.append(SETUP_INCLUDE)
+            .append(TARGET_PREPARER_OPEN.replace("CLEANUP_APKS", cleanupApks.toString()))
+            .append(APK_INSTALL_OPTION.replace("APK_NAME", testApkName))
+        if (!appApkName.isNullOrEmpty())
+            sb.append(APK_INSTALL_OPTION.replace("APK_NAME", appApkName!!))
+        // Temporary hardcoded hack for b/181810492
+        else if (applicationId == "androidx.benchmark.macro.test") {
+            sb.append(
+                APK_INSTALL_OPTION.replace(
+                    "APK_NAME",
+                    /* ktlint-disable max-line-length */
+                    "benchmark-integration-tests-macrobenchmark-target_macrobenchmark-target-release.apk"
+                    /* ktlint-enable max-line-length */
+                )
+            )
+        }
+        sb.append(TARGET_PREPARER_CLOSE)
+            .append(TEST_BLOCK_OPEN)
+            .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+            .append(PACKAGE_OPTION.replace("APPLICATION_ID", applicationId))
+        if (runAllTests) {
+            sb.append(TEST_BLOCK_CLOSE)
+        } else {
+            sb.append(SMALL_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+                .append(TEST_BLOCK_OPEN)
+            sb.append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+                .append(PACKAGE_OPTION.replace("APPLICATION_ID", applicationId))
+                .append(MEDIUM_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+        }
+        sb.append(CONFIGURATION_CLOSE)
+        return sb.toString()
+    }
+}
+
+class MediaConfigBuilder {
+    lateinit var configName: String
+    lateinit var clientApkName: String
+    lateinit var clientApkSha256: String
+    lateinit var clientApplicationId: String
+    var isClientPrevious: Boolean = true
+    var isServicePrevious: Boolean = true
+    lateinit var minSdk: String
+    var runAllTests: Boolean = true
+    lateinit var serviceApkName: String
+    lateinit var serviceApkSha256: String
+    lateinit var serviceApplicationId: String
+    var tags: MutableList<String> = mutableListOf()
+    lateinit var testRunner: String
+
+    fun configName(configName: String) = apply { this.configName = configName }
+    fun clientApkName(clientApkName: String) = apply { this.clientApkName = clientApkName }
+    fun clientApkSha256(clientApkSha256: String) = apply { this.clientApkSha256 = clientApkSha256 }
+    fun clientApplicationId(clientApplicationId: String) =
+        apply { this.clientApplicationId = clientApplicationId }
+    fun isClientPrevious(isClientPrevious: Boolean) = apply {
+        this.isClientPrevious = isClientPrevious
+    }
+    fun isServicePrevious(isServicePrevious: Boolean) = apply {
+        this.isServicePrevious = isServicePrevious
+    }
+    fun minSdk(minSdk: String) = apply { this.minSdk = minSdk }
+    fun runAllTests(runAllTests: Boolean) = apply { this.runAllTests = runAllTests }
+    fun serviceApkName(serviceApkName: String) = apply { this.serviceApkName = serviceApkName }
+    fun serviceApkSha256(serviceApkSha256: String) = apply {
+        this.serviceApkSha256 = serviceApkSha256
+    }
+    fun serviceApplicationId(serviceApplicationId: String) =
+        apply { this.serviceApplicationId = serviceApplicationId }
+    fun tag(tag: String) = apply { this.tags.add(tag) }
+    fun testRunner(testRunner: String) = apply { this.testRunner = testRunner }
+
+    private fun mediaInstrumentationArgs(): String {
+        return if (isClientPrevious) {
+            if (isServicePrevious) {
+                CLIENT_PREVIOUS + SERVICE_PREVIOUS
+            } else {
+                CLIENT_PREVIOUS + SERVICE_TOT
+            }
+        } else {
+            if (isServicePrevious) {
+                CLIENT_TOT + SERVICE_PREVIOUS
+            } else {
+                CLIENT_TOT + SERVICE_TOT
+            }
+        }
+    }
+
+    private fun mediaInstrumentationArgsForJson(): List<InstrumentationArg> {
+        return listOf(
+            if (isClientPrevious) {
+                InstrumentationArg(key = "client_version", value = "previous")
+            } else {
+                InstrumentationArg(key = "client_version", value = "tot")
+            },
+            if (isServicePrevious) {
+                InstrumentationArg(key = "service_version", value = "previous")
+            } else {
+                InstrumentationArg(key = "service_version", value = "tot")
+            }
+        )
+    }
+
+    fun buildJson(forClient: Boolean): String {
+        val gson = GsonBuilder().setPrettyPrinting().create()
+        val instrumentationArgs =
+            listOf(
+                InstrumentationArg("notAnnotation", "androidx.test.filters.FlakyTest")
+            ) + mediaInstrumentationArgsForJson()
+        val values = mapOf(
+            "name" to "$configName-${if (forClient) "clientTests" else "serviceTests"}",
+            "minSdkVersion" to minSdk,
+            "testSuiteTags" to tags,
+            "testApk" to if (forClient) clientApkName else serviceApkName,
+            "testApkSha256" to if (forClient) clientApkSha256 else serviceApkSha256,
+            "appApk" to if (forClient) serviceApkName else clientApkName,
+            "appApkSha256" to if (forClient) serviceApkSha256 else clientApkSha256,
+            "instrumentationArgs" to instrumentationArgs,
+            "additionalApkKeys" to listOf<String>()
+        )
+        return gson.toJson(values)
+    }
+
+    fun build(): String {
+        val sb = StringBuilder()
+        sb.append(XML_HEADER_AND_LICENSE)
+            .append(CONFIGURATION_OPEN)
+            .append(MIN_API_LEVEL_CONTROLLER_OBJECT.replace("MIN_SDK", minSdk))
+        tags.forEach { tag ->
+            sb.append(TEST_SUITE_TAG_OPTION.replace("TEST_SUITE_TAG", tag))
+        }
+        sb.append(
+            MODULE_METADATA_TAG_OPTION.replace(
+                "APPLICATION_ID", "$clientApplicationId;$serviceApplicationId"
+            )
+        )
+            .append(WIFI_DISABLE_OPTION)
+            .append(FLAKY_TEST_OPTION)
+            .append(SETUP_INCLUDE)
+            .append(MEDIA_TARGET_PREPARER_OPEN)
+            .append(APK_INSTALL_OPTION.replace("APK_NAME", clientApkName))
+            .append(APK_INSTALL_OPTION.replace("APK_NAME", serviceApkName))
+            .append(TARGET_PREPARER_CLOSE)
+            .append(TEST_BLOCK_OPEN)
+            .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+            .append(PACKAGE_OPTION.replace("APPLICATION_ID", clientApplicationId))
+            .append(mediaInstrumentationArgs())
+        if (runAllTests) {
+            sb.append(TEST_BLOCK_CLOSE)
+                .append(TEST_BLOCK_OPEN)
+                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
+                .append(mediaInstrumentationArgs())
+            sb.append(TEST_BLOCK_CLOSE)
+        } else {
+            // add the small and medium test runners for both client and service apps
+            sb.append(SMALL_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+                .append(TEST_BLOCK_OPEN)
+                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+                .append(PACKAGE_OPTION.replace("APPLICATION_ID", clientApplicationId))
+                .append(mediaInstrumentationArgs())
+                .append(MEDIUM_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+                .append(TEST_BLOCK_OPEN)
+                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
+                .append(mediaInstrumentationArgs())
+                .append(SMALL_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+                .append(TEST_BLOCK_OPEN)
+                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
+                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
+                .append(mediaInstrumentationArgs())
+                .append(MEDIUM_TEST_OPTIONS)
+                .append(TEST_BLOCK_CLOSE)
+        }
+        sb.append(CONFIGURATION_CLOSE)
+        return sb.toString()
+    }
+}
+
+private data class InstrumentationArg(
+    val key: String,
+    val value: String
+)
+
+/**
+ * These constants are the building blocks of the xml configs, but
+ * they aren't very readable as separate chunks. Look to
+ * the golden examples at the bottom of
+ * {@link androidx.build.testConfiguration.XmlTestConfigVerificationTest}
+ * for examples of what the full xml will look like.
+ */
+
+private val XML_HEADER_AND_LICENSE = """
+    <?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.-->
+
+""".trimIndent()
+
+private val CONFIGURATION_OPEN = """
+    <configuration description="Runs tests for the module">
+
+""".trimIndent()
+
+private val CONFIGURATION_CLOSE = """
+    </configuration>
+""".trimIndent()
+
+private val MIN_API_LEVEL_CONTROLLER_OBJECT = """
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
+    <option name="min-api-level" value="MIN_SDK" />
+    </object>
+
+""".trimIndent()
+
+private val TEST_SUITE_TAG_OPTION = """
+    <option name="test-suite-tag" value="TEST_SUITE_TAG" />
+
+""".trimIndent()
+
+private val MODULE_METADATA_TAG_OPTION = """
+    <option name="config-descriptor:metadata" key="applicationId" value="APPLICATION_ID" />
+
+""".trimIndent()
+
+private val WIFI_DISABLE_OPTION = """
+    <option name="wifi:disable" value="true" />
+
+""".trimIndent()
+
+private val SETUP_INCLUDE = """
+    <include name="google/unbundled/common/setup" />
+
+""".trimIndent()
+
+/**
+ * Specify the following options on the APK installer:
+ * - Pass the -t argument when installing APKs. This allows testonly APKs to be installed, which
+ *   includes all APKs built against a pre-release SDK. See b/205571374.
+ */
+private val TARGET_PREPARER_OPEN = """
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+    <option name="cleanup-apks" value="CLEANUP_APKS" />
+    <option name="install-arg" value="-t" />
+
+""".trimIndent()
+
+/**
+ * Differs from [TARGET_PREPARER_OPEN] in that Media target can remove APKs after testing.
+ */
+private val MEDIA_TARGET_PREPARER_OPEN = """
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+    <option name="cleanup-apks" value="true" />
+    <option name="install-arg" value="-t" />
+
+""".trimIndent()
+
+private val TARGET_PREPARER_CLOSE = """
+    </target_preparer>
+
+""".trimIndent()
+
+private val APK_INSTALL_OPTION = """
+    <option name="test-file-name" value="APK_NAME" />
+
+""".trimIndent()
+
+private val TEST_BLOCK_OPEN = """
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+
+""".trimIndent()
+
+private val TEST_BLOCK_CLOSE = """
+    </test>
+
+""".trimIndent()
+
+private val RUNNER_OPTION = """
+    <option name="runner" value="TEST_RUNNER"/>
+
+""".trimIndent()
+
+private val PACKAGE_OPTION = """
+    <option name="package" value="APPLICATION_ID" />
+
+""".trimIndent()
+
+private val BENCHMARK_PRESUBMIT_OPTION = """
+    <option name="instrumentation-arg" key="androidx.benchmark.dryRunMode.enable" value="true" />
+
+""".trimIndent()
+
+private val BENCHMARK_POSTSUBMIT_OPTIONS = """
+    <option name="instrumentation-arg" key="androidx.benchmark.output.enable" value="true" />
+    <option name="instrumentation-arg" key="listener" value="androidx.benchmark.junit4.InstrumentationResultsRunListener" />
+
+""".trimIndent()
+
+private val FLAKY_TEST_OPTION = """
+    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
+
+""".trimIndent()
+
+private val SMALL_TEST_OPTIONS = """
+    <option name="size" value="small" />
+
+""".trimIndent()
+
+private val MEDIUM_TEST_OPTIONS = """
+    <option name="size" value="medium" />
+
+""".trimIndent()
+
+private val CLIENT_PREVIOUS = """
+    <option name="instrumentation-arg" key="client_version" value="previous" />
+
+""".trimIndent()
+
+private val CLIENT_TOT = """
+    <option name="instrumentation-arg" key="client_version" value="tot" />
+
+""".trimIndent()
+
+private val SERVICE_PREVIOUS = """
+    <option name="instrumentation-arg" key="service_version" value="previous" />
+
+""".trimIndent()
+
+private val SERVICE_TOT = """
+    <option name="instrumentation-arg" key="service_version" value="tot" />
+
+""".trimIndent()
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilder.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilder.kt
deleted file mode 100644
index d5481b8..0000000
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/AndroidTestXmlBuilder.kt
+++ /dev/null
@@ -1,364 +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.testConfiguration
-
-class ConfigBuilder {
-    var appApkName: String? = null
-    lateinit var applicationId: String
-    var isBenchmark: Boolean = false
-    var disableDeviceTests: Boolean = false
-    var isPostsubmit: Boolean = true
-    lateinit var minSdk: String
-    var runAllTests: Boolean = true
-    var cleanupApks: Boolean = true
-    val tags: MutableList<String> = mutableListOf()
-    lateinit var testApkName: String
-    lateinit var testRunner: String
-
-    fun appApkName(appApkName: String) = apply { this.appApkName = appApkName }
-    fun applicationId(applicationId: String) = apply { this.applicationId = applicationId }
-    fun isBenchmark(isBenchmark: Boolean) = apply { this.isBenchmark = isBenchmark }
-    fun disableDeviceTests(disableDeviceTests: Boolean) =
-        apply { this.disableDeviceTests = disableDeviceTests }
-    fun isPostsubmit(isPostsubmit: Boolean) = apply { this.isPostsubmit = isPostsubmit }
-    fun minSdk(minSdk: String) = apply { this.minSdk = minSdk }
-    fun runAllTests(runAllTests: Boolean) = apply { this.runAllTests = runAllTests }
-    fun cleanupApks(cleanupApks: Boolean) = apply { this.cleanupApks = cleanupApks }
-    fun tag(tag: String) = apply { this.tags.add(tag) }
-    fun testApkName(testApkName: String) = apply { this.testApkName = testApkName }
-    fun testRunner(testRunner: String) = apply { this.testRunner = testRunner }
-
-    fun build(): String {
-        val sb = StringBuilder()
-        sb.append(XML_HEADER_AND_LICENSE)
-        if (disableDeviceTests) {
-            return sb.toString()
-        }
-
-        sb.append(CONFIGURATION_OPEN)
-            .append(MIN_API_LEVEL_CONTROLLER_OBJECT.replace("MIN_SDK", minSdk))
-        tags.forEach { tag ->
-            sb.append(TEST_SUITE_TAG_OPTION.replace("TEST_SUITE_TAG", tag))
-        }
-        sb.append(MODULE_METADATA_TAG_OPTION.replace("APPLICATION_ID", applicationId))
-            .append(WIFI_DISABLE_OPTION)
-            .append(FLAKY_TEST_OPTION)
-        if (isBenchmark) {
-            if (isPostsubmit) {
-                sb.append(BENCHMARK_POSTSUBMIT_OPTIONS)
-            } else {
-                sb.append(BENCHMARK_PRESUBMIT_OPTION)
-            }
-        }
-        sb.append(SETUP_INCLUDE)
-            .append(TARGET_PREPARER_OPEN.replace("CLEANUP_APKS", cleanupApks.toString()))
-            .append(APK_INSTALL_OPTION.replace("APK_NAME", testApkName))
-        if (!appApkName.isNullOrEmpty())
-            sb.append(APK_INSTALL_OPTION.replace("APK_NAME", appApkName!!))
-        // Temporary hardcoded hack for b/181810492
-        else if (applicationId == "androidx.benchmark.macro.test") {
-            sb.append(
-                APK_INSTALL_OPTION.replace(
-                    "APK_NAME",
-                    /* ktlint-disable max-line-length */
-                    "benchmark-integration-tests-macrobenchmark-target_macrobenchmark-target-release.apk"
-                    /* ktlint-enable max-line-length */
-                )
-            )
-        }
-        sb.append(TARGET_PREPARER_CLOSE)
-            .append(TEST_BLOCK_OPEN)
-            .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-            .append(PACKAGE_OPTION.replace("APPLICATION_ID", applicationId))
-        if (runAllTests) {
-            sb.append(TEST_BLOCK_CLOSE)
-        } else {
-            sb.append(SMALL_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-                .append(TEST_BLOCK_OPEN)
-            sb.append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-                .append(PACKAGE_OPTION.replace("APPLICATION_ID", applicationId))
-                .append(MEDIUM_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-        }
-        sb.append(CONFIGURATION_CLOSE)
-        return sb.toString()
-    }
-}
-
-class MediaConfigBuilder {
-    lateinit var clientApkName: String
-    lateinit var clientApplicationId: String
-    var isClientPrevious: Boolean = true
-    var isPostsubmit: Boolean = true
-    var isServicePrevious: Boolean = true
-    lateinit var minSdk: String
-    var runAllTests: Boolean = true
-    lateinit var serviceApkName: String
-    lateinit var serviceApplicationId: String
-    var tags: MutableList<String> = mutableListOf()
-    lateinit var testRunner: String
-
-    fun clientApkName(clientApkName: String) = apply { this.clientApkName = clientApkName }
-    fun clientApplicationId(clientApplicationId: String) =
-        apply { this.clientApplicationId = clientApplicationId }
-    fun isPostsubmit(isPostsubmit: Boolean) = apply { this.isPostsubmit = isPostsubmit }
-    fun isClientPrevious(isClientPrevious: Boolean) = apply {
-        this.isClientPrevious = isClientPrevious
-    }
-    fun isServicePrevious(isServicePrevious: Boolean) = apply {
-        this.isServicePrevious = isServicePrevious
-    }
-    fun minSdk(minSdk: String) = apply { this.minSdk = minSdk }
-    fun runAllTests(runAllTests: Boolean) = apply { this.runAllTests = runAllTests }
-    fun serviceApkName(serviceApkName: String) = apply { this.serviceApkName = serviceApkName }
-    fun serviceApplicationId(serviceApplicationId: String) =
-        apply { this.serviceApplicationId = serviceApplicationId }
-    fun tag(tag: String) = apply { this.tags.add(tag) }
-    fun testRunner(testRunner: String) = apply { this.testRunner = testRunner }
-
-    private fun mediaInstrumentationArgs(): String {
-        return if (isClientPrevious) {
-            if (isServicePrevious) {
-                CLIENT_PREVIOUS + SERVICE_PREVIOUS
-            } else {
-                CLIENT_PREVIOUS + SERVICE_TOT
-            }
-        } else {
-            if (isServicePrevious) {
-                CLIENT_TOT + SERVICE_PREVIOUS
-            } else {
-                CLIENT_TOT + SERVICE_TOT
-            }
-        }
-    }
-
-    fun build(): String {
-        val sb = StringBuilder()
-        sb.append(XML_HEADER_AND_LICENSE)
-            .append(CONFIGURATION_OPEN)
-            .append(MIN_API_LEVEL_CONTROLLER_OBJECT.replace("MIN_SDK", minSdk))
-        tags.forEach { tag ->
-            sb.append(TEST_SUITE_TAG_OPTION.replace("TEST_SUITE_TAG", tag))
-        }
-        sb.append(
-            MODULE_METADATA_TAG_OPTION.replace(
-                "APPLICATION_ID", "$clientApplicationId;$serviceApplicationId"
-            )
-        )
-            .append(WIFI_DISABLE_OPTION)
-            .append(FLAKY_TEST_OPTION)
-            .append(SETUP_INCLUDE)
-            .append(MEDIA_TARGET_PREPARER_OPEN)
-            .append(APK_INSTALL_OPTION.replace("APK_NAME", clientApkName))
-            .append(APK_INSTALL_OPTION.replace("APK_NAME", serviceApkName))
-            .append(TARGET_PREPARER_CLOSE)
-            .append(TEST_BLOCK_OPEN)
-            .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-            .append(PACKAGE_OPTION.replace("APPLICATION_ID", clientApplicationId))
-            .append(mediaInstrumentationArgs())
-        if (runAllTests) {
-            sb.append(TEST_BLOCK_CLOSE)
-                .append(TEST_BLOCK_OPEN)
-                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
-                .append(mediaInstrumentationArgs())
-            sb.append(TEST_BLOCK_CLOSE)
-        } else {
-            // add the small and medium test runners for both client and service apps
-            sb.append(SMALL_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-                .append(TEST_BLOCK_OPEN)
-                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-                .append(PACKAGE_OPTION.replace("APPLICATION_ID", clientApplicationId))
-                .append(mediaInstrumentationArgs())
-                .append(MEDIUM_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-                .append(TEST_BLOCK_OPEN)
-                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
-                .append(mediaInstrumentationArgs())
-                .append(SMALL_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-                .append(TEST_BLOCK_OPEN)
-                .append(RUNNER_OPTION.replace("TEST_RUNNER", testRunner))
-                .append(PACKAGE_OPTION.replace("APPLICATION_ID", serviceApplicationId))
-                .append(mediaInstrumentationArgs())
-                .append(MEDIUM_TEST_OPTIONS)
-                .append(TEST_BLOCK_CLOSE)
-        }
-        sb.append(CONFIGURATION_CLOSE)
-        return sb.toString()
-    }
-}
-
-/**
- * These constants are the building blocks of the xml configs, but
- * they aren't very readable as separate chunks. Look to
- * the golden examples at the bottom of
- * {@link androidx.build.testConfiguration.XmlTestConfigVerificationTest}
- * for examples of what the full xml will look like.
- */
-
-private val XML_HEADER_AND_LICENSE = """
-    <?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.-->
-
-""".trimIndent()
-
-private val CONFIGURATION_OPEN = """
-    <configuration description="Runs tests for the module">
-
-""".trimIndent()
-
-private val CONFIGURATION_CLOSE = """
-    </configuration>
-""".trimIndent()
-
-private val MIN_API_LEVEL_CONTROLLER_OBJECT = """
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MinApiLevelModuleController">
-    <option name="min-api-level" value="MIN_SDK" />
-    </object>
-
-""".trimIndent()
-
-private val TEST_SUITE_TAG_OPTION = """
-    <option name="test-suite-tag" value="TEST_SUITE_TAG" />
-
-""".trimIndent()
-
-private val MODULE_METADATA_TAG_OPTION = """
-    <option name="config-descriptor:metadata" key="applicationId" value="APPLICATION_ID" />
-
-""".trimIndent()
-
-private val WIFI_DISABLE_OPTION = """
-    <option name="wifi:disable" value="true" />
-
-""".trimIndent()
-
-private val SETUP_INCLUDE = """
-    <include name="google/unbundled/common/setup" />
-
-""".trimIndent()
-
-/**
- * Specify the following options on the APK installer:
- * - Pass the -t argument when installing APKs. This allows testonly APKs to be installed, which
- *   includes all APKs built against a pre-release SDK. See b/205571374.
- */
-private val TARGET_PREPARER_OPEN = """
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-    <option name="cleanup-apks" value="CLEANUP_APKS" />
-    <option name="install-arg" value="-t" />
-
-""".trimIndent()
-
-/**
- * Differs from [TARGET_PREPARER_OPEN] in that Media target can remove APKs after testing.
- */
-private val MEDIA_TARGET_PREPARER_OPEN = """
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-    <option name="cleanup-apks" value="true" />
-    <option name="install-arg" value="-t" />
-
-""".trimIndent()
-
-private val TARGET_PREPARER_CLOSE = """
-    </target_preparer>
-
-""".trimIndent()
-
-private val APK_INSTALL_OPTION = """
-    <option name="test-file-name" value="APK_NAME" />
-
-""".trimIndent()
-
-private val TEST_BLOCK_OPEN = """
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest">
-
-""".trimIndent()
-
-private val TEST_BLOCK_CLOSE = """
-    </test>
-
-""".trimIndent()
-
-private val RUNNER_OPTION = """
-    <option name="runner" value="TEST_RUNNER"/>
-
-""".trimIndent()
-
-private val PACKAGE_OPTION = """
-    <option name="package" value="APPLICATION_ID" />
-
-""".trimIndent()
-
-private val BENCHMARK_PRESUBMIT_OPTION = """
-    <option name="instrumentation-arg" key="androidx.benchmark.dryRunMode.enable" value="true" />
-
-""".trimIndent()
-
-private val BENCHMARK_POSTSUBMIT_OPTIONS = """
-    <option name="instrumentation-arg" key="androidx.benchmark.output.enable" value="true" />
-    <option name="instrumentation-arg" key="listener" value="androidx.benchmark.junit4.InstrumentationResultsRunListener" />
-
-""".trimIndent()
-
-private val FLAKY_TEST_OPTION = """
-    <option name="instrumentation-arg" key="notAnnotation" value="androidx.test.filters.FlakyTest" />
-
-""".trimIndent()
-
-private val SMALL_TEST_OPTIONS = """
-    <option name="size" value="small" />
-
-""".trimIndent()
-
-private val MEDIUM_TEST_OPTIONS = """
-    <option name="size" value="medium" />
-
-""".trimIndent()
-
-private val CLIENT_PREVIOUS = """
-    <option name="instrumentation-arg" key="client_version" value="previous" />
-
-""".trimIndent()
-
-private val CLIENT_TOT = """
-    <option name="instrumentation-arg" key="client_version" value="tot" />
-
-""".trimIndent()
-
-private val SERVICE_PREVIOUS = """
-    <option name="instrumentation-arg" key="service_version" value="previous" />
-
-""".trimIndent()
-
-private val SERVICE_TOT = """
-    <option name="instrumentation-arg" key="service_version" value="tot" />
-
-""".trimIndent()
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
index f805e8d..dccb090 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
@@ -21,6 +21,7 @@
 import com.android.build.api.variant.BuiltArtifact
 import com.android.build.api.variant.BuiltArtifacts
 import com.android.build.api.variant.BuiltArtifactsLoader
+import java.io.File
 import org.gradle.api.DefaultTask
 import org.gradle.api.file.DirectoryProperty
 import org.gradle.api.file.RegularFileProperty
@@ -33,7 +34,6 @@
 import org.gradle.api.tasks.PathSensitivity
 import org.gradle.api.tasks.TaskAction
 import org.gradle.work.DisableCachingByDefault
-import java.io.File
 
 /**
  * Writes three configuration files to test combinations of media client & service in
@@ -108,18 +108,6 @@
     @get:OutputFile
     abstract val clientToTServiceToT: RegularFileProperty
 
-    /**
-     * output file where we write the sha256 of each APK we refer in tests.
-     */
-    @get:OutputFile
-    abstract val shaReportOutput: RegularFileProperty
-
-    /**
-     * output file where we write the sha256 of each APK we refer in constained tests.
-     */
-    @get:OutputFile
-    abstract val constrainedShaReportOutput: RegularFileProperty
-
     @get:OutputFile
     abstract val constrainedClientPreviousServiceToT: RegularFileProperty
 
@@ -129,6 +117,24 @@
     @get:OutputFile
     abstract val constrainedClientToTServiceToT: RegularFileProperty
 
+    @get:OutputFile
+    abstract val jsonClientPreviousServiceToTClientTests: RegularFileProperty
+
+    @get:OutputFile
+    abstract val jsonClientPreviousServiceToTServiceTests: RegularFileProperty
+
+    @get:OutputFile
+    abstract val jsonClientToTServicePreviousClientTests: RegularFileProperty
+
+    @get:OutputFile
+    abstract val jsonClientToTServicePreviousServiceTests: RegularFileProperty
+
+    @get:OutputFile
+    abstract val jsonClientToTServiceToTClientTests: RegularFileProperty
+
+    @get:OutputFile
+    abstract val jsonClientToTServiceToTServiceTests: RegularFileProperty
+
     @TaskAction
     fun generateAndroidTestZip() {
         val clientToTApk = resolveApk(clientToTFolder, clientToTLoader)
@@ -137,37 +143,75 @@
         val servicePreviousApk = resolveApk(
             servicePreviousFolder, servicePreviousLoader
         )
-        val testApkSha256Report = TestApkSha256Report()
         writeConfigFileContent(
-            testApkSha256Report, clientToTApk, serviceToTApk, clientToTPath.get(),
-            serviceToTPath.get(), clientToTServiceToT, false, false
+            clientApk = clientToTApk,
+            serviceApk = serviceToTApk,
+            clientPath = clientToTPath.get(),
+            servicePath = serviceToTPath.get(),
+            xmlOutputFile = clientToTServiceToT,
+            jsonClientOutputFile = jsonClientToTServiceToTClientTests,
+            jsonServiceOutputFile = jsonClientToTServiceToTServiceTests,
+            isClientPrevious = false,
+            isServicePrevious = false
         )
         writeConfigFileContent(
-            testApkSha256Report, clientToTApk, servicePreviousApk, clientToTPath.get(),
-            servicePreviousPath.get(), clientToTServicePrevious, false, true
+            clientApk = clientToTApk,
+            serviceApk = servicePreviousApk,
+            clientPath = clientToTPath.get(),
+            servicePath = servicePreviousPath.get(),
+            xmlOutputFile = clientToTServicePrevious,
+            jsonClientOutputFile = jsonClientToTServicePreviousClientTests,
+            jsonServiceOutputFile = jsonClientToTServicePreviousServiceTests,
+            isClientPrevious = false,
+            isServicePrevious = true
         )
         writeConfigFileContent(
-            testApkSha256Report, clientPreviousApk, serviceToTApk, clientPreviousPath.get(),
-            serviceToTPath.get(), clientPreviousServiceToT, true, false
+            clientApk = clientPreviousApk,
+            serviceApk = serviceToTApk,
+            clientPath = clientPreviousPath.get(),
+            servicePath = serviceToTPath.get(),
+            xmlOutputFile = clientPreviousServiceToT,
+            jsonClientOutputFile = jsonClientPreviousServiceToTClientTests,
+            jsonServiceOutputFile = jsonClientPreviousServiceToTServiceTests,
+            isClientPrevious = true,
+            isServicePrevious = false
         )
         // write constrained configs as well
         writeConfigFileContent(
-            testApkSha256Report, clientToTApk, serviceToTApk, clientToTPath.get(),
-            serviceToTPath.get(), constrainedClientToTServiceToT, false, false, true
+            clientApk = clientToTApk,
+            serviceApk = serviceToTApk,
+            clientPath = clientToTPath.get(),
+            servicePath = serviceToTPath.get(),
+            xmlOutputFile = constrainedClientToTServiceToT,
+            jsonClientOutputFile = jsonClientToTServiceToTClientTests,
+            jsonServiceOutputFile = jsonClientToTServiceToTServiceTests,
+            isClientPrevious = false,
+            isServicePrevious = false,
+            isConstrained = true
         )
         writeConfigFileContent(
-            testApkSha256Report, clientToTApk, servicePreviousApk, clientToTPath.get(),
-            servicePreviousPath.get(), constrainedClientToTServicePrevious, false, true, true
+            clientApk = clientToTApk,
+            serviceApk = servicePreviousApk,
+            clientPath = clientToTPath.get(),
+            servicePath = servicePreviousPath.get(),
+            xmlOutputFile = constrainedClientToTServicePrevious,
+            jsonClientOutputFile = jsonClientToTServicePreviousClientTests,
+            jsonServiceOutputFile = jsonClientToTServicePreviousServiceTests,
+            isClientPrevious = false,
+            isServicePrevious = true,
+            isConstrained = true
         )
         writeConfigFileContent(
-            testApkSha256Report, clientPreviousApk, serviceToTApk, clientPreviousPath.get(),
-            serviceToTPath.get(), constrainedClientPreviousServiceToT, true, false, true
-        )
-        testApkSha256Report.writeToFile(
-            shaReportOutput.get().asFile
-        )
-        testApkSha256Report.writeToFile(
-            constrainedShaReportOutput.get().asFile
+            clientApk = clientPreviousApk,
+            serviceApk = serviceToTApk,
+            clientPath = clientPreviousPath.get(),
+            servicePath = serviceToTPath.get(),
+            xmlOutputFile = constrainedClientPreviousServiceToT,
+            jsonClientOutputFile = jsonClientPreviousServiceToTClientTests,
+            jsonServiceOutputFile = jsonClientPreviousServiceToTServiceTests,
+            isClientPrevious = true,
+            isServicePrevious = false,
+            isConstrained = true
         )
     }
 
@@ -185,32 +229,28 @@
     }
 
     private fun writeConfigFileContent(
-        testApkSha256Report: TestApkSha256Report,
         clientApk: BuiltArtifacts,
         serviceApk: BuiltArtifacts,
         clientPath: String,
         servicePath: String,
-        outputFile: RegularFileProperty,
+        xmlOutputFile: RegularFileProperty,
+        jsonClientOutputFile: RegularFileProperty,
+        jsonServiceOutputFile: RegularFileProperty,
         isClientPrevious: Boolean,
         isServicePrevious: Boolean,
         isConstrained: Boolean = false
     ) {
         val configBuilder = MediaConfigBuilder()
+        configBuilder.configName(xmlOutputFile.asFile.get().name)
         val clientBuiltArtifact = clientApk.elements.single()
         val serviceBuiltArtifact = serviceApk.elements.single()
         val clientApkName = clientBuiltArtifact.resolveName(clientPath)
         val serviceApkName = serviceBuiltArtifact.resolveName(servicePath)
-        testApkSha256Report.addFile(
-            name = clientApkName,
-            builtArtifact = clientBuiltArtifact
-        )
-        testApkSha256Report.addFile(
-            name = serviceApkName,
-            builtArtifact = serviceBuiltArtifact
-        )
         configBuilder.clientApkName(clientApkName)
+            .clientApkSha256(sha256(File(clientBuiltArtifact.outputFile)))
             .clientApplicationId(clientApk.applicationId)
             .serviceApkName(serviceApkName)
+            .serviceApkSha256(sha256(File(serviceBuiltArtifact.outputFile)))
             .serviceApplicationId(serviceApk.applicationId)
             .minSdk(minSdk.get().toString())
             .testRunner(testRunner.get())
@@ -218,8 +258,6 @@
             .isServicePrevious(isServicePrevious)
             .tag("androidx_unit_tests")
             .tag("media_compat")
-        val isPresubmit = presubmit.get()
-        configBuilder.isPostsubmit(!isPresubmit)
         when (affectedModuleDetectorSubset.get()) {
             ProjectSubset.DEPENDENT_PROJECTS -> {
                 if (isConstrained) {
@@ -229,7 +267,7 @@
                 }
             }
             ProjectSubset.NONE -> {
-                if (isPresubmit) {
+                if (presubmit.get()) {
                     configBuilder.runAllTests(false)
                 } else {
                     configBuilder.runAllTests(true)
@@ -240,14 +278,14 @@
             }
         }
 
-        val resolvedOutputFile: File = outputFile.asFile.get()
-        if (!resolvedOutputFile.exists()) {
-            if (!resolvedOutputFile.createNewFile()) {
-                throw RuntimeException(
-                    "Failed to create test configuration file: $resolvedOutputFile"
-                )
-            }
+        createOrFail(xmlOutputFile).writeText(configBuilder.build())
+        if (!isConstrained) {
+            createOrFail(jsonClientOutputFile).writeText(
+                configBuilder.buildJson(forClient = true)
+            )
+            createOrFail(jsonServiceOutputFile).writeText(
+                configBuilder.buildJson(forClient = false)
+            )
         }
-        resolvedOutputFile.writeText(configBuilder.build())
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
index 5247066..8ffa96a 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
@@ -33,6 +33,7 @@
 import org.gradle.api.tasks.PathSensitivity
 import org.gradle.api.tasks.TaskAction
 import java.io.File
+import org.gradle.api.provider.ListProperty
 
 /**
  * Writes a configuration file in
@@ -72,9 +73,6 @@
     abstract val hasBenchmarkPlugin: Property<Boolean>
 
     @get:Input
-    abstract val disableDeviceTests: Property<Boolean>
-
-    @get:Input
     @get:Optional
     abstract val benchmarkRunAlsoInterpreted: Property<Boolean>
 
@@ -87,9 +85,15 @@
     @get:Input
     abstract val presubmit: Property<Boolean>
 
+    @get:Input
+    abstract val additionalApkKeys: ListProperty<String>
+
     @get:OutputFile
     abstract val outputXml: RegularFileProperty
 
+    @get:OutputFile
+    abstract val outputJson: RegularFileProperty
+
     /**
      * Output file where we write the sha256 for each APK file we reference
      */
@@ -134,6 +138,7 @@
         configurations testing Android Application projects, so that both APKs get installed.
          */
         val configBuilder = ConfigBuilder()
+        configBuilder.configName = outputFile.asFile.get().name
         if (appLoader.isPresent) {
             val appApk = appLoader.get().load(appFolder.get())
                 ?: throw RuntimeException("Cannot load required APK for task: $name")
@@ -146,8 +151,10 @@
                 appName = appName.replace("debug-androidTest", "release")
             }
             configBuilder.appApkName(appName)
+                .appApkSha256(sha256(File(appApkBuiltArtifact.outputFile)))
             testApkSha256Report.addFile(appName, appApkBuiltArtifact)
         }
+        configBuilder.additionalApkKeys(additionalApkKeys.get())
         val isPresubmit = presubmit.get()
         configBuilder.isPostsubmit(!isPresubmit)
         // Will be using the constrained configs for all devices api 26 and below.
@@ -179,52 +186,56 @@
             }
         }
         // This section adds metadata tags that will help filter runners to specific modules.
-        if (disableDeviceTests.get()) {
-            configBuilder.disableDeviceTests(true)
-        } else {
-            if (hasBenchmarkPlugin.get()) {
-                configBuilder.isBenchmark(true)
-                if (configBuilder.isPostsubmit) {
-                    if (benchmarkRunAlsoInterpreted.get()) {
-                        configBuilder.tag("microbenchmarks_interpreted")
-                    }
-                    configBuilder.tag("microbenchmarks")
-                } else {
-                    // in presubmit, we treat micro benchmarks as regular correctness tests as
-                    // they run with dryRunMode to check crashes don't happen, without measurement
-                    configBuilder.tag("androidx_unit_tests")
+        if (hasBenchmarkPlugin.get()) {
+            configBuilder.isBenchmark(true)
+            if (configBuilder.isPostsubmit) {
+                if (benchmarkRunAlsoInterpreted.get()) {
+                    configBuilder.tag("microbenchmarks_interpreted")
                 }
-            } else if (testProjectPath.get().endsWith("macrobenchmark")) {
-                // macro benchmarks do not have a dryRunMode, so we don't run them in presubmit
-                configBuilder.tag("macrobenchmarks")
+                configBuilder.tag("microbenchmarks")
             } else {
+                // in presubmit, we treat micro benchmarks as regular correctness tests as
+                // they run with dryRunMode to check crashes don't happen, without measurement
                 configBuilder.tag("androidx_unit_tests")
-                if (testProjectPath.get().startsWith(":compose:")) {
-                    configBuilder.tag("compose")
-                } else if (testProjectPath.get().startsWith(":wear:")) {
-                    configBuilder.tag("wear")
-                }
             }
-            val testApk = testLoader.get().load(testFolder.get())
-                ?: throw RuntimeException("Cannot load required APK for task: $name")
-            val testApkBuiltArtifact = testApk.elements.single()
-            val testName = testApkBuiltArtifact.outputFile
-                .substringAfterLast("/")
-                .renameApkForTesting(testProjectPath.get(), hasBenchmarkPlugin.get())
-            configBuilder.testApkName(testName)
-                .applicationId(testApk.applicationId)
-                .minSdk(minSdk.get().toString())
-                .testRunner(testRunner.get())
-            testApkSha256Report.addFile(testName, testApkBuiltArtifact)
-        }
-        val resolvedOutputFile: File = outputFile.asFile.get()
-        if (!resolvedOutputFile.exists()) {
-            if (!resolvedOutputFile.createNewFile()) {
-                throw RuntimeException(
-                    "Failed to create test configuration file: $resolvedOutputFile"
-                )
+        } else if (testProjectPath.get().endsWith("macrobenchmark")) {
+            // macro benchmarks do not have a dryRunMode, so we don't run them in presubmit
+            configBuilder.tag("macrobenchmarks")
+        } else {
+            configBuilder.tag("androidx_unit_tests")
+            if (testProjectPath.get().startsWith(":compose:")) {
+                configBuilder.tag("compose")
+            } else if (testProjectPath.get().startsWith(":wear:")) {
+                configBuilder.tag("wear")
             }
         }
-        resolvedOutputFile.writeText(configBuilder.build())
+        val testApk = testLoader.get().load(testFolder.get())
+            ?: throw RuntimeException("Cannot load required APK for task: $name")
+        val testApkBuiltArtifact = testApk.elements.single()
+        val testName = testApkBuiltArtifact.outputFile
+            .substringAfterLast("/")
+            .renameApkForTesting(testProjectPath.get(), hasBenchmarkPlugin.get())
+        configBuilder.testApkName(testName)
+            .applicationId(testApk.applicationId)
+            .minSdk(minSdk.get().toString())
+            .testRunner(testRunner.get())
+            .testApkSha256(sha256(File(testApkBuiltArtifact.outputFile)))
+        testApkSha256Report.addFile(testName, testApkBuiltArtifact)
+        createOrFail(outputFile).writeText(configBuilder.buildXml())
+        if (!isConstrained) {
+            createOrFail(outputJson).writeText(configBuilder.buildJson())
+        }
     }
 }
+
+internal fun createOrFail(fileProperty: RegularFileProperty): File {
+    val resolvedFile: File = fileProperty.asFile.get()
+    if (!resolvedFile.exists()) {
+        if (!resolvedFile.createNewFile()) {
+            throw RuntimeException(
+                "Failed to create test configuration file: $resolvedFile"
+            )
+        }
+    }
+    return resolvedFile
+}
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt
index e52d4d8..0c971b8 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestApkSha256Report.kt
@@ -18,7 +18,6 @@
 
 import com.android.build.api.variant.BuiltArtifact
 import com.google.common.annotations.VisibleForTesting
-import com.google.common.hash.HashCode
 import com.google.common.hash.Hashing
 import com.google.common.io.BaseEncoding
 import java.io.File
@@ -39,7 +38,7 @@
  */
 @VisibleForTesting
 class TestApkSha256Report {
-    private val files = mutableMapOf<String, HashCode>()
+    private val files = mutableMapOf<String, String>()
 
     /**
      * Adds the given builtArtifact to the list of shas after calculating its sha256 hash.
@@ -78,11 +77,7 @@
         }.forEach { (fileName, hash) ->
             val elm = doc.createElement("file")
             elm.setAttribute("name", fileName)
-            elm.setAttribute(
-                "sha256", BaseEncoding.base16().lowerCase().encode(
-                    hash.asBytes()
-                )
-            )
+            elm.setAttribute("sha256", hash)
             root.appendChild(elm)
         }
         val transformerFactory = TransformerFactory.newInstance()
@@ -94,15 +89,17 @@
             transformer.transform(source, result)
         }
     }
+}
 
-    @Suppress("UnstableApiUsage") // guava Hashing is marked as @Beta
-    private fun sha256(file: File): HashCode {
-        val hasher = Hashing.sha256().newHasher()
-        file.inputStream().buffered().use {
-            while (it.available() > 0) {
-                hasher.putBytes(it.readNBytes(1024))
-            }
+@Suppress("UnstableApiUsage") // guava Hashing is marked as @Beta
+internal fun sha256(file: File): String {
+    val hasher = Hashing.sha256().newHasher()
+    file.inputStream().buffered().use {
+        while (it.available() > 0) {
+            hasher.putBytes(it.readNBytes(1024))
         }
-        return hasher.hash()
     }
+    return BaseEncoding.base16().lowerCase().encode(
+        hasher.hash().asBytes()
+    )
 }
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
index 040bfcc..3cceead 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
@@ -38,13 +38,13 @@
 import com.android.build.api.variant.HasAndroidTest
 import com.android.build.gradle.BaseExtension
 import com.android.build.gradle.tasks.PackageAndroidArtifact
+import java.io.File
 import org.gradle.api.Project
 import org.gradle.api.UnknownTaskException
 import org.gradle.api.file.DuplicatesStrategy
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.bundling.Zip
 import org.gradle.kotlin.dsl.getByType
-import java.io.File
 
 /**
  * Creates and configures the test config generation task for a project. Configuration includes
@@ -62,6 +62,7 @@
     overrideProject: Project = this
 ) {
     val xmlName = "${path.asFilenamePrefix()}$variantName.xml"
+    val jsonName = "${path.asFilenamePrefix()}$variantName.json"
     val sha256XmlName = "${path.asFilenamePrefix()}$variantName$SHA_256_FILE_SUFFIX"
     rootProject.tasks.named("createModuleInfo").configure {
         it as ModuleInfoGenerator
@@ -80,7 +81,9 @@
 
         task.testFolder.set(artifacts.get(SingleArtifact.APK))
         task.testLoader.set(artifacts.getBuiltArtifactsLoader())
+        task.additionalApkKeys.set(androidXExtension.additionalDeviceTestApkKeys)
         task.outputXml.fileValue(File(getTestConfigDirectory(), xmlName))
+        task.outputJson.fileValue(File(getTestConfigDirectory(), jsonName))
         task.shaReportOutput.fileValue(File(getTestConfigDirectory(), sha256XmlName))
         task.constrainedOutputXml.fileValue(File(getConstrainedTestConfigDirectory(), xmlName))
         task.constrainedShaReportOutput.fileValue(
@@ -93,7 +96,6 @@
         } else {
             task.minSdk.set(minSdk)
         }
-        task.disableDeviceTests.set(androidXExtension.disableDeviceTests)
         val hasBenchmarkPlugin = hasBenchmarkPlugin()
         task.hasBenchmarkPlugin.set(hasBenchmarkPlugin)
         if (hasBenchmarkPlugin) {
@@ -110,9 +112,11 @@
         AffectedModuleDetector.configureTaskGuard(task)
     }
     // Disable xml generation for projects that have no test sources
-    this.afterEvaluate {
+    // or explicitly don't want to run device tests
+    afterEvaluate {
+        val androidXExtension = extensions.getByType<AndroidXExtension>()
         generateTestConfigurationTask.configure {
-            it.enabled = this.hasAndroidTestSourceCode()
+            it.enabled = hasAndroidTestSourceCode() && !androidXExtension.disableDeviceTests
         }
     }
     this.rootProject.tasks.findByName(ZIP_TEST_CONFIGS_WITH_APKS_TASK)!!
@@ -232,7 +236,6 @@
 ) {
     val mediaPrefix = getMediaConfigTaskPrefix(isMedia2)
     val mediaTask = getOrCreateMediaTestConfigTask(this, isMedia2)
-    val sha256ReportFileName = "$mediaPrefix$SHA_256_FILE_SUFFIX"
     mediaTask.configure {
         it as GenerateMediaTestConfigurationTask
         if (this.name.contains("client")) {
@@ -292,16 +295,40 @@
                 "${mediaPrefix}ClientToTServiceToT$variantName.xml"
             )
         )
-        it.shaReportOutput.fileValue(
+        it.jsonClientPreviousServiceToTClientTests.fileValue(
             File(
                 this.getTestConfigDirectory(),
-                sha256ReportFileName
+                "${mediaPrefix}ClientPreviousServiceToTClientTests$variantName.json"
             )
         )
-        it.constrainedShaReportOutput.fileValue(
+        it.jsonClientPreviousServiceToTServiceTests.fileValue(
             File(
-                this.getConstrainedTestConfigDirectory(),
-                sha256ReportFileName
+                this.getTestConfigDirectory(),
+                "${mediaPrefix}ClientPreviousServiceToTServiceTests$variantName.json"
+            )
+        )
+        it.jsonClientToTServicePreviousClientTests.fileValue(
+            File(
+                this.getTestConfigDirectory(),
+                "${mediaPrefix}ClientToTServicePreviousClientTests$variantName.json"
+            )
+        )
+        it.jsonClientToTServicePreviousServiceTests.fileValue(
+            File(
+                this.getTestConfigDirectory(),
+                "${mediaPrefix}ClientToTServicePreviousServiceTests$variantName.json"
+            )
+        )
+        it.jsonClientToTServiceToTClientTests.fileValue(
+            File(
+                this.getTestConfigDirectory(),
+                "${mediaPrefix}ClientToTServiceToTClientTests$variantName.json"
+            )
+        )
+        it.jsonClientToTServiceToTServiceTests.fileValue(
+            File(
+                this.getTestConfigDirectory(),
+                "${mediaPrefix}ClientToTServiceToTServiceTests$variantName.json"
             )
         )
         it.minSdk.set(minSdk)
@@ -335,14 +362,15 @@
     if (path.endsWith("macrobenchmark")) {
         configTask.configure { task ->
             val androidXExtension = extensions.getByType<AndroidXExtension>()
-
+            val fileNamePrefix = "${this.path.asFilenamePrefix()}$variantName"
             task.testFolder.set(artifacts.get(SingleArtifact.APK))
             task.testLoader.set(artifacts.getBuiltArtifactsLoader())
+            task.additionalApkKeys.set(androidXExtension.additionalDeviceTestApkKeys)
             task.outputXml.fileValue(
-                File(
-                    this.getTestConfigDirectory(),
-                    "${this.path.asFilenamePrefix()}$variantName.xml"
-                )
+                File(getTestConfigDirectory(), "$fileNamePrefix.xml")
+            )
+            task.outputJson.fileValue(
+                File(getTestConfigDirectory(), "$fileNamePrefix.json")
             )
             task.shaReportOutput.fileValue(
                 File(
@@ -363,7 +391,6 @@
                 )
             )
             task.minSdk.set(minSdk)
-            task.disableDeviceTests.set(androidXExtension.disableDeviceTests)
             task.hasBenchmarkPlugin.set(this.hasBenchmarkPlugin())
             task.testRunner.set(testRunner)
             task.testProjectPath.set(this.path)
@@ -378,9 +405,10 @@
             AffectedModuleDetector.configureTaskGuard(task)
         }
         // Disable xml generation for projects that have no test sources
-        this.afterEvaluate {
+        afterEvaluate {
+            val androidXExtension = extensions.getByType<AndroidXExtension>()
             configTask.configure {
-                it.enabled = this.hasAndroidTestSourceCode()
+                it.enabled = hasAndroidTestSourceCode() && !androidXExtension.disableDeviceTests
             }
         }
         this.rootProject.tasks.findByName(ZIP_TEST_CONFIGS_WITH_APKS_TASK)!!
diff --git a/buildSrc/public/build.gradle b/buildSrc/public/build.gradle
index 9ccda13..82cab6b 100644
--- a/buildSrc/public/build.gradle
+++ b/buildSrc/public/build.gradle
@@ -28,6 +28,9 @@
     // Glance
     main.java.srcDirs += "${supportRootFolder}/glance/glance-appwidget/glance-layout-generator/" +
             "src/main/kotlin"
+
+    // Stable AIDL
+    main.java.srcDirs += "${supportRootFolder}/stableaidl/stableaidl-gradle-plugin/src/main/java"
 }
 
 dependencies {
@@ -61,5 +64,9 @@
             id = "androidx.benchmark.darwin"
             implementationClass = "androidx.benchmark.darwin.gradle.DarwinBenchmarkPlugin"
         }
+        stableaidl {
+            id = "androidx.stableaidl"
+            implementationClass = "androidx.stableaidl.StableAidlPlugin"
+        }
     }
 }
diff --git a/buildSrc/shared.gradle b/buildSrc/shared.gradle
index c96dfa4..331238c 100644
--- a/buildSrc/shared.gradle
+++ b/buildSrc/shared.gradle
@@ -22,6 +22,8 @@
     // Plugins we use and configure
     implementation(libs.androidGradlePluginz)
     implementation(libs.androidToolsCommon) // for com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
+    implementation(libs.androidToolsRepository) // com.android.repository for Stable AIDL plugin
+    implementation(libs.androidToolsSdkCommon) // com.android.ide.common for Stable AIDL plugin
     implementation(libs.kotlinGradlePluginz)
 
     // variety of json parsers
diff --git a/busytown/androidx.sh b/busytown/androidx.sh
index 2e0f9e9..621ff22 100755
--- a/busytown/androidx.sh
+++ b/busytown/androidx.sh
@@ -18,9 +18,10 @@
   EXIT_VALUE=1
 else
   # Run Gradle
-  if ! impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs \
+  if ! impl/build.sh buildOnServer createAllArchives checkExternalLicenses listTaskOutputs \
       -Pandroidx.enableComposeCompilerMetrics=true \
       -Pandroidx.enableComposeCompilerReports=true \
+      -Pandroidx.constraints=true \
       --no-daemon \
       --profile "$@"; then
     EXIT_VALUE=1
diff --git a/busytown/androidx_multiplatform_mac.sh b/busytown/androidx_multiplatform_mac.sh
index 128e691..b159ca6 100755
--- a/busytown/androidx_multiplatform_mac.sh
+++ b/busytown/androidx_multiplatform_mac.sh
@@ -17,8 +17,8 @@
 
 impl/build.sh buildOnServer :docs-kmp:zipCombinedKmpDocs --no-configuration-cache -Pandroidx.displayTestOutput=false
 
-# run a separate createArchive task to prepare a repository
+# run a separate createAllArchives task to prepare a repository
 # folder in DIST.
 # This cannot be merged with the buildOnServer run because
 # snapshot version is not a proper release version.
-DIST_DIR=$DIST_DIR/snapshots SNAPSHOT=true impl/build.sh createArchive --no-configuration-cache
+DIST_DIR=$DIST_DIR/snapshots SNAPSHOT=true impl/build.sh createAllArchives --no-configuration-cache -Pandroidx.constraints=true
diff --git a/busytown/androidx_snapshot.sh b/busytown/androidx_snapshot.sh
index f31a420..b281402 100755
--- a/busytown/androidx_snapshot.sh
+++ b/busytown/androidx_snapshot.sh
@@ -6,10 +6,11 @@
 cd "$(dirname $0)"
 
 SNAPSHOT=true impl/build.sh \
-    createArchive \
+    createAllArchives \
     -Pandroidx.enableAffectedModuleDetection=false \
     -Pandroidx.enableComposeCompilerMetrics=true \
     -Pandroidx.enableComposeCompilerReports=true \
+    -Pandroidx.constraints=true \
     "$@"
 
 echo "Completing $0 at $(date)"
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
index 95ed3c0..2ce4722 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
@@ -404,7 +404,9 @@
         }.build().apply {
             // set analyzer to make it active.
             setAnalyzer(Dispatchers.Default.asExecutor()) {
-                // Fake analyzer, do nothing.
+                // Fake analyzer, do nothing. Close the ImageProxy immediately to prevent the
+                // closing of the CameraDevice from being stuck.
+                it.close()
             }
         }
 
@@ -477,7 +479,9 @@
         useCase: UseCase = ImageAnalysis.Builder().build().apply {
             // set analyzer to make it active.
             setAnalyzer(Dispatchers.Default.asExecutor()) {
-                // Fake analyzer, do nothing.
+                // Fake analyzer, do nothing. Close the ImageProxy immediately to prevent the
+                // closing of the CameraDevice from being stuck.
+                it.close()
             }
         }
     ) {
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
index a9e2aeb..10e7fc0 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
@@ -111,7 +111,9 @@
     private val imageAnalysis = ImageAnalysis.Builder().build().apply {
         // set analyzer to make it active.
         setAnalyzer(Dispatchers.Default.asExecutor()) {
-            // Fake analyzer, do nothing.
+            // Fake analyzer, do nothing. Close the ImageProxy immediately to prevent the closing
+            // of the CameraDevice from being stuck.
+            it.close()
         }
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
index b1781dd..fe02a63 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
@@ -258,7 +258,9 @@
             ImageAnalysis.Builder().build().apply {
                 // set analyzer to make it active.
                 setAnalyzer(Dispatchers.Default.asExecutor()) {
-                    // Fake analyzer, do nothing.
+                    // Fake analyzer, do nothing. Close the ImageProxy immediately to prevent the
+                    // closing of the CameraDevice from being stuck.
+                    it.close()
                 }
             },
         )
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
index 9611df2..3c3cd7f 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/TestUseCaseCamera.kt
@@ -44,7 +44,6 @@
 import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.Config
-import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
@@ -102,8 +101,7 @@
         }
     }
 
-    override val runningUseCasesLiveData = MutableLiveData(useCases.toSet())
-
+    override var runningUseCases = useCases.toSet()
     override fun <T> setParameterAsync(
         key: CaptureRequest.Key<T>,
         value: T,
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
index 08fd80a..0b11ba7 100644
--- 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
@@ -33,9 +33,7 @@
 import androidx.camera.core.FocusMeteringResult
 import androidx.camera.core.MeteringPoint
 import androidx.camera.core.Preview
-import androidx.camera.core.UseCase
 import androidx.camera.core.impl.CameraControlInternal
-import androidx.lifecycle.Observer
 import com.google.common.util.concurrent.ListenableFuture
 import dagger.Binds
 import dagger.Module
@@ -43,10 +41,7 @@
 import javax.inject.Inject
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withTimeoutOrNull
 
 /**
@@ -58,13 +53,20 @@
     private val cameraProperties: CameraProperties,
     private val state3AControl: State3AControl,
     private val threads: UseCaseThreads,
-) : UseCaseCameraControl {
+) : UseCaseCameraControl, UseCaseCamera.RunningUseCasesChangeListener {
     private var _useCaseCamera: UseCaseCamera? = null
 
-    private val useCaseObserver = Observer<Set<UseCase>> { useCases ->
-        // reset to null since preview use case may not be active in current runningUseCases
+    override var useCaseCamera: UseCaseCamera?
+        get() = _useCaseCamera
+        set(value) {
+            _useCaseCamera = value
+        }
+
+    override fun onRunningUseCasesChanged() {
+        // reset to null since preview use case may not be active for current runningUseCases
         previewAspectRatio = null
-        useCases.forEach { useCase ->
+
+        _useCaseCamera?.runningUseCases?.forEach { useCase ->
             if (useCase is Preview) {
                 useCase.attachedSurfaceResolution?.apply {
                     previewAspectRatio = Rational(width, height)
@@ -73,29 +75,8 @@
         }
     }
 
-    override var useCaseCamera: UseCaseCamera?
-        get() = _useCaseCamera
-        set(value) {
-            if (_useCaseCamera != value) {
-                previewAspectRatio = null
-                // withContext does not switch thread properly with scope.launch so async is used
-                threads.sequentialScope.async {
-                    withContext(Dispatchers.Main) {
-                        _useCaseCamera?.runningUseCasesLiveData?.removeObserver(useCaseObserver)
-                    }
-                }
-            }
-
-            _useCaseCamera = value
-
-            threads.sequentialScope.async {
-                withContext(Dispatchers.Main) {
-                    _useCaseCamera?.runningUseCasesLiveData?.observeForever(useCaseObserver)
-                }
-            }
-        }
-
     override fun reset() {
+        previewAspectRatio = null
         cancelFocusAndMeteringAsync()
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/State3AControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/State3AControl.kt
index 740438c..dc8aa7e 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/State3AControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/State3AControl.kt
@@ -25,8 +25,6 @@
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.CaptureConfig
-import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.lifecycle.Observer
 import dagger.Binds
 import dagger.Module
 import dagger.multibindings.IntoSet
@@ -40,26 +38,23 @@
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class State3AControl @Inject constructor(
     val cameraProperties: CameraProperties,
-) : UseCaseCameraControl {
+) : UseCaseCameraControl, UseCaseCamera.RunningUseCasesChangeListener {
     private var _useCaseCamera: UseCaseCamera? = null
     override var useCaseCamera: UseCaseCamera?
         get() = _useCaseCamera
         set(value) {
-            val previousUseCaseCamera = _useCaseCamera
             _useCaseCamera = value
-            CameraXExecutors.mainThreadExecutor().execute {
-                previousUseCaseCamera?.runningUseCasesLiveData?.removeObserver(
-                    useCaseChangeObserver
-                )
-                value?.let {
-                    it.runningUseCasesLiveData.observeForever(useCaseChangeObserver)
-                    invalidate() // Always apply the settings to the camera.
-                }
+            value?.let {
+                invalidate() // Always apply the settings to the camera.
             }
         }
 
-    private val useCaseChangeObserver =
-        Observer<Set<UseCase>> { useCases -> useCases.updateTemplate() }
+    override fun onRunningUseCasesChanged() {
+        _useCaseCamera?.runningUseCases?.run {
+            updateTemplate()
+        }
+    }
+
     private val afModes = cameraProperties.metadata.getOrDefault(
         CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES,
         intArrayOf(CaptureRequest.CONTROL_AF_MODE_OFF)
@@ -200,4 +195,4 @@
         @IntoSet
         abstract fun provideControls(state3AControl: State3AControl): UseCaseCameraControl
     }
-}
\ 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 cfb3151..902bbcd 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
@@ -30,7 +30,6 @@
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.Config
 import androidx.camera.core.impl.SessionConfig
-import androidx.lifecycle.MutableLiveData
 import dagger.Binds
 import dagger.Module
 import javax.inject.Inject
@@ -47,7 +46,14 @@
 
 interface UseCaseCamera {
     // UseCases
-    val runningUseCasesLiveData: MutableLiveData<Set<UseCase>>
+    var runningUseCases: Set<UseCase>
+
+    interface RunningUseCasesChangeListener {
+        /**
+         * Invoked when value of [UseCaseCamera.runningUseCases] has been changed.
+         */
+        fun onRunningUseCasesChanged()
+    }
 
     // RequestControl of the UseCaseCamera
     val requestControl: UseCaseCameraRequestControl
@@ -73,7 +79,9 @@
  */
 @RequiresApi(21)
 @UseCaseCameraScope
+@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") // Java version required for Dagger
 class UseCaseCameraImpl @Inject constructor(
+    private val controls: java.util.Set<UseCaseCameraControl>,
     private val useCaseGraphConfig: UseCaseGraphConfig,
     private val useCases: java.util.ArrayList<UseCase>,
     private val useCaseSurfaceManager: UseCaseSurfaceManager,
@@ -83,8 +91,9 @@
     private val debugId = useCaseCameraIds.incrementAndGet()
     private val closed = atomic(false)
 
-    override val runningUseCasesLiveData = MutableLiveData<Set<UseCase>>(emptySet()).apply {
-        observeForever { value ->
+    override var runningUseCases = setOf<UseCase>()
+        set(value) {
+            field = value
             // Note: This may be called with the same set of values that was previously set. This
             // is used as a signal to indicate the properties of the UseCase may have changed.
             SessionConfigAdapter(value).getValidSessionConfigOrNull()?.let {
@@ -97,8 +106,13 @@
                     }.build()
                 )
             }
+
+            controls.forEach { control ->
+                if (control is UseCaseCamera.RunningUseCasesChangeListener) {
+                    control.onRunningUseCasesChanged()
+                }
+            }
         }
-    }
 
     init {
         debug { "Configured $this for $useCases" }
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 0826055..b950079 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
@@ -31,8 +31,6 @@
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.SessionConfig.ValidatingBuilder
-import androidx.camera.core.impl.utils.Threads
-import androidx.lifecycle.MutableLiveData
 import javax.inject.Inject
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.joinAll
@@ -225,7 +223,7 @@
         when {
             shouldAddRepeatingUseCase(runningUseCases) -> addRepeatingUseCase()
             shouldRemoveRepeatingUseCase(runningUseCases) -> removeRepeatingUseCase()
-            else -> camera?.runningUseCasesLiveData?.setLiveDataValue(runningUseCases)
+            else -> camera?.runningUseCases = runningUseCases
         }
     }
 
@@ -331,12 +329,4 @@
         val captureConfig = sessionConfig.repeatingCaptureConfig
         return predicate(captureConfig.surfaces, sessionConfig.surfaces)
     }
-
-    private fun <T> MutableLiveData<T>.setLiveDataValue(value: T?) {
-        if (Threads.isMainThread()) {
-            this.value = value
-        } else {
-            this.postValue(value)
-        }
-    }
 }
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
index 5c5af8b..157d7a7 100644
--- 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
@@ -51,9 +51,7 @@
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeUseCase
-import androidx.lifecycle.MutableLiveData
 import androidx.test.filters.MediumTest
-import androidx.testutils.MainDispatcherRule
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import com.google.common.util.concurrent.FutureCallback
@@ -67,22 +65,17 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.asCoroutineDispatcher
-import kotlinx.coroutines.asExecutor
 import kotlinx.coroutines.async
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.withContext
 import org.junit.After
 import org.junit.Assert.assertThrows
 import org.junit.Before
 import org.junit.Ignore
-import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
@@ -121,17 +114,10 @@
     240 + AREA_WIDTH_2 / 2, AREA_HEIGHT_2 / 2
 )
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(RobolectricCameraPipeTestRunner::class)
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 @DoNotInstrument
 class FocusMeteringControlTest {
-    private val testScope = TestScope()
-    private val testDispatcher = StandardTestDispatcher(testScope.testScheduler)
-
-    @get:Rule
-    val mainDispatcherRule = MainDispatcherRule(testDispatcher)
-
     private val pointFactory = SurfaceOrientedMeteringPointFactory(1f, 1f)
     private lateinit var focusMeteringControl: FocusMeteringControl
 
@@ -154,15 +140,6 @@
         )
     }
 
-    // testUseCaseThreads is used to ensure that all coroutines are executed before some specific
-    // point. But fakeUseCaseThreads can not be replaced in all tests because testDispatcher
-    // does not work well with withTimeoutOrNull()
-    private val testUseCaseThreads = UseCaseThreads(
-        testScope,
-        testDispatcher.asExecutor(),
-        testDispatcher
-    )
-
     @Before
     fun setUp() {
         loadCameraProperties()
@@ -355,7 +332,6 @@
         }
     }
 
-    @Ignore("b/266123157")
     @Test
     fun startFocusAndMetering_multiplePoints_3ARectsAreCorrect() = runBlocking {
         // Camera 0 i.e. Max AF count = 3, Max AE count = 3, Max AWB count = 1
@@ -438,17 +414,12 @@
         focusMeteringControl = initFocusMeteringControl(
             CAMERA_ID_0,
             setOf(createPreview(Size(1920, 1080))),
-            testUseCaseThreads,
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         startFocusMeteringAndAwait(
             FocusMeteringAction.Builder(point1).build()
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         with(fakeRequestControl.focusMeteringCalls.last()) {
             assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
             assertWithMessage("Wrong AF region")
@@ -462,17 +433,12 @@
         focusMeteringControl = initFocusMeteringControl(
             CAMERA_ID_1,
             setOf(createPreview(Size(640, 480))),
-            testUseCaseThreads,
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         startFocusMeteringAndAwait(
             FocusMeteringAction.Builder(point1).build()
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         with(fakeRequestControl.focusMeteringCalls.last()) {
             assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
             assertWithMessage("Wrong AF region")
@@ -492,17 +458,12 @@
         focusMeteringControl = initFocusMeteringControl(
             CAMERA_ID_0,
             setOf(createPreview(Size(640, 480))),
-            testUseCaseThreads,
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         startFocusMeteringAndAwait(
             FocusMeteringAction.Builder(point).build()
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         with(fakeRequestControl.focusMeteringCalls.last()) {
             assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
             assertWithMessage("Wrong AF region")
@@ -516,18 +477,14 @@
         focusMeteringControl = initFocusMeteringControl(
             CAMERA_ID_0,
             setOf(createPreview(Size(1920, 1080))),
-            testUseCaseThreads,
         )
-        fakeUseCaseCamera.runningUseCasesLiveData.value = emptySet()
-
-        testDispatcher.scheduler.advanceUntilIdle()
+        fakeUseCaseCamera.runningUseCases = emptySet()
+        focusMeteringControl.onRunningUseCasesChanged()
 
         startFocusMeteringAndAwait(
             FocusMeteringAction.Builder(point1).build()
         )
 
-        testDispatcher.scheduler.advanceUntilIdle()
-
         // point1 = (0, 0) is considered as center point of metering rectangle.
         // Since previewAspectRatio is not set, it will be same as cropRegionAspectRatio
         // which is the size of SENSOR_1 in this test. So the point is not adjusted,
@@ -539,37 +496,6 @@
     }
 
     @Test
-    fun previewRatioIsNotChanged_whenSameUseCaseCameraSetTwice() {
-        // use 16:9 aspect ratio Preview with sensor region of 4:3 (camera 0)
-        val useCases = setOf<UseCase>(createPreview(Size(1920, 1080)))
-
-        focusMeteringControl = initFocusMeteringControl(
-            CAMERA_ID_0,
-            useCases,
-            UseCaseThreads(
-                testScope,
-                testDispatcher.asExecutor(),
-                testDispatcher
-            ),
-        )
-        focusMeteringControl.useCaseCamera = fakeUseCaseCamera
-
-        testDispatcher.scheduler.advanceUntilIdle()
-
-        startFocusMeteringAndAwait(
-            FocusMeteringAction.Builder(point1).build()
-        )
-
-        testDispatcher.scheduler.advanceUntilIdle()
-
-        with(fakeRequestControl.focusMeteringCalls.last()) {
-            assertWithMessage("Wrong number of AF regions").that(afRegions.size).isEqualTo(1)
-            assertWithMessage("Wrong AF region")
-                .that(afRegions[0].rect).isEqualTo(M_RECT_PVIEW_RATIO_16x9_SENSOR_640x480)
-        }
-    }
-
-    @Test
     fun meteringPointsWithSize_convertedCorrectly() {
         val point1 = pointFactory.createPoint(0.5f, 0.5f, 1.0f)
         val point2 = pointFactory.createPoint(0.5f, 0.5f, 0.5f)
@@ -888,7 +814,6 @@
         assertThat(focusMeteringControl.isFocusMeteringSupported(action)).isTrue()
     }
 
-    @Ignore("b/266123157")
     @Test
     fun isFocusMeteringSupported_noSupport3ARegion_shouldReturnFalse() {
         val action = FocusMeteringAction.Builder(point1).build()
@@ -1171,8 +1096,7 @@
     }
 
     private val fakeUseCaseCamera = object : UseCaseCamera {
-        override val runningUseCasesLiveData: MutableLiveData<Set<UseCase>> =
-            MutableLiveData(emptySet())
+        override var runningUseCases = setOf<UseCase>()
 
         override val requestControl: UseCaseCameraRequestControl
             get() = fakeRequestControl
@@ -1207,8 +1131,9 @@
             state3AControl,
             useCaseThreads
         ).apply {
-            fakeUseCaseCamera.runningUseCasesLiveData.value = useCases
+            fakeUseCaseCamera.runningUseCases = useCases
             useCaseCamera = fakeUseCaseCamera
+            onRunningUseCasesChanged()
         }
 
     private fun initCameraProperties(
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
index ce83291..c9621e7 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraTest.kt
@@ -100,7 +100,9 @@
                 }
             )
         }
+        @Suppress("UNCHECKED_CAST", "PLATFORM_CLASS_MAPPED_TO_KOTLIN")
         val useCaseCamera = UseCaseCameraImpl(
+            controls = emptySet<UseCaseCameraControl>() as java.util.Set<UseCaseCameraControl>,
             useCaseGraphConfig = fakeUseCaseGraphConfig,
             useCases = arrayListOf(fakeUseCase),
             useCaseSurfaceManager = UseCaseSurfaceManager(
@@ -110,7 +112,7 @@
             threads = useCaseThreads,
             requestControl = requestControl
         ).also {
-            it.runningUseCasesLiveData.value = setOf(fakeUseCase)
+            it.runningUseCases = setOf(fakeUseCase)
         }
         assumeTrue(
             fakeCameraGraph.fakeCameraGraphSession.repeatingRequestSemaphore.tryAcquire(
@@ -124,7 +126,8 @@
                 addSurface(surface)
             }
         )
-        useCaseCamera.runningUseCasesLiveData.value = setOf(fakeUseCase)
+
+        useCaseCamera.runningUseCases = setOf(fakeUseCase)
 
         // Assert. The stopRepeating() should be called.
         assertThat(
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
index 1617485..a33fc33 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManagerTest.kt
@@ -22,6 +22,7 @@
 import androidx.camera.camera2.pipe.integration.adapter.CameraStateAdapter
 import androidx.camera.camera2.pipe.integration.adapter.RobolectricCameraPipeTestRunner
 import androidx.camera.camera2.pipe.integration.config.CameraConfig
+import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera.RunningUseCasesChangeListener
 import androidx.camera.camera2.pipe.integration.interop.Camera2CameraControl
 import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 import androidx.camera.camera2.pipe.integration.testing.FakeCamera2CameraControlCompat
@@ -82,7 +83,7 @@
         useCaseManager.attach(listOf(useCase))
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
+        val enabledUseCases = useCaseManager.camera?.runningUseCases
         assertThat(enabledUseCases).isEmpty()
     }
 
@@ -97,7 +98,7 @@
         useCaseManager.activate(useCase)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
+        val enabledUseCases = useCaseManager.camera?.runningUseCases
         assertThat(enabledUseCases).containsExactly(useCase)
     }
 
@@ -114,7 +115,7 @@
         useCaseManager.activate(imageCapture)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
+        val enabledUseCases = useCaseManager.camera?.runningUseCases
         assertThat(enabledUseCases).containsExactly(preview, imageCapture)
     }
 
@@ -129,7 +130,7 @@
         useCaseManager.activate(imageCapture)
 
         // Assert
-        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCasesLiveData?.value?.map {
+        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCases?.map {
             it::class.java
         }
         assertThat(enabledUseCaseClasses).containsExactly(
@@ -152,7 +153,7 @@
         useCaseManager.activate(preview)
 
         // Assert
-        val activeUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
+        val activeUseCases = useCaseManager.camera?.runningUseCases
         assertThat(activeUseCases).containsExactly(preview, imageCapture)
     }
 
@@ -170,7 +171,7 @@
         useCaseManager.deactivate(preview)
 
         // Assert
-        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCasesLiveData?.value?.map {
+        val enabledUseCaseClasses = useCaseManager.camera?.runningUseCases?.map {
             it::class.java
         }
         assertThat(enabledUseCaseClasses).containsExactly(
@@ -191,7 +192,7 @@
         useCaseManager.deactivate(imageCapture)
 
         // Assert
-        val enabledUseCases = useCaseManager.camera?.runningUseCasesLiveData?.value
+        val enabledUseCases = useCaseManager.camera?.runningUseCases
         assertThat(enabledUseCases).isEmpty()
     }
 
@@ -227,12 +228,45 @@
         assertThat(useCase.stateAttachedCount).isEqualTo(1)
     }
 
+    @Test
+    fun controlsNotified_whenRunningUseCasesChanged() {
+        // Arrange
+        val fakeControl = object : UseCaseCameraControl, RunningUseCasesChangeListener {
+            var runningUseCases: Set<UseCase> = emptySet()
+
+            @Suppress("UNUSED_PARAMETER")
+            override var useCaseCamera: UseCaseCamera?
+                get() = TODO("Not yet implemented")
+                set(value) {
+                    runningUseCases = value?.runningUseCases ?: emptySet()
+                }
+
+            override fun reset() {}
+
+            override fun onRunningUseCasesChanged() {}
+        }
+
+        val useCaseManager = createUseCaseManager(setOf(fakeControl))
+        val preview = createPreview()
+        val useCase = FakeUseCase()
+
+        // Act
+        useCaseManager.activate(preview)
+        useCaseManager.activate(useCase)
+        useCaseManager.attach(listOf(preview, useCase))
+
+        // Assert
+        assertThat(fakeControl.runningUseCases).isEqualTo(setOf(preview, useCase))
+    }
+
     @OptIn(ExperimentalCamera2Interop::class)
     @Suppress("UNCHECKED_CAST", "PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-    private fun createUseCaseManager() = UseCaseManager(
+    private fun createUseCaseManager(
+        controls: Set<UseCaseCameraControl> = emptySet(),
+    ) = UseCaseManager(
         cameraConfig = CameraConfig(CameraId("0")),
         builder = FakeUseCaseCameraComponentBuilder(),
-        controls = HashSet<UseCaseCameraControl>() as java.util.Set<UseCaseCameraControl>,
+        controls = controls as java.util.Set<UseCaseCameraControl>,
         cameraProperties = FakeCameraProperties(),
         camera2CameraControl = Camera2CameraControl.create(
             FakeCamera2CameraControlCompat(),
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
index 32977b3..9ec74a1 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeUseCaseCamera.kt
@@ -32,7 +32,6 @@
 import androidx.camera.core.impl.CaptureConfig
 import androidx.camera.core.impl.Config
 import androidx.camera.core.impl.SessionConfig
-import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Job
@@ -51,7 +50,7 @@
 }
 
 class FakeUseCaseCameraComponent(useCases: List<UseCase>) : UseCaseCameraComponent {
-    private val fakeUseCaseCamera = FakeUseCaseCamera(MutableLiveData(useCases.toSet()))
+    private val fakeUseCaseCamera = FakeUseCaseCamera(useCases.toSet())
 
     override fun getUseCaseCamera(): UseCaseCamera {
         return fakeUseCaseCamera
@@ -132,8 +131,7 @@
 
 // TODO: Further implement the methods in this class as needed
 class FakeUseCaseCamera(
-    override val runningUseCasesLiveData: MutableLiveData<Set<UseCase>> =
-        MutableLiveData(emptySet()),
+    override var runningUseCases: Set<UseCase> = emptySet(),
     override var requestControl: UseCaseCameraRequestControl = FakeUseCaseCameraRequestControl(),
 ) : UseCaseCamera {
 
diff --git a/camera/camera-camera2-pipe-testing/OWNERS b/camera/camera-camera2-pipe-testing/OWNERS
index 871060e..c445688 100644
--- a/camera/camera-camera2-pipe-testing/OWNERS
+++ b/camera/camera-camera2-pipe-testing/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 575599
 codelogic@google.com
 sushilnath@google.com
 lnishan@google.com
diff --git a/camera/camera-camera2-pipe-testing/src/main/AndroidManifest.xml b/camera/camera-camera2-pipe-testing/src/main/AndroidManifest.xml
index 9cd4123..9515a11 100644
--- a/camera/camera-camera2-pipe-testing/src/main/AndroidManifest.xml
+++ b/camera/camera-camera2-pipe-testing/src/main/AndroidManifest.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   Copyright 2020 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
index 7f88348..a301e01 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
@@ -54,7 +54,8 @@
  * the test will need start the [CameraGraph], [simulateCameraStarted], and either configure
  * surfaces for the [CameraGraph] or call [simulateFakeSurfaceConfiguration] to put the graph into a
  * state where it is able to send and simulate interactions with the camera. This mirrors the normal
- * lifecycle of a [CameraGraph].
+ * lifecycle of a [CameraGraph]. Tests using CameraGraphSimulators should also close them after
+ * they've completed their use of the simulator.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 class CameraGraphSimulator private constructor(
@@ -63,7 +64,7 @@
     val graphConfig: CameraGraph.Config,
     val cameraGraph: CameraGraph,
     private val cameraController: CameraControllerSimulator
-) {
+) : AutoCloseable {
     companion object {
         /**
          * Create a CameraGraphSimulator using the current [TestScope] provided by a Kotlin
@@ -117,27 +118,48 @@
         }
     }
 
+    private val closed = atomic(false)
+
     private val surfaceTextureNames = atomic(0)
     private val frameClockNanos = atomic(0L)
     private val frameCounter = atomic(0L)
     private val pendingFrameQueue = mutableListOf<FrameSimulator>()
+    private val surfacesCreated = mutableSetOf<Surface>()
+
+    override fun close() {
+        if (closed.compareAndSet(expect = false, update = true)) {
+            cameraGraph.close()
+            for (surface in surfacesCreated) {
+                surface.release()
+            }
+            surfacesCreated.clear()
+        }
+    }
 
     fun simulateCameraStarted() {
+        check(!closed.value) { "Cannot call simulateCameraStarted on $this after close." }
         cameraController.simulateCameraStarted()
     }
 
     fun simulateCameraStopped() {
+        check(!closed.value) { "Cannot call simulateCameraStopped on $this after close." }
         cameraController.simulateCameraStopped()
     }
 
     fun simulateCameraModified() {
+        check(!closed.value) { "Cannot call simulateCameraModified on $this after close." }
         cameraController.simulateCameraModified()
     }
 
-    fun simulateCameraError(graphStateError: GraphStateError) =
+    fun simulateCameraError(graphStateError: GraphStateError) {
+        check(!closed.value) { "Cannot call simulateCameraError on $this after close." }
         cameraController.simulateCameraError(graphStateError)
+    }
 
     fun simulateFakeSurfaceConfiguration() {
+        check(!closed.value) {
+            "Cannot call simulateFakeSurfaceConfiguration on $this after close."
+        }
         for (stream in cameraGraph.streams.streams) {
             // Pick an output -- most will only have one.
             val output = stream.outputs.first()
@@ -146,6 +168,7 @@
                     it.setDefaultBufferSize(output.size.width, output.size.height)
                 }
             )
+            surfacesCreated.add(surface)
             cameraGraph.setSurface(stream.id, surface)
         }
     }
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequence.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequence.kt
index fec4b9e..b40b1e4 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequence.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequence.kt
@@ -20,11 +20,11 @@
 
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.CaptureSequence
+import androidx.camera.camera2.pipe.CaptureSequences.invokeOnRequests
 import androidx.camera.camera2.pipe.FrameNumber
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.RequestMetadata
-import androidx.camera.camera2.pipe.CaptureSequence
-import androidx.camera.camera2.pipe.CaptureSequences.invokeOnRequests
 
 /** A CaptureSequence used for testing interactions with a [FakeCaptureSequenceProcessor] **/
 data class FakeCaptureSequence(
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequenceProcessor.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequenceProcessor.kt
index d3a362f..2c0e0ac 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequenceProcessor.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCaptureSequenceProcessor.kt
@@ -23,14 +23,14 @@
 import androidx.annotation.GuardedBy
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.CaptureSequence.CaptureSequenceListener
+import androidx.camera.camera2.pipe.CaptureSequenceProcessor
 import androidx.camera.camera2.pipe.Metadata
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.RequestMetadata
 import androidx.camera.camera2.pipe.RequestNumber
 import androidx.camera.camera2.pipe.RequestTemplate
 import androidx.camera.camera2.pipe.StreamId
-import androidx.camera.camera2.pipe.CaptureSequence.CaptureSequenceListener
-import androidx.camera.camera2.pipe.CaptureSequenceProcessor
 import kotlinx.atomicfu.atomic
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
index 3793665..a8a9b3a 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
@@ -28,13 +28,13 @@
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
 import androidx.camera.camera2.pipe.FrameInfo
+import androidx.camera.camera2.pipe.FrameMetadata
 import androidx.camera.camera2.pipe.FrameNumber
 import androidx.camera.camera2.pipe.Metadata
 import androidx.camera.camera2.pipe.Request
 import androidx.camera.camera2.pipe.RequestMetadata
 import androidx.camera.camera2.pipe.RequestNumber
 import androidx.camera.camera2.pipe.RequestTemplate
-import androidx.camera.camera2.pipe.FrameMetadata
 import androidx.camera.camera2.pipe.StreamId
 import kotlin.reflect.KClass
 import kotlinx.atomicfu.atomic
@@ -53,19 +53,19 @@
 /**
  * Utility class for interacting with objects that require pre-populated Metadata.
  */
-public open class FakeMetadata(
+open class FakeMetadata(
     private val metadata: Map<Metadata.Key<*>, Any?> = emptyMap()
 ) : Metadata {
-    public companion object {
+    companion object {
         @JvmField
-        public val TEST_KEY: Metadata.Key<Int> = Metadata.Key.create("test.key")
+        val TEST_KEY: Metadata.Key<Int> = Metadata.Key.create("test.key")
 
         @JvmField
-        public val TEST_KEY_ABSENT: Metadata.Key<Int> = Metadata.Key.create("test.key.absent")
+        val TEST_KEY_ABSENT: Metadata.Key<Int> = Metadata.Key.create("test.key.absent")
     }
 
-    public override fun <T> get(key: Metadata.Key<T>): T? = metadata[key] as T?
-    public override fun <T> getOrDefault(key: Metadata.Key<T>, default: T): T {
+    override fun <T> get(key: Metadata.Key<T>): T? = metadata[key] as T?
+    override fun <T> getOrDefault(key: Metadata.Key<T>, default: T): T {
         val value = metadata[key]
         return if (value == null) default else value as T
     }
@@ -74,7 +74,7 @@
 /**
  * Utility class for interacting with objects require specific [CameraCharacteristics] metadata.
  */
-public class FakeCameraMetadata(
+class FakeCameraMetadata(
     private val characteristics: Map<CameraCharacteristics.Key<*>, Any?> = emptyMap(),
     metadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
     cameraId: CameraId = nextFakeCameraId(),
@@ -82,7 +82,7 @@
     override val requestKeys: Set<CaptureRequest.Key<*>> = emptySet(),
     override val resultKeys: Set<CaptureResult.Key<*>> = emptySet(),
     override val sessionKeys: Set<CaptureRequest.Key<*>> = emptySet(),
-    public val physicalMetadata: Map<CameraId, CameraMetadata> = emptyMap(),
+    val physicalMetadata: Map<CameraId, CameraMetadata> = emptyMap(),
     override val physicalRequestKeys: Set<CaptureRequest.Key<*>> = emptySet(),
 ) : FakeMetadata(metadata), CameraMetadata {
 
@@ -90,8 +90,8 @@
     override fun <T> getOrDefault(key: CameraCharacteristics.Key<T>, default: T): T =
         get(key) ?: default
 
-    public override val camera: CameraId = cameraId
-    public override val isRedacted: Boolean = false
+    override val camera: CameraId = cameraId
+    override val isRedacted: Boolean = false
 
     override val physicalCameraIds: Set<CameraId> = physicalMetadata.keys
     override suspend fun getPhysicalMetadata(cameraId: CameraId): CameraMetadata =
@@ -106,7 +106,7 @@
 /**
  * Utility class for interacting with objects require specific [CaptureRequest] metadata.
  */
-public class FakeRequestMetadata(
+class FakeRequestMetadata(
     private val requestParameters: Map<CaptureRequest.Key<*>, Any?> = emptyMap(),
     metadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
     override val template: RequestTemplate = RequestTemplate(0),
@@ -125,7 +125,7 @@
 /**
  * Utility class for interacting with objects require specific [CaptureResult] metadata
  */
-public class FakeFrameMetadata(
+class FakeFrameMetadata(
     private val resultMetadata: Map<CaptureResult.Key<*>, Any?> = emptyMap(),
     extraResultMetadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
     override val camera: CameraId = nextFakeCameraId(),
@@ -145,7 +145,7 @@
  * Utility class for interacting with objects require specific [TotalCaptureResult] metadata
  */
 @Suppress("SyntheticAccessor") // Using an inline class generates a synthetic constructor
-public class FakeFrameInfo(
+class FakeFrameInfo(
     override val metadata: FrameMetadata = FakeFrameMetadata(),
     override val requestMetadata: RequestMetadata = FakeRequestMetadata(),
     private val physicalMetadata: Map<CameraId, FrameMetadata> = emptyMap()
@@ -157,5 +157,6 @@
 
     override val frameNumber: FrameNumber
         get() = metadata.frameNumber
+
     override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
 }
diff --git a/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt b/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
index 5063fd8..d931b71 100644
--- a/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
+++ b/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
@@ -53,7 +53,7 @@
 @OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(RobolectricCameraPipeTestRunner::class)
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-public class CameraGraphSimulatorTest {
+class CameraGraphSimulatorTest {
     private val metadata = FakeCameraMetadata(
         mapOf(CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_FRONT)
     )
@@ -73,309 +73,315 @@
     @Ignore("b/188446185")
     @Test
     fun simulatorCanSimulateRepeatingFrames() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        val stream = simulator.cameraGraph.streams[streamConfig]!!
-        val listener = FakeRequestListener()
-        val request = Request(
-            streams = listOf(stream.id),
-            listeners = listOf(listener)
-        )
-        simulator.cameraGraph.acquireSession().use {
-            it.startRepeating(request)
-        }
-        simulator.cameraGraph.start()
-        simulator.simulateCameraStarted()
-
-        val frame = simulator.simulateNextFrame()
-
-        assertThat(frame.request).isSameInstanceAs(request)
-        assertThat(frame.frameNumber.value).isGreaterThan(0)
-        assertThat(frame.timestampNanos).isGreaterThan(0)
-
-        val startEvent = listener.onStartedFlow.first()
-        assertThat(startEvent.frameNumber).isNotNull()
-        assertThat(startEvent.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(startEvent.timestamp).isNotNull()
-        assertThat(startEvent.timestamp.value).isGreaterThan(0)
-        assertThat(startEvent.requestMetadata.repeating).isTrue()
-        assertThat(startEvent.requestMetadata.request.streams).contains(stream.id)
-        assertThat(startEvent.requestMetadata.template)
-            .isEqualTo(graphConfig.defaultTemplate)
-
-        val totalCaptureResultEvent = withContext(Dispatchers.IO) {
-            withTimeoutOrNull(timeMillis = 50) {
-                listener.onTotalCaptureResultFlow.first()
-            }
-        }
-
-        assertThat(totalCaptureResultEvent).isNull()
-
-        // Launch the callbacks in a coroutine job to test the behavior of the simulator.
-        val simulateCallbacks = launch {
-            val resultMetadata = mutableMapOf<CaptureResult.Key<*>, Any>()
-            // Simulate two partial capture results, and one total capture result.
-            resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_MOVING
-            frame.simulatePartialCaptureResult(resultMetadata)
-            delay(10)
-
-            resultMetadata[CaptureResult.LENS_APERTURE] = 2.0f
-            frame.simulatePartialCaptureResult(resultMetadata)
-            delay(10)
-
-            resultMetadata[CaptureResult.FLASH_STATE] = CaptureResult.FLASH_STATE_FIRED
-            frame.simulateTotalCaptureResult(resultMetadata)
-            delay(10)
-
-            frame.simulateComplete(
-                resultMetadata,
-                extraMetadata = mapOf(
-                    CaptureResult.LENS_APERTURE to 4.0f
-                )
+        ).use { simulator ->
+            val stream = simulator.cameraGraph.streams[streamConfig]!!
+            val listener = FakeRequestListener()
+            val request = Request(
+                streams = listOf(stream.id),
+                listeners = listOf(listener)
             )
+            simulator.cameraGraph.acquireSession().use {
+                it.startRepeating(request)
+            }
+            simulator.cameraGraph.start()
+            simulator.simulateCameraStarted()
+
+            val frame = simulator.simulateNextFrame()
+
+            assertThat(frame.request).isSameInstanceAs(request)
+            assertThat(frame.frameNumber.value).isGreaterThan(0)
+            assertThat(frame.timestampNanos).isGreaterThan(0)
+
+            val startEvent = listener.onStartedFlow.first()
+            assertThat(startEvent.frameNumber).isNotNull()
+            assertThat(startEvent.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(startEvent.timestamp).isNotNull()
+            assertThat(startEvent.timestamp.value).isGreaterThan(0)
+            assertThat(startEvent.requestMetadata.repeating).isTrue()
+            assertThat(startEvent.requestMetadata.request.streams).contains(stream.id)
+            assertThat(startEvent.requestMetadata.template)
+                .isEqualTo(graphConfig.defaultTemplate)
+
+            val totalCaptureResultEvent = withContext(Dispatchers.IO) {
+                withTimeoutOrNull(timeMillis = 50) {
+                    listener.onTotalCaptureResultFlow.first()
+                }
+            }
+
+            assertThat(totalCaptureResultEvent).isNull()
+
+            // Launch the callbacks in a coroutine job to test the behavior of the simulator.
+            val simulateCallbacks = launch {
+                val resultMetadata = mutableMapOf<CaptureResult.Key<*>, Any>()
+                // Simulate two partial capture results, and one total capture result.
+                resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_MOVING
+                frame.simulatePartialCaptureResult(resultMetadata)
+                delay(10)
+
+                resultMetadata[CaptureResult.LENS_APERTURE] = 2.0f
+                frame.simulatePartialCaptureResult(resultMetadata)
+                delay(10)
+
+                resultMetadata[CaptureResult.FLASH_STATE] = CaptureResult.FLASH_STATE_FIRED
+                frame.simulateTotalCaptureResult(resultMetadata)
+                delay(10)
+
+                frame.simulateComplete(
+                    resultMetadata,
+                    extraMetadata = mapOf(
+                        CaptureResult.LENS_APERTURE to 4.0f
+                    )
+                )
+            }
+
+            val partialEvent1 = listener.onPartialCaptureResultFlow.first()
+            assertThat(partialEvent1.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(partialEvent1.frameMetadata.camera).isEqualTo(metadata.camera)
+            assertThat(partialEvent1.frameMetadata[CaptureResult.LENS_STATE]).isEqualTo(1)
+            assertThat(partialEvent1.frameMetadata[CaptureResult.LENS_APERTURE]).isNull()
+            assertThat(partialEvent1.frameMetadata[CaptureResult.FLASH_STATE]).isNull()
+
+            val partialEvent2 = listener.onPartialCaptureResultFlow.drop(1).first()
+            assertThat(partialEvent2.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(partialEvent2.frameMetadata.camera).isEqualTo(metadata.camera)
+            assertThat(partialEvent2.frameMetadata[CaptureResult.LENS_STATE]).isEqualTo(1)
+            assertThat(partialEvent2.frameMetadata[CaptureResult.LENS_APERTURE]).isEqualTo(2.0f)
+            assertThat(partialEvent2.frameMetadata[CaptureResult.FLASH_STATE]).isNull()
+
+            val totalEvent = listener.onTotalCaptureResultFlow.first()
+            assertThat(totalEvent.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(totalEvent.frameInfo.camera).isEqualTo(metadata.camera)
+            assertThat(totalEvent.frameInfo.metadata[CaptureResult.LENS_STATE]).isEqualTo(1)
+            assertThat(totalEvent.frameInfo.metadata[CaptureResult.LENS_APERTURE]).isEqualTo(2.0f)
+            assertThat(totalEvent.frameInfo.metadata[CaptureResult.FLASH_STATE]).isEqualTo(3)
+
+            val completedEvent = listener.onCompleteFlow.first()
+            assertThat(completedEvent.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(completedEvent.frameInfo.camera).isEqualTo(metadata.camera)
+            assertThat(completedEvent.frameInfo.metadata[CaptureResult.LENS_STATE]).isEqualTo(1)
+            assertThat(completedEvent.frameInfo.metadata[CaptureResult.LENS_APERTURE]).isEqualTo(
+                4.0f
+            )
+            assertThat(completedEvent.frameInfo.metadata[CaptureResult.FLASH_STATE]).isEqualTo(3)
+
+            simulateCallbacks.join()
         }
-
-        val partialEvent1 = listener.onPartialCaptureResultFlow.first()
-        assertThat(partialEvent1.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(partialEvent1.frameMetadata.camera).isEqualTo(metadata.camera)
-        assertThat(partialEvent1.frameMetadata[CaptureResult.LENS_STATE]).isEqualTo(1)
-        assertThat(partialEvent1.frameMetadata[CaptureResult.LENS_APERTURE]).isNull()
-        assertThat(partialEvent1.frameMetadata[CaptureResult.FLASH_STATE]).isNull()
-
-        val partialEvent2 = listener.onPartialCaptureResultFlow.drop(1).first()
-        assertThat(partialEvent2.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(partialEvent2.frameMetadata.camera).isEqualTo(metadata.camera)
-        assertThat(partialEvent2.frameMetadata[CaptureResult.LENS_STATE]).isEqualTo(1)
-        assertThat(partialEvent2.frameMetadata[CaptureResult.LENS_APERTURE]).isEqualTo(2.0f)
-        assertThat(partialEvent2.frameMetadata[CaptureResult.FLASH_STATE]).isNull()
-
-        val totalEvent = listener.onTotalCaptureResultFlow.first()
-        assertThat(totalEvent.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(totalEvent.frameInfo.camera).isEqualTo(metadata.camera)
-        assertThat(totalEvent.frameInfo.metadata[CaptureResult.LENS_STATE]).isEqualTo(1)
-        assertThat(totalEvent.frameInfo.metadata[CaptureResult.LENS_APERTURE]).isEqualTo(2.0f)
-        assertThat(totalEvent.frameInfo.metadata[CaptureResult.FLASH_STATE]).isEqualTo(3)
-
-        val completedEvent = listener.onCompleteFlow.first()
-        assertThat(completedEvent.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(completedEvent.frameInfo.camera).isEqualTo(metadata.camera)
-        assertThat(completedEvent.frameInfo.metadata[CaptureResult.LENS_STATE]).isEqualTo(1)
-        assertThat(completedEvent.frameInfo.metadata[CaptureResult.LENS_APERTURE]).isEqualTo(
-            4.0f
-        )
-        assertThat(completedEvent.frameInfo.metadata[CaptureResult.FLASH_STATE]).isEqualTo(3)
-
-        simulateCallbacks.join()
     }
 
     @Test
     fun simulatorAbortsRequests() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        val stream = simulator.cameraGraph.streams[streamConfig]!!
-        val listener = FakeRequestListener()
-        val request = Request(
-            streams = listOf(stream.id),
-            listeners = listOf(listener)
-        )
+        ).use { simulator ->
+            val stream = simulator.cameraGraph.streams[streamConfig]!!
+            val listener = FakeRequestListener()
+            val request = Request(
+                streams = listOf(stream.id),
+                listeners = listOf(listener)
+            )
 
-        simulator.cameraGraph.acquireSession().use {
-            it.submit(request = request)
+            simulator.cameraGraph.acquireSession().use {
+                it.submit(request = request)
+            }
+            simulator.cameraGraph.close()
+
+            val abortedEvent = listener.onAbortedFlow.first()
+            assertThat(abortedEvent.request).isSameInstanceAs(request)
         }
-        simulator.cameraGraph.close()
-
-        val abortedEvent = listener.onAbortedFlow.first()
-        assertThat(abortedEvent.request).isSameInstanceAs(request)
     }
 
     @Test
     fun simulatorCanIssueBufferLoss() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        val stream = simulator.cameraGraph.streams[streamConfig]!!
-        val listener = FakeRequestListener()
-        val request = Request(
-            streams = listOf(stream.id),
-            listeners = listOf(listener)
-        )
+        ).use { simulator ->
+            val stream = simulator.cameraGraph.streams[streamConfig]!!
+            val listener = FakeRequestListener()
+            val request = Request(
+                streams = listOf(stream.id),
+                listeners = listOf(listener)
+            )
 
-        simulator.cameraGraph.acquireSession().use {
-            it.submit(request = request)
+            simulator.cameraGraph.acquireSession().use {
+                it.submit(request = request)
+            }
+
+            simulator.cameraGraph.start()
+            simulator.simulateCameraStarted()
+            simulator.simulateFakeSurfaceConfiguration()
+
+            val frame = simulator.simulateNextFrame()
+            assertThat(frame.request).isSameInstanceAs(request)
+
+            frame.simulateBufferLoss(stream.id)
+            val lossEvent = listener.onBufferLostFlow.first()
+            assertThat(lossEvent.frameNumber).isEqualTo(frame.frameNumber)
+            assertThat(lossEvent.requestMetadata.request).isSameInstanceAs(request)
+            assertThat(lossEvent.streamId).isEqualTo(stream.id)
         }
-
-        simulator.cameraGraph.start()
-        simulator.simulateCameraStarted()
-        simulator.simulateFakeSurfaceConfiguration()
-
-        val frame = simulator.simulateNextFrame()
-        assertThat(frame.request).isSameInstanceAs(request)
-
-        frame.simulateBufferLoss(stream.id)
-        val lossEvent = listener.onBufferLostFlow.first()
-        assertThat(lossEvent.frameNumber).isEqualTo(frame.frameNumber)
-        assertThat(lossEvent.requestMetadata.request).isSameInstanceAs(request)
-        assertThat(lossEvent.streamId).isEqualTo(stream.id)
     }
 
     @Ignore("b/188446185")
     @Test
     fun simulatorCanIssueMultipleFrames() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        val stream = simulator.cameraGraph.streams[streamConfig]!!
-        val listener = FakeRequestListener()
-        val request = Request(
-            streams = listOf(stream.id),
-            listeners = listOf(listener)
-        )
+        ).use { simulator ->
+            val stream = simulator.cameraGraph.streams[streamConfig]!!
+            val listener = FakeRequestListener()
+            val request = Request(
+                streams = listOf(stream.id),
+                listeners = listOf(listener)
+            )
 
-        simulator.cameraGraph.acquireSession().use {
-            it.startRepeating(request = request)
+            simulator.cameraGraph.acquireSession().use {
+                it.startRepeating(request = request)
+            }
+            simulator.cameraGraph.start()
+            simulator.simulateCameraStarted()
+
+            val frame1 = simulator.simulateNextFrame()
+            val frame2 = simulator.simulateNextFrame()
+            val frame3 = simulator.simulateNextFrame()
+
+            assertThat(frame1).isNotEqualTo(frame2)
+            assertThat(frame2).isNotEqualTo(frame3)
+            assertThat(frame1.request).isSameInstanceAs(request)
+            assertThat(frame2.request).isSameInstanceAs(request)
+            assertThat(frame3.request).isSameInstanceAs(request)
+
+            val simulateCallbacks = launch {
+                val resultMetadata = mutableMapOf<CaptureResult.Key<*>, Any>()
+                resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_MOVING
+                frame1.simulateTotalCaptureResult(resultMetadata)
+                frame1.simulateComplete(resultMetadata)
+
+                delay(15)
+                frame2.simulateTotalCaptureResult(resultMetadata)
+                frame2.simulateComplete(resultMetadata)
+
+                delay(15)
+                resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_STATIONARY
+                frame3.simulateTotalCaptureResult(resultMetadata)
+                frame3.simulateComplete(resultMetadata)
+            }
+
+            val startEvents = withTimeout(timeMillis = 250) {
+                listener.onStartedFlow.take(3).toList()
+            }
+            assertThat(startEvents).hasSize(3)
+
+            val event1 = startEvents[0]
+            val event2 = startEvents[1]
+            val event3 = startEvents[2]
+
+            // Frame numbers are not equal
+            assertThat(event1.frameNumber).isNotEqualTo(event2.frameNumber)
+            assertThat(event2.frameNumber).isNotEqualTo(event3.frameNumber)
+
+            // Timestamps are in ascending order
+            assertThat(event3.timestamp.value).isGreaterThan(event2.timestamp.value)
+            assertThat(event2.timestamp.value).isGreaterThan(event1.timestamp.value)
+
+            // Metadata references the same request.
+            assertThat(event1.requestMetadata.repeating).isTrue()
+            assertThat(event2.requestMetadata.repeating).isTrue()
+            assertThat(event3.requestMetadata.repeating).isTrue()
+            assertThat(event1.requestMetadata.request).isSameInstanceAs(request)
+            assertThat(event2.requestMetadata.request).isSameInstanceAs(request)
+            assertThat(event3.requestMetadata.request).isSameInstanceAs(request)
+
+            val completeEvents = withTimeout(timeMillis = 250) {
+                listener.onCompleteFlow.take(3).toList()
+            }
+            assertThat(completeEvents).hasSize(3)
+
+            val completeEvent1 = completeEvents[0]
+            val completeEvent2 = completeEvents[1]
+            val completeEvent3 = completeEvents[2]
+
+            assertThat(completeEvent1.frameNumber).isEqualTo(event1.frameNumber)
+            assertThat(completeEvent2.frameNumber).isEqualTo(event2.frameNumber)
+            assertThat(completeEvent3.frameNumber).isEqualTo(event3.frameNumber)
+
+            assertThat(completeEvent1.frameInfo.metadata[CaptureResult.LENS_STATE])
+                .isEqualTo(CaptureResult.LENS_STATE_MOVING)
+            assertThat(completeEvent2.frameInfo.metadata[CaptureResult.LENS_STATE])
+                .isEqualTo(CaptureResult.LENS_STATE_MOVING)
+            assertThat(completeEvent3.frameInfo.metadata[CaptureResult.LENS_STATE])
+                .isEqualTo(CaptureResult.LENS_STATE_STATIONARY)
+
+            simulateCallbacks.join()
         }
-        simulator.cameraGraph.start()
-        simulator.simulateCameraStarted()
-
-        val frame1 = simulator.simulateNextFrame()
-        val frame2 = simulator.simulateNextFrame()
-        val frame3 = simulator.simulateNextFrame()
-
-        assertThat(frame1).isNotEqualTo(frame2)
-        assertThat(frame2).isNotEqualTo(frame3)
-        assertThat(frame1.request).isSameInstanceAs(request)
-        assertThat(frame2.request).isSameInstanceAs(request)
-        assertThat(frame3.request).isSameInstanceAs(request)
-
-        val simulateCallbacks = launch {
-            val resultMetadata = mutableMapOf<CaptureResult.Key<*>, Any>()
-            resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_MOVING
-            frame1.simulateTotalCaptureResult(resultMetadata)
-            frame1.simulateComplete(resultMetadata)
-
-            delay(15)
-            frame2.simulateTotalCaptureResult(resultMetadata)
-            frame2.simulateComplete(resultMetadata)
-
-            delay(15)
-            resultMetadata[CaptureResult.LENS_STATE] = CaptureResult.LENS_STATE_STATIONARY
-            frame3.simulateTotalCaptureResult(resultMetadata)
-            frame3.simulateComplete(resultMetadata)
-        }
-
-        val startEvents = withTimeout(timeMillis = 250) {
-            listener.onStartedFlow.take(3).toList()
-        }
-        assertThat(startEvents).hasSize(3)
-
-        val event1 = startEvents[0]
-        val event2 = startEvents[1]
-        val event3 = startEvents[2]
-
-        // Frame numbers are not equal
-        assertThat(event1.frameNumber).isNotEqualTo(event2.frameNumber)
-        assertThat(event2.frameNumber).isNotEqualTo(event3.frameNumber)
-
-        // Timestamps are in ascending order
-        assertThat(event3.timestamp.value).isGreaterThan(event2.timestamp.value)
-        assertThat(event2.timestamp.value).isGreaterThan(event1.timestamp.value)
-
-        // Metadata references the same request.
-        assertThat(event1.requestMetadata.repeating).isTrue()
-        assertThat(event2.requestMetadata.repeating).isTrue()
-        assertThat(event3.requestMetadata.repeating).isTrue()
-        assertThat(event1.requestMetadata.request).isSameInstanceAs(request)
-        assertThat(event2.requestMetadata.request).isSameInstanceAs(request)
-        assertThat(event3.requestMetadata.request).isSameInstanceAs(request)
-
-        val completeEvents = withTimeout(timeMillis = 250) {
-            listener.onCompleteFlow.take(3).toList()
-        }
-        assertThat(completeEvents).hasSize(3)
-
-        val completeEvent1 = completeEvents[0]
-        val completeEvent2 = completeEvents[1]
-        val completeEvent3 = completeEvents[2]
-
-        assertThat(completeEvent1.frameNumber).isEqualTo(event1.frameNumber)
-        assertThat(completeEvent2.frameNumber).isEqualTo(event2.frameNumber)
-        assertThat(completeEvent3.frameNumber).isEqualTo(event3.frameNumber)
-
-        assertThat(completeEvent1.frameInfo.metadata[CaptureResult.LENS_STATE])
-            .isEqualTo(CaptureResult.LENS_STATE_MOVING)
-        assertThat(completeEvent2.frameInfo.metadata[CaptureResult.LENS_STATE])
-            .isEqualTo(CaptureResult.LENS_STATE_MOVING)
-        assertThat(completeEvent3.frameInfo.metadata[CaptureResult.LENS_STATE])
-            .isEqualTo(CaptureResult.LENS_STATE_STATIONARY)
-
-        simulateCallbacks.join()
     }
 
     @Test
     fun simulatorCanSimulateGraphState() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+        ).use { simulator ->
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
 
-        simulator.cameraGraph.start()
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarting)
+            simulator.cameraGraph.start()
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarting)
 
-        simulator.simulateCameraStarted()
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarted)
+            simulator.simulateCameraStarted()
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarted)
 
-        simulator.cameraGraph.stop()
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopping)
+            simulator.cameraGraph.stop()
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopping)
 
-        simulator.simulateCameraStopped()
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+            simulator.simulateCameraStopped()
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+        }
     }
 
     @Test
     fun simulatorCanSimulateGraphError() = runTest {
-        val simulator = CameraGraphSimulator.create(
+        CameraGraphSimulator.create(
             this,
             context,
             metadata,
             graphConfig
-        )
-        val error = GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
+        ).use { simulator ->
+            val error = GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
 
-        simulator.simulateCameraError(error)
-        // The CameraGraph is stopped at this point, so the errors should be ignored.
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+            simulator.simulateCameraError(error)
+            // The CameraGraph is stopped at this point, so the errors should be ignored.
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
 
-        simulator.cameraGraph.start()
-        simulator.simulateCameraError(error)
-        val graphState = simulator.cameraGraph.graphState.value
-        assertThat(graphState).isInstanceOf(GraphStateError::class.java)
-        val graphStateError = graphState as GraphStateError
-        assertThat(graphStateError.cameraError).isEqualTo(error.cameraError)
-        assertThat(graphStateError.willAttemptRetry).isEqualTo(error.willAttemptRetry)
+            simulator.cameraGraph.start()
+            simulator.simulateCameraError(error)
+            val graphState = simulator.cameraGraph.graphState.value
+            assertThat(graphState).isInstanceOf(GraphStateError::class.java)
+            val graphStateError = graphState as GraphStateError
+            assertThat(graphStateError.cameraError).isEqualTo(error.cameraError)
+            assertThat(graphStateError.willAttemptRetry).isEqualTo(error.willAttemptRetry)
 
-        simulator.simulateCameraStarted()
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarted)
+            simulator.simulateCameraStarted()
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStarted)
 
-        simulator.cameraGraph.stop()
-        simulator.simulateCameraStopped()
-        simulator.simulateCameraError(error)
-        assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+            simulator.cameraGraph.stop()
+            simulator.simulateCameraStopped()
+            simulator.simulateCameraError(error)
+            assertThat(simulator.cameraGraph.graphState.value).isEqualTo(GraphStateStopped)
+        }
     }
 }
diff --git a/camera/camera-camera2-pipe/OWNERS b/camera/camera-camera2-pipe/OWNERS
index 871060e..c445688 100644
--- a/camera/camera-camera2-pipe/OWNERS
+++ b/camera/camera-camera2-pipe/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 575599
 codelogic@google.com
 sushilnath@google.com
 lnishan@google.com
diff --git a/camera/camera-camera2-pipe/build.gradle b/camera/camera-camera2-pipe/build.gradle
index da239fa..f339499 100644
--- a/camera/camera-camera2-pipe/build.gradle
+++ b/camera/camera-camera2-pipe/build.gradle
@@ -17,7 +17,6 @@
 
 import androidx.build.Publish
 import androidx.build.RunApiTasks
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
diff --git a/camera/camera-camera2-pipe/dependencies.gradle b/camera/camera-camera2-pipe/dependencies.gradle
index 2ef4ce0c..e27053d 100644
--- a/camera/camera-camera2-pipe/dependencies.gradle
+++ b/camera/camera-camera2-pipe/dependencies.gradle
@@ -16,12 +16,12 @@
 
 ext {
     CAMERA_PIPE_DEPS = [
-        API : [
-                "androidx.annotation:annotation:1.2.0",
-                libs.kotlinStdlib,
-                libs.kotlinCoroutinesAndroid,
-                "org.jetbrains.kotlinx:atomicfu:0.13.1"
-        ],
-        IMPLEMENTATION : [libs.dagger]
+            API           : [
+                    "androidx.annotation:annotation:1.2.0",
+                    libs.kotlinStdlib,
+                    libs.kotlinCoroutinesAndroid,
+                    "org.jetbrains.kotlinx:atomicfu:0.13.1"
+            ],
+            IMPLEMENTATION: [libs.dagger]
     ]
 }
diff --git a/camera/camera-camera2-pipe/src/androidTest/java/AndroidManifest.xml b/camera/camera-camera2-pipe/src/androidTest/java/AndroidManifest.xml
index e3f7258..39ea23d 100644
--- a/camera/camera-camera2-pipe/src/androidTest/java/AndroidManifest.xml
+++ b/camera/camera-camera2-pipe/src/androidTest/java/AndroidManifest.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
+<?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.
@@ -13,7 +12,6 @@
 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.camera.camera2.pipe.test">
+<manifest package="androidx.camera.camera2.pipe.test">
 
 </manifest>
diff --git a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
index 6d67fe0..86e017c 100644
--- a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
+++ b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
@@ -26,5 +26,7 @@
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 21)
 class CameraPipeInstrumentationTest {
-    @Test fun test() {}
+    @Test
+    fun test() {
+    }
 }
diff --git a/camera/camera-camera2-pipe/src/main/AndroidManifest.xml b/camera/camera-camera2-pipe/src/main/AndroidManifest.xml
index 9cd4123..9515a11 100644
--- a/camera/camera-camera2-pipe/src/main/AndroidManifest.xml
+++ b/camera/camera-camera2-pipe/src/main/AndroidManifest.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   Copyright 2020 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt
index 098631d..4f9485d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraBackend.kt
@@ -19,7 +19,8 @@
 import kotlinx.coroutines.Deferred
 
 /** This is used to uniquely identify a specific backend implementation. */
-@JvmInline value class CameraBackendId(public val value: String)
+@JvmInline
+value class CameraBackendId(val value: String)
 
 /**
  * A CameraBackend is used by [CameraPipe] to abstract out the lifecycle, state, and interactions
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
index 7c79688..9e94da7 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
@@ -27,7 +27,7 @@
 // Public controls and enums used to interact with a CameraGraph.
 
 /** An enum to match the CameraMetadata.CONTROL_AF_MODE_* constants. */
-public enum class AfMode(public val value: Int) {
+enum class AfMode(val value: Int) {
     OFF(CameraMetadata.CONTROL_AF_MODE_OFF),
     AUTO(CameraMetadata.CONTROL_AF_MODE_AUTO),
     MACRO(CameraMetadata.CONTROL_AF_MODE_MACRO),
@@ -35,49 +35,49 @@
     CONTINUOUS_PICTURE(CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE),
     EDOF(CameraMetadata.CONTROL_AF_MODE_EDOF);
 
-    public companion object {
+    companion object {
         @JvmStatic
-        public fun fromIntOrNull(value: Int): AfMode? = values().firstOrNull { it.value == value }
+        fun fromIntOrNull(value: Int): AfMode? = values().firstOrNull { it.value == value }
     }
 }
 
 /** An enum to match the CameraMetadata.CONTROL_AE_MODE_* constants. */
-public enum class AeMode(public val value: Int) {
+enum class AeMode(val value: Int) {
     OFF(CameraMetadata.CONTROL_AE_MODE_OFF),
     ON(CameraMetadata.CONTROL_AE_MODE_ON),
     ON_AUTO_FLASH(CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH),
     ON_ALWAYS_FLASH(CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH),
     ON_AUTO_FLASH_REDEYE(CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
 
-    public companion object {
+    companion object {
         @JvmStatic
-        public fun fromIntOrNull(value: Int): AeMode? = values().firstOrNull { it.value == value }
+        fun fromIntOrNull(value: Int): AeMode? = values().firstOrNull { it.value == value }
     }
 }
 
 /** An enum to match the CameraMetadata.CONTROL_AWB_MODE_* constants. */
-public enum class AwbMode(public val value: Int) {
+enum class AwbMode(val value: Int) {
     AUTO(CameraMetadata.CONTROL_AWB_MODE_AUTO),
     CLOUDY_DAYLIGHT(CameraMetadata.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT),
     DAYLIGHT(CameraMetadata.CONTROL_AWB_MODE_DAYLIGHT),
     INCANDESCENT(CameraMetadata.CONTROL_AWB_MODE_INCANDESCENT),
     FLUORESCENT(CameraMetadata.CONTROL_AWB_MODE_FLUORESCENT);
 
-    public companion object {
+    companion object {
         @JvmStatic
-        public fun fromIntOrNull(value: Int): AwbMode? = values().firstOrNull { it.value == value }
+        fun fromIntOrNull(value: Int): AwbMode? = values().firstOrNull { it.value == value }
     }
 }
 
 /** An enum to match the CameraMetadata.FLASH_MODE_* constants. */
-public enum class FlashMode(public val value: Int) {
+enum class FlashMode(val value: Int) {
     OFF(CameraMetadata.FLASH_MODE_OFF),
     SINGLE(CameraMetadata.FLASH_MODE_SINGLE),
     TORCH(CameraMetadata.FLASH_MODE_TORCH);
 
-    public companion object {
+    companion object {
         @JvmStatic
-        public fun fromIntOrNull(value: Int): FlashMode? =
+        fun fromIntOrNull(value: Int): FlashMode? =
             values().firstOrNull { it.value == value }
     }
 }
@@ -92,13 +92,13 @@
  *
  * #CONTROL_AE_MODE_ON
  */
-public enum class TorchState {
+enum class TorchState {
     ON,
     OFF
 }
 
 /** Requirement to consider prior to locking auto-exposure, auto-focus and auto-whitebalance. */
-public enum class Lock3ABehavior {
+enum class Lock3ABehavior {
     /**
      * This requirement means that we want to lock the values for 3A immediately.
      *
@@ -132,14 +132,14 @@
  *   completion of the method, in that case this frameMetadata may not contain all the kay value
  *   pairs associated with the final result i.e. [TotalCaptureResult] of this frame.
  */
-public data class Result3A(val status: Status, val frameMetadata: FrameMetadata? = null) {
+data class Result3A(val status: Status, val frameMetadata: FrameMetadata? = null) {
     /**
      * Enum to know the status of 3A operation in case the method returns before the desired
      * operation is complete. The reason could be that the operation was talking a lot longer and an
      * enforced frame or time limit was reached, submitting the desired request to camera failed
      * etc.
      */
-    public enum class Status {
+    enum class Status {
         OK,
         FRAME_LIMIT_REACHED,
         TIME_LIMIT_REACHED,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
index a28d882..9736e8b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
@@ -24,7 +24,7 @@
 import kotlinx.coroutines.flow.flow
 
 /** Methods for querying, iterating, and selecting the Cameras that are available on the device. */
-public interface CameraDevices {
+interface CameraDevices {
     /**
      * Read the list of currently openable CameraIds from the provided CameraBackend, suspending if
      * needed. By default this will load the list of openable CameraIds from the default backend.
@@ -64,8 +64,9 @@
     @Deprecated(
         message = "findAll() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("awaitCameraIds"),
-        level = DeprecationLevel.WARNING)
-    public fun findAll(): List<CameraId>
+        level = DeprecationLevel.WARNING
+    )
+    fun findAll(): List<CameraId>
 
     /**
      * Load the list of CameraIds from the Camera2 CameraManager, suspending if the list of
@@ -74,8 +75,9 @@
     @Deprecated(
         message = "ids() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("getCameraIds"),
-        level = DeprecationLevel.WARNING)
-    public suspend fun ids(): List<CameraId>
+        level = DeprecationLevel.WARNING
+    )
+    suspend fun ids(): List<CameraId>
 
     /**
      * Load CameraMetadata for a specific CameraId. Loading CameraMetadata can take a non-zero
@@ -85,8 +87,9 @@
     @Deprecated(
         message = "getMetadata() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("getCameraMetadata"),
-        level = DeprecationLevel.WARNING)
-    public suspend fun getMetadata(camera: CameraId): CameraMetadata
+        level = DeprecationLevel.WARNING
+    )
+    suspend fun getMetadata(camera: CameraId): CameraMetadata
 
     /**
      * Load CameraMetadata for a specific CameraId and block the calling thread until the result is
@@ -95,15 +98,25 @@
     @Deprecated(
         message = "awaitMetadata() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("awaitCameraMetadata"),
-        level = DeprecationLevel.WARNING)
-    public fun awaitMetadata(camera: CameraId): CameraMetadata
+        level = DeprecationLevel.WARNING
+    )
+    fun awaitMetadata(camera: CameraId): CameraMetadata
 }
 
+/**
+ * CameraId represents a typed identifier for a camera represented as a non-blank String.
+ */
 @JvmInline
-public value class CameraId(public val value: String) {
-    public companion object {
-        public inline fun fromCamera2Id(value: String): CameraId = CameraId(value)
-        public inline fun fromCamera1Id(value: Int): CameraId = CameraId("$value")
+value class CameraId(val value: String) {
+    init {
+        require(value.isNotBlank()) {
+            "CameraId cannot be null or blank!"
+        }
+    }
+
+    companion object {
+        inline fun fromCamera2Id(value: String): CameraId = CameraId(value)
+        inline fun fromCamera1Id(value: Int): CameraId = CameraId("$value")
     }
 
     /**
@@ -111,8 +124,8 @@
      *
      * @return The parsed Camera1 id, or null if the value cannot be parsed as a Camera1 id.
      */
-    public inline fun toCamera1Id(): Int? = value.toIntOrNull()
-    public override fun toString(): String = "Camera $value"
+    inline fun toCamera1Id(): Int? = value.toIntOrNull()
+    override fun toString(): String = "Camera $value"
 }
 
 /**
@@ -120,7 +133,7 @@
  * metadata of cameras that are otherwise hidden. Metadata for hidden cameras are always returned
  * last.
  */
-public fun CameraDevices.find(
+fun CameraDevices.find(
     cameraBackendId: CameraBackendId? = null,
     includePhysicalCameraMetadata: Boolean = false
 ): Flow<CameraMetadata> = flow {
@@ -145,7 +158,8 @@
                     val physicalMetadata = this@find.getCameraMetadata(physicalId, cameraBackendId)
                     if (physicalMetadata != null &&
                         physicalMetadata.camera == physicalId &&
-                        visited.add(physicalId)) {
+                        visited.add(physicalId)
+                    ) {
                         emit(physicalMetadata)
                     }
                 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraError.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraError.kt
index 2c0ca3d..aac3027 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraError.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraError.kt
@@ -106,7 +106,8 @@
                 MAX_CAMERAS_IN_USE -> ERROR_CAMERA_LIMIT_EXCEEDED
                 else -> {
                     throw IllegalArgumentException(
-                        "Unexpected CameraAccessException reason:" + "${exception.reason}")
+                        "Unexpected CameraAccessException reason:" + "${exception.reason}"
+                    )
                 }
             }
 
@@ -119,7 +120,8 @@
                 StateCallback.ERROR_CAMERA_SERVICE -> ERROR_CAMERA_SERVICE
                 else -> {
                     throw IllegalArgumentException(
-                        "Unexpected StateCallback error code:" + "$stateCallbackError")
+                        "Unexpected StateCallback error code:" + "$stateCallbackError"
+                    )
                 }
             }
     }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
index ff0b20a..7522c6a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
@@ -26,9 +26,324 @@
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraGraph.Constants3A.DEFAULT_FRAME_LIMIT
 import androidx.camera.camera2.pipe.CameraGraph.Constants3A.DEFAULT_TIME_LIMIT_NS
+import androidx.camera.camera2.pipe.GraphState.GraphStateStarting
+import androidx.camera.camera2.pipe.GraphState.GraphStateStopped
+import androidx.camera.camera2.pipe.GraphState.GraphStateStopping
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.flow.StateFlow
 
+/** A [CameraGraph] represents the combined configuration and state of a camera. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+interface CameraGraph : AutoCloseable {
+    val streams: StreamGraph
+
+    /**
+     * Returns the state flow of [GraphState], which emits the current state of the [CameraGraph],
+     * including when a [CameraGraph] is stopped, starting or started.
+     */
+    val graphState: StateFlow<GraphState>
+
+    /**
+     * This will cause the [CameraGraph] to start opening the [CameraDevice] and configuring a
+     * [CameraCaptureSession]. While the CameraGraph is alive it will attempt to keep the camera
+     * open, active, and in a configured running state.
+     */
+    fun start()
+
+    /**
+     * This will cause the [CameraGraph] to stop executing requests and close the current Camera2
+     * [CameraCaptureSession] (if one is active). The most recent repeating request will be
+     * preserved, and any calls to submit a request to a session will be enqueued. To stop requests
+     * from being enqueued, close the [CameraGraph].
+     */
+    fun stop()
+
+    /** Acquire and exclusive access to the [CameraGraph] in a suspending fashion. */
+    suspend fun acquireSession(): Session
+
+    /**
+     * Try acquiring an exclusive access the [CameraGraph]. Returns null if it can't be acquired
+     * immediately.
+     */
+    fun acquireSessionOrNull(): Session?
+
+    /**
+     * This configures the camera graph to use a specific Surface for the given stream.
+     *
+     * Changing a surface may cause the camera to stall and/or reconfigure.
+     */
+    fun setSurface(stream: StreamId, surface: Surface?)
+
+    /**
+     * This defines the configuration, flags, and pre-defined structure of a [CameraGraph] instance.
+     * Note that for parameters, null is considered a valid value, and unset keys are ignored.
+     *
+     * @param camera The Camera2 [CameraId] that this [CameraGraph] represents.
+     * @param streams A list of [CameraStream]s to use when building the configuration.
+     * @param streamSharingGroups A list of [CameraStream]s to apply buffer sharing to.
+     * @param input An input configuration to support Camera2 Reprocessing.
+     * @param sessionTemplate The template id to use when creating the [CaptureRequest] to supply
+     *   the default parameters for a [SessionConfiguration] object.
+     * @param sessionParameters the extra parameters to apply to the [CaptureRequest] used to supply
+     *   the default parameters for a [SessionConfiguration] object. These parameters are *only*
+     *   used to create the [CaptureRequest] for session configuration. Use [defaultParameters] or
+     *   [requiredParameters] to enforce that the key is set for every request.
+     * @param sessionMode defines the [OperatingMode] of the session. May be used to configure a
+     *   [CameraConstrainedHighSpeedCaptureSession] for slow motion capture (If available)
+     * @param defaultTemplate The default template to be used if a [Request] does not specify one.
+     * @param defaultParameters The default parameters to be used for a [Request].
+     * @param defaultListeners A default set of listeners that will be added to every [Request].
+     * @param requiredParameters Will override any other configured parameter, and can be used to
+     *   enforce that specific keys are always set to specific value for every [CaptureRequest].
+     * @param cameraBackendId If defined, this tells the [CameraGraph] to use a specific
+     *   [CameraBackend] to open and operate the camera. The defined [camera] parameter must be a
+     *   camera that can be opened by this [CameraBackend]. If this value is null it will use the
+     *   default backend that has been configured by [CameraPipe].
+     * @param customCameraBackend If defined, this [customCameraBackend] will be created an used for
+     *   _only_ this [CameraGraph]. This cannot be defined if [cameraBackendId] is defined.
+     */
+    data class Config(
+        val camera: CameraId,
+        val streams: List<CameraStream.Config>,
+        val streamSharingGroups: List<List<CameraStream.Config>> = listOf(),
+        val input: InputStream.Config? = null,
+        val sessionTemplate: RequestTemplate = RequestTemplate(1),
+        val sessionParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
+        val sessionMode: OperatingMode = OperatingMode.NORMAL,
+        val defaultTemplate: RequestTemplate = RequestTemplate(1),
+        val defaultParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
+        val defaultListeners: List<Request.Listener> = listOf(),
+        val requiredParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
+        val cameraBackendId: CameraBackendId? = null,
+        val customCameraBackend: CameraBackendFactory? = null,
+        val metadataTransform: MetadataTransform = MetadataTransform(),
+        val flags: Flags = Flags()
+        // TODO: Internal error handling. May be better at the CameraPipe level.
+    ) {
+        init {
+            check(cameraBackendId == null || customCameraBackend == null) {
+                "Setting both cameraBackendId and customCameraBackend is not supported."
+            }
+        }
+    }
+
+    /**
+     * Flags define boolean values that are used to adjust the behavior and interactions with
+     * camera2. These flags should default to the ideal behavior and should be overridden on
+     * specific devices to be faster or to work around bad behavior.
+     */
+    data class Flags(
+        val configureBlankSessionOnStop: Boolean = false,
+        val abortCapturesOnStop: Boolean = false,
+        val allowMultipleActiveCameras: Boolean = false
+    )
+
+    enum class OperatingMode {
+        NORMAL,
+        HIGH_SPEED,
+    }
+
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+    object Constants3A {
+        // Constants related to controlling the time or frame budget a 3A operation should get.
+        const val DEFAULT_FRAME_LIMIT: Int = 60
+        const val DEFAULT_TIME_LIMIT_MS: Int = 3_000
+        const val DEFAULT_TIME_LIMIT_NS: Long = 3_000_000_000L
+
+        // Constants related to metering regions.
+        /** No metering region is specified. */
+        val METERING_REGIONS_EMPTY: Array<MeteringRectangle> = emptyArray()
+
+        /**
+         * No-op metering regions, this will tell camera device to pick the right metering region
+         * for us.
+         */
+        val METERING_REGIONS_DEFAULT: Array<MeteringRectangle> =
+            arrayOf(MeteringRectangle(0, 0, 0, 0, 0))
+
+        /** Placeholder frame number for [Result3A] when a 3A method encounters an error. */
+        val FRAME_NUMBER_INVALID: FrameNumber = FrameNumber(-1L)
+    }
+
+    /**
+     * A [Session] is an interactive lock for [CameraGraph] and allows state to be changed.
+     *
+     * Holding this object prevents other systems from acquiring a [Session] until the currently
+     * held session is released. Because of its exclusive nature, [Session]s are intended for fast,
+     * short-lived state updates, or for interactive capture sequences that must not be altered.
+     * (Flash photo sequences, for example).
+     *
+     * While this object is thread-safe, it should not shared or held for long periods of time.
+     * Example: A [Session] should *not* be held during video recording.
+     */
+    interface Session : AutoCloseable {
+        /**
+         * Causes the CameraGraph to start or update the current repeating request with the provided
+         * [Request] object. The [Request] object may be cached, and may be used for other
+         * interactions with the camera (such as updating 3A, or issuing 3A triggers).
+         */
+        fun startRepeating(request: Request)
+
+        /** Stop the current repeating request. */
+        fun stopRepeating()
+
+        /**
+         * Add the [Request] into an in-flight request queue. Requests will be issued to the Camera
+         * exactly once.
+         */
+        fun submit(request: Request)
+
+        /**
+         * Add the [Request] into an in-flight request queue. Requests will be issued to the Camera
+         * exactly once. The list of [Request]s is guaranteed to be submitted together.
+         */
+        fun submit(requests: List<Request>)
+
+        /**
+         * Abort in-flight requests. This will abort *all* requests in the current
+         * CameraCaptureSession as well as any requests that are enqueued, but that have not yet
+         * been submitted to the camera.
+         */
+        fun abort()
+
+        /**
+         * Applies the given 3A parameters to the camera device.
+         *
+         * @return earliest FrameNumber at which the parameters were successfully applied.
+         */
+        fun update3A(
+            aeMode: AeMode? = null,
+            afMode: AfMode? = null,
+            awbMode: AwbMode? = null,
+            aeRegions: List<MeteringRectangle>? = null,
+            afRegions: List<MeteringRectangle>? = null,
+            awbRegions: List<MeteringRectangle>? = null
+        ): Deferred<Result3A>
+
+        /**
+         * Applies the given 3A parameters to the camera device but for only one frame.
+         *
+         * @return the FrameNumber for which these parameters were applied.
+         */
+        suspend fun submit3A(
+            aeMode: AeMode? = null,
+            afMode: AfMode? = null,
+            awbMode: AwbMode? = null,
+            aeRegions: List<MeteringRectangle>? = null,
+            afRegions: List<MeteringRectangle>? = null,
+            awbRegions: List<MeteringRectangle>? = null
+        ): Deferred<Result3A>
+
+        /**
+         * Turns the torch to ON or OFF.
+         *
+         * This method has a side effect on the currently set AE mode. Ref:
+         * https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#FLASH_MODE
+         * To use the flash control, AE mode must be set to ON or OFF. So if the AE mode is already
+         * not either ON or OFF, we will need to update the AE mode to one of those states, here we
+         * will choose ON. It is the responsibility of the application layer above CameraPipe to
+         * restore the AE mode after the torch control has been used. The [update3A] method can be
+         * used to restore the AE state to a previous value.
+         *
+         * @return the FrameNumber at which the turn was fully turned on if switch was ON, or the
+         *   FrameNumber at which it was completely turned off when the switch was OFF.
+         */
+        fun setTorch(torchState: TorchState): Deferred<Result3A>
+
+        /**
+         * Locks the auto-exposure, auto-focus and auto-whitebalance as per the given desired
+         * behaviors. This given 3A parameters are applied before the lock is obtained. If 'null'
+         * value is passed for a parameter, that parameter is ignored, and the current value for
+         * that parameter continues to be applied.
+         *
+         * @param afTriggerStartAeMode the AeMode value that should override current AeMode for
+         *   AF_TRIGGER_START request, this value should not be retained for following requests
+         * @param frameLimit the maximum number of frames to wait before we give up waiting for this
+         *   operation to complete.
+         * @param timeLimitNs the maximum time limit in ms we wait before we give up waiting for
+         *   this operation to complete.
+         * @return [Result3A], which will contain the latest frame number at which the locks were
+         *   applied or the frame number at which the method returned early because either frame
+         *   limit or time limit was reached.
+         *
+         * TODO(sushilnath@): Add support for specifying the AE, AF and AWB modes as well. The
+         *   update of modes require special care if the desired lock behavior is immediate. In that
+         *   case we have to submit a combination of repeating and single requests so that the AF
+         *   skips the initial state of the new mode's state machine and stays locks in the new mode
+         *   as well.
+         */
+        suspend fun lock3A(
+            aeMode: AeMode? = null,
+            afMode: AfMode? = null,
+            awbMode: AwbMode? = null,
+            aeRegions: List<MeteringRectangle>? = null,
+            afRegions: List<MeteringRectangle>? = null,
+            awbRegions: List<MeteringRectangle>? = null,
+            aeLockBehavior: Lock3ABehavior? = null,
+            afLockBehavior: Lock3ABehavior? = null,
+            awbLockBehavior: Lock3ABehavior? = null,
+            afTriggerStartAeMode: AeMode? = null,
+            frameLimit: Int = DEFAULT_FRAME_LIMIT,
+            timeLimitNs: Long = DEFAULT_TIME_LIMIT_NS
+        ): Deferred<Result3A>
+
+        /**
+         * Unlocks auto-exposure, auto-focus, auto-whitebalance. Once they are unlocked they get
+         * back to their initial state or resume their auto scan depending on the current mode they
+         * are operating in.
+         *
+         * Providing 'true' for a parameter in this method will unlock that component and if 'false'
+         * is provided or the parameter is not specified then it will have no effect on the lock of
+         * that component, i.e. if it was locked earlier it will stay locked and if it was already
+         * unlocked, it will stay unlocked.
+         *
+         * @return [Result3A], which will contain the latest frame number at which the auto-focus,
+         *   auto-exposure, auto-white balance were unlocked as per the method arguments.
+         */
+        suspend fun unlock3A(
+            ae: Boolean? = null,
+            af: Boolean? = null,
+            awb: Boolean? = null
+        ): Deferred<Result3A>
+
+        /**
+         * This methods does pre-capture metering sequence and locks auto-focus. Once the operation
+         * completes, we can proceed to take high-quality pictures.
+         *
+         * Note: Flash will be used during pre-capture metering and during image capture if the AE
+         * mode was set to [AeMode.ON_AUTO_FLASH] or [AeMode.ON_ALWAYS_FLASH], thus firing it for
+         * low light captures or for every capture, respectively.
+         *
+         * @param frameLimit the maximum number of frames to wait before we give up waiting for this
+         *   operation to complete.
+         * @param timeLimitNs the maximum time limit in ms we wait before we give up waiting for
+         *   this operation to complete.
+         * @return [Result3A], which will contain the latest frame number at which the locks were
+         *   applied or the frame number at which the method returned early because either frame
+         *   limit or time limit was reached.
+         */
+        suspend fun lock3AForCapture(
+            frameLimit: Int = DEFAULT_FRAME_LIMIT,
+            timeLimitNs: Long = DEFAULT_TIME_LIMIT_NS
+        ): Deferred<Result3A>
+
+        /**
+         * After submitting pre-capture metering sequence needed by [lock3AForCapture] method, the
+         * camera system can internally lock the auto-exposure routine for subsequent still image
+         * capture, and if not image capture request is submitted the auto-exposure may not resume
+         * it's normal scan. This method brings focus and exposure back to normal after high quality
+         * image captures using [lock3AForCapture] method.
+         */
+        suspend fun unlock3APostCapture(): Deferred<Result3A>
+    }
+}
+
+/**
+ * GraphState represents public the public facing state of a [CameraGraph] instance. When created,
+ * a [CameraGraph] starts in [GraphStateStopped]. Calling [CameraGraph.start] puts the graph into
+ * [GraphStateStarting], and [CameraGraph.stop] puts the graph into [GraphStateStopping]. Remaining
+ * states are produced by the underlying camera as a result of these start/stop calls.
+ */
 abstract class GraphState internal constructor() {
     /**
      * When the [CameraGraph] is starting. This means we're in the process of opening a (virtual)
@@ -60,309 +375,3 @@
     class GraphStateError(val cameraError: CameraError, val willAttemptRetry: Boolean) :
         GraphState()
 }
-
-/** A [CameraGraph] represents the combined configuration and state of a camera. */
-@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public interface CameraGraph : AutoCloseable {
-    public val streams: StreamGraph
-
-    /**
-     * Returns the state flow of [GraphState], which emits the current state of the [CameraGraph],
-     * including when a [CameraGraph] is stopped, starting or started.
-     */
-    public val graphState: StateFlow<GraphState>
-
-    /**
-     * This will cause the [CameraGraph] to start opening the [CameraDevice] and configuring a
-     * [CameraCaptureSession]. While the CameraGraph is alive it will attempt to keep the camera
-     * open, active, and in a configured running state.
-     */
-    public fun start()
-
-    /**
-     * This will cause the [CameraGraph] to stop executing requests and close the current Camera2
-     * [CameraCaptureSession] (if one is active). The most recent repeating request will be
-     * preserved, and any calls to submit a request to a session will be enqueued. To stop requests
-     * from being enqueued, close the [CameraGraph].
-     */
-    public fun stop()
-
-    /** Acquire and exclusive access to the [CameraGraph] in a suspending fashion. */
-    public suspend fun acquireSession(): Session
-
-    /**
-     * Try acquiring an exclusive access the [CameraGraph]. Returns null if it can't be acquired
-     * immediately.
-     */
-    public fun acquireSessionOrNull(): Session?
-
-    /**
-     * This configures the camera graph to use a specific Surface for the given stream.
-     *
-     * Changing a surface may cause the camera to stall and/or reconfigure.
-     */
-    public fun setSurface(stream: StreamId, surface: Surface?)
-
-    /**
-     * This defines the configuration, flags, and pre-defined structure of a [CameraGraph] instance.
-     * Note that for parameters, null is considered a valid value, and unset keys are ignored.
-     *
-     * @param camera The Camera2 [CameraId] that this [CameraGraph] represents.
-     * @param streams A list of [CameraStream]s to use when building the configuration.
-     * @param streamSharingGroups A list of [CameraStream]s to apply buffer sharing to.
-     * @param input An input configuration to support Camera2 Reprocessing.
-     * @param sessionTemplate The template id to use when creating the [CaptureRequest] to supply
-     *   the default parameters for a [SessionConfiguration] object.
-     * @param sessionParameters the extra parameters to apply to the [CaptureRequest] used to supply
-     *   the default parameters for a [SessionConfiguration] object. These parameters are *only*
-     *   used to create the [CaptureRequest] for session configuration. Use [defaultParameters] or
-     *   [requiredParameters] to enforce that the key is set for every request.
-     * @param sessionMode defines the [OperatingMode] of the session. May be used to configure a
-     *   [CameraConstrainedHighSpeedCaptureSession] for slow motion capture (If available)
-     * @param defaultTemplate The default template to be used if a [Request] does not specify one.
-     * @param defaultParameters The default parameters to be used for a [Request].
-     * @param defaultListeners A default set of listeners that will be added to every [Request].
-     * @param requiredParameters Will override any other configured parameter, and can be used to
-     *   enforce that specific keys are always set to specific value for every [CaptureRequest].
-     * @param cameraBackendId If defined, this tells the [CameraGraph] to use a specific
-     *   [CameraBackend] to open and operate the camera. The defined [camera] parameter must be a
-     *   camera that can be opened by this [CameraBackend]. If this value is null it will use the
-     *   default backend that has been configured by [CameraPipe].
-     * @param customCameraBackend If defined, this [customCameraBackend] will be created an used for
-     *   _only_ this [CameraGraph]. This cannot be defined if [cameraBackendId] is defined.
-     */
-    public data class Config(
-        val camera: CameraId,
-        val streams: List<CameraStream.Config>,
-        val streamSharingGroups: List<List<CameraStream.Config>> = listOf(),
-        val input: InputStream.Config? = null,
-        val sessionTemplate: RequestTemplate = RequestTemplate(1),
-        val sessionParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
-        val sessionMode: OperatingMode = OperatingMode.NORMAL,
-        val defaultTemplate: RequestTemplate = RequestTemplate(1),
-        val defaultParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
-        val defaultListeners: List<Request.Listener> = listOf(),
-        val requiredParameters: Map<*, Any?> = emptyMap<Any, Any?>(),
-        val cameraBackendId: CameraBackendId? = null,
-        val customCameraBackend: CameraBackendFactory? = null,
-        val metadataTransform: MetadataTransform = MetadataTransform(),
-        val flags: Flags = Flags()
-    // TODO: Internal error handling. May be better at the CameraPipe level.
-    ) {
-        init {
-            check(cameraBackendId == null || customCameraBackend == null) {
-                "Setting both cameraBackendId and customCameraBackend is not supported."
-            }
-        }
-    }
-
-    /**
-     * Flags define boolean values that are used to adjust the behavior and interactions with
-     * camera2. These flags should default to the ideal behavior and should be overridden on
-     * specific devices to be faster or to work around bad behavior.
-     */
-    public data class Flags(
-        val configureBlankSessionOnStop: Boolean = false,
-        val abortCapturesOnStop: Boolean = false,
-        val allowMultipleActiveCameras: Boolean = false
-    )
-
-    public enum class OperatingMode {
-        NORMAL,
-        HIGH_SPEED,
-    }
-
-    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-    public object Constants3A {
-        // Constants related to controlling the time or frame budget a 3A operation should get.
-        public const val DEFAULT_FRAME_LIMIT: Int = 60
-        public const val DEFAULT_TIME_LIMIT_MS: Int = 3_000
-        public const val DEFAULT_TIME_LIMIT_NS: Long = 3_000_000_000L
-
-        // Constants related to metering regions.
-        /** No metering region is specified. */
-        public val METERING_REGIONS_EMPTY: Array<MeteringRectangle> = emptyArray()
-
-        /**
-         * No-op metering regions, this will tell camera device to pick the right metering region
-         * for us.
-         */
-        public val METERING_REGIONS_DEFAULT: Array<MeteringRectangle> =
-            arrayOf(MeteringRectangle(0, 0, 0, 0, 0))
-
-        /** Placeholder frame number for [Result3A] when a 3A method encounters an error. */
-        public val FRAME_NUMBER_INVALID: FrameNumber = FrameNumber(-1L)
-    }
-
-    /**
-     * A [Session] is an interactive lock for [CameraGraph] and allows state to be changed.
-     *
-     * Holding this object prevents other systems from acquiring a [Session] until the currently
-     * held session is released. Because of its exclusive nature, [Session]s are intended for fast,
-     * short-lived state updates, or for interactive capture sequences that must not be altered.
-     * (Flash photo sequences, for example).
-     *
-     * While this object is thread-safe, it should not shared or held for long periods of time.
-     * Example: A [Session] should *not* be held during video recording.
-     */
-    public interface Session : AutoCloseable {
-        /**
-         * Causes the CameraGraph to start or update the current repeating request with the provided
-         * [Request] object. The [Request] object may be cached, and may be used for other
-         * interactions with the camera (such as updating 3A, or issuing 3A triggers).
-         */
-        public fun startRepeating(request: Request)
-
-        /** Stop the current repeating request. */
-        public fun stopRepeating()
-
-        /**
-         * Add the [Request] into an in-flight request queue. Requests will be issued to the Camera
-         * exactly once.
-         */
-        public fun submit(request: Request)
-
-        /**
-         * Add the [Request] into an in-flight request queue. Requests will be issued to the Camera
-         * exactly once. The list of [Request]s is guaranteed to be submitted together.
-         */
-        public fun submit(requests: List<Request>)
-
-        /**
-         * Abort in-flight requests. This will abort *all* requests in the current
-         * CameraCaptureSession as well as any requests that are enqueued, but that have not yet
-         * been submitted to the camera.
-         */
-        public fun abort()
-
-        /**
-         * Applies the given 3A parameters to the camera device.
-         *
-         * @return earliest FrameNumber at which the parameters were successfully applied.
-         */
-        public fun update3A(
-            aeMode: AeMode? = null,
-            afMode: AfMode? = null,
-            awbMode: AwbMode? = null,
-            aeRegions: List<MeteringRectangle>? = null,
-            afRegions: List<MeteringRectangle>? = null,
-            awbRegions: List<MeteringRectangle>? = null
-        ): Deferred<Result3A>
-
-        /**
-         * Applies the given 3A parameters to the camera device but for only one frame.
-         *
-         * @return the FrameNumber for which these parameters were applied.
-         */
-        public suspend fun submit3A(
-            aeMode: AeMode? = null,
-            afMode: AfMode? = null,
-            awbMode: AwbMode? = null,
-            aeRegions: List<MeteringRectangle>? = null,
-            afRegions: List<MeteringRectangle>? = null,
-            awbRegions: List<MeteringRectangle>? = null
-        ): Deferred<Result3A>
-
-        /**
-         * Turns the torch to ON or OFF.
-         *
-         * This method has a side effect on the currently set AE mode. Ref:
-         * https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#FLASH_MODE
-         * To use the flash control, AE mode must be set to ON or OFF. So if the AE mode is already
-         * not either ON or OFF, we will need to update the AE mode to one of those states, here we
-         * will choose ON. It is the responsibility of the application layer above CameraPipe to
-         * restore the AE mode after the torch control has been used. The [update3A] method can be
-         * used to restore the AE state to a previous value.
-         *
-         * @return the FrameNumber at which the turn was fully turned on if switch was ON, or the
-         *   FrameNumber at which it was completely turned off when the switch was OFF.
-         */
-        public fun setTorch(torchState: TorchState): Deferred<Result3A>
-
-        /**
-         * Locks the auto-exposure, auto-focus and auto-whitebalance as per the given desired
-         * behaviors. This given 3A parameters are applied before the lock is obtained. If 'null'
-         * value is passed for a parameter, that parameter is ignored, and the current value for
-         * that parameter continues to be applied.
-         *
-         * @param afTriggerStartAeMode the AeMode value that should override current AeMode for
-         *   AF_TRIGGER_START request, this value should not be retained for following requests
-         * @param frameLimit the maximum number of frames to wait before we give up waiting for this
-         *   operation to complete.
-         * @param timeLimitNs the maximum time limit in ms we wait before we give up waiting for
-         *   this operation to complete.
-         * @return [Result3A], which will contain the latest frame number at which the locks were
-         *   applied or the frame number at which the method returned early because either frame
-         *   limit or time limit was reached.
-         *
-         * TODO(sushilnath@): Add support for specifying the AE, AF and AWB modes as well. The
-         *   update of modes require special care if the desired lock behavior is immediate. In that
-         *   case we have to submit a combination of repeating and single requests so that the AF
-         *   skips the initial state of the new mode's state machine and stays locks in the new mode
-         *   as well.
-         */
-        public suspend fun lock3A(
-            aeMode: AeMode? = null,
-            afMode: AfMode? = null,
-            awbMode: AwbMode? = null,
-            aeRegions: List<MeteringRectangle>? = null,
-            afRegions: List<MeteringRectangle>? = null,
-            awbRegions: List<MeteringRectangle>? = null,
-            aeLockBehavior: Lock3ABehavior? = null,
-            afLockBehavior: Lock3ABehavior? = null,
-            awbLockBehavior: Lock3ABehavior? = null,
-            afTriggerStartAeMode: AeMode? = null,
-            frameLimit: Int = DEFAULT_FRAME_LIMIT,
-            timeLimitNs: Long = DEFAULT_TIME_LIMIT_NS
-        ): Deferred<Result3A>
-
-        /**
-         * Unlocks auto-exposure, auto-focus, auto-whitebalance. Once they are unlocked they get
-         * back to their initial state or resume their auto scan depending on the current mode they
-         * are operating in.
-         *
-         * Providing 'true' for a parameter in this method will unlock that component and if 'false'
-         * is provided or the parameter is not specified then it will have no effect on the lock of
-         * that component, i.e if it was locked earlier it will stay locked and if it was already
-         * unlocked, it will stay unlocked.
-         *
-         * @return [Result3A], which will contain the latest frame number at which the auto-focus,
-         *   auto-exposure, auto-white balance were unlocked as per the method arguments.
-         */
-        public suspend fun unlock3A(
-            ae: Boolean? = null,
-            af: Boolean? = null,
-            awb: Boolean? = null
-        ): Deferred<Result3A>
-
-        /**
-         * This methods does pre-capture metering sequence and locks auto-focus. Once the operation
-         * completes, we can proceed to take high-quality pictures.
-         *
-         * Note: Flash will be used during pre-capture metering and during image capture if the AE
-         * mode was set to [AeMode.ON_AUTO_FLASH] or [AeMode.ON_ALWAYS_FLASH], thus firing it for
-         * low light captures or for every capture, respectively.
-         *
-         * @param frameLimit the maximum number of frames to wait before we give up waiting for this
-         *   operation to complete.
-         * @param timeLimitNs the maximum time limit in ms we wait before we give up waiting for
-         *   this operation to complete.
-         * @return [Result3A], which will contain the latest frame number at which the locks were
-         *   applied or the frame number at which the method returned early because either frame
-         *   limit or time limit was reached.
-         */
-        public suspend fun lock3AForCapture(
-            frameLimit: Int = DEFAULT_FRAME_LIMIT,
-            timeLimitNs: Long = DEFAULT_TIME_LIMIT_NS
-        ): Deferred<Result3A>
-
-        /**
-         * After submitting pre-capture metering sequence needed by [lock3AForCapture] method, the
-         * camera system can internally lock the auto-exposure routine for subsequent still image
-         * capture, and if not image capture request is submitted the auto-exposure may not resume
-         * it's normal scan. This method brings focus and exposure back to normal after high quality
-         * image captures using [lock3AForCapture] method.
-         */
-        public suspend fun unlock3APostCapture(): Deferred<Result3A>
-    }
-}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
index 01ad490..24cbc65 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
@@ -32,23 +32,23 @@
  * directly. This allows code to get reasonable behavior for all properties across all OS levels and
  * makes behavior that depends on [CameraMetadata] easier to test and reason about.
  */
-public interface CameraMetadata : Metadata, UnsafeWrapper {
-    public operator fun <T> get(key: CameraCharacteristics.Key<T>): T?
-    public fun <T> getOrDefault(key: CameraCharacteristics.Key<T>, default: T): T
+interface CameraMetadata : Metadata, UnsafeWrapper {
+    operator fun <T> get(key: CameraCharacteristics.Key<T>): T?
+    fun <T> getOrDefault(key: CameraCharacteristics.Key<T>, default: T): T
 
-    public val camera: CameraId
-    public val isRedacted: Boolean
+    val camera: CameraId
+    val isRedacted: Boolean
 
-    public val keys: Set<CameraCharacteristics.Key<*>>
-    public val requestKeys: Set<CaptureRequest.Key<*>>
-    public val resultKeys: Set<CaptureResult.Key<*>>
-    public val sessionKeys: Set<CaptureRequest.Key<*>>
+    val keys: Set<CameraCharacteristics.Key<*>>
+    val requestKeys: Set<CaptureRequest.Key<*>>
+    val resultKeys: Set<CaptureResult.Key<*>>
+    val sessionKeys: Set<CaptureRequest.Key<*>>
 
-    public val physicalCameraIds: Set<CameraId>
-    public val physicalRequestKeys: Set<CaptureRequest.Key<*>>
+    val physicalCameraIds: Set<CameraId>
+    val physicalRequestKeys: Set<CaptureRequest.Key<*>>
 
-    public suspend fun getPhysicalMetadata(cameraId: CameraId): CameraMetadata
-    public fun awaitPhysicalMetadata(cameraId: CameraId): CameraMetadata
+    suspend fun getPhysicalMetadata(cameraId: CameraId): CameraMetadata
+    fun awaitPhysicalMetadata(cameraId: CameraId): CameraMetadata
 }
 
 /**
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
index b67d791..d90a1bc 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
@@ -49,7 +49,7 @@
  * [android.hardware.camera2.CameraDevice] and [android.hardware.camera2.CameraCaptureSession] via
  * the [CameraGraph] interface.
  */
-public class CameraPipe(config: Config) {
+class CameraPipe(config: Config) {
     private val debugId = cameraPipeIds.incrementAndGet()
     private val component: CameraPipeComponent =
         DaggerCameraPipeComponent.builder()
@@ -61,7 +61,7 @@
      * This creates a new [CameraGraph] that can be used to interact with a single Camera on the
      * device. Multiple [CameraGraph]s can be created, but only one should be active at a time.
      */
-    public fun create(config: CameraGraph.Config): CameraGraph {
+    fun create(config: CameraGraph.Config): CameraGraph {
         return component
             .cameraGraphComponentBuilder()
             .cameraGraphConfigModule(CameraGraphConfigModule(config))
@@ -70,12 +70,12 @@
     }
 
     /** This provides access to information about the available cameras on the device. */
-    public fun cameras(): CameraDevices {
+    fun cameras(): CameraDevices {
         return component.cameras()
     }
 
     /** This returns [CameraSurfaceManager] which tracks the lifetime of Surfaces in CameraPipe. */
-    public fun cameraSurfaceManager(): CameraSurfaceManager {
+    fun cameraSurfaceManager(): CameraSurfaceManager {
         return component.cameraSurfaceManager()
     }
 
@@ -83,7 +83,7 @@
      * Application level configuration for [CameraPipe]. Nullable values are optional and reasonable
      * defaults will be provided if values are not specified.
      */
-    public data class Config(
+    data class Config(
         val appContext: Context,
         val threadConfig: ThreadConfig = ThreadConfig(),
         val cameraMetadataConfig: CameraMetadataConfig = CameraMetadataConfig(),
@@ -95,7 +95,7 @@
      * Application level configuration for Camera2Interop callbacks. If set, these callbacks will be
      * triggered at the appropriate places in Camera-Pipe.
      */
-    public data class CameraInteropConfig(
+    data class CameraInteropConfig(
         val cameraDeviceStateCallback: CameraDevice.StateCallback? = null,
         val cameraSessionStateCallback: CameraCaptureSession.StateCallback? = null
     )
@@ -114,7 +114,7 @@
      * - [testOnlyScope] is used for testing to overwrite the internal global scope with the test
      *   method scope.
      */
-    public data class ThreadConfig(
+    data class ThreadConfig(
         val defaultLightweightExecutor: Executor? = null,
         val defaultBackgroundExecutor: Executor? = null,
         val defaultBlockingExecutor: Executor? = null,
@@ -132,9 +132,9 @@
      * @param cameraCacheBlocklist is used to prevent the metadata backend from caching the results
      *   of specific keys for specific cameraIds.
      */
-    public class CameraMetadataConfig(
-        public val cacheBlocklist: Set<CameraCharacteristics.Key<*>> = emptySet(),
-        public val cameraCacheBlocklist: Map<CameraId, Set<CameraCharacteristics.Key<*>>> =
+    class CameraMetadataConfig(
+        val cacheBlocklist: Set<CameraCharacteristics.Key<*>> = emptySet(),
+        val cameraCacheBlocklist: Map<CameraId, Set<CameraCharacteristics.Key<*>>> =
             emptyMap()
     )
 
@@ -170,7 +170,8 @@
      * system.
      */
     @Deprecated(
-        "CameraPipe.External is deprecated, use customCameraBackend on " + "GraphConfig instead.")
+        "CameraPipe.External is deprecated, use customCameraBackend on " + "GraphConfig instead."
+    )
     class External(threadConfig: ThreadConfig = ThreadConfig()) {
         private val component: ExternalCameraPipeComponent =
             DaggerExternalCameraPipeComponent.builder()
@@ -184,8 +185,9 @@
         @Suppress("DEPRECATION")
         @Deprecated(
             "CameraPipe.External is deprecated, use customCameraBackend on " +
-                "GraphConfig instead.")
-        public fun create(
+                "GraphConfig instead."
+        )
+        fun create(
             config: CameraGraph.Config,
             cameraMetadata: CameraMetadata,
             requestProcessor: RequestProcessor
@@ -197,7 +199,8 @@
             val component: ExternalCameraGraphComponent =
                 componentBuilder
                     .externalCameraGraphConfigModule(
-                        ExternalCameraGraphConfigModule(config, cameraMetadata, requestProcessor))
+                        ExternalCameraGraphConfigModule(config, cameraMetadata, requestProcessor)
+                    )
                     .build()
             return component.cameraGraph()
         }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraSurfaceManager.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraSurfaceManager.kt
index 4f6e14c..b0fecf3 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraSurfaceManager.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraSurfaceManager.kt
@@ -45,13 +45,15 @@
  */
 @Singleton
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class CameraSurfaceManager @Inject constructor() {
+class CameraSurfaceManager @Inject constructor() {
 
     private val lock = Any()
 
-    @GuardedBy("lock") private val useCountMap: MutableMap<Surface, Int> = mutableMapOf()
+    @GuardedBy("lock")
+    private val useCountMap: MutableMap<Surface, Int> = mutableMapOf()
 
-    @GuardedBy("lock") private val listeners: MutableSet<SurfaceListener> = mutableSetOf()
+    @GuardedBy("lock")
+    private val listeners: MutableSet<SurfaceListener> = mutableSetOf()
 
     /**
      * A new [SurfaceToken] is issued when a [Surface] is registered in CameraSurfaceManager. When
@@ -93,7 +95,7 @@
      * Adds a [SurfaceListener] to receive [Surface] lifetime updates. When a listener is added, it
      * will receive [SurfaceListener.onSurfaceActive] for all active Surfaces.
      */
-    public fun addListener(listener: SurfaceListener) {
+    fun addListener(listener: SurfaceListener) {
         val activeSurfaces =
             synchronized(lock) {
                 listeners.add(listener)
@@ -104,7 +106,7 @@
     }
 
     /** Removes a [SurfaceListener] to stop receiving [Surface] lifetime updates. */
-    public fun removeListener(listener: SurfaceListener) {
+    fun removeListener(listener: SurfaceListener) {
         synchronized(lock) { listeners.remove(listener) }
     }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequence.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequence.kt
index a85bc64..144ccc2 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequence.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequence.kt
@@ -22,7 +22,7 @@
  *
  * A CaptureSequence should be created from a [CaptureSequenceProcessor].
  */
-public interface CaptureSequence<out TCaptureRequest> {
+interface CaptureSequence<out TCaptureRequest> {
     val cameraId: CameraId
     val repeating: Boolean
     val captureRequestList: List<TCaptureRequest>
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequenceProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequenceProcessor.kt
index 8e33af1..9c6cc07 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequenceProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CaptureSequenceProcessor.kt
@@ -17,7 +17,7 @@
 package androidx.camera.camera2.pipe
 
 /** Create and submit [CaptureSequence]s to an active camera instance. */
-public interface CaptureSequenceProcessor<
+interface CaptureSequenceProcessor<
     out TCaptureRequest, TCaptureSequence : CaptureSequence<TCaptureRequest>> {
 
     /**
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Frames.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Frames.kt
new file mode 100644
index 0000000..5409f4f
--- /dev/null
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Frames.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
+package androidx.camera.camera2.pipe
+
+import android.hardware.camera2.CaptureResult
+import android.hardware.camera2.TotalCaptureResult
+import androidx.annotation.RequiresApi
+
+/**
+ * A [FrameNumber] is the identifier that represents a specific exposure by the Camera. FrameNumbers
+ * increase within a specific CameraCaptureSession, and are not created until the HAL begins
+ * processing a request.
+ */
+@JvmInline
+value class FrameNumber(val value: Long)
+
+/** [FrameInfo] is a wrapper around [TotalCaptureResult]. */
+interface FrameInfo : UnsafeWrapper {
+    val metadata: FrameMetadata
+
+    /**
+     * If this [FrameInfo] was produced from a logical camera there will be metadata associated with
+     * the physical streams that were sent to the camera.
+     */
+    operator fun get(camera: CameraId): FrameMetadata?
+
+    val camera: CameraId
+    val frameNumber: FrameNumber
+    val requestMetadata: RequestMetadata
+}
+
+/** [FrameMetadata] is a wrapper around [CaptureResult]. */
+interface FrameMetadata : Metadata, UnsafeWrapper {
+    operator fun <T> get(key: CaptureResult.Key<T>): T?
+    fun <T> getOrDefault(key: CaptureResult.Key<T>, default: T): T
+
+    val camera: CameraId
+    val frameNumber: FrameNumber
+
+    /**
+     * Extra metadata will override values defined by the wrapped CaptureResult object. This is
+     * exposed separately to allow other systems to know what is altered relative to Camera2.
+     */
+    val extraMetadata: Map<*, Any?>
+}
+
+/**
+ * This defines a metadata transform that will be applied to the data produced by
+ * [Request.Listener.onTotalCaptureResult]. The returned map will override the values returned by
+ * TotalCaptureResult. Setting the offset and window size will cause the
+ * [Request.Listener.onComplete] method to be delayed so that the transform can be run on future
+ * metadata.
+ */
+data class MetadataTransform(
+    /**
+     * This defines the number of historical [TotalCaptureResult] objects this transform is allowed
+     * to look at. Setting this value to > 0 increases the number of [TotalCaptureResult] the
+     * [CameraGraph] will hold on to.
+     */
+    val past: Int = 0,
+
+    /**
+     * This defines the number of future [TotalCaptureResult] objects this transform is allowed to
+     * look at. Setting this value to > 0 will cause [Request.Listener.onComplete] to be delayed by
+     * the number of frames specified here.
+     */
+    val future: Int = 0,
+
+    /**
+     * This transform function will be invoked at high speed, and may be invoked multiple times if
+     * correcting physical camera results.
+     *
+     * the returned values should be limited to values that will override the default values that
+     * are set on the TotalCaptureResult for this frame.
+     */
+    val transformFn: TransformFn = object : TransformFn {}
+) {
+    init {
+        check(past >= 0)
+        check(future >= 0)
+    }
+
+    interface TransformFn {
+        fun computeOverridesFor(
+            result: FrameInfo,
+            camera: CameraId,
+            related: List<FrameInfo?>
+        ): Map<*, Any?> = emptyMap<Any, Any?>()
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
index 1529c70..57d8d16 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
@@ -18,10 +18,6 @@
 
 package androidx.camera.camera2.pipe
 
-import android.hardware.camera2.CaptureRequest
-import android.hardware.camera2.CaptureResult
-import android.hardware.camera2.TotalCaptureResult
-import android.view.Surface
 import androidx.annotation.RequiresApi
 
 /**
@@ -32,20 +28,21 @@
  *
  * These interfaces are read-only.
  */
-public interface Metadata {
-    public operator fun <T> get(key: Key<T>): T?
-    public fun <T> getOrDefault(key: Key<T>, default: T): T
+interface Metadata {
+    operator fun <T> get(key: Key<T>): T?
+    fun <T> getOrDefault(key: Key<T>, default: T): T
 
     /** Metadata keys provide values or controls that are provided or computed by CameraPipe. */
-    public class Key<T> private constructor(private val name: String) {
-        public companion object {
-            @JvmStatic internal val keys: MutableSet<String> = HashSet()
+    class Key<T> private constructor(private val name: String) {
+        companion object {
+            @JvmStatic
+            internal val keys: MutableSet<String> = HashSet()
 
             /**
              * This will create a new Key instance, and will check to see that the key has not been
              * previously created somewhere else.
              */
-            public fun <T> create(name: String): Key<T> {
+            fun <T> create(name: String): Key<T> {
                 synchronized(keys) { check(keys.add(name)) { "$name is already defined!" } }
                 return Key(name)
             }
@@ -56,178 +53,3 @@
         }
     }
 }
-
-/**
- * RequestMetadata wraps together all of the information about a specific CaptureRequest that was
- * submitted to Camera2.
- *
- * <p> This class is distinct from [Request] which is used to configure and issue a request to the
- * [CameraGraph]. This class will report the actual keys / values that were sent to camera2 (if
- * different) from the request that was used to create the Camera2 [CaptureRequest].
- */
-public interface RequestMetadata : Metadata, UnsafeWrapper {
-    public operator fun <T> get(key: CaptureRequest.Key<T>): T?
-    public fun <T> getOrDefault(key: CaptureRequest.Key<T>, default: T): T
-
-    /** The actual Camera2 template that was used when creating this [CaptureRequest] */
-    public val template: RequestTemplate
-
-    /**
-     * A Map of StreamId(s) that were submitted with this CaptureRequest and the Surface(s) used for
-     * this request. It's possible that not all of the streamId's specified in the [Request] are
-     * present in the [CaptureRequest].
-     */
-    public val streams: Map<StreamId, Surface>
-
-    /** Returns true if this is used in a repeating request. */
-    public val repeating: Boolean
-
-    /** The request object that was used to create this [CaptureRequest] */
-    public val request: Request
-
-    /** An internal number used to identify a specific [CaptureRequest] */
-    public val requestNumber: RequestNumber
-}
-
-/** [FrameInfo] is a wrapper around [TotalCaptureResult]. */
-public interface FrameInfo : UnsafeWrapper {
-    public val metadata: FrameMetadata
-
-    /**
-     * If this [FrameInfo] was produced from a logical camera there will be metadata associated with
-     * the physical streams that were sent to the camera.
-     */
-    public operator fun get(camera: CameraId): FrameMetadata?
-
-    public val camera: CameraId
-    public val frameNumber: FrameNumber
-    public val requestMetadata: RequestMetadata
-}
-
-/** [FrameMetadata] is a wrapper around [CaptureResult]. */
-public interface FrameMetadata : Metadata, UnsafeWrapper {
-    public operator fun <T> get(key: CaptureResult.Key<T>): T?
-    public fun <T> getOrDefault(key: CaptureResult.Key<T>, default: T): T
-
-    public val camera: CameraId
-    public val frameNumber: FrameNumber
-
-    /**
-     * Extra metadata will override values defined by the wrapped CaptureResult object. This is
-     * exposed separately to allow other systems to know what is altered relative to Camera2.
-     */
-    public val extraMetadata: Map<*, Any?>
-}
-
-/**
- * This defines a metadata transform that will be applied to the data produced by
- * [Request.Listener.onTotalCaptureResult]. The returned map will override the values returned by
- * TotalCaptureResult. Setting the offset and window size will cause the
- * [Request.Listener.onComplete] method to be delayed so that the transform can be run on future
- * metadata.
- */
-public data class MetadataTransform(
-    /**
-     * This defines the number of historical [TotalCaptureResult] objects this transform is allowed
-     * to look at. Setting this value to > 0 increases the number of [TotalCaptureResult] the
-     * [CameraGraph] will hold on to.
-     */
-    val past: Int = 0,
-
-    /**
-     * This defines the number of future [TotalCaptureResult] objects this transform is allowed to
-     * look at. Setting this value to > 0 will cause [Request.Listener.onComplete] to be delayed by
-     * the number of frames specified here.
-     */
-    val future: Int = 0,
-
-    /**
-     * This transform function will be invoked at high speed, and may be invoked multiple times if
-     * correcting physical camera results.
-     *
-     * the returned values should be limited to values that will override the default values that
-     * are set on the TotalCaptureResult for this frame.
-     */
-    val transformFn: TransformFn = object : TransformFn {}
-) {
-    init {
-        check(past >= 0)
-        check(future >= 0)
-    }
-
-    public interface TransformFn {
-        public fun computeOverridesFor(
-            result: FrameInfo,
-            camera: CameraId,
-            related: List<FrameInfo?>
-        ): Map<*, Any?> = emptyMap<Any, Any?>()
-    }
-}
-
-/**
- * A [RequestTemplate] indicates which preset set list of parameters will be applied to a request by
- * default. These values are defined by camera2.
- */
-@JvmInline
-public value class RequestTemplate(public val value: Int) {
-    val name: String
-        get() {
-            return when (value) {
-                1 -> "TEMPLATE_PREVIEW"
-                2 -> "TEMPLATE_STILL_CAPTURE"
-                3 -> "TEMPLATE_RECORD"
-                4 -> "TEMPLATE_VIDEO_SNAPSHOT"
-                5 -> "TEMPLATE_ZERO_SHUTTER_LAG"
-                6 -> "TEMPLATE_MANUAL"
-                else -> "UNKNOWN-$value"
-            }
-        }
-}
-
-/**
- * A [RequestNumber] is an artificial identifier that is created for each request that is submitted
- * to the Camera.
- */
-@JvmInline public value class RequestNumber(public val value: Long)
-
-/**
- * A [FrameNumber] is the identifier that represents a specific exposure by the Camera. FrameNumbers
- * increase within a specific CameraCaptureSession, and are not created until the HAL begins
- * processing a request.
- */
-@JvmInline public value class FrameNumber(public val value: Long)
-
-/**
- * This is a timestamp from the Camera, and corresponds to the nanosecond exposure time of a Frame.
- * While the value is expressed in nano-seconds, the precision may be much lower. In addition, the
- * time-base of the Camera is undefined, although it's common for it to be in either Monotonic or
- * Realtime.
- *
- * <p> Timestamp may differ from timestamps that are obtained from other parts of the Camera and
- * media systems within the same device. For example, it's common for high frequency sensors to
- * operate based on a real-time clock, while audio/visual systems commonly operate based on a
- * monotonic clock.
- */
-@JvmInline public value class CameraTimestamp(public val value: Long)
-
-/** Utility function to help deal with the unsafe nature of the typed Key/Value pairs. */
-public fun CaptureRequest.Builder.writeParameters(parameters: Map<*, Any?>) {
-    for ((key, value) in parameters) {
-        writeParameter(key, value)
-    }
-}
-
-/** Utility function to help deal with the unsafe nature of the typed Key/Value pairs. */
-public fun CaptureRequest.Builder.writeParameter(key: Any?, value: Any?) {
-    if (key != null && key is CaptureRequest.Key<*>) {
-        @Suppress("UNCHECKED_CAST") this.set(key as CaptureRequest.Key<Any>, value)
-    }
-}
-
-/**
- * Utility function to put all metadata in the current map through an unchecked cast. The unchecked
- * cast is necessary since CameraGraph.Config uses Map<*, Any?> as the standard type for parameters.
- */
-fun MutableMap<Any, Any?>.putAllMetadata(metadata: Map<*, Any?>) {
-    @Suppress("UNCHECKED_CAST") this.putAll(metadata as Map<Any, Any?>)
-}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
deleted file mode 100644
index b79096f..0000000
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
+++ /dev/null
@@ -1,229 +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.
- */
-
-@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-
-package androidx.camera.camera2.pipe
-
-import android.hardware.camera2.CameraCaptureSession
-import android.hardware.camera2.CameraDevice
-import android.hardware.camera2.CaptureFailure
-import android.hardware.camera2.CaptureRequest
-import androidx.annotation.RequiresApi
-
-/**
- * A [Request] is an immutable package of outputs and parameters needed to issue a [CaptureRequest]
- * to a Camera2 [CameraCaptureSession].
- *
- * [Request] objects are handled by camera2 via the [RequestProcessor] interface, and will translate
- * each [Request] object into a corresponding [CaptureRequest] object using the active
- * [CameraDevice], [CameraCaptureSession], and [CameraGraph.Config]. Requests may be queued up and
- * submitted after a delay, or reused (in the case of repeating requests) if the
- * [CameraCaptureSession] is reconfigured or recreated.
- *
- * Depending on the [CameraGraph.Config], it is possible that not all parameters that are set on the
- * [Request] will be honored when a [Request] is sent to the camera. Specifically, Camera2
- * parameters related to 3A State and any required parameters specified on the [CameraGraph.Config]
- * will override parameters specified in a [Request]
- *
- * @param streams The list of streams to submit. Each request *must* have 1 or more valid streams.
- */
-public data class Request(
-    val streams: List<StreamId>,
-    val parameters: Map<CaptureRequest.Key<*>, Any> = emptyMap(),
-    val extras: Map<Metadata.Key<*>, Any> = emptyMap(),
-    val listeners: List<Listener> = emptyList(),
-    val template: RequestTemplate? = null
-) {
-
-    /**
-     * This listener is used to observe the state and progress of a [Request] that has been issued
-     * to the [CameraGraph]. Listeners will be invoked on background threads at high speed, and
-     * should avoid blocking work or accessing synchronized resources if possible. [Listener]s used
-     * in a repeating request may be issued multiple times within the same session, and should not
-     * rely on [onRequestSequenceSubmitted] from being invoked only once.
-     */
-    public interface Listener {
-        /**
-         * This event indicates that the camera sensor has started exposing the frame associated
-         * with this Request. The timestamp will either be the beginning or end of the sensors
-         * exposure time depending on the device, and may be in a different timebase from the
-         * timestamps that are returned from the underlying buffers.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param timestamp the android timestamp in nanos for this exposure
-         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
-         */
-        public fun onStarted(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            timestamp: CameraTimestamp
-        ) {}
-
-        /**
-         * This event indicates that the camera sensor has additional information about the frame
-         * associated with this Request. This method may be invoked 0 or more times before the frame
-         * receives onComplete.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param captureResult the current android capture result for this exposure
-         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
-         */
-        public fun onPartialCaptureResult(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            captureResult: FrameMetadata
-        ) {}
-
-        /**
-         * This event indicates that all of the metadata associated with this frame has been
-         * produced. If [onPartialCaptureResult] was invoked, the values returned in the
-         * totalCaptureResult map be a superset of the values produced from the
-         * [onPartialCaptureResult] calls.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param totalCaptureResult the final android capture result for this exposure
-         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
-         */
-        public fun onTotalCaptureResult(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            totalCaptureResult: FrameInfo
-        ) {}
-
-        /**
-         * This is an artificial event that will be invoked after onTotalCaptureResult. This may be
-         * invoked several frames after onTotalCaptureResult due to incorrect HAL implementations
-         * that return metadata that get shifted several frames in the future. See b/154568653 for
-         * real examples of this. The actual amount of shifting and required transformations may
-         * vary per device.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param result the package of metadata associated with this result.
-         */
-        public fun onComplete(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            result: FrameInfo
-        ) {}
-
-        /**
-         * onFailed occurs when a CaptureRequest failed in some way and the frame will not receive
-         * the [onTotalCaptureResult] callback.
-         *
-         * Surfaces may not received images if "wasImagesCaptured" is set to false.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param captureFailure the android [CaptureFailure] data
-         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureFailed
-         */
-        public fun onFailed(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            captureFailure: CaptureFailure
-        ) {}
-
-        /**
-         * onBufferLost occurs when a CaptureRequest failed to create an image for a given output
-         * stream. This method may be invoked multiple times per frame if multiple buffers were
-         * lost. This method may not be invoked when an image is lost in some situations.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the android frame number for this exposure
-         * @param stream the internal stream that will not receive a buffer for this frame.
-         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureBufferLost
-         */
-        public fun onBufferLost(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber,
-            stream: StreamId
-        ) {}
-
-        /**
-         * This is an artificial callback that will be invoked if a specific request was pending or
-         * had already been submitted to when an abort was requested. The behavior of the request is
-         * undefined if this method is invoked and images or metadata may or may not be produced for
-         * this request. Repeating requests will not receive onAborted.
-         *
-         * @param request information about this specific request.
-         */
-        public fun onAborted(request: Request) {}
-
-        /**
-         * Invoked after the CaptureRequest(s) have been created, but before the request is
-         * submitted to the Camera. This method may be invoked multiple times if the request fails
-         * to submit or if this is a repeating request.
-         *
-         * @param requestMetadata information about this specific request.
-         */
-        public fun onRequestSequenceCreated(requestMetadata: RequestMetadata) {}
-
-        /**
-         * Invoked after the CaptureRequest(s) has been submitted. This method may be invoked
-         * multiple times if the request was submitted as a repeating request.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         */
-        public fun onRequestSequenceSubmitted(requestMetadata: RequestMetadata) {}
-
-        /**
-         * Invoked by Camera2 if the request was aborted after having been submitted. This method is
-         * distinct from onAborted, which is directly invoked when aborting captures.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @see
-         *   android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureSequenceAborted
-         */
-        public fun onRequestSequenceAborted(requestMetadata: RequestMetadata) {}
-
-        /**
-         * Invoked by Camera2 if the request was completed after having been submitted. This method
-         * is distinct from onCompleted which is invoked for each frame when used with a repeating
-         * request.
-         *
-         * @param requestMetadata the data about the camera2 request that was sent to the camera.
-         * @param frameNumber the final frame number of this sequence.
-         * @see
-         *   android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureSequenceCompleted
-         */
-        public fun onRequestSequenceCompleted(
-            requestMetadata: RequestMetadata,
-            frameNumber: FrameNumber
-        ) {}
-    }
-
-    public operator fun <T> get(key: CaptureRequest.Key<T>): T? = getUnchecked(key)
-    public operator fun <T> get(key: Metadata.Key<T>): T? = getUnchecked(key)
-
-    @Suppress("UNCHECKED_CAST")
-    private fun <T> Request.getUnchecked(key: Metadata.Key<T>): T? = this.extras[key] as T?
-
-    @Suppress("UNCHECKED_CAST")
-    private fun <T> Request.getUnchecked(key: CaptureRequest.Key<T>): T? =
-        this.parameters[key] as T?
-}
-
-public fun <T> Request.getOrDefault(key: Metadata.Key<T>, default: T): T = this[key] ?: default
-
-public fun <T> Request.getOrDefault(key: CaptureRequest.Key<T>, default: T): T =
-    this[key] ?: default
-
-public fun Request.formatForLogs(): String = "Request($streams)@${Integer.toHexString(hashCode())}"
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
new file mode 100644
index 0000000..6781c8d
--- /dev/null
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
@@ -0,0 +1,331 @@
+/*
+ * 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:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
+package androidx.camera.camera2.pipe
+
+import android.hardware.camera2.CameraCaptureSession
+import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CaptureFailure
+import android.hardware.camera2.CaptureRequest
+import android.view.Surface
+import androidx.annotation.RequiresApi
+
+/**
+ * A [RequestNumber] is an artificial identifier that is created for each request that is submitted
+ * to the Camera.
+ */
+@JvmInline
+value class RequestNumber(val value: Long)
+
+/**
+ * A [Request] is an immutable package of outputs and parameters needed to issue a [CaptureRequest]
+ * to a Camera2 [CameraCaptureSession].
+ *
+ * [Request] objects are handled by camera2 via the [RequestProcessor] interface, and will translate
+ * each [Request] object into a corresponding [CaptureRequest] object using the active
+ * [CameraDevice], [CameraCaptureSession], and [CameraGraph.Config]. Requests may be queued up and
+ * submitted after a delay, or reused (in the case of repeating requests) if the
+ * [CameraCaptureSession] is reconfigured or recreated.
+ *
+ * Depending on the [CameraGraph.Config], it is possible that not all parameters that are set on the
+ * [Request] will be honored when a [Request] is sent to the camera. Specifically, Camera2
+ * parameters related to 3A State and any required parameters specified on the [CameraGraph.Config]
+ * will override parameters specified in a [Request]
+ *
+ * @param streams The list of streams to submit. Each request *must* have 1 or more valid streams.
+ */
+data class Request(
+    val streams: List<StreamId>,
+    val parameters: Map<CaptureRequest.Key<*>, Any> = emptyMap(),
+    val extras: Map<Metadata.Key<*>, Any> = emptyMap(),
+    val listeners: List<Listener> = emptyList(),
+    val template: RequestTemplate? = null
+) {
+    operator fun <T> get(key: CaptureRequest.Key<T>): T? = getUnchecked(key)
+    operator fun <T> get(key: Metadata.Key<T>): T? = getUnchecked(key)
+
+    /**
+     * This listener is used to observe the state and progress of a [Request] that has been issued
+     * to the [CameraGraph]. Listeners will be invoked on background threads at high speed, and
+     * should avoid blocking work or accessing synchronized resources if possible. [Listener]s used
+     * in a repeating request may be issued multiple times within the same session, and should not
+     * rely on [onRequestSequenceSubmitted] from being invoked only once.
+     */
+    interface Listener {
+        /**
+         * This event indicates that the camera sensor has started exposing the frame associated
+         * with this Request. The timestamp will either be the beginning or end of the sensors
+         * exposure time depending on the device, and may be in a different timebase from the
+         * timestamps that are returned from the underlying buffers.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param timestamp the android timestamp in nanos for this exposure
+         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
+         */
+        fun onStarted(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            timestamp: CameraTimestamp
+        ) {
+        }
+
+        /**
+         * This event indicates that the camera sensor has additional information about the frame
+         * associated with this Request. This method may be invoked 0 or more times before the frame
+         * receives onComplete.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param captureResult the current android capture result for this exposure
+         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
+         */
+        fun onPartialCaptureResult(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            captureResult: FrameMetadata
+        ) {
+        }
+
+        /**
+         * This event indicates that all of the metadata associated with this frame has been
+         * produced. If [onPartialCaptureResult] was invoked, the values returned in the
+         * totalCaptureResult map be a superset of the values produced from the
+         * [onPartialCaptureResult] calls.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param totalCaptureResult the final android capture result for this exposure
+         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureStarted
+         */
+        fun onTotalCaptureResult(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            totalCaptureResult: FrameInfo
+        ) {
+        }
+
+        /**
+         * This is an artificial event that will be invoked after onTotalCaptureResult. This may be
+         * invoked several frames after onTotalCaptureResult due to incorrect HAL implementations
+         * that return metadata that get shifted several frames in the future. See b/154568653 for
+         * real examples of this. The actual amount of shifting and required transformations may
+         * vary per device.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param result the package of metadata associated with this result.
+         */
+        fun onComplete(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            result: FrameInfo
+        ) {
+        }
+
+        /**
+         * onFailed occurs when a CaptureRequest failed in some way and the frame will not receive
+         * the [onTotalCaptureResult] callback.
+         *
+         * Surfaces may not received images if "wasImagesCaptured" is set to false.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param captureFailure the android [CaptureFailure] data
+         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureFailed
+         */
+        fun onFailed(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            captureFailure: CaptureFailure
+        ) {
+        }
+
+        /**
+         * onBufferLost occurs when a CaptureRequest failed to create an image for a given output
+         * stream. This method may be invoked multiple times per frame if multiple buffers were
+         * lost. This method may not be invoked when an image is lost in some situations.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the android frame number for this exposure
+         * @param stream the internal stream that will not receive a buffer for this frame.
+         * @see android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureBufferLost
+         */
+        fun onBufferLost(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber,
+            stream: StreamId
+        ) {
+        }
+
+        /**
+         * This is an artificial callback that will be invoked if a specific request was pending or
+         * had already been submitted to when an abort was requested. The behavior of the request is
+         * undefined if this method is invoked and images or metadata may or may not be produced for
+         * this request. Repeating requests will not receive onAborted.
+         *
+         * @param request information about this specific request.
+         */
+        fun onAborted(request: Request) {}
+
+        /**
+         * Invoked after the CaptureRequest(s) have been created, but before the request is
+         * submitted to the Camera. This method may be invoked multiple times if the request fails
+         * to submit or if this is a repeating request.
+         *
+         * @param requestMetadata information about this specific request.
+         */
+        fun onRequestSequenceCreated(requestMetadata: RequestMetadata) {}
+
+        /**
+         * Invoked after the CaptureRequest(s) has been submitted. This method may be invoked
+         * multiple times if the request was submitted as a repeating request.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         */
+        fun onRequestSequenceSubmitted(requestMetadata: RequestMetadata) {}
+
+        /**
+         * Invoked by Camera2 if the request was aborted after having been submitted. This method is
+         * distinct from onAborted, which is directly invoked when aborting captures.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @see
+         *   android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureSequenceAborted
+         */
+        fun onRequestSequenceAborted(requestMetadata: RequestMetadata) {}
+
+        /**
+         * Invoked by Camera2 if the request was completed after having been submitted. This method
+         * is distinct from onCompleted which is invoked for each frame when used with a repeating
+         * request.
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param frameNumber the final frame number of this sequence.
+         * @see
+         *   android.hardware.camera2.CameraCaptureSession.CaptureCallback.onCaptureSequenceCompleted
+         */
+        fun onRequestSequenceCompleted(
+            requestMetadata: RequestMetadata,
+            frameNumber: FrameNumber
+        ) {
+        }
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    private fun <T> getUnchecked(key: Metadata.Key<T>): T? = this.extras[key] as T?
+
+    @Suppress("UNCHECKED_CAST")
+    private fun <T> getUnchecked(key: CaptureRequest.Key<T>): T? =
+        this.parameters[key] as T?
+}
+
+/**
+ * A [RequestTemplate] indicates which preset set list of parameters will be applied to a request by
+ * default. These values are defined by camera2.
+ */
+@JvmInline
+value class RequestTemplate(val value: Int) {
+    val name: String
+        get() {
+            return when (value) {
+                1 -> "TEMPLATE_PREVIEW"
+                2 -> "TEMPLATE_STILL_CAPTURE"
+                3 -> "TEMPLATE_RECORD"
+                4 -> "TEMPLATE_VIDEO_SNAPSHOT"
+                5 -> "TEMPLATE_ZERO_SHUTTER_LAG"
+                6 -> "TEMPLATE_MANUAL"
+                else -> "UNKNOWN-$value"
+            }
+        }
+}
+
+/**
+ * RequestMetadata wraps together all of the information about a specific CaptureRequest that was
+ * submitted to Camera2.
+ *
+ * <p> This class is distinct from [Request] which is used to configure and issue a request to the
+ * [CameraGraph]. This class will report the actual keys / values that were sent to camera2 (if
+ * different) from the request that was used to create the Camera2 [CaptureRequest].
+ */
+interface RequestMetadata : Metadata, UnsafeWrapper {
+    operator fun <T> get(key: CaptureRequest.Key<T>): T?
+    fun <T> getOrDefault(key: CaptureRequest.Key<T>, default: T): T
+
+    /** The actual Camera2 template that was used when creating this [CaptureRequest] */
+    val template: RequestTemplate
+
+    /**
+     * A Map of StreamId(s) that were submitted with this CaptureRequest and the Surface(s) used for
+     * this request. It's possible that not all of the streamId's specified in the [Request] are
+     * present in the [CaptureRequest].
+     */
+    val streams: Map<StreamId, Surface>
+
+    /** Returns true if this is used in a repeating request. */
+    val repeating: Boolean
+
+    /** The request object that was used to create this [CaptureRequest] */
+    val request: Request
+
+    /** An internal number used to identify a specific [CaptureRequest] */
+    val requestNumber: RequestNumber
+}
+
+/**
+ * This is a timestamp from the Camera, and corresponds to the nanosecond exposure time of a Frame.
+ * While the value is expressed in nano-seconds, the precision may be much lower. In addition, the
+ * time-base of the Camera is undefined, although it's common for it to be in either Monotonic or
+ * Realtime.
+ *
+ * <p> Timestamp may differ from timestamps that are obtained from other parts of the Camera and
+ * media systems within the same device. For example, it's common for high frequency sensors to
+ * operate based on a real-time clock, while audio/visual systems commonly operate based on a
+ * monotonic clock.
+ */
+@JvmInline
+value class CameraTimestamp(val value: Long)
+
+fun <T> Request.getOrDefault(key: Metadata.Key<T>, default: T): T = this[key] ?: default
+
+fun <T> Request.getOrDefault(key: CaptureRequest.Key<T>, default: T): T =
+    this[key] ?: default
+
+fun Request.formatForLogs(): String = "Request($streams)@${Integer.toHexString(hashCode())}"
+
+/** Utility function to help deal with the unsafe nature of the typed Key/Value pairs. */
+fun CaptureRequest.Builder.writeParameters(parameters: Map<*, Any?>) {
+    for ((key, value) in parameters) {
+        writeParameter(key, value)
+    }
+}
+
+/** Utility function to help deal with the unsafe nature of the typed Key/Value pairs. */
+fun CaptureRequest.Builder.writeParameter(key: Any?, value: Any?) {
+    if (key != null && key is CaptureRequest.Key<*>) {
+        @Suppress("UNCHECKED_CAST") this.set(key as CaptureRequest.Key<Any>, value)
+    }
+}
+
+/**
+ * Utility function to put all metadata in the current map through an unchecked cast. The unchecked
+ * cast is necessary since CameraGraph.Config uses Map<*, Any?> as the standard type for parameters.
+ */
+fun MutableMap<Any, Any?>.putAllMetadata(metadata: Map<*, Any?>) {
+    @Suppress("UNCHECKED_CAST") this.putAll(metadata as Map<Any, Any?>)
+}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
index 960357a..77a6337 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
@@ -27,34 +27,34 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @JvmInline
-public value class StreamFormat(public val value: Int) {
-    public companion object {
-        public val UNKNOWN: StreamFormat = StreamFormat(0)
-        public val PRIVATE: StreamFormat = StreamFormat(0x22)
+value class StreamFormat(val value: Int) {
+    companion object {
+        val UNKNOWN: StreamFormat = StreamFormat(0)
+        val PRIVATE: StreamFormat = StreamFormat(0x22)
 
-        public val DEPTH16: StreamFormat = StreamFormat(0x44363159)
-        public val DEPTH_JPEG: StreamFormat = StreamFormat(0x69656963)
-        public val DEPTH_POINT_CLOUD: StreamFormat = StreamFormat(0x101)
-        public val FLEX_RGB_888: StreamFormat = StreamFormat(0x29)
-        public val FLEX_RGBA_8888: StreamFormat = StreamFormat(0x2A)
-        public val HEIC: StreamFormat = StreamFormat(0x48454946)
-        public val JPEG: StreamFormat = StreamFormat(0x100)
-        public val NV16: StreamFormat = StreamFormat(0x10)
-        public val NV21: StreamFormat = StreamFormat(0x11)
-        public val RAW10: StreamFormat = StreamFormat(0x25)
-        public val RAW12: StreamFormat = StreamFormat(0x26)
-        public val RAW_DEPTH: StreamFormat = StreamFormat(0x1002)
-        public val RAW_PRIVATE: StreamFormat = StreamFormat(0x24)
-        public val RAW_SENSOR: StreamFormat = StreamFormat(0x20)
-        public val RGB_565: StreamFormat = StreamFormat(4)
-        public val Y12: StreamFormat = StreamFormat(0x32315659)
-        public val Y16: StreamFormat = StreamFormat(0x20363159)
-        public val Y8: StreamFormat = StreamFormat(0x20203859)
-        public val YUV_420_888: StreamFormat = StreamFormat(0x23)
-        public val YUV_422_888: StreamFormat = StreamFormat(0x27)
-        public val YUV_444_888: StreamFormat = StreamFormat(0x28)
-        public val YUY2: StreamFormat = StreamFormat(0x14)
-        public val YV12: StreamFormat = StreamFormat(0x32315659)
+        val DEPTH16: StreamFormat = StreamFormat(0x44363159)
+        val DEPTH_JPEG: StreamFormat = StreamFormat(0x69656963)
+        val DEPTH_POINT_CLOUD: StreamFormat = StreamFormat(0x101)
+        val FLEX_RGB_888: StreamFormat = StreamFormat(0x29)
+        val FLEX_RGBA_8888: StreamFormat = StreamFormat(0x2A)
+        val HEIC: StreamFormat = StreamFormat(0x48454946)
+        val JPEG: StreamFormat = StreamFormat(0x100)
+        val NV16: StreamFormat = StreamFormat(0x10)
+        val NV21: StreamFormat = StreamFormat(0x11)
+        val RAW10: StreamFormat = StreamFormat(0x25)
+        val RAW12: StreamFormat = StreamFormat(0x26)
+        val RAW_DEPTH: StreamFormat = StreamFormat(0x1002)
+        val RAW_PRIVATE: StreamFormat = StreamFormat(0x24)
+        val RAW_SENSOR: StreamFormat = StreamFormat(0x20)
+        val RGB_565: StreamFormat = StreamFormat(4)
+        val Y12: StreamFormat = StreamFormat(0x32315659)
+        val Y16: StreamFormat = StreamFormat(0x20363159)
+        val Y8: StreamFormat = StreamFormat(0x20203859)
+        val YUV_420_888: StreamFormat = StreamFormat(0x23)
+        val YUV_422_888: StreamFormat = StreamFormat(0x27)
+        val YUV_444_888: StreamFormat = StreamFormat(0x28)
+        val YUY2: StreamFormat = StreamFormat(0x14)
+        val YV12: StreamFormat = StreamFormat(0x32315659)
     }
 
     override fun toString(): String {
@@ -67,7 +67,7 @@
      * @return the number of bits per pixel or -1 if the format does not have a well defined number
      *   of bits per pixel.
      */
-    public val bitsPerPixel: Int
+    val bitsPerPixel: Int
         get() {
             when (this) {
                 DEPTH16 -> return 16
@@ -98,7 +98,7 @@
      *
      * @return a human readable string representation of the StreamFormat.
      */
-    public val name: String
+    val name: String
         get() {
             when (this) {
                 UNKNOWN -> return "UNKNOWN"
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
index 0527026..dbff74d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
@@ -24,11 +24,11 @@
  * [CameraStream]s can be used to build [Request]s that are sent to a [CameraGraph].
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public interface StreamGraph {
-    public val streams: List<CameraStream>
-    public val streamIds: Set<StreamId>
-    public val input: InputStream?
-    public val outputs: List<OutputStream>
+interface StreamGraph {
+    val streams: List<CameraStream>
+    val streamIds: Set<StreamId>
+    val input: InputStream?
+    val outputs: List<OutputStream>
 
-    public operator fun get(config: CameraStream.Config): CameraStream?
+    operator fun get(config: CameraStream.Config): CameraStream?
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
index a36c50c..d6c9790 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
@@ -21,6 +21,10 @@
 import android.hardware.camera2.params.OutputConfiguration
 import android.util.Size
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.OutputStream.DynamicRangeProfile.Companion.STANDARD
+import androidx.camera.camera2.pipe.OutputStream.MirrorMode.Companion.MIRROR_MODE_AUTO
+import androidx.camera.camera2.pipe.OutputStream.StreamUseCase.Companion.DEFAULT
+import androidx.camera.camera2.pipe.OutputStream.TimestampBase.Companion.TIMESTAMP_BASE_DEFAULT
 import androidx.camera.camera2.pipe.compat.Api33Compat
 
 /**
@@ -62,12 +66,12 @@
  *                 \-> OutputConfig-2 -> OutputStream-2
  *   ```
  */
-public class CameraStream
-internal constructor(public val id: StreamId, public val outputs: List<OutputStream>) {
+class CameraStream
+internal constructor(val id: StreamId, val outputs: List<OutputStream>) {
     override fun toString(): String = id.toString()
 
     /** Configuration that may be used to define a [CameraStream] on a [CameraGraph] */
-    public class Config internal constructor(val outputs: List<OutputStream.Config>) {
+    class Config internal constructor(val outputs: List<OutputStream.Config>) {
         companion object {
             /** Create a simple [CameraStream] to [OutputStream] configuration */
             fun create(
@@ -90,7 +94,8 @@
                         timestampBase,
                         dynamicRangeProfile,
                         streamUseCase,
-                    ))
+                    )
+                )
 
             /**
              * Create a simple [CameraStream] using a previously defined [OutputStream.Config]. This
@@ -112,7 +117,7 @@
  * This identifies a single surface that is used to tell the camera to produce one or more outputs.
  */
 @JvmInline
-public value class StreamId(public val value: Int) {
+value class StreamId(val value: Int) {
     override fun toString(): String = "Stream-$value"
 }
 
@@ -122,18 +127,18 @@
  * the underlying HAL on the device may produce different sized images for the same request. This
  * represents one of those potential outputs.
  */
-public interface OutputStream {
+interface OutputStream {
     // Every output comes from one, and exactly one, CameraStream
-    public val stream: CameraStream
+    val stream: CameraStream
 
-    public val id: OutputId
-    public val size: Size
-    public val format: StreamFormat
-    public val camera: CameraId
-    public val mirrorMode: MirrorMode?
-    public val timestampBase: TimestampBase?
-    public val dynamicRangeProfile: DynamicRangeProfile?
-    public val streamUseCase: StreamUseCase?
+    val id: OutputId
+    val size: Size
+    val format: StreamFormat
+    val camera: CameraId
+    val mirrorMode: MirrorMode?
+    val timestampBase: TimestampBase?
+    val dynamicRangeProfile: DynamicRangeProfile?
+    val streamUseCase: StreamUseCase?
     // TODO: Consider adding sensor mode and/or other metadata
 
     /**
@@ -141,13 +146,13 @@
      * Camera.
      */
     sealed class Config(
-        public val size: Size,
-        public val format: StreamFormat,
-        public val camera: CameraId?,
-        public val mirrorMode: MirrorMode?,
-        public val timestampBase: TimestampBase?,
-        public val dynamicRangeProfile: DynamicRangeProfile?,
-        public val streamUseCase: StreamUseCase?,
+        val size: Size,
+        val format: StreamFormat,
+        val camera: CameraId?,
+        val mirrorMode: MirrorMode?,
+        val timestampBase: TimestampBase?,
+        val dynamicRangeProfile: DynamicRangeProfile?,
+        val streamUseCase: StreamUseCase?,
     ) {
         companion object {
             fun create(
@@ -161,7 +166,8 @@
                 streamUseCase: StreamUseCase? = null,
             ): Config =
                 if (outputType == OutputType.SURFACE_TEXTURE ||
-                    outputType == OutputType.SURFACE_VIEW) {
+                    outputType == OutputType.SURFACE_VIEW
+                ) {
                     LazyOutputConfig(
                         size,
                         format,
@@ -170,7 +176,8 @@
                         mirrorMode,
                         timestampBase,
                         dynamicRangeProfile,
-                        streamUseCase)
+                        streamUseCase
+                    )
                 } else {
                     check(outputType == OutputType.SURFACE)
                     SimpleOutputConfig(
@@ -213,7 +220,8 @@
                 mirrorMode,
                 timestampBase,
                 dynamicRangeProfile,
-                streamUseCase)
+                streamUseCase
+            )
 
         /**
          * Used to configure an output with a surface that may be provided after the camera is
@@ -363,21 +371,21 @@
 
 /** This identifies a single output. */
 @JvmInline
-public value class OutputId(public val value: Int) {
+value class OutputId(val value: Int) {
     override fun toString(): String = "Output-$value"
 }
 
 /** Configuration for defining the properties of a Camera2 InputStream for reprocessing requests. */
-public interface InputStream {
-    public val id: InputId
-    public val format: StreamFormat
+interface InputStream {
+    val id: InputId
+    val format: StreamFormat
     // TODO: This may accept
 
-    public class Config(val stream: CameraStream.Config)
+    class Config(val stream: CameraStream.Config)
 }
 
 /** This identifies a single input. */
 @JvmInline
-public value class InputId(public val value: Int) {
+value class InputId(val value: Int) {
     override fun toString(): String = "Input-$value"
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
index 15c221d..2fc9a6b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
@@ -28,7 +28,7 @@
  * of the object is managed by CameraPipe.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public interface UnsafeWrapper {
+interface UnsafeWrapper {
     /**
      * Attempt to unwrap this object into an underlying type.
      *
@@ -39,5 +39,5 @@
      *
      * @return unwrapped object matching T or null
      */
-    public fun <T : Any> unwrapAs(type: KClass<T>): T?
+    fun <T : Any> unwrapAs(type: KClass<T>): T?
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
index 40b5167..66767ad 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
@@ -115,7 +115,8 @@
         handler: Handler?
     ) {
         cameraDevice.createCaptureSessionByOutputConfigurations(
-            outputConfig, stateCallback, handler)
+            outputConfig, stateCallback, handler
+        )
     }
 
     @JvmStatic
@@ -130,7 +131,8 @@
         handler: Handler?
     ) {
         cameraDevice.createReprocessableCaptureSessionByConfigurations(
-            inputConfig, outputs, stateCallback, handler)
+            inputConfig, outputs, stateCallback, handler
+        )
     }
 
     @JvmStatic
@@ -289,7 +291,6 @@
 }
 
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-@Suppress("DEPRECATION")
 internal object Api33Compat {
     @JvmStatic
     @DoNotInline
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2Backend.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2Backend.kt
index 5ac418d..343a8cb 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2Backend.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2Backend.kt
@@ -83,7 +83,9 @@
             camera2CameraControllerComponent
                 .camera2ControllerConfig(
                     Camera2ControllerConfig(
-                        this, graphConfig, graphListener, streamGraph as StreamGraphImpl))
+                        this, graphConfig, graphListener, streamGraph as StreamGraphImpl
+                    )
+                )
                 .build()
 
         // Create and return a Camera2 CameraController object.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
index d35dffa..4b48fbc 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
@@ -60,7 +60,8 @@
     override fun start() {
         val camera =
             virtualCameraManager.open(
-                config.camera, config.flags.allowMultipleActiveCameras, graphListener)
+                config.camera, config.flags.allowMultipleActiveCameras, graphListener
+            )
         synchronized(this) {
             if (closed) {
                 return
@@ -77,7 +78,8 @@
                     captureSequenceProcessorFactory,
                     cameraSurfaceManager,
                     timeSource,
-                    scope)
+                    scope
+                )
             currentSession = session
 
             val surfaces: Map<StreamId, Surface>? = currentSurfaceMap
@@ -133,12 +135,12 @@
     override fun updateSurfaceMap(surfaceMap: Map<StreamId, Surface>) {
         // TODO: Add logic to decide if / when to re-configure the Camera2 CaptureSession.
         synchronized(this) {
-                if (closed) {
-                    return
-                }
-                currentSurfaceMap = surfaceMap
-                currentSession
+            if (closed) {
+                return
             }
+            currentSurfaceMap = surfaceMap
+            currentSession
+        }
             ?.configureSurfaceMap(surfaceMap)
     }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
index 426cc51..e61a66e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
@@ -27,6 +27,7 @@
 import androidx.camera.camera2.pipe.CameraMetadata
 import androidx.camera.camera2.pipe.Metadata
 import androidx.camera.camera2.pipe.core.Debug
+import androidx.camera.camera2.pipe.core.Log
 import kotlin.reflect.KClass
 
 /**
@@ -44,9 +45,11 @@
     private val metadata: Map<Metadata.Key<*>, Any?>,
     private val cacheBlocklist: Set<CameraCharacteristics.Key<*>>,
 ) : CameraMetadata {
-    @GuardedBy("values") private val values = ArrayMap<CameraCharacteristics.Key<*>, Any?>()
+    @GuardedBy("values")
+    private val values = ArrayMap<CameraCharacteristics.Key<*>, Any?>()
 
-    @Suppress("UNCHECKED_CAST") override fun <T> get(key: Metadata.Key<T>): T? = metadata[key] as T?
+    @Suppress("UNCHECKED_CAST")
+    override fun <T> get(key: Metadata.Key<T>): T? = metadata[key] as T?
 
     @Suppress("UNCHECKED_CAST")
     override fun <T> getOrDefault(key: Metadata.Key<T>, default: T): T =
@@ -124,7 +127,10 @@
                 Debug.trace("Camera-${camera.value}#keys") {
                     @Suppress("UselessCallOnNotNull") characteristics.keys.orEmpty().toSet()
                 }
-            } catch (ignored: AssertionError) {
+            } catch (e: AssertionError) {
+                Log.warn(e) {
+                    "Failed to getKeys from Camera-${camera.value}"
+                }
                 emptySet()
             }
         }
@@ -136,7 +142,10 @@
                     @Suppress("UselessCallOnNotNull")
                     characteristics.availableCaptureRequestKeys.orEmpty().toSet()
                 }
-            } catch (ignored: AssertionError) {
+            } catch (e: AssertionError) {
+                Log.warn(e) {
+                    "Failed to getAvailableCaptureRequestKeys from Camera-${camera.value}"
+                }
                 emptySet()
             }
         }
@@ -148,7 +157,10 @@
                     @Suppress("UselessCallOnNotNull")
                     characteristics.availableCaptureResultKeys.orEmpty().toSet()
                 }
-            } catch (ignored: AssertionError) {
+            } catch (e: AssertionError) {
+                Log.warn(e) {
+                    "Failed to getAvailableCaptureResultKeys from Camera-${camera.value}"
+                }
                 emptySet()
             }
         }
@@ -160,15 +172,19 @@
             } else {
                 try {
                     Debug.trace("Camera-${camera.value}#physicalCameraIds") {
+                        val ids = Api28Compat.getPhysicalCameraIds(characteristics)
+                        Log.info { "Loaded physicalCameraIds from $camera: $ids" }
+
                         @Suppress("UselessCallOnNotNull")
-                        Api28Compat.getPhysicalCameraIds(characteristics)
-                            .orEmpty()
+                        ids.orEmpty()
                             .map { CameraId(it) }
                             .toSet()
                     }
-                } catch (ignored: AssertionError) {
+                } catch (e: AssertionError) {
+                    Log.warn(e) { "Failed to getPhysicalCameraIds from Camera-${camera.value}" }
                     emptySet()
-                } catch (ignored: NullPointerException) {
+                } catch (e: NullPointerException) {
+                    Log.warn(e) { "Failed to getPhysicalCameraIds from Camera-${camera.value}" }
                     emptySet()
                 }
             }
@@ -185,7 +201,11 @@
                             .orEmpty()
                             .toSet()
                     }
-                } catch (ignored: AssertionError) {
+                } catch (e: AssertionError) {
+                    Log.warn(e) {
+                        "Failed to getAvailablePhysicalCameraRequestKeys from " +
+                            "Camera-${camera.value}"
+                    }
                     emptySet()
                 }
             }
@@ -200,7 +220,10 @@
                     Debug.trace("Camera-${camera.value}#availableSessionKeys") {
                         Api28Compat.getAvailableSessionKeys(characteristics).orEmpty().toSet()
                     }
-                } catch (ignored: AssertionError) {
+                } catch (e: AssertionError) {
+                    Log.warn(e) {
+                        "Failed to getAvailableSessionKeys from Camera-${camera.value}"
+                    }
                     emptySet()
                 }
             }
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 48f45e5..65a4eb3 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
@@ -52,7 +52,8 @@
 ) : CameraCaptureSession.CaptureCallback(), CaptureSequence<CaptureRequest> {
     private val debugId = captureSequenceDebugIds.incrementAndGet()
 
-    @Volatile private var _sequenceNumber: Int? = null
+    @Volatile
+    private var _sequenceNumber: Int? = null
     override var sequenceNumber: Int
         get() {
             if (_sequenceNumber == null) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessor.kt
index b0374d6..b6be643 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessor.kt
@@ -63,7 +63,8 @@
     ): CaptureSequenceProcessor<*, CaptureSequence<Any>> {
         @Suppress("SyntheticAccessor")
         return Camera2CaptureSequenceProcessor(
-            session, threads, graphConfig.defaultTemplate, surfaceMap, streamGraph)
+            session, threads, graphConfig.defaultTemplate, surfaceMap, streamGraph
+        )
             as CaptureSequenceProcessor<Any, CaptureSequence<Any>>
     }
 }
@@ -207,7 +208,8 @@
                         requestTemplate,
                         isRepeating,
                         request,
-                        requestTag)
+                        requestTag
+                    )
                 requestMap[requestTag] = metadata
                 requestList.add(metadata)
             } else {
@@ -224,7 +226,8 @@
                         requestTemplate,
                         isRepeating,
                         request,
-                        requestTag)
+                        requestTag
+                    )
                 requestMap[requestTag] = metadata
                 requestList.add(metadata)
             }
@@ -240,28 +243,34 @@
             listeners,
             sequenceListener,
             requestMap,
-            surfaceToStreamMap)
+            surfaceToStreamMap
+        )
     }
 
     override fun submit(captureSequence: Camera2CaptureSequence): Int {
         val captureCallback = captureSequence as CameraCaptureSession.CaptureCallback
         // TODO: Update these calls to use executors on newer versions of the OS
         return if (captureSequence.captureRequestList.size == 1 &&
-            session !is CameraConstrainedHighSpeedCaptureSessionWrapper) {
+            session !is CameraConstrainedHighSpeedCaptureSessionWrapper
+        ) {
             if (captureSequence.repeating) {
                 session.setRepeatingRequest(
-                    captureSequence.captureRequestList[0], captureCallback, threads.camera2Handler)
+                    captureSequence.captureRequestList[0], captureCallback, threads.camera2Handler
+                )
             } else {
                 session.capture(
-                    captureSequence.captureRequestList[0], captureSequence, threads.camera2Handler)
+                    captureSequence.captureRequestList[0], captureSequence, threads.camera2Handler
+                )
             }
         } else {
             if (captureSequence.repeating) {
                 session.setRepeatingBurst(
-                    captureSequence.captureRequestList, captureSequence, threads.camera2Handler)
+                    captureSequence.captureRequestList, captureSequence, threads.camera2Handler
+                )
             } else {
                 session.captureBurst(
-                    captureSequence.captureRequestList, captureSequence, threads.camera2Handler)
+                    captureSequence.captureRequestList, captureSequence, threads.camera2Handler
+                )
             }
         }
     }
@@ -433,9 +442,11 @@
             requiredParameters.containsKey(key) -> {
                 requiredParameters[key] as T?
             }
+
             request.extras.containsKey(key) -> {
                 request.extras[key] as T?
             }
+
             else -> {
                 defaultParameters[key] as T?
             }
@@ -449,6 +460,7 @@
             CaptureRequest::class -> captureRequest as T
             CameraCaptureSession::class ->
                 cameraCaptureSessionWrapper.unwrapAs(CameraCaptureSession::class) as? T
+
             else -> null
         }
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
index a5f7457..bfaf688 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
@@ -39,9 +39,10 @@
 ) {
     private val lock = Any()
 
-    @GuardedBy("lock") private var openableCameras: List<CameraId>? = null
+    @GuardedBy("lock")
+    private var openableCameras: List<CameraId>? = null
 
-    suspend fun getCameraIds(): List<CameraId>? {
+    suspend fun getCameraIds(): List<CameraId> {
         val cameras = synchronized(lock) { openableCameras }
         if (!cameras.isNullOrEmpty()) {
             return cameras
@@ -78,9 +79,10 @@
         val cameraIdArray =
             try {
                 // WARNING: This method can, at times, return an empty list of cameras on devices
-                // that
-                //  will normally return a valid list of cameras (b/159052778)
-                cameraManager.cameraIdList
+                // that will normally return a valid list of cameras (b/159052778)
+                val ids = cameraManager.cameraIdList
+                Log.info { "Loaded CameraIdList $ids" }
+                ids
             } catch (e: CameraAccessException) {
                 Log.warn(e) { "Failed to query CameraManager#getCameraIdList!" }
                 return null
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
index 5cf6757..73a1a99 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
@@ -53,7 +53,8 @@
     private val cameraMetadataConfig: CameraPipe.CameraMetadataConfig,
     private val timeSource: TimeSource
 ) : Camera2MetadataProvider {
-    @GuardedBy("cache") private val cache = ArrayMap<String, CameraMetadata>()
+    @GuardedBy("cache")
+    private val cache = ArrayMap<String, CameraMetadata>()
 
     override suspend fun getCameraMetadata(cameraId: CameraId): CameraMetadata {
         synchronized(cache) {
@@ -88,6 +89,7 @@
 
         return Debug.trace("Camera-${cameraId.value}#readCameraMetadata") {
             try {
+                Log.debug { "Loading metadata for $cameraId" }
                 val cameraManager =
                     cameraPipeContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager
                 val characteristics = cameraManager.getCameraCharacteristics(cameraId.value)
@@ -111,7 +113,8 @@
 
                 val cameraMetadata =
                     Camera2CameraMetadata(
-                        cameraId, redacted, characteristics, this, emptyMap(), cacheBlocklist)
+                        cameraId, redacted, characteristics, this, emptyMap(), cacheBlocklist
+                    )
 
                 Log.info {
                     val duration = Timestamps.now(timeSource) - start
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
index 9303923..a4461dd 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
@@ -156,8 +156,10 @@
         cameraDevice.createCaptureSession(
             outputs,
             AndroidCaptureSessionStateCallback(
-                this, stateCallback, previousStateCallback, interopSessionStateCallback),
-            handler)
+                this, stateCallback, previousStateCallback, interopSessionStateCallback
+            ),
+            handler
+        )
     }
 
     @RequiresApi(23)
@@ -177,8 +179,10 @@
             input,
             outputs,
             AndroidCaptureSessionStateCallback(
-                this, stateCallback, previousStateCallback, interopSessionStateCallback),
-            handler)
+                this, stateCallback, previousStateCallback, interopSessionStateCallback
+            ),
+            handler
+        )
     }
 
     @RequiresApi(23)
@@ -196,8 +200,10 @@
             cameraDevice,
             outputs,
             AndroidCaptureSessionStateCallback(
-                this, stateCallback, previousStateCallback, interopSessionStateCallback),
-            handler)
+                this, stateCallback, previousStateCallback, interopSessionStateCallback
+            ),
+            handler
+        )
     }
 
     @RequiresApi(24)
@@ -215,8 +221,10 @@
             cameraDevice,
             outputConfigurations.map { it.unwrapAs(OutputConfiguration::class) },
             AndroidCaptureSessionStateCallback(
-                this, stateCallback, previousStateCallback, interopSessionStateCallback),
-            handler)
+                this, stateCallback, previousStateCallback, interopSessionStateCallback
+            ),
+            handler
+        )
     }
 
     @RequiresApi(24)
@@ -234,11 +242,14 @@
         Api24Compat.createCaptureSessionByOutputConfigurations(
             cameraDevice,
             Api23Compat.newInputConfiguration(
-                inputConfig.width, inputConfig.height, inputConfig.format),
+                inputConfig.width, inputConfig.height, inputConfig.format
+            ),
             outputs.map { it.unwrapAs(OutputConfiguration::class) },
             AndroidCaptureSessionStateCallback(
-                this, stateCallback, previousStateCallback, interopSessionStateCallback),
-            handler)
+                this, stateCallback, previousStateCallback, interopSessionStateCallback
+            ),
+            handler
+        )
     }
 
     @RequiresApi(28)
@@ -253,7 +264,9 @@
                 config.outputConfigurations.map { it.unwrapAs(OutputConfiguration::class) },
                 config.executor,
                 AndroidCaptureSessionStateCallback(
-                    this, stateCallback, previousStateCallback, interopSessionStateCallback))
+                    this, stateCallback, previousStateCallback, interopSessionStateCallback
+                )
+            )
 
         if (config.inputConfiguration != null) {
             Api28Compat.setInputConfiguration(
@@ -261,7 +274,9 @@
                 Api23Compat.newInputConfiguration(
                     config.inputConfiguration.width,
                     config.inputConfiguration.height,
-                    config.inputConfiguration.format))
+                    config.inputConfiguration.format
+                )
+            )
         }
 
         val requestBuilder = cameraDevice.createCaptureRequest(config.sessionTemplateId)
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
index f9767ba..23fbb4a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
@@ -99,7 +99,8 @@
     ): Map<StreamId, OutputConfigurationWrapper> {
         try {
             cameraDevice.createCaptureSession(
-                surfaces.map { it.value }, captureSessionState, threads.camera2Handler)
+                surfaces.map { it.value }, captureSessionState, threads.camera2Handler
+            )
         } catch (e: Throwable) {
             Log.warn {
                 "Failed to create capture session from $cameraDevice for $captureSessionState!"
@@ -127,10 +128,12 @@
                     InputConfiguration(
                         outputConfig.size.width,
                         outputConfig.size.height,
-                        outputConfig.format.value),
+                        outputConfig.format.value
+                    ),
                     surfaces.map { it.value },
                     captureSessionState,
-                    threads.camera2Handler)
+                    threads.camera2Handler
+                )
             } catch (e: Throwable) {
                 Log.warn {
                     "Failed to create reprocessable captures session from $cameraDevice for" +
@@ -141,7 +144,8 @@
         } else {
             try {
                 cameraDevice.createCaptureSession(
-                    surfaces.map { it.value }, captureSessionState, threads.camera2Handler)
+                    surfaces.map { it.value }, captureSessionState, threads.camera2Handler
+                )
             } catch (e: Throwable) {
                 Log.warn {
                     "Failed to create captures session from $cameraDevice for $captureSessionState!"
@@ -163,7 +167,8 @@
     ): Map<StreamId, OutputConfigurationWrapper> {
         try {
             cameraDevice.createConstrainedHighSpeedCaptureSession(
-                surfaces.map { it.value }, captureSessionState, threads.camera2Handler)
+                surfaces.map { it.value }, captureSessionState, threads.camera2Handler
+            )
         } catch (e: Throwable) {
             Log.warn {
                 "Failed to create ConstrainedHighSpeedCaptureSession " +
@@ -204,17 +209,20 @@
         try {
             if (graphConfig.input == null) {
                 cameraDevice.createCaptureSessionByOutputConfigurations(
-                    outputs.all, captureSessionState, threads.camera2Handler)
+                    outputs.all, captureSessionState, threads.camera2Handler
+                )
             } else {
                 val outputConfig = graphConfig.input.stream.outputs.single()
                 cameraDevice.createReprocessableCaptureSessionByConfigurations(
                     InputConfigData(
                         outputConfig.size.width,
                         outputConfig.size.height,
-                        outputConfig.format.value),
+                        outputConfig.format.value
+                    ),
                     outputs.all,
                     captureSessionState,
-                    threads.camera2Handler)
+                    threads.camera2Handler
+                )
             }
         } catch (e: Throwable) {
             Log.warn {
@@ -263,7 +271,8 @@
             graphConfig.input?.let {
                 val outputConfig = it.stream.outputs.single()
                 InputConfigData(
-                    outputConfig.size.width, outputConfig.size.height, outputConfig.format.value)
+                    outputConfig.size.width, outputConfig.size.height, outputConfig.format.value
+                )
             }
 
         val sessionConfig =
@@ -274,7 +283,8 @@
                 threads.camera2Executor,
                 captureSessionState,
                 graphConfig.sessionTemplate.value,
-                graphConfig.sessionParameters)
+                graphConfig.sessionParameters
+            )
 
         try {
             cameraDevice.createCaptureSession(sessionConfig)
@@ -315,7 +325,8 @@
                     surfaceSharing = false, // No way to read this value.
                     maxSharedSurfaceCount = 1, // Hardcoded
                     physicalCameraId = null, // No way to read this value.
-                ))
+                )
+            )
             continue
         }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
index 7a3fbd2..2ca96faf 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
@@ -72,7 +72,8 @@
     private val activeSurfaceMap = synchronizedMap(HashMap<StreamId, Surface>())
     private var sessionCreatingTimestamp: TimestampNs? = null
 
-    @GuardedBy("lock") private var _cameraDevice: CameraDeviceWrapper? = null
+    @GuardedBy("lock")
+    private var _cameraDevice: CameraDeviceWrapper? = null
     var cameraDevice: CameraDeviceWrapper?
         get() = synchronized(lock) { _cameraDevice }
         set(value) =
@@ -87,14 +88,17 @@
                 }
             }
 
-    @GuardedBy("lock") private var cameraCaptureSession: ConfiguredCameraCaptureSession? = null
+    @GuardedBy("lock")
+    private var cameraCaptureSession: ConfiguredCameraCaptureSession? = null
 
     @GuardedBy("lock")
     private var pendingOutputMap: Map<StreamId, OutputConfigurationWrapper>? = null
 
-    @GuardedBy("lock") private var pendingSurfaceMap: Map<StreamId, Surface>? = null
+    @GuardedBy("lock")
+    private var pendingSurfaceMap: Map<StreamId, Surface>? = null
 
-    @GuardedBy("lock") private var state = State.PENDING
+    @GuardedBy("lock")
+    private var state = State.PENDING
 
     private enum class State {
         PENDING,
@@ -104,7 +108,8 @@
         CLOSED
     }
 
-    @GuardedBy("lock") private var _surfaceMap: Map<StreamId, Surface>? = null
+    @GuardedBy("lock")
+    private var _surfaceMap: Map<StreamId, Surface>? = null
 
     @GuardedBy("lock")
     private val _surfaceTokenMap: MutableMap<Surface, AutoCloseable> = mutableMapOf()
@@ -197,7 +202,9 @@
                     ConfiguredCameraCaptureSession(
                         session,
                         GraphRequestProcessor.from(
-                            captureSequenceProcessorFactory.create(session, activeSurfaceMap)))
+                            captureSequenceProcessorFactory.create(session, activeSurfaceMap)
+                        )
+                    )
                 cameraCaptureSession = captureSession
             } else {
                 captureSession = cameraCaptureSession
@@ -404,7 +411,8 @@
                 val availableDeferredSurfaces = _surfaceMap?.filter { deferred.containsKey(it.key) }
 
                 if (availableDeferredSurfaces != null &&
-                    availableDeferredSurfaces.size == deferred.size) {
+                    availableDeferredSurfaces.size == deferred.size
+                ) {
                     pendingSurfaceMap = availableDeferredSurfaces
                 }
             }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
index 2a693a9..564a5bc 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
@@ -60,7 +60,8 @@
     val inputSurface: Surface?
 
     /** @see [CameraCaptureSession.abortCaptures]. */
-    @Throws(ObjectUnavailableException::class) fun abortCaptures()
+    @Throws(ObjectUnavailableException::class)
+    fun abortCaptures()
 
     /**
      * @param request The settings for this exposure
@@ -125,7 +126,8 @@
     ): Int
 
     /** @see [CameraCaptureSession.stopRepeating]. */
-    @Throws(ObjectUnavailableException::class) fun stopRepeating()
+    @Throws(ObjectUnavailableException::class)
+    fun stopRepeating()
 
     /** Forwards to CameraCaptureSession#finalizeOutputConfigurations */
     @Throws(ObjectUnavailableException::class)
@@ -242,7 +244,8 @@
         // this happens, several methods are not allowed, the behavior is different, and interacting
         // with the session requires several behavior changes for these interactions to work well.
         return if (Build.VERSION.SDK_INT >= 23 &&
-            session is CameraConstrainedHighSpeedCaptureSession) {
+            session is CameraConstrainedHighSpeedCaptureSession
+        ) {
             AndroidCameraConstrainedHighSpeedCaptureSession(device, session)
         } else {
             AndroidCameraCaptureSession(device, session)
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
index 7367a5f..85cdd1c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
@@ -58,6 +58,7 @@
                 Log.debug(e) { "Rethrowing ${e::class.java.simpleName} from Camera2" }
                 ObjectUnavailableException(e)
             }
+
             else -> e
         }
     }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExternalRequestProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExternalRequestProcessor.kt
index 79ef27d..8988b2b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExternalRequestProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExternalRequestProcessor.kt
@@ -112,7 +112,8 @@
                     parameters,
                     isRepeating,
                     request,
-                    RequestNumber(internalRequestNumbers.incrementAndGet()))
+                    RequestNumber(internalRequestNumbers.incrementAndGet())
+                )
             }
 
         return ExternalCaptureSequence(
@@ -123,7 +124,8 @@
             defaultParameters,
             requiredParameters,
             listeners,
-            sequenceListener)
+            sequenceListener
+        )
     }
 
     override fun submit(captureSequence: ExternalCaptureSequence): Int {
@@ -136,20 +138,23 @@
                 captureSequence.captureRequestList.single(),
                 captureSequence.defaultParameters,
                 captureSequence.requiredParameters,
-                captureSequence.listeners)
+                captureSequence.listeners
+            )
         } else {
             if (captureSequence.captureRequestList.size == 1) {
                 processor.submit(
                     captureSequence.captureRequestList.single(),
                     captureSequence.defaultParameters,
                     captureSequence.requiredParameters,
-                    captureSequence.listeners)
+                    captureSequence.listeners
+                )
             } else {
                 processor.submit(
                     captureSequence.captureRequestList,
                     captureSequence.defaultParameters,
                     captureSequence.requiredParameters,
-                    captureSequence.listeners)
+                    captureSequence.listeners
+                )
             }
         }
         return internalSequenceNumbers.incrementAndGet()
@@ -179,7 +184,8 @@
         override val listeners: List<Request.Listener>,
         override val sequenceListener: CaptureSequence.CaptureSequenceListener,
     ) : CaptureSequence<Request> {
-        @Volatile private var _sequenceNumber: Int? = null
+        @Volatile
+        private var _sequenceNumber: Int? = null
         override var sequenceNumber: Int
             get() {
                 if (_sequenceNumber == null) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpener.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpener.kt
index 4d79abc..f4c438a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpener.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpener.kt
@@ -73,7 +73,8 @@
         Debug.trace("CameraDevice-${cameraId.value}#openCamera") {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                 Api28Compat.openCamera(
-                    instance, cameraId.value, threads.camera2Executor, stateCallback)
+                    instance, cameraId.value, threads.camera2Executor, stateCallback
+                )
             } else {
                 instance.openCamera(cameraId.value, stateCallback, threads.camera2Handler)
             }
@@ -116,7 +117,8 @@
             val manager = cameraManager.get()
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                 Api28Compat.registerAvailabilityCallback(
-                    manager, threads.camera2Executor, availabilityCallback)
+                    manager, threads.camera2Executor, availabilityCallback
+                )
             } else {
                 manager.registerAvailabilityCallback(availabilityCallback, threads.camera2Handler)
             }
@@ -166,7 +168,8 @@
                 requestTimestamp,
                 timeSource,
                 cameraInteropConfig?.cameraDeviceStateCallback,
-                cameraInteropConfig?.cameraSessionStateCallback)
+                cameraInteropConfig?.cameraSessionStateCallback
+            )
 
         try {
             cameraOpener.openCamera(cameraId, cameraState)
@@ -179,10 +182,12 @@
                     cameraState.close()
                     return OpenCameraResult(errorCode = result.cameraErrorCode)
                 }
+
                 is CameraStateClosed -> {
                     cameraState.close()
                     return OpenCameraResult(errorCode = result.cameraErrorCode)
                 }
+
                 is CameraStateUnopened -> {
                     cameraState.close()
                     throw IllegalStateException("Unexpected CameraState: $result")
@@ -239,7 +244,8 @@
                         attempts,
                         requestTimestamp,
                         timeSource,
-                        devicePolicyManager.camerasDisabled)
+                        devicePolicyManager.camerasDisabled
+                    )
                 // Always notify if the decision is to not retry the camera open, otherwise allow
                 // 1 open call to happen silently without generating an error, and notify about each
                 // error after that point.
@@ -294,6 +300,7 @@
                     } else {
                         true
                     }
+
                 CameraError.ERROR_CAMERA_LIMIT_EXCEEDED -> true
                 CameraError.ERROR_CAMERA_DISABLED ->
                     // The error indicates indicates that the current camera is currently disabled,
@@ -314,6 +321,7 @@
                     } else {
                         true
                     }
+
                 CameraError.ERROR_CAMERA_DEVICE -> true
                 CameraError.ERROR_CAMERA_SERVICE -> true
                 CameraError.ERROR_CAMERA_DISCONNECTED -> true
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
index eae884e..b5e7a6d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
@@ -117,14 +117,16 @@
     private val debugId = virtualCameraDebugIds.incrementAndGet()
     private val lock = Any()
 
-    @GuardedBy("lock") private var closed = false
+    @GuardedBy("lock")
+    private var closed = false
 
     // This is intended so that it will only ever replay the most recent event to new subscribers,
     // but to never drop events for existing subscribers.
     private val _stateFlow = MutableSharedFlow<CameraState>(replay = 1, extraBufferCapacity = 3)
     private val _states = _stateFlow.distinctUntilChanged()
 
-    @GuardedBy("lock") private var _lastState: CameraState = CameraStateUnopened
+    @GuardedBy("lock")
+    private var _lastState: CameraState = CameraStateUnopened
     override val state: Flow<CameraState>
         get() = _states
 
@@ -181,7 +183,9 @@
                     CameraStateClosed(
                         cameraId,
                         cameraClosedReason = ClosedReason.APP_DISCONNECTED,
-                        cameraErrorCode = lastCameraError))
+                        cameraErrorCode = lastCameraError
+                    )
+                )
             }
         }
     }
@@ -210,9 +214,11 @@
     private val debugId = androidCameraDebugIds.incrementAndGet()
     private val lock = Any()
 
-    @GuardedBy("lock") private var opening = false
+    @GuardedBy("lock")
+    private var opening = false
 
-    @GuardedBy("lock") private var pendingClose: ClosingInfo? = null
+    @GuardedBy("lock")
+    private var pendingClose: ClosingInfo? = null
 
     private val requestTimestampNanos: TimestampNs
     private var openTimestampNanos: TimestampNs? = null
@@ -242,7 +248,8 @@
 
         closeWith(
             device?.unwrapAs(CameraDevice::class),
-            @Suppress("SyntheticAccessor") ClosingInfo(ClosedReason.APP_CLOSED))
+            @Suppress("SyntheticAccessor") ClosingInfo(ClosedReason.APP_CLOSED)
+        )
     }
 
     suspend fun awaitClosed() {
@@ -286,7 +293,8 @@
         // while if it synchronously calls createCaptureSession.
         _state.value =
             CameraStateOpen(
-                AndroidCameraDevice(metadata, cameraDevice, cameraId, interopSessionStateCallback))
+                AndroidCameraDevice(metadata, cameraDevice, cameraId, interopSessionStateCallback)
+            )
 
         // Check to see if we received close() or other events in the meantime.
         val closeInfo =
@@ -312,7 +320,9 @@
             @Suppress("SyntheticAccessor")
             ClosingInfo(
                 ClosedReason.CAMERA2_DISCONNECTED,
-                errorCode = CameraError.ERROR_CAMERA_DISCONNECTED))
+                errorCode = CameraError.ERROR_CAMERA_DISCONNECTED
+            )
+        )
         interopDeviceStateCallback?.onDisconnected(cameraDevice)
         Debug.traceStop()
     }
@@ -325,7 +335,8 @@
         closeWith(
             cameraDevice,
             @Suppress("SyntheticAccessor")
-            ClosingInfo(ClosedReason.CAMERA2_ERROR, errorCode = CameraError.from(errorCode)))
+            ClosingInfo(ClosedReason.CAMERA2_ERROR, errorCode = CameraError.from(errorCode))
+        )
         interopDeviceStateCallback?.onError(cameraDevice, errorCode)
         Debug.traceStop()
     }
@@ -336,7 +347,8 @@
         Log.debug { "$cameraId: onClosed" }
 
         closeWith(
-            cameraDevice, @Suppress("SyntheticAccessor") ClosingInfo(ClosedReason.CAMERA2_CLOSED))
+            cameraDevice, @Suppress("SyntheticAccessor") ClosingInfo(ClosedReason.CAMERA2_CLOSED)
+        )
         interopDeviceStateCallback?.onClosed(cameraDevice)
         Debug.traceStop()
     }
@@ -356,7 +368,9 @@
             null,
             @Suppress("SyntheticAccessor")
             ClosingInfo(
-                ClosedReason.CAMERA2_EXCEPTION, errorCode = cameraError, exception = throwable))
+                ClosedReason.CAMERA2_EXCEPTION, errorCode = cameraError, exception = throwable
+            )
+        )
     }
 
     private fun closeWith(cameraDevice: CameraDevice?, closeRequest: ClosingInfo) {
@@ -412,7 +426,8 @@
             cameraActiveDurationNs = activeDuration,
             cameraClosingDurationNs = closeDuration,
             cameraErrorCode = closingInfo.errorCode,
-            cameraException = closingInfo.exception)
+            cameraException = closingInfo.exception
+        )
     }
 
     private data class ClosingInfo(
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
index a8e07d7..b870809 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
@@ -212,8 +212,10 @@
         }
         return OpenVirtualCameraResult(
             activeCamera =
-                ActiveCamera(
-                    androidCameraState = result.cameraState, scope = scope, channel = requestQueue))
+            ActiveCamera(
+                androidCameraState = result.cameraState, scope = scope, channel = requestQueue
+            )
+        )
     }
 
     @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
@@ -251,7 +253,8 @@
                 // A notable bug is b/264396089 where, because camera opens took too long, we didn't
                 // acquire a WakeLockToken, and thereby not issuing the request to close camera
                 // eventually.
-                startTimeoutOnCreation = true)
+                startTimeoutOnCreation = true
+            )
 
         init {
             listenerJob =
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/Camera2Component.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/Camera2Component.kt
index 99a3486..c7b6b1e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/Camera2Component.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/Camera2Component.kt
@@ -50,7 +50,8 @@
     @DefaultCameraBackend
     abstract fun bindCameraPipeCameraBackend(camera2Backend: Camera2Backend): CameraBackend
 
-    @Binds abstract fun bindCameraOpener(camera2CameraOpener: Camera2CameraOpener): CameraOpener
+    @Binds
+    abstract fun bindCameraOpener(camera2CameraOpener: Camera2CameraOpener): CameraOpener
 
     @Binds
     abstract fun bindCameraMetadataProvider(
@@ -63,16 +64,18 @@
     ): CameraAvailabilityMonitor
 }
 
-@Scope internal annotation class Camera2ControllerScope
+@Scope
+internal annotation class Camera2ControllerScope
 
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @Camera2ControllerScope
 @Subcomponent(
     modules =
-        [
-            Camera2ControllerConfig::class,
-            Camera2ControllerModule::class,
-            Camera2CaptureSessionsModule::class])
+    [
+        Camera2ControllerConfig::class,
+        Camera2ControllerModule::class,
+        Camera2CaptureSessionsModule::class]
+)
 internal interface Camera2ControllerComponent {
     fun cameraController(): CameraController
 
@@ -90,13 +93,17 @@
     private val graphListener: GraphListener,
     private val streamGraph: StreamGraph,
 ) {
-    @Provides fun provideCameraGraphConfig() = graphConfig
+    @Provides
+    fun provideCameraGraphConfig() = graphConfig
 
-    @Provides fun provideCameraBackend() = cameraBackend
+    @Provides
+    fun provideCameraBackend() = cameraBackend
 
-    @Provides fun provideStreamGraph() = streamGraph as StreamGraphImpl
+    @Provides
+    fun provideStreamGraph() = streamGraph as StreamGraphImpl
 
-    @Provides fun provideGraphListener() = graphListener
+    @Provides
+    fun provideGraphListener() = graphListener
 }
 
 @Module
@@ -116,7 +123,8 @@
         @Provides
         fun provideCoroutineScope(threads: Threads): CoroutineScope {
             return CoroutineScope(
-                threads.lightweightDispatcher.plus(CoroutineName("CXCP-Camera2Controller")))
+                threads.lightweightDispatcher.plus(CoroutineName("CXCP-Camera2Controller"))
+            )
         }
     }
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
index 1468201..faa502a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
@@ -43,20 +43,24 @@
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.CoroutineScope
 
-@Scope internal annotation class CameraGraphScope
+@Scope
+internal annotation class CameraGraphScope
 
-@Qualifier internal annotation class ForCameraGraph
+@Qualifier
+internal annotation class ForCameraGraph
 
-@Qualifier internal annotation class CameraGraphContext
+@Qualifier
+internal annotation class CameraGraphContext
 
 @CameraGraphScope
 @Subcomponent(
     modules =
-        [
-            SharedCameraGraphModules::class,
-            InternalCameraGraphModules::class,
-            CameraGraphConfigModule::class,
-        ])
+    [
+        SharedCameraGraphModules::class,
+        InternalCameraGraphModules::class,
+        CameraGraphConfigModule::class,
+    ]
+)
 internal interface CameraGraphComponent {
     fun cameraGraph(): CameraGraph
 
@@ -69,16 +73,20 @@
 
 @Module
 internal class CameraGraphConfigModule(private val config: CameraGraph.Config) {
-    @Provides fun provideCameraGraphConfig(): CameraGraph.Config = config
+    @Provides
+    fun provideCameraGraphConfig(): CameraGraph.Config = config
 }
 
 @Module
 internal abstract class SharedCameraGraphModules {
-    @Binds abstract fun bindCameraGraph(cameraGraph: CameraGraphImpl): CameraGraph
+    @Binds
+    abstract fun bindCameraGraph(cameraGraph: CameraGraphImpl): CameraGraph
 
-    @Binds abstract fun bindGraphProcessor(graphProcessor: GraphProcessorImpl): GraphProcessor
+    @Binds
+    abstract fun bindGraphProcessor(graphProcessor: GraphProcessorImpl): GraphProcessor
 
-    @Binds abstract fun bindGraphListener(graphProcessor: GraphProcessorImpl): GraphListener
+    @Binds
+    abstract fun bindGraphListener(graphProcessor: GraphProcessorImpl): GraphListener
 
     @Binds
     @CameraGraphContext
@@ -130,7 +138,9 @@
 
             val cameraBackendId = graphConfig.cameraBackendId
             if (cameraBackendId != null) {
-                cameraBackends[cameraBackendId]
+                return checkNotNull(cameraBackends[cameraBackendId]) {
+                    "Failed to initialize $cameraBackendId from $graphConfig"
+                }
             }
             return cameraBackends.default
         }
@@ -158,7 +168,8 @@
             streamGraph: StreamGraphImpl,
         ): CameraController {
             return cameraBackend.createCameraController(
-                cameraContext, graphConfig, graphProcessor, streamGraph)
+                cameraContext, graphConfig, graphProcessor, streamGraph
+            )
         }
     }
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
index 9f99f9e..ce3a3ad 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
@@ -48,19 +48,22 @@
 import javax.inject.Qualifier
 import javax.inject.Singleton
 
-@Qualifier internal annotation class DefaultCameraBackend
+@Qualifier
+internal annotation class DefaultCameraBackend
 
 /** Qualifier for requesting the CameraPipe scoped Context object */
-@Qualifier internal annotation class CameraPipeContext
+@Qualifier
+internal annotation class CameraPipeContext
 
 @Singleton
 @Component(
     modules =
-        [
-            CameraPipeConfigModule::class,
-            CameraPipeModules::class,
-            Camera2Module::class,
-        ])
+    [
+        CameraPipeConfigModule::class,
+        CameraPipeModules::class,
+        Camera2Module::class,
+    ]
+)
 internal interface CameraPipeComponent {
     fun cameraGraphComponentBuilder(): CameraGraphComponent.Builder
     fun cameras(): CameraDevices
@@ -69,7 +72,8 @@
 
 @Module(includes = [ThreadConfigModule::class], subcomponents = [CameraGraphComponent::class])
 internal class CameraPipeConfigModule(private val config: CameraPipe.Config) {
-    @Provides fun provideCameraPipeConfig(): CameraPipe.Config = config
+    @Provides
+    fun provideCameraPipeConfig(): CameraPipe.Config = config
 
     @Provides
     fun provideCameraInteropConfig(
@@ -81,9 +85,11 @@
 
 @Module
 internal abstract class CameraPipeModules {
-    @Binds abstract fun bindCameras(impl: CameraDevicesImpl): CameraDevices
+    @Binds
+    abstract fun bindCameras(impl: CameraDevicesImpl): CameraDevices
 
-    @Binds abstract fun bindTimeSource(timeSource: SystemTimeSource): TimeSource
+    @Binds
+    abstract fun bindTimeSource(timeSource: SystemTimeSource): TimeSource
 
     companion object {
         @Provides
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
index e54e05f..b93b659 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
@@ -49,9 +49,11 @@
     private val cameraMetadata: CameraMetadata,
     private val requestProcessor: RequestProcessor
 ) {
-    @Provides fun provideCameraGraphConfig(): CameraGraph.Config = config
+    @Provides
+    fun provideCameraGraphConfig(): CameraGraph.Config = config
 
-    @Provides fun provideCameraMetadata(): CameraMetadata = cameraMetadata
+    @Provides
+    fun provideCameraMetadata(): CameraMetadata = cameraMetadata
 
     @CameraGraphScope
     @Provides
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
index b4a6898..126ca30 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
@@ -123,7 +123,8 @@
             lightweightExecutor = lightweightExecutor,
             lightweightDispatcher = lightweightDispatcher,
             camera2Handler = cameraHandlerFn,
-            camera2Executor = cameraExecutorFn)
+            camera2Executor = cameraExecutorFn
+        )
     }
 
     private fun provideTestOnlyThreads(
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/AndroidThreads.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/AndroidThreads.kt
index 7b7c2a7..499b9e0 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/AndroidThreads.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/AndroidThreads.kt
@@ -50,9 +50,9 @@
             Process.THREAD_PRIORITY_URGENT_DISPLAY + 3,
             Process.THREAD_PRIORITY_URGENT_DISPLAY + 2,
             Process.THREAD_PRIORITY_URGENT_DISPLAY // 10 (Thread.MAX_PRIORITY)
-            )
+        )
 
-    public val factory: ThreadFactory = Executors.defaultThreadFactory()
+    val factory: ThreadFactory = Executors.defaultThreadFactory()
 
     /** Wraps `delegate` such that the threads created by it are set to `priority`. */
     fun ThreadFactory.withAndroidPriority(androidPriority: Int): ThreadFactory {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
index f739c99..a3130f1 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
@@ -33,9 +33,9 @@
 
 /** Internal debug utilities, constants, and checks. */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public object Debug {
-    public const val ENABLE_LOGGING: Boolean = true
-    public const val ENABLE_TRACING: Boolean = true
+object Debug {
+    const val ENABLE_LOGGING: Boolean = true
+    const val ENABLE_TRACING: Boolean = true
 
     /**
      * Wrap the specified [block] in calls to [Trace.beginSection] (with the supplied [label]) and
@@ -44,7 +44,7 @@
      * @param label A name of the code section to appear in the trace.
      * @param block A block of code which is being traced.
      */
-    public inline fun <T> trace(label: String, crossinline block: () -> T): T {
+    inline fun <T> trace(label: String, crossinline block: () -> T): T {
         try {
             traceStart { label }
             return block()
@@ -54,14 +54,14 @@
     }
 
     /** Forwarding call to [Trace.beginSection] that can be statically disabled at compile time. */
-    public inline fun traceStart(crossinline label: () -> String) {
+    inline fun traceStart(crossinline label: () -> String) {
         if (ENABLE_TRACING) {
             Trace.beginSection(label())
         }
     }
 
     /** Forwarding call to [Trace.endSection] that can be statically disabled at compile time. */
-    public inline fun traceStop() {
+    inline fun traceStop() {
         if (ENABLE_TRACING) {
             Trace.endSection()
         }
@@ -89,7 +89,7 @@
         }
     }
 
-    public fun formatCameraGraphProperties(
+    fun formatCameraGraphProperties(
         metadata: CameraMetadata,
         graphConfig: CameraGraph.Config,
         cameraGraph: CameraGraph
@@ -111,7 +111,8 @@
         val capabilities = metadata[REQUEST_AVAILABLE_CAPABILITIES]
         val cameraType =
             if (capabilities != null &&
-                capabilities.contains(REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA)) {
+                capabilities.contains(REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA)
+            ) {
                 "Logical"
             } else {
                 "Physical"
@@ -161,32 +162,32 @@
  *
  * Example: checkApi(Build.VERSION_CODES.LOLLIPOP, "createCameraDevice")
  */
-public inline fun checkApi(requiredApi: Int, methodName: String) {
+inline fun checkApi(requiredApi: Int, methodName: String) {
     check(Build.VERSION.SDK_INT >= requiredApi) {
         "$methodName is not supported on API ${Build.VERSION.SDK_INT} (requires API $requiredApi)"
     }
 }
 
 /** Asserts that this method was invoked on Android L (API 21) or higher. */
-public inline fun checkLOrHigher(methodName: String): Unit =
+inline fun checkLOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.LOLLIPOP, methodName)
 
 /** Asserts that this method was invoked on Android M (API 23) or higher. */
-public inline fun checkMOrHigher(methodName: String): Unit =
+inline fun checkMOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.M, methodName)
 
 /** Asserts that this method was invoked on Android N (API 24) or higher. */
-public inline fun checkNOrHigher(methodName: String): Unit =
+inline fun checkNOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.N, methodName)
 
 /** Asserts that this method was invoked on Android O (API 26) or higher. */
-public inline fun checkOOrHigher(methodName: String): Unit =
+inline fun checkOOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.O, methodName)
 
 /** Asserts that this method was invoked on Android P (API 28) or higher. */
-public inline fun checkPOrHigher(methodName: String): Unit =
+inline fun checkPOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.P, methodName)
 
 /** Asserts that this method was invoked on Android Q (API 29) or higher. */
-public inline fun checkQOrHigher(methodName: String): Unit =
+inline fun checkQOrHigher(methodName: String): Unit =
     checkApi(Build.VERSION_CODES.Q, methodName)
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
index 0f301fd..0e1423e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
@@ -29,8 +29,8 @@
  * Log.debug { "This is a log message with a $value" }
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public object Log {
-    public const val TAG: String = "CXCP"
+object Log {
+    const val TAG: String = "CXCP"
 
     private const val LOG_LEVEL_DEBUG = 1
     private const val LOG_LEVEL_INFO = 2
@@ -40,28 +40,28 @@
     // This indicates the lowest log level that will always log.
     private const val LOG_LEVEL = LOG_LEVEL_DEBUG
 
-    public val DEBUG_LOGGABLE: Boolean =
+    val DEBUG_LOGGABLE: Boolean =
         LOG_LEVEL <= LOG_LEVEL_DEBUG || Log.isLoggable(TAG, Log.DEBUG)
-    public val INFO_LOGGABLE: Boolean = LOG_LEVEL <= LOG_LEVEL_INFO || Log.isLoggable(TAG, Log.INFO)
-    public val WARN_LOGGABLE: Boolean = LOG_LEVEL <= LOG_LEVEL_WARN || Log.isLoggable(TAG, Log.WARN)
-    public val ERROR_LOGGABLE: Boolean =
+    val INFO_LOGGABLE: Boolean = LOG_LEVEL <= LOG_LEVEL_INFO || Log.isLoggable(TAG, Log.INFO)
+    val WARN_LOGGABLE: Boolean = LOG_LEVEL <= LOG_LEVEL_WARN || Log.isLoggable(TAG, Log.WARN)
+    val ERROR_LOGGABLE: Boolean =
         LOG_LEVEL <= LOG_LEVEL_ERROR || Log.isLoggable(TAG, Log.ERROR)
 
     /** Debug functions log noisy information related to the internals of the system. */
-    public inline fun debug(crossinline msg: () -> String) {
+    inline fun debug(crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && DEBUG_LOGGABLE) Log.d(TAG, msg())
     }
 
-    public inline fun debug(throwable: Throwable, crossinline msg: () -> String) {
+    inline fun debug(throwable: Throwable, crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && DEBUG_LOGGABLE) Log.d(TAG, msg(), throwable)
     }
 
     /** Info functions log standard, useful information about the state of the system. */
-    public inline fun info(crossinline msg: () -> String) {
+    inline fun info(crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && INFO_LOGGABLE) Log.i(TAG, msg())
     }
 
-    public inline fun info(throwable: Throwable, crossinline msg: () -> String) {
+    inline fun info(throwable: Throwable, crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && INFO_LOGGABLE) Log.i(TAG, msg(), throwable)
     }
 
@@ -69,27 +69,27 @@
      * Warning functions are used when something unexpected may lead to a crash or fatal exception
      * later on as a result if the unusual circumstances
      */
-    public inline fun warn(crossinline msg: () -> String) {
+    inline fun warn(crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && WARN_LOGGABLE) Log.w(TAG, msg())
     }
 
-    public inline fun warn(throwable: Throwable, crossinline msg: () -> String) {
+    inline fun warn(throwable: Throwable, crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && WARN_LOGGABLE) Log.w(TAG, msg(), throwable)
     }
 
     /**
      * Error functions are reserved for something unexpected that will lead to a crash or data loss.
      */
-    public inline fun error(crossinline msg: () -> String) {
+    inline fun error(crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && ERROR_LOGGABLE) Log.e(TAG, msg())
     }
 
-    public inline fun error(throwable: Throwable, crossinline msg: () -> String) {
+    inline fun error(throwable: Throwable, crossinline msg: () -> String) {
         if (Debug.ENABLE_LOGGING && ERROR_LOGGABLE) Log.e(TAG, msg(), throwable)
     }
 
     /** Read the stack trace of a calling method and join it to a formatted string. */
-    public fun readStackTrace(limit: Int = 4): String {
+    fun readStackTrace(limit: Int = 4): String {
         val elements = Thread.currentThread().stackTrace
         // Ignore the first 3 elements, which ignores:
         // VMStack.getThreadStackTrace
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
index ce5adf8..f1953a9 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
@@ -37,7 +37,8 @@
 internal class Permissions
 @Inject
 constructor(@CameraPipeContext private val cameraPipeContext: Context) {
-    @Volatile private var _hasCameraPermission = false
+    @Volatile
+    private var _hasCameraPermission = false
     val hasCameraPermission: Boolean
         get() =
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -58,7 +59,8 @@
         if (!_hasCameraPermission) {
             Debug.traceStart { "CXCP#checkCameraPermission" }
             if (Api23Compat.checkSelfPermission(cameraPipeContext, Manifest.permission.CAMERA) ==
-                PERMISSION_GRANTED) {
+                PERMISSION_GRANTED
+            ) {
                 _hasCameraPermission = true
             }
             Debug.traceStop()
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
index a3c97b7..eae40c0 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
@@ -26,22 +26,22 @@
 
 /** A nanosecond timestamp */
 @JvmInline
-public value class TimestampNs constructor(public val value: Long) {
-    public inline operator fun minus(other: TimestampNs): DurationNs =
+value class TimestampNs constructor(val value: Long) {
+    inline operator fun minus(other: TimestampNs): DurationNs =
         DurationNs(value - other.value)
 
-    public inline operator fun plus(other: DurationNs): TimestampNs =
+    inline operator fun plus(other: DurationNs): TimestampNs =
         TimestampNs(value + other.value)
 }
 
 @JvmInline
-public value class DurationNs(public val value: Long) {
-    public inline operator fun minus(other: DurationNs): DurationNs =
+value class DurationNs(val value: Long) {
+    inline operator fun minus(other: DurationNs): DurationNs =
         DurationNs(value - other.value)
 
-    public inline operator fun plus(other: DurationNs): DurationNs = DurationNs(value + other.value)
+    inline operator fun plus(other: DurationNs): DurationNs = DurationNs(value + other.value)
 
-    public inline operator fun plus(other: TimestampNs): TimestampNs =
+    inline operator fun plus(other: TimestampNs): TimestampNs =
         TimestampNs(value + other.value)
 
     operator fun compareTo(other: DurationNs): Int {
@@ -55,30 +55,30 @@
     }
 
     companion object {
-        public inline fun fromMs(durationMs: Long) = DurationNs(durationMs * 1_000_000L)
+        inline fun fromMs(durationMs: Long) = DurationNs(durationMs * 1_000_000L)
     }
 }
 
 interface TimeSource {
-    public fun now(): TimestampNs
+    fun now(): TimestampNs
 }
 
 @Singleton
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public class SystemTimeSource @Inject constructor() : TimeSource {
+class SystemTimeSource @Inject constructor() : TimeSource {
     override fun now() = TimestampNs(SystemClock.elapsedRealtimeNanos())
 }
 
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-public object Timestamps {
-    public inline fun now(timeSource: TimeSource): TimestampNs = timeSource.now()
+object Timestamps {
+    inline fun now(timeSource: TimeSource): TimestampNs = timeSource.now()
 
-    public inline fun DurationNs.formatNs(): String = "$this ns"
-    public inline fun DurationNs.formatMs(decimals: Int = 3): String =
+    inline fun DurationNs.formatNs(): String = "$this ns"
+    inline fun DurationNs.formatMs(decimals: Int = 3): String =
         "%.${decimals}f ms".format(null, this.value / 1_000_000.0)
 
-    public inline fun TimestampNs.formatNs(): String = "$this ns"
-    public inline fun TimestampNs.formatMs(): String = "${this.value / 1_000_000} ms"
-    public inline fun TimestampNs.measureNow(timeSource: TimeSource = SystemTimeSource()) =
+    inline fun TimestampNs.formatNs(): String = "$this ns"
+    inline fun TimestampNs.formatMs(): String = "${this.value / 1_000_000} ms"
+    inline fun TimestampNs.measureNow(timeSource: TimeSource = SystemTimeSource()) =
         now(timeSource) - this
 }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
index a65fa0b..4e035a2 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
@@ -122,9 +122,11 @@
 
     private val pending = ArrayDeque<TokenRequest>()
 
-    @GuardedBy("pending") private var closed = false
+    @GuardedBy("pending")
+    private var closed = false
 
-    @GuardedBy("pending") private var _available: Long = capacity
+    @GuardedBy("pending")
+    private var _available: Long = capacity
 
     override val available: Long
         get() =
@@ -167,7 +169,8 @@
         suspendCancellableCoroutine { continuation ->
             if (min > capacity) {
                 continuation.resumeWithException(
-                    IllegalArgumentException("Attempted to acquire $min / $capacity"))
+                    IllegalArgumentException("Attempted to acquire $min / $capacity")
+                )
                 return@suspendCancellableCoroutine
             }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
index 225d157..f28cb36 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
@@ -43,11 +43,14 @@
 ) {
     private val lock = Any()
 
-    @GuardedBy("lock") private var count = 0
+    @GuardedBy("lock")
+    private var count = 0
 
-    @GuardedBy("lock") private var timeoutJob: Job? = null
+    @GuardedBy("lock")
+    private var timeoutJob: Job? = null
 
-    @GuardedBy("lock") private var closed = false
+    @GuardedBy("lock")
+    private var closed = false
 
     init {
         if (startTimeoutOnCreation) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
index 91a28eb..e720845 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
@@ -89,7 +89,8 @@
             awbMode = awbMode,
             aeRegions = aeRegions,
             afRegions = afRegions,
-            awbRegions = awbRegions)
+            awbRegions = awbRegions
+        )
     }
 
     override suspend fun submit3A(
@@ -138,7 +139,8 @@
             awbLockBehavior,
             afTriggerStartAeMode,
             frameLimit,
-            timeLimitNs)
+            timeLimitNs
+        )
     }
 
     override suspend fun unlock3A(ae: Boolean?, af: Boolean?, awb: Boolean?): Deferred<Result3A> {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
index 7ed15a8..c7a5f1a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
@@ -59,18 +59,21 @@
             listOf(
                 CaptureResult.CONTROL_AE_STATE_CONVERGED,
                 CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED,
-                CaptureResult.CONTROL_AE_STATE_LOCKED)
+                CaptureResult.CONTROL_AE_STATE_LOCKED
+            )
 
         private val awbConvergedStateList =
             listOf(
-                CaptureResult.CONTROL_AWB_STATE_CONVERGED, CaptureResult.CONTROL_AWB_STATE_LOCKED)
+                CaptureResult.CONTROL_AWB_STATE_CONVERGED, CaptureResult.CONTROL_AWB_STATE_LOCKED
+            )
 
         private val afConvergedStateList =
             listOf(
                 CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
                 CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED,
                 CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
+                CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
+            )
 
         private val aeLockedStateList = listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)
 
@@ -79,13 +82,15 @@
         private val afLockedStateList =
             listOf(
                 CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
+                CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
+            )
 
         private val aePostPrecaptureStateList =
             listOf(
                 CaptureResult.CONTROL_AE_STATE_CONVERGED,
                 CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED,
-                CaptureResult.CONTROL_AE_STATE_LOCKED)
+                CaptureResult.CONTROL_AE_STATE_LOCKED
+            )
 
         val parameterForAfTriggerStart =
             mapOf<CaptureRequest.Key<*>, Any>(CONTROL_AF_TRIGGER to CONTROL_AF_TRIGGER_START)
@@ -96,7 +101,8 @@
         private val parametersForAePrecaptureAndAfTrigger =
             mapOf<CaptureRequest.Key<*>, Any>(
                 CONTROL_AF_TRIGGER to CONTROL_AF_TRIGGER_START,
-                CONTROL_AE_PRECAPTURE_TRIGGER to CONTROL_AE_PRECAPTURE_TRIGGER_START)
+                CONTROL_AE_PRECAPTURE_TRIGGER to CONTROL_AE_PRECAPTURE_TRIGGER_START
+            )
 
         private val result3ASubmitFailed = Result3A(Status.SUBMIT_FAILED)
 
@@ -105,7 +111,8 @@
                 CaptureResult.CONTROL_AE_STATE_INACTIVE,
                 CaptureResult.CONTROL_AE_STATE_SEARCHING,
                 CaptureResult.CONTROL_AE_STATE_CONVERGED,
-                CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED)
+                CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED
+            )
 
         private val afUnlockedStateList =
             listOf(
@@ -113,18 +120,21 @@
                 CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN,
                 CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
                 CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
-                CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
+                CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED
+            )
 
         private val awbUnlockedStateList =
             listOf(
                 CaptureResult.CONTROL_AWB_STATE_INACTIVE,
                 CaptureResult.CONTROL_AWB_STATE_SEARCHING,
-                CaptureResult.CONTROL_AWB_STATE_CONVERGED)
+                CaptureResult.CONTROL_AWB_STATE_CONVERGED
+            )
     }
 
     // Keep track of the result associated with latest call to update3A. If update3A is called again
     // and the current result is not complete, we will cancel the current result.
-    @GuardedBy("this") private var lastUpdate3AResult: Deferred<Result3A>? = null
+    @GuardedBy("this")
+    private var lastUpdate3AResult: Deferred<Result3A>? = null
 
     fun update3A(
         aeMode: AeMode? = null,
@@ -243,12 +253,14 @@
         // As needed unlock ae, awb and wait for ae, af and awb to converge.
         if (aeLockBehavior.shouldWaitForAeToConverge() ||
             afLockBehaviorSanitized.shouldWaitForAfToConverge() ||
-            awbLockBehavior.shouldWaitForAwbToConverge()) {
+            awbLockBehavior.shouldWaitForAwbToConverge()
+        ) {
             val converged3AExitConditions =
                 createConverged3AExitConditions(
                     aeLockBehavior.shouldWaitForAeToConverge(),
                     afLockBehaviorSanitized.shouldWaitForAfToConverge(),
-                    awbLockBehavior.shouldWaitForAwbToConverge())
+                    awbLockBehavior.shouldWaitForAwbToConverge()
+                )
             val listener =
                 Result3AStateListenerImpl(converged3AExitConditions, frameLimit, timeLimitNs)
             graphListener3A.addListener(listener)
@@ -291,7 +303,8 @@
             awbLockBehavior,
             afTriggerStartAeMode,
             frameLimit,
-            timeLimitNs)
+            timeLimitNs
+        )
     }
 
     /**
@@ -350,9 +363,11 @@
             Result3AStateListenerImpl(
                 mapOf<CaptureResult.Key<*>, List<Any>>(
                     CaptureResult.CONTROL_AE_STATE to aePostPrecaptureStateList,
-                    CaptureResult.CONTROL_AF_STATE to afLockedStateList),
+                    CaptureResult.CONTROL_AF_STATE to afLockedStateList
+                ),
                 frameLimit,
-                timeLimitNs)
+                timeLimitNs
+            )
         graphListener3A.addListener(listener)
 
         debug { "lock3AForCapture - sending a request to trigger ae precapture metering and af." }
@@ -385,7 +400,9 @@
     private suspend fun unlock3APostCaptureAndroidLAndBelow(): Deferred<Result3A> {
         debug { "unlock3AForCapture - sending a request to cancel af and turn on ae." }
         if (!graphProcessor.submit(
-            mapOf(CONTROL_AF_TRIGGER to CONTROL_AF_TRIGGER_CANCEL, CONTROL_AE_LOCK to true))) {
+                mapOf(CONTROL_AF_TRIGGER to CONTROL_AF_TRIGGER_CANCEL, CONTROL_AE_LOCK to true)
+            )
+        ) {
             debug { "unlock3AForCapture - request to cancel af and lock ae as failed." }
             return CompletableDeferred(result3ASubmitFailed)
         }
@@ -417,7 +434,8 @@
             mapOf<CaptureRequest.Key<*>, Any>(
                 CONTROL_AF_TRIGGER to CONTROL_AF_TRIGGER_CANCEL,
                 CONTROL_AE_PRECAPTURE_TRIGGER to
-                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL)
+                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
+            )
         if (!graphProcessor.submit(parametersForAePrecaptureAndAfCancel)) {
             debug {
                 "unlock3APostCapture - request to reset af and ae precapture metering failed, " +
@@ -433,7 +451,9 @@
         val listener =
             Result3AStateListenerImpl(
                 mapOf<CaptureResult.Key<*>, List<Any>>(
-                    CaptureResult.CONTROL_AF_STATE to afUnlockedStateList))
+                    CaptureResult.CONTROL_AF_STATE to afUnlockedStateList
+                )
+            )
         graphListener3A.addListener(listener)
         graphProcessor.invalidate()
         return listener.result
@@ -461,7 +481,8 @@
         val finalAwbLockValue = if (awbLockBehavior == null) null else true
         val locked3AExitConditions =
             createLocked3AExitConditions(
-                finalAeLockValue != null, afLockBehavior != null, finalAwbLockValue != null)
+                finalAeLockValue != null, afLockBehavior != null, finalAwbLockValue != null
+            )
 
         var resultForLocked: Deferred<Result3A>? = null
         if (locked3AExitConditions.isNotEmpty()) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
index 132f5bf..03f8e82 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
@@ -92,19 +92,26 @@
 ) : GraphProcessor, GraphListener {
     private val lock = Any()
 
-    @GuardedBy("lock") private val submitQueue: MutableList<List<Request>> = ArrayList()
+    @GuardedBy("lock")
+    private val submitQueue: MutableList<List<Request>> = ArrayList()
 
-    @GuardedBy("lock") private var currentRepeatingRequest: Request? = null
+    @GuardedBy("lock")
+    private var currentRepeatingRequest: Request? = null
 
-    @GuardedBy("lock") private var nextRepeatingRequest: Request? = null
+    @GuardedBy("lock")
+    private var nextRepeatingRequest: Request? = null
 
-    @GuardedBy("lock") private var _requestProcessor: GraphRequestProcessor? = null
+    @GuardedBy("lock")
+    private var _requestProcessor: GraphRequestProcessor? = null
 
-    @GuardedBy("lock") private var submitting = false
+    @GuardedBy("lock")
+    private var submitting = false
 
-    @GuardedBy("lock") private var dirty = false
+    @GuardedBy("lock")
+    private var dirty = false
 
-    @GuardedBy("lock") private var closed = false
+    @GuardedBy("lock")
+    private var closed = false
 
     private val _graphState = MutableStateFlow<GraphState>(GraphStateStopped)
 
@@ -262,7 +269,8 @@
                         requests = listOf(request),
                         defaultParameters = cameraGraphConfig.defaultParameters,
                         requiredParameters = requiredParameters,
-                        listeners = graphListeners)
+                        listeners = graphListeners
+                    )
             }
         }
 
@@ -372,11 +380,13 @@
                 requiredParameters.putAllMetadata(cameraGraphConfig.requiredParameters)
 
                 if (processor.submit(
-                    isRepeating = true,
-                    requests = listOf(request),
-                    defaultParameters = cameraGraphConfig.defaultParameters,
-                    requiredParameters = requiredParameters,
-                    listeners = graphListeners)) {
+                        isRepeating = true,
+                        requests = listOf(request),
+                        defaultParameters = cameraGraphConfig.defaultParameters,
+                        requiredParameters = requiredParameters,
+                        listeners = graphListeners
+                    )
+                ) {
                     // ONLY update the current repeating request if the update succeeds
                     synchronized(lock) {
                         if (processor === _requestProcessor) {
@@ -437,7 +447,8 @@
                             requests = burst,
                             defaultParameters = cameraGraphConfig.defaultParameters,
                             requiredParameters = requiredParameters,
-                            listeners = graphListeners)
+                            listeners = graphListeners
+                        )
                     }
             } finally {
                 Debug.traceStop()
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphRequestProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphRequestProcessor.kt
index 8b2d269..bde6051 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphRequestProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphRequestProcessor.kt
@@ -37,7 +37,7 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @Suppress("NOTHING_TO_INLINE")
-public class GraphRequestProcessor
+class GraphRequestProcessor
 private constructor(
     private val captureSequenceProcessor: CaptureSequenceProcessor<Any, CaptureSequence<Any>>
 ) {
@@ -46,12 +46,14 @@
         fun from(captureSequenceProcessor: CaptureSequenceProcessor<*, *>): GraphRequestProcessor {
             @Suppress("UNCHECKED_CAST")
             return GraphRequestProcessor(
-                captureSequenceProcessor as CaptureSequenceProcessor<Any, CaptureSequence<Any>>)
+                captureSequenceProcessor as CaptureSequenceProcessor<Any, CaptureSequence<Any>>
+            )
         }
     }
 
     private val debugId = graphRequestProcessorIds.incrementAndGet()
     private val closed = atomic(false)
+
     @GuardedBy("activeCaptureSequences")
     private val activeCaptureSequences = mutableListOf<CaptureSequence<*>>()
     private val activeBurstListener =
@@ -131,7 +133,8 @@
                 defaultParameters,
                 requiredParameters,
                 listeners,
-                activeBurstListener)
+                activeBurstListener
+            )
 
         // Reject incoming requests if this instance has been stopped or closed.
         if (captureSequence == null) {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
index 2048cdf..31888e5 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
@@ -56,10 +56,14 @@
     val result: Deferred<Result3A>
         get() = _result
 
-    @Volatile private var frameNumberOfFirstUpdate: FrameNumber? = null
-    @Volatile private var timestampOfFirstUpdateNs: Long? = null
+    @Volatile
+    private var frameNumberOfFirstUpdate: FrameNumber? = null
 
-    @GuardedBy("this") private var initialRequestNumber: RequestNumber? = null
+    @Volatile
+    private var timestampOfFirstUpdateNs: Long? = null
+
+    @GuardedBy("this")
+    private var initialRequestNumber: RequestNumber? = null
 
     override fun onRequestSequenceCreated(requestNumber: RequestNumber) {
         synchronized(this) {
@@ -94,7 +98,8 @@
         if (timeLimitNs != null &&
             timestampOfFirstUpdateNs != null &&
             currentTimestampNs != null &&
-            currentTimestampNs - timestampOfFirstUpdateNs > timeLimitNs) {
+            currentTimestampNs - timestampOfFirstUpdateNs > timeLimitNs
+        ) {
             _result.complete(Result3A(Result3A.Status.TIME_LIMIT_REACHED, frameMetadata))
             return true
         }
@@ -106,7 +111,8 @@
         val frameNumberOfFirstUpdate = frameNumberOfFirstUpdate
         if (frameNumberOfFirstUpdate != null &&
             frameLimit != null &&
-            currentFrameNumber.value - frameNumberOfFirstUpdate.value > frameLimit) {
+            currentFrameNumber.value - frameNumberOfFirstUpdate.value > frameLimit
+        ) {
             _result.complete(Result3A(Result3A.Status.FRAME_LIMIT_REACHED, frameMetadata))
             return true
         }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
index 34d9b26..8f7ace1 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
@@ -120,17 +120,18 @@
                         output.camera ?: graphConfig.camera,
                         groupNumber = groupNumbers[streamConfig],
                         deferredOutputType =
-                            if (deferredOutputsAllowed) {
-                                (output as? OutputStream.Config.LazyOutputConfig)?.outputType
-                            } else {
-                                null
-                            },
+                        if (deferredOutputsAllowed) {
+                            (output as? OutputStream.Config.LazyOutputConfig)?.outputType
+                        } else {
+                            null
+                        },
                         mirrorMode = output.mirrorMode,
                         timestampBase = output.timestampBase,
                         dynamicRangeProfile = output.dynamicRangeProfile,
                         streamUseCase = output.streamUseCase,
                         externalOutputConfig =
-                            (output as? OutputStream.Config.ExternalOutputConfig)?.output)
+                        (output as? OutputStream.Config.ExternalOutputConfig)?.output
+                    )
                 outputConfigMap[output] = outputConfig
                 outputConfigListBuilder.add(outputConfig)
             }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/SurfaceGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/SurfaceGraph.kt
index 093483f..70feb5d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/SurfaceGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/SurfaceGraph.kt
@@ -44,12 +44,14 @@
 ) {
     private val lock = Any()
 
-    @GuardedBy("lock") private val surfaceMap: MutableMap<StreamId, Surface> = mutableMapOf()
+    @GuardedBy("lock")
+    private val surfaceMap: MutableMap<StreamId, Surface> = mutableMapOf()
 
     @GuardedBy("lock")
     private val surfaceUsageMap: MutableMap<Surface, AutoCloseable> = mutableMapOf()
 
-    @GuardedBy("lock") private val closed: Boolean = false
+    @GuardedBy("lock")
+    private val closed: Boolean = false
 
     operator fun set(streamId: StreamId, surface: Surface?) {
         val closeable =
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraBackendsImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraBackendsImpl.kt
index 8c56d28..8f91377 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraBackendsImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraBackendsImpl.kt
@@ -56,7 +56,8 @@
 
             val backend =
                 cameraBackends[backendId]?.create(
-                    CameraBackendContext(cameraPipeContext, threads, this))
+                    CameraBackendContext(cameraPipeContext, threads, this)
+                )
             if (backend != null) {
                 check(backendId == backend.id) {
                     "Unexpected backend id! Expected $backendId but it was actually ${backend.id}"
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraDevicesImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraDevicesImpl.kt
index 26a313b..6e9cedfb 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraDevicesImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/internal/CameraDevicesImpl.kt
@@ -37,26 +37,30 @@
     @Deprecated(
         "findAll() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("awaitCameraIds"),
-        level = DeprecationLevel.WARNING)
+        level = DeprecationLevel.WARNING
+    )
     override fun findAll(): List<CameraId> = awaitCameraIds() ?: emptyList()
 
     @Deprecated(
         "ids() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("getCameraIds"),
-        level = DeprecationLevel.WARNING)
+        level = DeprecationLevel.WARNING
+    )
     override suspend fun ids(): List<CameraId> = getCameraIds() ?: emptyList()
 
     @Deprecated(
         "getMetadata() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("getCameraMetadata"),
-        level = DeprecationLevel.WARNING)
+        level = DeprecationLevel.WARNING
+    )
     override suspend fun getMetadata(camera: CameraId): CameraMetadata =
         checkNotNull(getCameraMetadata(camera))
 
     @Deprecated(
         "awaitMetadata() is not able to specify a specific CameraBackendId to query.",
         replaceWith = ReplaceWith("awaitCameraMetadata"),
-        level = DeprecationLevel.WARNING)
+        level = DeprecationLevel.WARNING
+    )
     override fun awaitMetadata(camera: CameraId): CameraMetadata =
         checkNotNull(awaitCameraMetadata(camera))
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/CameraPipeTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/CameraPipeTest.kt
index ef64bab..4092b41 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/CameraPipeTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/CameraPipeTest.kt
@@ -52,7 +52,9 @@
                 CameraGraph.Config(
                     camera = fakeCameraId,
                     streams = listOf(),
-                    defaultTemplate = RequestTemplate(0)))
+                    defaultTemplate = RequestTemplate(0)
+                )
+            )
         assertThat(cameraGraph).isNotNull()
     }
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
index 4f56868..5e5b2ae 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/RequestTest.kt
@@ -47,8 +47,9 @@
             Request(
                 listOf(StreamId(1)),
                 parameters =
-                    mapOf(CaptureRequest.EDGE_MODE to CaptureRequest.EDGE_MODE_HIGH_QUALITY),
-                extras = mapOf(FakeMetadata.TEST_KEY to 42))
+                mapOf(CaptureRequest.EDGE_MODE to CaptureRequest.EDGE_MODE_HIGH_QUALITY),
+                extras = mapOf(FakeMetadata.TEST_KEY to 42)
+            )
 
         // Check with a valid test key
         assertThat(request[FakeMetadata.TEST_KEY]).isEqualTo(42)
@@ -67,8 +68,10 @@
         // Check with an invalid test key
         assertThat(request.get(CaptureRequest.CONTROL_AE_MODE)).isNull()
         assertThat(
-                request.getOrDefault(
-                    CaptureRequest.CONTROL_AE_MODE, default = CaptureRequest.CONTROL_AE_MODE_ON))
+            request.getOrDefault(
+                CaptureRequest.CONTROL_AE_MODE, default = CaptureRequest.CONTROL_AE_MODE_ON
+            )
+        )
             .isEqualTo(CaptureRequest.CONTROL_AE_MODE_ON)
     }
 }
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessorTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessorTest.kt
index 715854c..a5b2acf 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessorTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequenceProcessorTest.kt
@@ -59,7 +59,8 @@
     private val mainLooper = Shadows.shadowOf(Looper.getMainLooper())
     private val cameraId =
         RobolectricCameras.create(
-            mapOf(INFO_SUPPORTED_HARDWARE_LEVEL to INFO_SUPPORTED_HARDWARE_LEVEL_FULL))
+            mapOf(INFO_SUPPORTED_HARDWARE_LEVEL to INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
+        )
     private val testCamera = RobolectricCameras.open(cameraId)
 
     private val stream1Config = CameraStream.Config.create(Size(640, 480), StreamFormat.YUV_420_888)
@@ -71,13 +72,15 @@
         CameraStream.Config.create(
             Size(1024, 768),
             StreamFormat.PRIVATE,
-            streamUseCase = OutputStream.StreamUseCase.PREVIEW)
+            streamUseCase = OutputStream.StreamUseCase.PREVIEW
+        )
 
     private val stream4Config =
         CameraStream.Config.create(
             Size(1024, 768),
             StreamFormat.PRIVATE,
-            streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD)
+            streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD
+        )
 
     private val graphConfig =
         CameraGraph.Config(
@@ -89,7 +92,8 @@
         CameraGraph.Config(
             camera = testCamera.cameraId,
             streams = listOf(stream3Config, stream4Config),
-            sessionMode = CameraGraph.OperatingMode.HIGH_SPEED)
+            sessionMode = CameraGraph.OperatingMode.HIGH_SPEED
+        )
 
     private val streamGraph = StreamGraphImpl(testCamera.metadata, graphConfig)
 
@@ -142,11 +146,14 @@
         val requestBuilder = fakeCameraDevice.fakeCamera.cameraDevice.createCaptureRequest(1)
         // Parameters
         requestBuilder.set(
-            CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH)
+            CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH
+        )
         requestBuilder.set(
-            CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
+            CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+        )
         requestBuilder.set(
-            CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO)
+            CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO
+        )
 
         // Surfaces
         requestBuilder.addTarget(surface1)
@@ -170,24 +177,28 @@
                 FakeThreads.fromTestScope(this),
                 RequestTemplate(1),
                 mapOf(stream1.id to surface1, stream2.id to surface2),
-                streamGraph)
+                streamGraph
+            )
 
         val sequence =
             captureSequenceProcessor.build(
                 isRepeating = false,
                 requests = listOf(Request(listOf(stream1.id, stream2.id))),
                 defaultParameters =
-                    mapOf<Any, Any?>(
-                        CaptureRequest.CONTROL_AE_MODE to
-                            CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
-                        CaptureRequest.CONTROL_AF_MODE to
-                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE),
+                mapOf<Any, Any?>(
+                    CaptureRequest.CONTROL_AE_MODE to
+                        CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
+                    CaptureRequest.CONTROL_AF_MODE to
+                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+                ),
                 requiredParameters =
-                    mapOf<Any, Any?>(
-                        CaptureRequest.CONTROL_AF_MODE to
-                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO),
+                mapOf<Any, Any?>(
+                    CaptureRequest.CONTROL_AF_MODE to
+                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO
+                ),
                 listeners = listOf(),
-                sequenceListener = FakeCaptureSequenceListener())
+                sequenceListener = FakeCaptureSequenceListener()
+            )
 
         val result = captureSequenceProcessor.submit(sequence!!)
 
@@ -206,7 +217,8 @@
                 FakeThreads.fromTestScope(this),
                 RequestTemplate(1),
                 mapOf(stream1.id to surface1),
-                streamGraph)
+                streamGraph
+            )
         val captureSequence =
             captureSequenceProcessor.build(
                 isRepeating = false,
@@ -214,7 +226,8 @@
                 defaultParameters = mapOf<Any, Any?>(),
                 requiredParameters = mapOf<Any, Any?>(),
                 listeners = emptyList(),
-                sequenceListener = FakeCaptureSequenceListener())
+                sequenceListener = FakeCaptureSequenceListener()
+            )
         assertThat(captureSequence).isNotNull()
 
         val result = captureSequenceProcessor.submit(captureSequence!!)
@@ -229,7 +242,8 @@
                 FakeThreads.fromTestScope(this),
                 RequestTemplate(1),
                 mapOf(stream1.id to surface1),
-                streamGraph)
+                streamGraph
+            )
 
         // Key part is that only stream1 has a surface, but stream2 is requested.
         val captureSequence =
@@ -239,7 +253,8 @@
                 defaultParameters = mapOf<Any, Any?>(),
                 requiredParameters = mapOf<Any, Any?>(),
                 listeners = emptyList(),
-                sequenceListener = FakeCaptureSequenceListener())
+                sequenceListener = FakeCaptureSequenceListener()
+            )
 
         assertThat(captureSequence).isNull()
     }
@@ -252,7 +267,8 @@
                 FakeThreads.fromTestScope(this),
                 RequestTemplate(1),
                 mapOf(stream1.id to surface1),
-                streamGraph)
+                streamGraph
+            )
         val captureSequence =
             captureSequenceProcessor.build(
                 isRepeating = false,
@@ -260,7 +276,8 @@
                 defaultParameters = mapOf<Any, Any?>(),
                 requiredParameters = mapOf<Any, Any?>(),
                 listeners = emptyList(),
-                sequenceListener = FakeCaptureSequenceListener())
+                sequenceListener = FakeCaptureSequenceListener()
+            )
 
         assertThat(captureSequence).isNotNull()
         assertThat(captureSequence!!.captureMetadataList).isNotEmpty()
@@ -278,24 +295,28 @@
                 FakeThreads.fromTestScope(this),
                 RequestTemplate(1),
                 mapOf(stream3.id to surface3, stream4.id to surface4),
-                highSpeedStreamGraph)
+                highSpeedStreamGraph
+            )
 
         val sequence =
             captureSequenceProcessor.build(
                 isRepeating = false,
                 requests = listOf(Request(listOf(stream3.id, stream4.id))),
                 defaultParameters =
-                    mapOf<Any, Any?>(
-                        CaptureRequest.CONTROL_AE_MODE to
-                            CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
-                        CaptureRequest.CONTROL_AF_MODE to
-                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE),
+                mapOf<Any, Any?>(
+                    CaptureRequest.CONTROL_AE_MODE to
+                        CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
+                    CaptureRequest.CONTROL_AF_MODE to
+                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+                ),
                 requiredParameters =
-                    mapOf<Any, Any?>(
-                        CaptureRequest.CONTROL_AF_MODE to
-                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO),
+                mapOf<Any, Any?>(
+                    CaptureRequest.CONTROL_AF_MODE to
+                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO
+                ),
                 listeners = listOf(),
-                sequenceListener = FakeCaptureSequenceListener())
+                sequenceListener = FakeCaptureSequenceListener()
+            )
 
         val result = captureSequenceProcessor.submit(sequence!!)
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
index ba53292..d1cf87b 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
@@ -46,7 +46,9 @@
                         CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
                     CameraCharacteristics.SENSOR_ORIENTATION to 90,
                     CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK,
-                    CameraCharacteristics.FLASH_INFO_AVAILABLE to true))
+                    CameraCharacteristics.FLASH_INFO_AVAILABLE to true
+                )
+            )
 
         val camera1 =
             RobolectricCameras.create(
@@ -55,7 +57,9 @@
                         CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3,
                     CameraCharacteristics.SENSOR_ORIENTATION to 0,
                     CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_FRONT,
-                    CameraCharacteristics.FLASH_INFO_AVAILABLE to false))
+                    CameraCharacteristics.FLASH_INFO_AVAILABLE to false
+                )
+            )
 
         val cache =
             Camera2MetadataCache(
@@ -63,7 +67,8 @@
                 FakeThreads.fromTestScope(this),
                 Permissions(RobolectricCameras.application),
                 CameraPipe.CameraMetadataConfig(),
-                SystemTimeSource())
+                SystemTimeSource()
+            )
 
         val metadata0 = cache.awaitCameraMetadata(camera0)
         val metadata1 = cache.awaitCameraMetadata(camera1)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionStateTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionStateTest.kt
index 578a55a..21b88e8 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionStateTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionStateTest.kt
@@ -69,7 +69,8 @@
 
     private val captureSessionFactory =
         FakeCaptureSessionFactory(
-            requiredStreams = setOf(stream1, stream2), deferrableStreams = setOf(stream3Deferred))
+            requiredStreams = setOf(stream1, stream2), deferrableStreams = setOf(stream3Deferred)
+        )
 
     private val fakeCameraDevice: CameraDeviceWrapper = mock()
     private val fakeCaptureSession: CameraCaptureSessionWrapper = mock()
@@ -89,7 +90,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
         // When disconnect is called first
         state.disconnect()
 
@@ -110,7 +112,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
 
         // When surfaces are configured
         state.configureSurfaceMap(mapOf(stream1 to surface1, stream2 to surface2))
@@ -136,7 +139,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
 
         // When surfaces are configured
         state.configureSurfaceMap(mapOf(stream1 to surface1, stream2 to surface2))
@@ -164,7 +168,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
         // When surfaces are configured
         state.configureSurfaceMap(mapOf(stream1 to surface1, stream2 to surface2))
         // And session is finalized
@@ -186,7 +191,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
         // When surfaces are configured
         state.configureSurfaceMap(mapOf(stream1 to surface1, stream2 to surface2))
         // And configuration fails
@@ -208,7 +214,8 @@
                 captureSequenceProcessorFactory,
                 cameraSurfaceManager,
                 timeSource,
-                this)
+                this
+            )
         // When surfaces are configured
         state.configureSurfaceMap(mapOf(stream1 to surface1, stream2 to surface2))
         // And the capture session is closed
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpenerTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpenerTest.kt
index 1bd2604..06d89fc 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpenerTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/RetryingCameraStateOpenerTest.kt
@@ -97,7 +97,8 @@
 
     private val retryingCameraStateOpener =
         RetryingCameraStateOpener(
-            cameraStateOpener, cameraAvailabilityMonitor, fakeTimeSource, fakeDevicePolicyManager)
+            cameraStateOpener, cameraAvailabilityMonitor, fakeTimeSource, fakeDevicePolicyManager
+        )
 
     // TODO(lnishan): Consider mocking this object when Mockito works well with value classes.
     private val fakeGraphListener =
@@ -121,12 +122,14 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_IN_USE,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_IN_USE,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -136,12 +139,14 @@
         fakeTimeSource.currentTimestamp = TimestampNs(30_000_000_000L) // 30 seconds
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_IN_USE,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_IN_USE,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isFalse()
     }
 
@@ -151,12 +156,14 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_UNDETERMINED,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_UNDETERMINED,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isFalse()
     }
 
@@ -166,18 +173,21 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_IN_USE,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_IN_USE,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // The second retry attempt should fail if SDK version < S, and succeed otherwise.
         val secondRetry =
             RetryingCameraStateOpener.shouldRetry(
-                CameraError.ERROR_CAMERA_IN_USE, 2, firstAttemptTimestamp, fakeTimeSource, false)
+                CameraError.ERROR_CAMERA_IN_USE, 2, firstAttemptTimestamp, fakeTimeSource, false
+            )
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
             assertThat(secondRetry).isFalse()
         } else {
@@ -191,22 +201,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_LIMIT_EXCEEDED,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_LIMIT_EXCEEDED,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should succeed as well.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_LIMIT_EXCEEDED,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_LIMIT_EXCEEDED,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -216,22 +230,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISABLED,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    camerasDisabledByDevicePolicy = true))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISABLED,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                camerasDisabledByDevicePolicy = true
+            )
+        )
             .isTrue()
 
         // Second attempt should fail if camera is disabled.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISABLED,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    camerasDisabledByDevicePolicy = true))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISABLED,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                camerasDisabledByDevicePolicy = true
+            )
+        )
             .isFalse()
     }
 
@@ -241,22 +259,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISABLED,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    camerasDisabledByDevicePolicy = false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISABLED,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                camerasDisabledByDevicePolicy = false
+            )
+        )
             .isTrue()
 
         // Second attempt should success if camera is not disabled.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISABLED,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    camerasDisabledByDevicePolicy = false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISABLED,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                camerasDisabledByDevicePolicy = false
+            )
+        )
             .isTrue()
     }
 
@@ -266,22 +288,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DEVICE,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DEVICE,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should succeed as well.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DEVICE,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DEVICE,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -291,22 +317,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_SERVICE,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_SERVICE,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should succeed as well.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_SERVICE,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_SERVICE,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -316,22 +346,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISCONNECTED,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISCONNECTED,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should succeed as well.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_CAMERA_DISCONNECTED,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_CAMERA_DISCONNECTED,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -341,22 +375,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_ILLEGAL_ARGUMENT_EXCEPTION,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_ILLEGAL_ARGUMENT_EXCEPTION,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should succeed as well.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_ILLEGAL_ARGUMENT_EXCEPTION,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_ILLEGAL_ARGUMENT_EXCEPTION,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
     }
 
@@ -366,22 +404,26 @@
         fakeTimeSource.currentTimestamp = TimestampNs(1_000_000_000L) // 1 second
 
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_SECURITY_EXCEPTION,
-                    1,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_SECURITY_EXCEPTION,
+                1,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isTrue()
 
         // Second attempt should fail.
         assertThat(
-                RetryingCameraStateOpener.shouldRetry(
-                    CameraError.ERROR_SECURITY_EXCEPTION,
-                    2,
-                    firstAttemptTimestamp,
-                    fakeTimeSource,
-                    false))
+            RetryingCameraStateOpener.shouldRetry(
+                CameraError.ERROR_SECURITY_EXCEPTION,
+                2,
+                firstAttemptTimestamp,
+                fakeTimeSource,
+                false
+            )
+        )
             .isFalse()
     }
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/VirtualCameraTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/VirtualCameraTest.kt
index 063d350..01c6aac 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/VirtualCameraTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/VirtualCameraTest.kt
@@ -89,7 +89,10 @@
             flowOf(
                 CameraStateOpen(
                     AndroidCameraDevice(
-                        testCamera.metadata, testCamera.cameraDevice, testCamera.cameraId)))
+                        testCamera.metadata, testCamera.cameraDevice, testCamera.cameraId
+                    )
+                )
+            )
         virtualCamera.connect(
             cameraState,
             object : Token {
@@ -118,12 +121,16 @@
             listOf(
                 CameraStateOpen(
                     AndroidCameraDevice(
-                        testCamera.metadata, testCamera.cameraDevice, testCamera.cameraId)),
+                        testCamera.metadata, testCamera.cameraDevice, testCamera.cameraId
+                    )
+                ),
                 CameraStateClosing(),
                 CameraStateClosed(
                     cameraId,
                     ClosedReason.CAMERA2_ERROR,
-                    cameraErrorCode = CameraError.ERROR_CAMERA_SERVICE))
+                    cameraErrorCode = CameraError.ERROR_CAMERA_SERVICE
+                )
+            )
 
         val events = mutableListOf<CameraState>()
         val job = launch { virtualCamera.state.collect { events.add(it) } }
@@ -167,7 +174,8 @@
                 testCamera.metadata,
                 attemptNumber = 1,
                 attemptTimestampNanos = now,
-                timeSource)
+                timeSource
+            )
 
         assertThat(listener.state.value).isInstanceOf(CameraStateUnopened.javaClass)
 
@@ -177,9 +185,10 @@
 
         assertThat(listener.state.value).isInstanceOf(CameraStateOpen::class.java)
         assertThat(
-                (listener.state.value as CameraStateOpen)
-                    .cameraDevice
-                    .unwrapAs(CameraDevice::class))
+            (listener.state.value as CameraStateOpen)
+                .cameraDevice
+                .unwrapAs(CameraDevice::class)
+        )
             .isSameInstanceAs(testCamera.cameraDevice)
 
         mainLooper.idleFor(1000, TimeUnit.MILLISECONDS)
@@ -210,7 +219,8 @@
                 testCamera.metadata,
                 attemptNumber = 1,
                 attemptTimestampNanos = now,
-                timeSource)
+                timeSource
+            )
 
         listener.onDisconnected(testCamera.cameraDevice)
         listener.onError(testCamera.cameraDevice, CameraDevice.StateCallback.ERROR_CAMERA_SERVICE)
@@ -230,7 +240,8 @@
                 testCamera.metadata,
                 attemptNumber = 1,
                 attemptTimestampNanos = now,
-                timeSource)
+                timeSource
+            )
 
         listener.close()
         mainLooper.idle()
@@ -247,7 +258,8 @@
                 testCamera.metadata,
                 attemptNumber = 1,
                 attemptTimestampNanos = now,
-                timeSource)
+                timeSource
+            )
 
         listener.closeWith(IllegalArgumentException("Test Exception"))
         mainLooper.idle()
@@ -264,7 +276,8 @@
                 testCamera.metadata,
                 attemptNumber = 1,
                 attemptTimestampNanos = now,
-                timeSource)
+                timeSource
+            )
 
         listener.onError(testCamera.cameraDevice, CameraDevice.StateCallback.ERROR_CAMERA_SERVICE)
         mainLooper.idle()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/config/CameraPipeComponentTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/config/CameraPipeComponentTest.kt
index 6e4969e..7be483a 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/config/CameraPipeComponentTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/config/CameraPipeComponentTest.kt
@@ -86,7 +86,9 @@
                         CameraGraph.Config(
                             camera = fakeCameraId,
                             streams = listOf(),
-                        )))
+                        )
+                    )
+                )
                 .build()
 
         val graph = graphComponent.cameraGraph()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CameraGraphImplTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CameraGraphImplTest.kt
index 6c4489a..e377214 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CameraGraphImplTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CameraGraphImplTest.kt
@@ -89,7 +89,8 @@
                 defaultBackendId = backend.id,
                 cameraBackends = mapOf(backend.id to CameraBackendFactory { backend }),
                 context,
-                threads)
+                threads
+            )
         val cameraContext = CameraBackendsImpl.CameraBackendContext(context, threads, backends)
         val streamGraph = StreamGraphImpl(metadata, graphConfig)
         cameraController =
@@ -106,7 +107,8 @@
                 surfaceGraph,
                 cameraController,
                 GraphState3A(),
-                Listener3A())
+                Listener3A()
+            )
         stream1 =
             checkNotNull(graph.streams[stream1Config]) {
                 "Failed to find stream for $stream1Config!"
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AForCaptureTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AForCaptureTest.kt
index 346f7d4..2aa755f 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AForCaptureTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AForCaptureTest.kt
@@ -65,18 +65,22 @@
         // this response i.e cameraResponse1, AF is still scanning so the result won't be complete.
         val cameraResponse = async {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_SEARCHING)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_SEARCHING
+                    )
+                )
+            )
         }
 
         cameraResponse.await()
@@ -86,18 +90,22 @@
         // lock3AForCapture call will complete.
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_CONVERGED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -130,18 +138,22 @@
         // complete.
         val cameraResponse = async {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_CONVERGED
+                    )
+                )
+            )
         }
 
         cameraResponse.await()
@@ -152,18 +164,22 @@
         // capture result corresponding to the submitted request suffices.
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_CONVERGED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -185,11 +201,13 @@
 
         val cameraResponse = async {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
-                FakeFrameMetadata(frameNumber = FrameNumber(101L), resultMetadata = mapOf()))
+                FakeFrameMetadata(frameNumber = FrameNumber(101L), resultMetadata = mapOf())
+            )
         }
 
         cameraResponse.await()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ALock3ATest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ALock3ATest.kt
index 537dd6d..8594455 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ALock3ATest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ALock3ATest.kt
@@ -57,7 +57,8 @@
         FakeCameraMetadata(
             mapOf(
                 CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES to
-                    intArrayOf(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)),
+                    intArrayOf(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
+            ),
         )
     private val controller3A = Controller3A(graphProcessor, fakeMetadata, graphState3A, listener3A)
 
@@ -71,7 +72,8 @@
         val result =
             controller3A.lock3A(
                 afLockBehavior = Lock3ABehavior.IMMEDIATE,
-                aeLockBehavior = Lock3ABehavior.IMMEDIATE)
+                aeLockBehavior = Lock3ABehavior.IMMEDIATE
+            )
         assertThat(result.isCompleted).isFalse()
 
         // Since requirement of to lock both AE and AF immediately, the requests to lock AE and AF
@@ -80,18 +82,22 @@
         // result won't be complete.
         val cameraResponse = async {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         cameraResponse.await()
@@ -101,18 +107,22 @@
         // will complete.
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -139,25 +149,30 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.IMMEDIATE,
-                    aeLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN)
+                    aeLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
         // Launch a task to repeatedly invoke a given capture result.
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -175,18 +190,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -208,25 +227,30 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.IMMEDIATE,
-                    aeLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN)
+                    aeLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
 
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -241,18 +265,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -280,24 +308,29 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN,
-                    aeLockBehavior = Lock3ABehavior.IMMEDIATE)
+                    aeLockBehavior = Lock3ABehavior.IMMEDIATE
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -307,18 +340,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -347,24 +384,29 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN,
-                    aeLockBehavior = Lock3ABehavior.IMMEDIATE)
+                    aeLockBehavior = Lock3ABehavior.IMMEDIATE
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -374,18 +416,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -419,24 +465,29 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN,
-                    aeLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN)
+                    aeLockBehavior = Lock3ABehavior.AFTER_CURRENT_SCAN
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -446,18 +497,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -500,24 +555,29 @@
             globalScope.async {
                 controller3A.lock3A(
                     afLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN,
-                    aeLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN)
+                    aeLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN
+                )
             }
         assertThat(lock3AAsyncTask.isCompleted).isFalse()
         globalScope.launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_CONVERGED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED,
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_CONVERGED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -527,18 +587,22 @@
 
         globalScope.launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -574,7 +638,8 @@
                 aeRegions = listOf(aeMeteringRegion),
                 afRegions = listOf(afMeteringRegion),
                 afLockBehavior = Lock3ABehavior.IMMEDIATE,
-                aeLockBehavior = Lock3ABehavior.IMMEDIATE)
+                aeLockBehavior = Lock3ABehavior.IMMEDIATE
+            )
         assertThat(result.isCompleted).isFalse()
 
         // Since requirement of to lock both AE and AF immediately, the requests to lock AE and AF
@@ -583,18 +648,22 @@
         // result won't be complete.
         val cameraResponse = async {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         cameraResponse.await()
@@ -604,18 +673,22 @@
         // will complete.
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_LOCKED
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -648,7 +721,8 @@
             FakeCameraMetadata(
                 mapOf(
                     CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES to
-                        intArrayOf(CaptureRequest.CONTROL_AF_MODE_OFF)),
+                        intArrayOf(CaptureRequest.CONTROL_AF_MODE_OFF)
+                ),
             )
         val controller3A = Controller3A(graphProcessor, fakeMetadata, graphState3A, listener3A)
         val result = controller3A.lock3A(afLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN).await()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASetTorchTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASetTorchTest.kt
index 520954e..b5edf4f 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASetTorchTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASetTorchTest.kt
@@ -62,16 +62,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_ON,
-                            CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_TORCH)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_ON,
+                        CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_TORCH
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -87,16 +91,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_ON,
-                            CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_OFF)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_ON,
+                        CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_OFF
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -114,16 +122,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_OFF,
-                            CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_TORCH)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_OFF,
+                        CaptureResult.FLASH_MODE to CaptureResult.FLASH_MODE_TORCH
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASubmit3ATest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASubmit3ATest.kt
index ce86e0d..924c289 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASubmit3ATest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3ASubmit3ATest.kt
@@ -67,14 +67,17 @@
         val result = controller3A.submit3A(afMode = AfMode.OFF)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_OFF)))
+                    mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_OFF)
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -86,16 +89,20 @@
         val result = controller3A.submit3A(aeMode = AeMode.ON_ALWAYS_FLASH)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_MODE to
-                                CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_MODE to
+                            CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -107,16 +114,20 @@
         val result = controller3A.submit3A(awbMode = AwbMode.CLOUDY_DAYLIGHT)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AWB_MODE to
-                                CaptureResult.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)))
+                    mapOf(
+                        CaptureResult.CONTROL_AWB_MODE to
+                            CaptureResult.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -128,16 +139,19 @@
         val result = controller3A.submit3A(afRegions = listOf(MeteringRectangle(1, 1, 100, 100, 2)))
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -149,16 +163,19 @@
         val result = controller3A.submit3A(aeRegions = listOf(MeteringRectangle(1, 1, 100, 100, 2)))
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -172,16 +189,19 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AWB_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AWB_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUnlock3ATest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUnlock3ATest.kt
index fcb0d26..951bce4 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUnlock3ATest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUnlock3ATest.kt
@@ -51,7 +51,8 @@
         FakeCameraMetadata(
             mapOf(
                 CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES to
-                    intArrayOf(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)),
+                    intArrayOf(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
+            ),
         )
     private val controller3A = Controller3A(graphProcessor, fakeMetadata, graphState3A, listener3A)
 
@@ -68,16 +69,20 @@
         val repeatingJob = launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_LOCKED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -95,16 +100,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_SEARCHING)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_SEARCHING
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -120,16 +129,20 @@
         val repeatingJob = launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -148,16 +161,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_INACTIVE)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_INACTIVE
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -173,16 +190,20 @@
         val repeatingJob = launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AWB_STATE to
-                                    CaptureResult.CONTROL_AWB_STATE_LOCKED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AWB_STATE to
+                                CaptureResult.CONTROL_AWB_STATE_LOCKED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -200,16 +221,20 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AWB_STATE to
-                                CaptureResult.CONTROL_AWB_STATE_SEARCHING)))
+                    mapOf(
+                        CaptureResult.CONTROL_AWB_STATE to
+                            CaptureResult.CONTROL_AWB_STATE_SEARCHING
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -225,18 +250,22 @@
         val repeatingJob = launch {
             while (true) {
                 listener3A.onRequestSequenceCreated(
-                    FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                    FakeRequestMetadata(requestNumber = RequestNumber(1))
+                )
                 listener3A.onPartialCaptureResult(
                     FakeRequestMetadata(requestNumber = RequestNumber(1)),
                     FrameNumber(101L),
                     FakeFrameMetadata(
                         frameNumber = FrameNumber(101L),
                         resultMetadata =
-                            mapOf(
-                                CaptureResult.CONTROL_AE_STATE to
-                                    CaptureResult.CONTROL_AE_STATE_LOCKED,
-                                CaptureResult.CONTROL_AF_STATE to
-                                    CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        mapOf(
+                            CaptureResult.CONTROL_AE_STATE to
+                                CaptureResult.CONTROL_AE_STATE_LOCKED,
+                            CaptureResult.CONTROL_AF_STATE to
+                                CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                        )
+                    )
+                )
                 delay(FRAME_RATE_MS)
             }
         }
@@ -258,18 +287,22 @@
 
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_STATE to
-                                CaptureResult.CONTROL_AF_STATE_INACTIVE,
-                            CaptureResult.CONTROL_AE_STATE to
-                                CaptureResult.CONTROL_AE_STATE_SEARCHING)))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_STATE to
+                            CaptureResult.CONTROL_AF_STATE_INACTIVE,
+                        CaptureResult.CONTROL_AE_STATE to
+                            CaptureResult.CONTROL_AE_STATE_SEARCHING
+                    )
+                )
+            )
         }
 
         val result3A = result.await()
@@ -283,7 +316,8 @@
             FakeCameraMetadata(
                 mapOf(
                     CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES to
-                        intArrayOf(CaptureRequest.CONTROL_AF_MODE_OFF)),
+                        intArrayOf(CaptureRequest.CONTROL_AF_MODE_OFF)
+                ),
             )
         val controller3A = Controller3A(graphProcessor, fakeMetadata, graphState3A, listener3A)
         val result = controller3A.unlock3A(af = true).await()
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUpdate3ATest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUpdate3ATest.kt
index 5682eb6..75e21ef 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUpdate3ATest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Controller3AUpdate3ATest.kt
@@ -83,14 +83,17 @@
         val result = controller3A.update3A(afMode = AfMode.OFF)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_OFF)))
+                    mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_OFF)
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -104,16 +107,20 @@
         val result = controller3A.update3A(aeMode = AeMode.ON_ALWAYS_FLASH)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_MODE to
-                                CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH)))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_MODE to
+                            CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -127,16 +134,20 @@
         val result = controller3A.update3A(awbMode = AwbMode.CLOUDY_DAYLIGHT)
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AWB_MODE to
-                                CaptureResult.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)))
+                    mapOf(
+                        CaptureResult.CONTROL_AWB_MODE to
+                            CaptureResult.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT
+                    )
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -150,16 +161,19 @@
         val result = controller3A.update3A(afRegions = listOf(MeteringRectangle(1, 1, 100, 100, 2)))
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AF_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AF_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -173,16 +187,19 @@
         val result = controller3A.update3A(aeRegions = listOf(MeteringRectangle(1, 1, 100, 100, 2)))
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AE_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AE_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
@@ -197,16 +214,19 @@
             controller3A.update3A(awbRegions = listOf(MeteringRectangle(1, 1, 100, 100, 2)))
         launch {
             listener3A.onRequestSequenceCreated(
-                FakeRequestMetadata(requestNumber = RequestNumber(1)))
+                FakeRequestMetadata(requestNumber = RequestNumber(1))
+            )
             listener3A.onPartialCaptureResult(
                 FakeRequestMetadata(requestNumber = RequestNumber(1)),
                 FrameNumber(101L),
                 FakeFrameMetadata(
                     frameNumber = FrameNumber(101L),
                     resultMetadata =
-                        mapOf(
-                            CaptureResult.CONTROL_AWB_REGIONS to
-                                Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })))
+                    mapOf(
+                        CaptureResult.CONTROL_AWB_REGIONS to
+                            Array(1) { MeteringRectangle(1, 1, 99, 99, 2) })
+                )
+            )
         }
         val result3A = result.await()
         assertThat(result3A.frameMetadata!!.frameNumber.value).isEqualTo(101L)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CorrectedFrameMetadataTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CorrectedFrameMetadataTest.kt
index 73bd154..2b7df96 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CorrectedFrameMetadataTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/CorrectedFrameMetadataTest.kt
@@ -37,15 +37,19 @@
                 mapOf(
                     CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_ON,
                     CaptureResult.CONTROL_AF_MODE to
-                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE),
-                mapOf(FakeMetadata.TEST_KEY to 42))
+                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+                ),
+                mapOf(FakeMetadata.TEST_KEY to 42)
+            )
 
         val fixed =
             CorrectedFrameMetadata(
                 metadata,
                 mapOf(
                     CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_OFF,
-                    CaptureResult.LENS_STATE to CaptureResult.LENS_STATE_STATIONARY))
+                    CaptureResult.LENS_STATE to CaptureResult.LENS_STATE_STATIONARY
+                )
+            )
 
         assertThat(fixed[CaptureResult.CONTROL_AE_MODE])
             .isEqualTo(CaptureResult.CONTROL_AE_MODE_OFF)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/GraphProcessorTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/GraphProcessorTest.kt
index 5b80a9d..c585e41 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/GraphProcessorTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/GraphProcessorTest.kt
@@ -79,7 +79,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
         graphProcessor.onGraphStarted(graphRequestProcessor1)
         graphProcessor.submit(request1)
         advanceUntilIdle()
@@ -99,7 +100,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.onGraphStarted(graphRequestProcessor1)
         graphProcessor.onGraphStarted(graphRequestProcessor2)
@@ -121,7 +123,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.submit(request1)
         graphProcessor.submit(request2)
@@ -147,7 +150,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.submit(listOf(request1, request2))
         graphProcessor.onGraphStarted(graphRequestProcessor1)
@@ -165,7 +169,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         fakeProcessor1.rejectRequests = true
         graphProcessor.onGraphStarted(graphRequestProcessor1)
@@ -195,7 +200,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         // Note: setting the requestProcessor, and calling submit() can both trigger a call
         // to submit a request.
@@ -231,7 +237,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.onGraphStarted(graphRequestProcessor1)
         graphProcessor.startRepeating(request1)
@@ -254,7 +261,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.onGraphStarted(graphRequestProcessor1)
         graphProcessor.startRepeating(request1)
@@ -280,7 +288,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         fakeProcessor1.rejectRequests = true
         graphProcessor.onGraphStarted(graphRequestProcessor1)
@@ -301,7 +310,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.startRepeating(request1)
         graphProcessor.submit(request2)
@@ -314,16 +324,16 @@
 
         // Loop until we see at least one repeating request, and one submit event.
         launch {
-                while (!hasRequest1Event && !hasRequest2Event) {
-                    val event = fakeProcessor1.nextEvent()
-                    hasRequest1Event =
-                        hasRequest1Event ||
-                            event.requestSequence?.captureRequestList?.contains(request1) ?: false
-                    hasRequest2Event =
-                        hasRequest2Event ||
-                            event.requestSequence?.captureRequestList?.contains(request2) ?: false
-                }
+            while (!hasRequest1Event && !hasRequest2Event) {
+                val event = fakeProcessor1.nextEvent()
+                hasRequest1Event =
+                    hasRequest1Event ||
+                        event.requestSequence?.captureRequestList?.contains(request1) ?: false
+                hasRequest2Event =
+                    hasRequest2Event ||
+                        event.requestSequence?.captureRequestList?.contains(request2) ?: false
             }
+        }
             .join()
     }
 
@@ -335,7 +345,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
 
         graphProcessor.startRepeating(request1)
         graphProcessor.submit(request2)
@@ -366,7 +377,8 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
         graphProcessor.close()
 
         // Abort queued and in-flight requests.
@@ -391,12 +403,14 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
         assertThat(graphProcessor.graphState.value).isEqualTo(GraphStateStopped)
 
         graphProcessor.onGraphStarted(graphRequestProcessor1)
         graphProcessor.onGraphError(
-            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true))
+            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
+        )
         assertThat(graphProcessor.graphState.value).isInstanceOf(GraphStateError::class.java)
     }
 
@@ -408,11 +422,13 @@
                 FakeGraphConfigs.graphConfig,
                 graphState3A,
                 this,
-                arrayListOf(globalListener))
+                arrayListOf(globalListener)
+            )
         assertThat(graphProcessor.graphState.value).isEqualTo(GraphStateStopped)
 
         graphProcessor.onGraphError(
-            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true))
+            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
+        )
         assertThat(graphProcessor.graphState.value).isEqualTo(GraphStateStopped)
 
         graphProcessor.onGraphStarting()
@@ -421,13 +437,15 @@
         // GraphProcessor should drop errors while the camera graph is stopping.
         graphProcessor.onGraphStopping()
         graphProcessor.onGraphError(
-            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true))
+            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
+        )
         assertThat(graphProcessor.graphState.value).isEqualTo(GraphStateStopped)
 
         // GraphProcessor should also drop errors while the camera graph is stopped.
         graphProcessor.onGraphStopped(graphRequestProcessor1)
         graphProcessor.onGraphError(
-            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true))
+            GraphStateError(CameraError.ERROR_CAMERA_DEVICE, willAttemptRetry = true)
+        )
         assertThat(graphProcessor.graphState.value).isEqualTo(GraphStateStopped)
     }
 }
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Listener3ATest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Listener3ATest.kt
index 0bc44fd..919a722 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Listener3ATest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Listener3ATest.kt
@@ -38,7 +38,8 @@
     fun testListenersInvoked() {
         val result3AStateListener =
             Result3AStateListenerImpl(
-                mapOf(CaptureResult.CONTROL_AF_MODE to listOf(CaptureResult.CONTROL_AF_MODE_AUTO)))
+                mapOf(CaptureResult.CONTROL_AF_MODE to listOf(CaptureResult.CONTROL_AF_MODE_AUTO))
+            )
         val listener3A = Listener3A()
         listener3A.addListener(result3AStateListener)
 
@@ -50,7 +51,8 @@
         val frameNumber = FrameNumber(1L)
         val captureResult =
             FakeFrameMetadata(
-                mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_AUTO))
+                mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_AUTO)
+            )
         // Once the correct metadata is updated the listener3A should broadcast it to the
         // result3AState listener added to it, making the deferred result complete.
         listener3A.onPartialCaptureResult(requestMetadata, frameNumber, captureResult)
@@ -64,7 +66,10 @@
                 Result3AStateListenerImpl(
                     mapOf(
                         CaptureResult.CONTROL_AF_MODE to
-                            listOf(CaptureResult.CONTROL_AF_MODE_AUTO))))
+                            listOf(CaptureResult.CONTROL_AF_MODE_AUTO)
+                    )
+                )
+            )
         val listener3A = Listener3A()
         listener3A.addListener(result3AStateListener)
 
@@ -75,12 +80,16 @@
             FakeFrameMetadata(
                 mapOf(
                     CaptureResult.CONTROL_AF_MODE to
-                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE))
+                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+                )
+            )
         val captureResult1 =
             FakeFrameMetadata(
                 mapOf(
                     CaptureResult.CONTROL_AF_MODE to
-                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE))
+                        CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE
+                )
+            )
         listener3A.onPartialCaptureResult(requestMetadata, FrameNumber(1), captureResult)
         assertThat(result3AStateListener.updateCount).isEqualTo(1)
 
@@ -97,13 +106,19 @@
                 Result3AStateListenerImpl(
                     mapOf(
                         CaptureResult.CONTROL_AF_MODE to
-                            listOf(CaptureResult.CONTROL_AF_MODE_AUTO))))
+                            listOf(CaptureResult.CONTROL_AF_MODE_AUTO)
+                    )
+                )
+            )
         val result3AStateListener2 =
             UpdateCounting3AStateListener(
                 Result3AStateListenerImpl(
                     mapOf(
                         CaptureResult.CONTROL_AE_MODE to
-                            listOf(CaptureResult.CONTROL_AE_MODE_OFF))))
+                            listOf(CaptureResult.CONTROL_AE_MODE_OFF)
+                    )
+                )
+            )
 
         val listener3A = Listener3A()
         listener3A.addListener(result3AStateListener1)
@@ -113,7 +128,8 @@
         val frameNumber = FrameNumber(1L)
         val captureResult =
             FakeFrameMetadata(
-                mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_AUTO))
+                mapOf(CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_AUTO)
+            )
 
         // There should be no update to either of the listeners right now.
         assertThat(result3AStateListener1.updateCount).isEqualTo(0)
@@ -134,7 +150,9 @@
             FakeFrameMetadata(
                 mapOf(
                     CaptureResult.CONTROL_AF_MODE to CaptureResult.CONTROL_AF_MODE_AUTO,
-                    CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_OFF))
+                    CaptureResult.CONTROL_AE_MODE to CaptureResult.CONTROL_AE_MODE_OFF
+                )
+            )
         listener3A.onPartialCaptureResult(requestMetadata, frameNumber, captureResult1)
         assertThat(result3AStateListener1.updateCount).isEqualTo(1)
         assertThat(result3AStateListener2.updateCount).isEqualTo(2)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Result3AStateListenerImplTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Result3AStateListenerImplTest.kt
index a7bcd0b..e6519a8 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Result3AStateListenerImplTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/Result3AStateListenerImplTest.kt
@@ -59,7 +59,9 @@
             Result3AStateListenerImpl(
                 mapOf(
                     CaptureResult.CONTROL_AF_STATE to
-                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                )
+            )
         assertThat(listenerForKeys.result.isCompleted).isFalse()
     }
 
@@ -69,15 +71,19 @@
             Result3AStateListenerImpl(
                 mapOf(
                     CaptureResult.CONTROL_AF_STATE to
-                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN
+                )
+            )
 
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
@@ -89,15 +95,19 @@
             Result3AStateListenerImpl(
                 mapOf(
                     CaptureResult.CONTROL_AF_STATE to
-                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isTrue()
     }
@@ -108,14 +118,18 @@
             Result3AStateListenerImpl(
                 mapOf(
                     CaptureResult.CONTROL_AF_STATE to
-                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_CONVERGED))
+                mapOf(
+                    CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_CONVERGED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
     }
@@ -128,18 +142,23 @@
                     CaptureResult.CONTROL_AF_STATE to
                         listOf(
                             CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED),
+                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
+                        ),
                     CaptureResult.CONTROL_AE_STATE to
-                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                        CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                    CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_LOCKED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isTrue()
     }
@@ -152,17 +171,22 @@
                     CaptureResult.CONTROL_AF_STATE to
                         listOf(
                             CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED),
+                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
+                        ),
                     CaptureResult.CONTROL_AE_STATE to
-                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
     }
@@ -175,27 +199,34 @@
                     CaptureResult.CONTROL_AF_STATE to
                         listOf(
                             CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED),
+                            CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
+                        ),
                     CaptureResult.CONTROL_AE_STATE to
-                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AE_STATE_LOCKED)
+                )
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata1 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
-                        CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
+                    CaptureResult.CONTROL_AE_STATE to CaptureResult.CONTROL_AE_STATE_LOCKED
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata1)
         assertThat(listenerForKeys.result.isCompleted).isTrue()
     }
@@ -205,39 +236,47 @@
         val listenerForKeys =
             Result3AStateListenerImpl(
                 exitConditionForKeys =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)),
-                timeLimitNs = 1000000000L)
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                ),
+                timeLimitNs = 1000000000L
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         val frameMetadata1 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 400000000L))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 400000000L
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata1)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata2 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 900000000L))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 900000000L
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata2)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata3 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 1500000000L))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 1500000000L
+                )
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata3)
         val completedDeferred = listenerForKeys.result
         assertThat(completedDeferred.isCompleted).isTrue()
@@ -250,10 +289,12 @@
         val listenerForKeys =
             Result3AStateListenerImpl(
                 exitConditionForKeys =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)),
-                frameLimit = 10)
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                ),
+                frameLimit = 10
+            )
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
 
         listenerForKeys.onRequestSequenceCreated(RequestNumber(1))
@@ -261,44 +302,52 @@
         val frameMetadata1 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 400000000L),
-                frameNumber = FrameNumber(1))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 400000000L
+                ),
+                frameNumber = FrameNumber(1)
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata1)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata2 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 900000000L),
-                frameNumber = FrameNumber(3))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 900000000L
+                ),
+                frameNumber = FrameNumber(3)
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata2)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata3 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 1500000000L),
-                frameNumber = FrameNumber(10))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 1500000000L
+                ),
+                frameNumber = FrameNumber(10)
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata3)
         assertThat(listenerForKeys.result.isCompleted).isFalse()
 
         val frameMetadata4 =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
-                        CaptureResult.SENSOR_TIMESTAMP to 1700000000L),
-                frameNumber = FrameNumber(12))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN,
+                    CaptureResult.SENSOR_TIMESTAMP to 1700000000L
+                ),
+                frameNumber = FrameNumber(12)
+            )
         listenerForKeys.update(RequestNumber(1), frameMetadata4)
         val completedDeferred = listenerForKeys.result
 
@@ -313,14 +362,18 @@
             Result3AStateListenerImpl(
                 mapOf(
                     CaptureResult.CONTROL_AF_STATE to
-                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)))
+                        listOf(CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED)
+                )
+            )
 
         val frameMetadata =
             FakeFrameMetadata(
                 resultMetadata =
-                    mapOf(
-                        CaptureResult.CONTROL_AF_STATE to
-                            CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED))
+                mapOf(
+                    CaptureResult.CONTROL_AF_STATE to
+                        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+                )
+            )
         // The reference request number of not yet set on the listener, so the update will be
         // ignored.
         listenerForKeys.update(RequestNumber(1), frameMetadata)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
index 388e8b6..1968e06 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
@@ -84,7 +84,8 @@
                     OutputStream.Config.create(Size(800, 600), StreamFormat.YUV_420_888),
                     OutputStream.Config.create(Size(1600, 1200), StreamFormat.YUV_420_888),
                     OutputStream.Config.create(Size(800, 600), StreamFormat.YUV_420_888),
-                ))
+                )
+            )
         val graphConfig =
             CameraGraph.Config(
                 camera = CameraId("TestCamera"),
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/SurfaceGraphTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/SurfaceGraphTest.kt
index dc160cf..73b8a55 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/SurfaceGraphTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/SurfaceGraphTest.kt
@@ -202,6 +202,7 @@
         verify(fakeSurfaceListener, never()).onSurfaceInactive(eq(fakeSurface2))
         verify(fakeSurfaceListener, never()).onSurfaceInactive(eq(fakeSurface3))
     }
+
     @Test
     fun settingSurfaceToPreviouslySetSurfaceIsANoOp() {
         surfaceGraph[stream1.id] = fakeSurface1
@@ -214,6 +215,7 @@
         verify(fakeSurfaceListener, never()).onSurfaceInactive(eq(fakeSurface2))
         verify(fakeSurfaceListener, never()).onSurfaceInactive(eq(fakeSurface3))
     }
+
     @Test
     fun settingSurfaceToNullThenPreviousSurfaceWillReaquireSurfaceToken() {
         surfaceGraph[stream1.id] = fakeSurface1
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraDeviceWrapper.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraDeviceWrapper.kt
index 33d454e..33c7946 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraDeviceWrapper.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeCameraDeviceWrapper.kt
@@ -53,7 +53,8 @@
             return Api23Compat.createReprocessCaptureRequest(fakeCamera.cameraDevice, inputResult)
         }
         throw UnsupportedOperationException(
-            "createReprocessCaptureRequest is not supported below API 23")
+            "createReprocessCaptureRequest is not supported below API 23"
+        )
     }
 
     override fun createCaptureSession(
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphConfigs.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphConfigs.kt
index 8bd64cd..1232911 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphConfigs.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphConfigs.kt
@@ -38,37 +38,45 @@
             mapOf(
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL to
                     CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
-                CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK),
-            cameraId = camera1)
+                CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK
+            ),
+            cameraId = camera1
+        )
     val fakeMetadata2 =
         FakeCameraMetadata(
             mapOf(
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL to
                     CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
-                CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_FRONT),
-            cameraId = camera2)
+                CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_FRONT
+            ),
+            cameraId = camera2
+        )
     val fakeCameraBackend =
         FakeCameraBackend(
-            mapOf(fakeMetadata.camera to fakeMetadata, fakeMetadata2.camera to fakeMetadata2))
+            mapOf(fakeMetadata.camera to fakeMetadata, fakeMetadata2.camera to fakeMetadata2)
+        )
 
     val streamConfig1 =
         CameraStream.Config.create(size = Size(100, 100), format = StreamFormat.YUV_420_888)
     val streamConfig2 =
         CameraStream.Config.create(
-            size = Size(123, 321), format = StreamFormat.YUV_420_888, camera = camera1)
+            size = Size(123, 321), format = StreamFormat.YUV_420_888, camera = camera1
+        )
     val streamConfig3 =
         CameraStream.Config.create(
             size = Size(200, 200),
             format = StreamFormat.YUV_420_888,
             camera = camera2,
-            outputType = OutputStream.OutputType.SURFACE_TEXTURE)
+            outputType = OutputStream.OutputType.SURFACE_TEXTURE
+        )
     val streamConfig4 =
         CameraStream.Config.create(
             size = Size(200, 200),
             format = StreamFormat.YUV_420_888,
             camera = camera2,
             outputType = OutputStream.OutputType.SURFACE_TEXTURE,
-            mirrorMode = OutputStream.MirrorMode.MIRROR_MODE_H)
+            mirrorMode = OutputStream.MirrorMode.MIRROR_MODE_H
+        )
     val streamConfig5 =
         CameraStream.Config.create(
             size = Size(200, 200),
@@ -76,7 +84,8 @@
             camera = camera2,
             outputType = OutputStream.OutputType.SURFACE_TEXTURE,
             mirrorMode = OutputStream.MirrorMode.MIRROR_MODE_AUTO,
-            timestampBase = OutputStream.TimestampBase.TIMESTAMP_BASE_MONOTONIC)
+            timestampBase = OutputStream.TimestampBase.TIMESTAMP_BASE_MONOTONIC
+        )
     val streamConfig6 =
         CameraStream.Config.create(
             size = Size(200, 200),
@@ -85,7 +94,8 @@
             outputType = OutputStream.OutputType.SURFACE_TEXTURE,
             mirrorMode = OutputStream.MirrorMode.MIRROR_MODE_AUTO,
             timestampBase = OutputStream.TimestampBase.TIMESTAMP_BASE_DEFAULT,
-            dynamicRangeProfile = OutputStream.DynamicRangeProfile.PUBLIC_MAX)
+            dynamicRangeProfile = OutputStream.DynamicRangeProfile.PUBLIC_MAX
+        )
 
     val streamConfig7 =
         CameraStream.Config.create(
@@ -96,11 +106,13 @@
             mirrorMode = OutputStream.MirrorMode.MIRROR_MODE_AUTO,
             timestampBase = OutputStream.TimestampBase.TIMESTAMP_BASE_DEFAULT,
             dynamicRangeProfile = OutputStream.DynamicRangeProfile.STANDARD,
-            streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD)
+            streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD
+        )
 
     val sharedOutputConfig =
         OutputStream.Config.create(
-            size = Size(200, 200), format = StreamFormat.YUV_420_888, camera = camera1)
+            size = Size(200, 200), format = StreamFormat.YUV_420_888, camera = camera1
+        )
     val sharedStreamConfig1 = CameraStream.Config.create(sharedOutputConfig)
     val sharedStreamConfig2 = CameraStream.Config.create(sharedOutputConfig)
 
@@ -108,17 +120,19 @@
         CameraGraph.Config(
             camera = camera1,
             streams =
-                listOf(
-                    streamConfig1,
-                    streamConfig2,
-                    streamConfig3,
-                    streamConfig4,
-                    streamConfig5,
-                    streamConfig6,
-                    streamConfig7,
-                    sharedStreamConfig1,
-                    sharedStreamConfig2),
+            listOf(
+                streamConfig1,
+                streamConfig2,
+                streamConfig3,
+                streamConfig4,
+                streamConfig5,
+                streamConfig6,
+                streamConfig7,
+                sharedStreamConfig1,
+                sharedStreamConfig2
+            ),
             streamSharingGroups = listOf(listOf(streamConfig1, streamConfig2)),
             defaultParameters = mapOf(CaptureRequest.JPEG_THUMBNAIL_QUALITY to 24),
-            requiredParameters = mapOf(CaptureRequest.JPEG_THUMBNAIL_QUALITY to 42))
+            requiredParameters = mapOf(CaptureRequest.JPEG_THUMBNAIL_QUALITY to 42)
+        )
 }
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphProcessor.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphProcessor.kt
index ef343be..128e70c 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphProcessor.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/FakeGraphProcessor.kt
@@ -89,7 +89,8 @@
                     requests = listOf(currRepeatingRequest),
                     defaultParameters = defaultParameters,
                     requiredParameters = requiredParameters,
-                    listeners = defaultListeners)
+                    listeners = defaultListeners
+                )
         }
     }
 
@@ -163,6 +164,7 @@
             requests = listOf(currRepeatingRequest),
             defaultParameters = defaultParameters,
             requiredParameters = requiredParameters,
-            listeners = defaultListeners)
+            listeners = defaultListeners
+        )
     }
 }
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameraPipeTestRunner.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameraPipeTestRunner.kt
index 86b2ba2..b30909c 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameraPipeTestRunner.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameraPipeTestRunner.kt
@@ -46,7 +46,8 @@
     }
 }
 
-@JvmInline public value class TestValue(public val value: String)
+@JvmInline
+public value class TestValue(public val value: String)
 
 public data class TestData(val value1: TestValue, val value2: String)
 
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
index e680af6..cf5cbba 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
@@ -106,7 +106,8 @@
                 characteristics,
                 FakeCameraMetadataProvider(),
                 emptyMap(),
-                emptySet())
+                emptySet()
+            )
 
         @Suppress("SyntheticAccessor") val callback = CameraStateCallback(cameraId)
         cameraManager.openCamera(cameraId.value, callback, Handler())
@@ -150,7 +151,8 @@
 
         override fun onDisconnected(camera: CameraDevice) {
             throw UnsupportedOperationException(
-                "onDisconnected is not expected for Robolectric Camera")
+                "onDisconnected is not expected for Robolectric Camera"
+            )
         }
 
         override fun onError(camera: CameraDevice, error: Int) {
@@ -169,7 +171,8 @@
     fun fakeCamerasCanBeOpened() {
         val fakeCameraId =
             RobolectricCameras.create(
-                mapOf(CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK))
+                mapOf(CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK)
+            )
         val fakeCamera = RobolectricCameras.open(fakeCameraId)
 
         Truth.assertThat(fakeCamera).isNotNull()
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.kt
index d98a0a7..bde605f 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.kt
@@ -619,6 +619,11 @@
         return forwardCameraManagerCompatImpl.cameraIdList
     }
 
+    @Throws(CameraAccessExceptionCompat::class)
+    override fun getConcurrentCameraIds(): MutableSet<MutableSet<String>> {
+        return forwardCameraManagerCompatImpl.concurrentCameraIds
+    }
+
     override fun registerAvailabilityCallback(
         executor: Executor,
         callback: AvailabilityCallback
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
index 419da9e..d0c8fd7 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
@@ -440,6 +440,10 @@
             return forwardCameraManager.cameraIdList
         }
 
+        override fun getConcurrentCameraIds(): MutableSet<MutableSet<String>> {
+            return forwardCameraManager.concurrentCameraIds
+        }
+
         override fun registerAvailabilityCallback(
             executor: Executor,
             callback: CameraManager.AvailabilityCallback
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
index 2f1c922..1e1bc2c 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
@@ -100,8 +100,6 @@
         mCameraCharacteristics =
                 CameraUtil.getCameraCharacteristics(CameraSelector.LENS_FACING_BACK);
 
-        assumeTrue(getMaxDigitalZoom() >= 2.0);
-
         mControlUpdateCallback = mock(ControlUpdateCallback.class);
         mHandlerThread = new HandlerThread("ControlThread");
         mHandlerThread.start();
@@ -110,6 +108,8 @@
         ScheduledExecutorService executorService = CameraXExecutors.newHandlerExecutor(mHandler);
         mCameraCharacteristicsCompat = CameraCharacteristicsCompat.toCameraCharacteristicsCompat(
                 mCameraCharacteristics);
+        assumeTrue(getMaxDigitalZoom() >= 2.0);
+
         mCamera2CameraControlImpl = new Camera2CameraControlImpl(mCameraCharacteristicsCompat,
                 executorService, executorService, mControlUpdateCallback);
 
@@ -563,6 +563,10 @@
     }
 
     private float getMaxDigitalZoom() {
+        if (isAndroidRZoomEnabled()) {
+            return mCameraCharacteristics.get(
+                    CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE).getUpper();
+        }
         return mCameraCharacteristics.get(
                 CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
     }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
index 67a8646..6c5d17b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
@@ -33,6 +33,7 @@
 import androidx.camera.core.impl.utils.MainThreadAsyncHandler;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 /**
@@ -99,6 +100,24 @@
     }
 
     /**
+     * Return set of set of camera ids, each set includes one combination of the camera ids that
+     * could operate concurrently.
+     *
+     * <p>This API is added in API Level 30, any lower API version will return empty set instead.
+     *
+     * <p>The behavior of this method matches that of {@link CameraManager#getConcurrentCameraIds()}
+     * except that {@link CameraAccessExceptionCompat} is thrown in place of
+     * {@link CameraAccessException} for convenience.
+     *
+     * @return Set of set of camera ids.
+     * @throws CameraAccessExceptionCompat
+     */
+    @NonNull
+    public Set<Set<String>> getConcurrentCameraIds() throws CameraAccessExceptionCompat {
+        return mImpl.getConcurrentCameraIds();
+    }
+
+    /**
      * Register a callback to be notified about camera device availability.
      *
      * <p>The behavior of this method matches that of {@link
@@ -236,6 +255,12 @@
         @NonNull
         String[] getCameraIdList() throws CameraAccessExceptionCompat;
 
+        /**
+         * Return the set of concurrent camera id set which could operate concurrently.
+         */
+        @NonNull
+        Set<Set<String>> getConcurrentCameraIds() throws CameraAccessExceptionCompat;
+
         void registerAvailabilityCallback(
                 @NonNull /* @CallbackExecutor */ Executor executor,
                 @NonNull CameraManager.AvailabilityCallback callback);
@@ -267,7 +292,9 @@
         @NonNull
         static CameraManagerCompatImpl from(@NonNull Context context,
                 @NonNull Handler compatHandler) {
-            if (Build.VERSION.SDK_INT >= 29) {
+            if (Build.VERSION.SDK_INT >= 30) {
+                return new CameraManagerCompatApi30Impl(context);
+            } else if (Build.VERSION.SDK_INT >= 29) {
                 return new CameraManagerCompatApi29Impl(context);
             } else if (Build.VERSION.SDK_INT >= 28) {
                 // Can use Executor directly on API 28+
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatApi30Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatApi30Impl.java
new file mode 100644
index 0000000..f268c1d
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatApi30Impl.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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;
+
+import android.content.Context;
+import android.hardware.camera2.CameraAccessException;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.util.Set;
+
+@RequiresApi(30)
+class CameraManagerCompatApi30Impl extends CameraManagerCompatApi29Impl {
+
+    CameraManagerCompatApi30Impl(@NonNull Context context) {
+        super(context);
+    }
+
+    @NonNull
+    @Override
+    public Set<Set<String>> getConcurrentCameraIds() throws CameraAccessExceptionCompat {
+        try {
+            return mCameraManager.getConcurrentCameraIds();
+        } catch (CameraAccessException e) {
+            throw CameraAccessExceptionCompat.toCameraAccessExceptionCompat(e);
+        }
+    }
+}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
index c85a016..9a62f4b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompatBaseImpl.java
@@ -30,8 +30,10 @@
 import androidx.annotation.RequiresPermission;
 import androidx.core.util.Preconditions;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 @RequiresApi(21)
@@ -61,6 +63,12 @@
         }
     }
 
+    @NonNull
+    @Override
+    public Set<Set<String>> getConcurrentCameraIds() throws CameraAccessExceptionCompat {
+        return Collections.emptySet();
+    }
+
     @Override
     public void registerAvailabilityCallback(@NonNull Executor executor,
             @NonNull CameraManager.AvailabilityCallback callback) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/FlashAvailabilityBufferUnderflowQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/FlashAvailabilityBufferUnderflowQuirk.java
index d3ef576..45701e8 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/FlashAvailabilityBufferUnderflowQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/FlashAvailabilityBufferUnderflowQuirk.java
@@ -20,11 +20,11 @@
 import android.os.Build;
 import android.util.Pair;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.Quirk;
 
 import java.nio.BufferUnderflowException;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
@@ -44,12 +44,17 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class FlashAvailabilityBufferUnderflowQuirk implements Quirk {
-    private static final Set<Pair<String, String>> KNOWN_AFFECTED_MODELS = new HashSet<>(
-            Arrays.asList(
-                    // Devices enumerated as Pair(Build.MANUFACTURER, Build.MODEL)
-                    new Pair<>("sprd", "lemp"),
-                    new Pair<>("sprd", "DM20C")
-            ));
+    private static final Set<Pair<String, String>> KNOWN_AFFECTED_MODELS = new HashSet<>();
+    static {
+        // Devices enumerated as Pair(Build.MANUFACTURER, Build.MODEL).
+        addAffectedDevice("sprd", "lemp");
+        addAffectedDevice("sprd", "DM20C");
+    }
+
+    private static void addAffectedDevice(@NonNull String manufacturer, @NonNull String model) {
+        KNOWN_AFFECTED_MODELS.add(new Pair<>(manufacturer.toLowerCase(Locale.US),
+                model.toLowerCase(Locale.US)));
+    }
 
     static boolean load() {
         return KNOWN_AFFECTED_MODELS.contains(new Pair<>(Build.MANUFACTURER.toLowerCase(Locale.US),
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CameraInfoImplTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CameraInfoImplTest.java
index fc150d4..e901fb7 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CameraInfoImplTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CameraInfoImplTest.java
@@ -57,6 +57,8 @@
 import androidx.lifecycle.MutableLiveData;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.google.common.collect.ImmutableSet;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -73,6 +75,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 @RunWith(RobolectricTestRunner.class)
@@ -817,6 +820,12 @@
             return mCameraIdCharacteristics.keySet().toArray(new String[0]);
         }
 
+        @NonNull
+        @Override
+        public Set<Set<String>> getConcurrentCameraIds() throws CameraAccessExceptionCompat {
+            return ImmutableSet.of(mCameraIdCharacteristics.keySet());
+        }
+
         @Override
         public void registerAvailabilityCallback(@NonNull Executor executor,
                 @NonNull CameraManager.AvailabilityCallback callback) {
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
index a09d6d3..ff18ed7 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
@@ -49,7 +49,9 @@
 import org.robolectric.shadows.ShadowLog;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Executor;
 
 @RunWith(RobolectricTestRunner.class)
@@ -223,6 +225,32 @@
         manager.getCameraCharacteristicsCompat(CAMERA_ID);
     }
 
+    @Test
+    @Config(minSdk = 30)
+    public void getConcurrentCameraIds_api30_returnsCameraIdSets() {
+        CameraManagerCompat manager = CameraManagerCompat.from(mContext);
+
+        try {
+            manager.getConcurrentCameraIds();
+        } catch (CameraAccessExceptionCompat e) {
+        }
+
+        verify(mInteractionCallback, times(1)).getConcurrentCameraIds();
+    }
+
+    @Test
+    @Config(maxSdk = 29)
+    public void getConcurrentCameraIds_api29_returnsCameraIdSets() {
+        CameraManagerCompat manager = CameraManagerCompat.from(mContext);
+
+        try {
+            manager.getConcurrentCameraIds();
+        } catch (CameraAccessExceptionCompat e) {
+        }
+
+        verify(mInteractionCallback, times(0)).getConcurrentCameraIds();
+    }
+
     /**
      * A Shadow of {@link CameraManager} which forwards invocations to callbacks to record
      * interactions.
@@ -234,6 +262,8 @@
     public static final class ShadowInteractionCameraManager {
 
         private static final String[] EMPTY_ID_LIST = new String[]{};
+
+        private static final Set<Set<String>> EMPTY_CONCURRENT_ID_SET = new HashSet<>();
         private final List<Callback> mCallbacks = new ArrayList<>();
         private final CameraCharacteristics mCameraCharacteristics =
                 mock(CameraCharacteristics.class);
@@ -254,6 +284,17 @@
 
         @NonNull
         @Implementation
+        protected Set<Set<String>> getConcurrentCameraIds() throws CameraAccessException {
+            if (Build.VERSION.SDK_INT >= 30) {
+                for (Callback cb : mCallbacks) {
+                    Set<Set<String>> ids = cb.getConcurrentCameraIds();
+                }
+            }
+            return EMPTY_CONCURRENT_ID_SET;
+        }
+
+        @NonNull
+        @Implementation
         protected CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId) {
             for (Callback cb : mCallbacks) {
                 cb.getCameraCharacteristics(cameraId);
@@ -312,6 +353,9 @@
             String[] getCameraIdList();
 
             @NonNull
+            Set<Set<String>> getConcurrentCameraIds();
+
+            @NonNull
             CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId);
 
             void openCamera(@NonNull String cameraId,
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index eda1d75..391ebc9a 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -331,6 +331,7 @@
     method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
     method public int getWidth();
     method public void setCropRect(android.graphics.Rect?);
+    method public default android.graphics.Bitmap toBitmap();
   }
 
   public static interface ImageProxy.PlaneProxy {
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
index ba687e2..10bd0e1 100644
--- a/camera/camera-core/api/public_plus_experimental_current.txt
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -348,6 +348,7 @@
     method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
     method public int getWidth();
     method public void setCropRect(android.graphics.Rect?);
+    method public default android.graphics.Bitmap toBitmap();
   }
 
   public static interface ImageProxy.PlaneProxy {
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index eda1d75..391ebc9a 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -331,6 +331,7 @@
     method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
     method public int getWidth();
     method public void setCropRect(android.graphics.Rect?);
+    method public default android.graphics.Bitmap toBitmap();
   }
 
   public static interface ImageProxy.PlaneProxy {
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/utils/ImageUtilDeviceTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/utils/ImageUtilDeviceTest.kt
index 0b994e8..0738973 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/utils/ImageUtilDeviceTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/utils/ImageUtilDeviceTest.kt
@@ -16,13 +16,24 @@
 
 package androidx.camera.core.internal.utils
 
+import android.graphics.ImageFormat
+import android.graphics.Matrix
+import android.graphics.PixelFormat
+import androidx.camera.core.ImageProcessingUtil
 import androidx.camera.core.ImageProxy
+import androidx.camera.core.ImageReaderProxys
+import androidx.camera.core.ImmutableImageInfo
+import androidx.camera.core.SafeCloseImageReaderProxy
+import androidx.camera.core.impl.TagBundle
 import androidx.camera.testing.TestImageUtil
+import androidx.camera.testing.fakes.FakeImageProxy
 import androidx.camera.testing.fakes.FakePlaneProxy
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
+import java.nio.ByteBuffer
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -121,4 +132,57 @@
             HEIGHT
         )
     }
+
+    @Test
+    fun createBitmapFromImageProxy_yuv420() {
+        val fakeImageProxy = TestImageUtil.createYuvFakeImageProxy(
+            ImmutableImageInfo.create(
+            TagBundle.emptyBundle(), 0, 0, Matrix()
+        ), WIDTH, HEIGHT)
+
+        val bitmap = ImageUtil.createBitmapFromImageProxy(fakeImageProxy)
+
+        assertThat(bitmap.width).isEqualTo(WIDTH)
+        assertThat(bitmap.height).isEqualTo(HEIGHT)
+        assertThat(bitmap.byteCount).isEqualTo(76800)
+    }
+
+    @Test
+    fun createBitmapFromImageProxy_rgba() {
+        val fakeYuvImageProxy = TestImageUtil.createYuvFakeImageProxy(
+            ImmutableImageInfo.create(
+                TagBundle.emptyBundle(), 0, 0, Matrix()
+            ), WIDTH, HEIGHT)
+
+        val fakeRgbaImageProxy = ImageProcessingUtil.convertYUVToRGB(
+            fakeYuvImageProxy,
+            SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                    WIDTH,
+                    HEIGHT,
+                    PixelFormat.RGBA_8888,
+                    2)),
+            ByteBuffer.allocateDirect(WIDTH * HEIGHT * 4),
+            0,
+            false)
+        assertThat(fakeRgbaImageProxy).isNotNull()
+
+        val bitmap = ImageUtil.createBitmapFromImageProxy(fakeRgbaImageProxy!!)
+
+        assertThat(bitmap.width).isEqualTo(WIDTH)
+        assertThat(bitmap.height).isEqualTo(HEIGHT)
+        assertThat(bitmap.byteCount).isEqualTo(76800)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun createBitmapFromImageProxy_invalidFormat() {
+        val image = FakeImageProxy(ImmutableImageInfo.create(
+            TagBundle.emptyBundle(), 0, 0, Matrix()
+        ))
+        image.format = ImageFormat.JPEG
+        image.width = WIDTH
+        image.height = HEIGHT
+
+        ImageUtil.createBitmapFromImageProxy(image)
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/main/cpp/image_processing_util_jni.cc b/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
index b628aa6..c7a3d44 100644
--- a/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
+++ b/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
@@ -400,6 +400,67 @@
     return result;
 }
 
+JNIEXPORT jint
+Java_androidx_camera_core_ImageProcessingUtil_nativeConvertAndroid420ToBitmap(
+        JNIEnv* env,
+        jclass,
+        jobject src_y,
+        jint src_stride_y,
+        jobject src_u,
+        jint src_stride_u,
+        jobject src_v,
+        jint src_stride_v,
+        jint src_pixel_stride_y,
+        jint src_pixel_stride_uv,
+        jobject bitmap,
+        jint bitmap_stride,
+        jint width,
+        jint height) {
+
+    void* bitmapAddress = nullptr;
+
+    // get bitmap address
+    int lockResult =  AndroidBitmap_lockPixels(env, bitmap, &bitmapAddress);
+    if (lockResult != 0) {
+        return -1;
+    }
+
+    uint8_t* src_y_ptr =
+            static_cast<uint8_t*>(env->GetDirectBufferAddress(src_y));
+    uint8_t* src_u_ptr =
+            static_cast<uint8_t*>(env->GetDirectBufferAddress(src_u));
+    uint8_t* src_v_ptr =
+            static_cast<uint8_t*>(env->GetDirectBufferAddress(src_v));
+
+    int dst_stride_y = bitmap_stride;
+
+    int result = Android420ToABGR(
+            src_y_ptr ,
+            src_stride_y,
+            src_u_ptr,
+            src_stride_u,
+            src_v_ptr,
+            src_stride_v,
+            src_pixel_stride_uv,
+            reinterpret_cast<uint8_t *> (bitmapAddress),
+            dst_stride_y,
+            /* is_full_swing = */true,
+            width,
+            height);
+
+    if (result != 0) {
+        return -1;
+    }
+
+    // balance call to AndroidBitmap_lockPixels
+    int unlockResult = AndroidBitmap_unlockPixels(env,bitmap);
+    if (unlockResult != 0) {
+        return -1;
+    }
+
+    return 0;
+}
+
 JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_nativeRotateYUV(
         JNIEnv* env,
         jclass,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
index 253a7ee..a6e369e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
@@ -240,6 +240,55 @@
     }
 
     /**
+     * Converts image proxy in YUV to {@link Bitmap}.
+     *
+     * <p> Different from {@link ImageProcessingUtil#convertYUVToRGB(
+     * ImageProxy, ImageReaderProxy, ByteBuffer, int, boolean)}, this function converts to
+     * {@link Bitmap} in RGBA directly. If input format is invalid,
+     * {@link IllegalArgumentException} will be thrown. If the conversion to bitmap failed,
+     * {@link UnsupportedOperationException} will be thrown.
+     *
+     * @param imageProxy input image proxy in YUV.
+     * @return bitmap output bitmap in RGBA.
+     */
+    @NonNull
+    public static Bitmap convertYUVToBitmap(@NonNull ImageProxy imageProxy) {
+        if (imageProxy.getFormat() != ImageFormat.YUV_420_888) {
+            throw new IllegalArgumentException("Input image format must be YUV_420_888");
+        }
+
+        int imageWidth = imageProxy.getWidth();
+        int imageHeight = imageProxy.getHeight();
+        int srcStrideY = imageProxy.getPlanes()[0].getRowStride();
+        int srcStrideU = imageProxy.getPlanes()[1].getRowStride();
+        int srcStrideV = imageProxy.getPlanes()[2].getRowStride();
+        int srcPixelStrideY = imageProxy.getPlanes()[0].getPixelStride();
+        int srcPixelStrideUV = imageProxy.getPlanes()[1].getPixelStride();
+
+        Bitmap bitmap = Bitmap.createBitmap(imageProxy.getWidth(),
+                imageProxy.getHeight(), Bitmap.Config.ARGB_8888);
+        int bitmapStride = bitmap.getRowBytes();
+
+        int result = nativeConvertAndroid420ToBitmap(
+                imageProxy.getPlanes()[0].getBuffer(),
+                srcStrideY,
+                imageProxy.getPlanes()[1].getBuffer(),
+                srcStrideU,
+                imageProxy.getPlanes()[2].getBuffer(),
+                srcStrideV,
+                srcPixelStrideY,
+                srcPixelStrideUV,
+                bitmap,
+                bitmapStride,
+                imageWidth,
+                imageHeight);
+        if (result != 0) {
+            throw new UnsupportedOperationException("YUV to RGB conversion failed");
+        }
+        return bitmap;
+    }
+
+    /**
      * Applies one pixel shift workaround for YUV image
      *
      * @param imageProxy input image proxy in YUV.
@@ -490,7 +539,7 @@
             int srcStrideV,
             int srcPixelStrideY,
             int srcPixelStrideUV,
-            @NonNull Surface surface,
+            @Nullable Surface surface,
             @Nullable ByteBuffer convertedByteBufferRGB,
             int width,
             int height,
@@ -499,6 +548,20 @@
             int startOffsetV,
             @ImageOutputConfig.RotationDegreesValue int rotationDegrees);
 
+    private static native int nativeConvertAndroid420ToBitmap(
+            @NonNull ByteBuffer srcByteBufferY,
+            int srcStrideY,
+            @NonNull ByteBuffer srcByteBufferU,
+            int srcStrideU,
+            @NonNull ByteBuffer srcByteBufferV,
+            int srcStrideV,
+            int srcPixelStrideY,
+            int srcPixelStrideUV,
+            @NonNull Bitmap bitmap,
+            int bitmapStride,
+            int width,
+            int height);
+
     private static native int nativeShiftPixel(
             @NonNull ByteBuffer srcByteBufferY,
             int srcStrideY,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
index 1ecad47..3bea291 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
@@ -16,7 +16,12 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.internal.utils.ImageUtil.createBitmapFromImageProxy;
+
 import android.annotation.SuppressLint;
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.media.Image;
 
@@ -55,8 +60,8 @@
     /**
      * Returns the image format.
      *
-     * <p> The image format can be one of the {@link android.graphics.ImageFormat} or
-     * {@link android.graphics.PixelFormat} constants.
+     * <p> The image format can be one of the {@link ImageFormat} or
+     * {@link PixelFormat} constants.
      *
      * @see android.media.Image#getFormat()
      */
@@ -133,4 +138,19 @@
     @Nullable
     @ExperimentalGetImage
     Image getImage();
+
+    /**
+     * Converts {@link ImageProxy} to {@link Bitmap}.
+     *
+     * <p>The supported {@link ImageProxy} format is {@link ImageFormat#YUV_420_888} or
+     * {@link PixelFormat#RGBA_8888}. If format is invalid, an {@link IllegalArgumentException}
+     * will be thrown. If the conversion to bimap failed, an
+     * {@link UnsupportedOperationException} will be thrown.
+     *
+     * @return {@link Bitmap} instance.
+     */
+    @NonNull
+    default Bitmap toBitmap() {
+        return createBitmapFromImageProxy(this);
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
index 15c47e1..5638803 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
@@ -77,10 +77,10 @@
     Option<CameraSelector> OPTION_CAMERA_SELECTOR =
             Config.Option.create("camerax.core.useCase.cameraSelector", CameraSelector.class);
     /**
-     * Option: camerax.core.useCase.targetFramerate
+     * Option: camerax.core.useCase.targetFrameRate
      */
     Option<Range<Integer>> OPTION_TARGET_FRAME_RATE =
-            Config.Option.create("camerax.core.useCase.targetFrameRate", CameraSelector.class);
+            Config.Option.create("camerax.core.useCase.targetFrameRate", Range.class);
 
     /**
      * Option: camerax.core.useCase.zslDisabled
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index ad3c388..ee71415 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -96,10 +96,10 @@
 
     // UseCases from the app. This does not include internal UseCases created by CameraX.
     @GuardedBy("mLock")
-    private final Set<UseCase> mUseCases = new HashSet<>();
+    private final List<UseCase> mAppUseCases = new ArrayList<>();
     // UseCases sent to the camera including internal UseCases created by CameraX.
     @GuardedBy("mLock")
-    private final Set<UseCase> mCameraUseCases = new HashSet<>();
+    private final List<UseCase> mCameraUseCases = new ArrayList<>();
 
     @GuardedBy("mLock")
     @Nullable
@@ -206,10 +206,12 @@
      */
     public void addUseCases(@NonNull Collection<UseCase> appUseCasesToAdd) throws CameraException {
         synchronized (mLock) {
-            Set<UseCase> appUseCasesAfter = new HashSet<>(mUseCases);
-            appUseCasesAfter.addAll(appUseCasesToAdd);
+            List<UseCase> appUseCases = new ArrayList<>(mAppUseCases);
+            // Removing new from existing to avoid duplicate UseCases.
+            appUseCases.removeAll(appUseCasesToAdd);
+            appUseCases.addAll(appUseCasesToAdd);
             try {
-                updateUseCases(appUseCasesAfter);
+                updateUseCases(appUseCases);
             } catch (IllegalArgumentException e) {
                 throw new CameraException(e.getMessage());
             }
@@ -221,16 +223,16 @@
      */
     public void removeUseCases(@NonNull Collection<UseCase> useCasesToRemove) {
         synchronized (mLock) {
-            Set<UseCase> appUseCasesAfter = new HashSet<>(mUseCases);
-            appUseCasesAfter.removeAll(useCasesToRemove);
-            updateUseCases(appUseCasesAfter);
+            List<UseCase> appUseCases = new ArrayList<>(mAppUseCases);
+            appUseCases.removeAll(useCasesToRemove);
+            updateUseCases(appUseCases);
         }
     }
 
     /**
      * Updates the states based the new app UseCases.
      */
-    void updateUseCases(@NonNull Set<UseCase> appUseCases) {
+    void updateUseCases(@NonNull Collection<UseCase> appUseCases) {
         // TODO(b/265820449): set applyStreamSharing to true if Effects requires it..
         updateUseCases(appUseCases, /*applyStreamSharing*/false);
     }
@@ -240,27 +242,27 @@
      *
      * <p> This method calculates the new camera UseCases based on the input and the current state,
      * attach/detach the camera UseCases, and save the updated state in following member variables:
-     * {@link #mCameraUseCases}, {@link #mUseCases} and {@link #mPlaceholderForExtensions}.
+     * {@link #mCameraUseCases}, {@link #mAppUseCases} and {@link #mPlaceholderForExtensions}.
      *
      * @throws IllegalArgumentException if the UseCase combination is not supported. In that case,
      *                                  it will not update the internal states.
      */
-    void updateUseCases(@NonNull Set<UseCase> appUseCases, boolean applyStreamSharing) {
+    void updateUseCases(@NonNull Collection<UseCase> appUseCases, boolean applyStreamSharing) {
         synchronized (mLock) {
             // Calculate camera UseCases and keep the result in local variables in case they don't
             // meet the stream combination rules.
             UseCase placeholderForExtensions = calculatePlaceholderForExtensions(appUseCases);
             StreamSharing streamSharing = applyStreamSharing
                     ? createOrReuseStreamSharing(appUseCases) : null;
-            Set<UseCase> cameraUseCases =
+            Collection<UseCase> cameraUseCases =
                     calculateCameraUseCases(appUseCases, placeholderForExtensions, streamSharing);
 
             // Calculate the action items.
-            Set<UseCase> cameraUseCasesToAttach = new HashSet<>(cameraUseCases);
+            List<UseCase> cameraUseCasesToAttach = new ArrayList<>(cameraUseCases);
             cameraUseCasesToAttach.removeAll(mCameraUseCases);
-            Set<UseCase> cameraUseCasesToKeep = new HashSet<>(cameraUseCases);
+            List<UseCase> cameraUseCasesToKeep = new ArrayList<>(cameraUseCases);
             cameraUseCasesToKeep.retainAll(mCameraUseCases);
-            Set<UseCase> cameraUseCasesToDetach = new HashSet<>(mCameraUseCases);
+            List<UseCase> cameraUseCasesToDetach = new ArrayList<>(mCameraUseCases);
             cameraUseCasesToDetach.removeAll(cameraUseCases);
 
             // Calculate suggested resolutions. This step throws exception if the camera UseCases
@@ -316,8 +318,8 @@
             }
 
             // The changes are successful. Update the states of this class.
-            mUseCases.clear();
-            mUseCases.addAll(appUseCases);
+            mAppUseCases.clear();
+            mAppUseCases.addAll(appUseCases);
             mCameraUseCases.clear();
             mCameraUseCases.addAll(cameraUseCases);
             mPlaceholderForExtensions = placeholderForExtensions;
@@ -335,7 +337,7 @@
      * Returns {@link UseCase}s qualified for {@link StreamSharing}.
      */
     @NonNull
-    private Set<UseCase> getStreamSharingChildren(@NonNull Set<UseCase> appUseCases) {
+    private Set<UseCase> getStreamSharingChildren(@NonNull Collection<UseCase> appUseCases) {
         Set<UseCase> useCases = new HashSet<>();
         for (UseCase useCase : appUseCases) {
             checkArgument(!isStreamSharing(useCase), "Only support one level of sharing for now.");
@@ -357,7 +359,7 @@
      * {@link StreamSharing} children({@link Preview} and VideoCapture).
      */
     @Nullable
-    private StreamSharing createOrReuseStreamSharing(@NonNull Set<UseCase> appUseCases) {
+    private StreamSharing createOrReuseStreamSharing(@NonNull Collection<UseCase> appUseCases) {
         synchronized (mLock) {
             Set<UseCase> newChildren = getStreamSharingChildren(appUseCases);
             if (newChildren.size() < 2) {
@@ -375,10 +377,10 @@
     /**
      * Returns {@link UseCase} that connects to the camera.
      */
-    static Set<UseCase> calculateCameraUseCases(@NonNull Set<UseCase> appUseCases,
+    static Collection<UseCase> calculateCameraUseCases(@NonNull Collection<UseCase> appUseCases,
             @Nullable UseCase placeholderForExtensions,
             @Nullable StreamSharing streamSharing) {
-        Set<UseCase> useCases = new HashSet<>(appUseCases);
+        List<UseCase> useCases = new ArrayList<>(appUseCases);
         if (placeholderForExtensions != null) {
             useCases.add(placeholderForExtensions);
         }
@@ -398,15 +400,15 @@
     @NonNull
     public List<UseCase> getUseCases() {
         synchronized (mLock) {
-            return new ArrayList<>(mUseCases);
+            return new ArrayList<>(mAppUseCases);
         }
     }
 
     @VisibleForTesting
     @NonNull
-    Set<UseCase> getCameraUseCases() {
+    Collection<UseCase> getCameraUseCases() {
         synchronized (mLock) {
-            return new HashSet<>(mCameraUseCases);
+            return new ArrayList<>(mCameraUseCases);
         }
     }
 
@@ -421,12 +423,12 @@
     public void attachUseCases() {
         synchronized (mLock) {
             if (!mAttached) {
-                mCameraInternal.attachUseCases(mUseCases);
+                mCameraInternal.attachUseCases(mCameraUseCases);
                 restoreInteropConfig();
 
                 // Notify to update the use case's active state because it may be cleared if the
                 // use case was ever detached from a camera previously.
-                for (UseCase useCase : mUseCases) {
+                for (UseCase useCase : mCameraUseCases) {
                     useCase.notifyState();
                 }
 
@@ -457,7 +459,7 @@
     public void detachUseCases() {
         synchronized (mLock) {
             if (mAttached) {
-                mCameraInternal.detachUseCases(new ArrayList<>(mUseCases));
+                mCameraInternal.detachUseCases(new ArrayList<>(mCameraUseCases));
                 cacheInteropConfig();
                 mAttached = false;
             }
@@ -722,7 +724,7 @@
                 cameraConfig = CameraConfigs.emptyConfig();
             }
 
-            if (!mUseCases.isEmpty() && !mCameraConfig.getCompatibilityId().equals(
+            if (!mAppUseCases.isEmpty() && !mCameraConfig.getCompatibilityId().equals(
                     cameraConfig.getCompatibilityId())) {
                 throw new IllegalStateException(
                         "Need to unbind all use cases before binding with extension enabled");
@@ -758,7 +760,7 @@
      * @param appUseCases UseCase provided by the app.
      */
     @Nullable
-    UseCase calculatePlaceholderForExtensions(@NonNull Set<UseCase> appUseCases) {
+    UseCase calculatePlaceholderForExtensions(@NonNull Collection<UseCase> appUseCases) {
         synchronized (mLock) {
             UseCase placeholder = null;
             if (isCoexistingPreviewImageCaptureRequired()) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
index 7f9c9c3..fe9b5ac 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
@@ -26,25 +26,26 @@
 
 /**
  * <p>QuirkSummary
- *     Bug Id: b/171492111
- *     Description: Quirk required to check whether ImageCapture supports a specific capture
- *                  config option. For example, JPEG related options will be applied when
- *                  capturing images. CaptureConfig.OPTION_ROTATION is used to provide the target
- *                  rotation information to the HAL. So that the HAL can rotate the image buffer
- *                  directly and provide the correct orientation information in the embedded exif
- *                  data. But not all devices can support CaptureConfig.OPTION_ROTATION. Huawei
- *                  Mate 20 Lite and Honor 9X can't handle the capture rotation option correctly
- *                  and the embedded exif's orientation value is wrong. For these devices, the
- *                  rotation option can't be used and we should calculate the rotation value
- *                  according to the target rotation setting for the final output image.
- *     Device(s): Huawei Mate 20 Lite, Honor 9X
- *     @see androidx.camera.core.internal.compat.workaround.ExifRotationAvailability
+ * Bug Id: b/171492111
+ * Description: Quirk required to check whether ImageCapture supports a specific capture
+ * config option. For example, JPEG related options will be applied when
+ * capturing images. CaptureConfig.OPTION_ROTATION is used to provide the target
+ * rotation information to the HAL. So that the HAL can rotate the image buffer
+ * directly and provide the correct orientation information in the embedded exif
+ * data. But not all devices can support CaptureConfig.OPTION_ROTATION. Huawei
+ * Mate 20 Lite and Honor 9X can't handle the capture rotation option correctly
+ * and the embedded exif's orientation value is wrong. For these devices, the
+ * rotation option can't be used and we should calculate the rotation value
+ * according to the target rotation setting for the final output image.
+ * Device(s): Huawei Mate 20 Lite, Honor 9X
+ *
+ * @see androidx.camera.core.internal.compat.workaround.ExifRotationAvailability
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class ImageCaptureRotationOptionQuirk implements Quirk {
 
     static boolean load() {
-        return isHuaweiMate20Lite() || isHonor9X();
+        return isHuaweiMate20Lite() || isHonor9X() || isEmulatorAndApi21();
     }
 
     private static boolean isHuaweiMate20Lite() {
@@ -56,6 +57,23 @@
                 Build.MODEL);
     }
 
+    private static boolean isEmulatorAndApi21() {
+        return isEmulator() && Build.VERSION.SDK_INT == 21;
+    }
+
+    private static boolean isEmulator() {
+        return Build.FINGERPRINT.startsWith("generic")
+                || Build.FINGERPRINT.startsWith("unknown")
+                || Build.MODEL.contains("google_sdk")
+                || Build.MODEL.contains("Emulator")
+                || Build.MODEL.contains("Cuttlefish")
+                || Build.MODEL.contains("Android SDK built for x86")
+                || Build.MANUFACTURER.contains("Genymotion")
+                || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
+                || Build.PRODUCT.equals("google_sdk")
+                || Build.HARDWARE.contains("ranchu");
+    }
+
     /**
      * Returns true if the capture config option can be supported.
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
index 08925e5..9cad93f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
@@ -25,6 +25,7 @@
 import android.graphics.BitmapRegionDecoder;
 import android.graphics.ImageFormat;
 import android.graphics.Matrix;
+import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.YuvImage;
@@ -62,6 +63,31 @@
     }
 
     /**
+     * Creates {@link Bitmap} from {@link ImageProxy}.
+     *
+     * <p> Currently only {@link ImageFormat#YUV_420_888} and {@link PixelFormat#RGBA_8888} are
+     * supported. If the format is invalid, an {@link IllegalArgumentException} will be thrown.
+     * If the conversion to bimap failed, an {@link UnsupportedOperationException} will be thrown.
+     *
+     * @param imageProxy The input {@link ImageProxy} instance.
+     * @return {@link Bitmap} instance.
+     */
+    @NonNull
+    public static Bitmap createBitmapFromImageProxy(@NonNull ImageProxy imageProxy) {
+        switch (imageProxy.getFormat()) {
+            case ImageFormat.YUV_420_888:
+                return ImageProcessingUtil.convertYUVToBitmap(imageProxy);
+            case PixelFormat.RGBA_8888:
+                return createBitmapFromRgbaImage(imageProxy);
+            default:
+                throw new IllegalArgumentException(
+                        "Incorrect image format of the input image proxy: "
+                                + imageProxy.getFormat() + ", only ImageFormat.YUV_420_888 and "
+                                + "PixelFormat.RGBA_8888 are supported");
+        }
+    }
+
+    /**
      * Creates a {@link Bitmap} from an {@link ImageProxy.PlaneProxy} array.
      *
      * <p>This method expects a single plane with a pixel stride of 4 and a row stride of (width *
@@ -403,6 +429,19 @@
                 /*denominator=*/ rational.getNumerator());
     }
 
+    @NonNull
+    private static Bitmap createBitmapFromRgbaImage(@NonNull ImageProxy imageProxy) {
+        Bitmap bitmap =
+                Bitmap.createBitmap(imageProxy.getWidth(),
+                imageProxy.getHeight(),
+                Bitmap.Config.ARGB_8888);
+        // Rewind the buffer just to be safe.
+        imageProxy.getPlanes()[0].getBuffer().rewind();
+        ImageProcessingUtil.copyByteBufferToBitmap(bitmap, imageProxy.getPlanes()[0].getBuffer(),
+                imageProxy.getPlanes()[0].getRowStride());
+        return bitmap;
+    }
+
     /**
      * Checks whether the image's crop rectangle is the same as the source image size.
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEdge.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEdge.java
index ca3c2df..c44bea5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEdge.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEdge.java
@@ -41,6 +41,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.CameraEffect;
 import androidx.camera.core.SurfaceOutput;
 import androidx.camera.core.SurfaceProcessor;
@@ -124,6 +125,11 @@
     @NonNull
     private final Set<Runnable> mOnInvalidatedListeners = new HashSet<>();
 
+    // Guarded by main thread.
+    // Tombstone flag indicates whether the edge has been closed. Once closed, the edge should
+    // never be used again.
+    private boolean mIsClosed = false;
+
     /**
      * Please see the getters to understand the parameters.
      */
@@ -156,6 +162,7 @@
     @MainThread
     public void addOnInvalidatedListener(@NonNull Runnable onInvalidated) {
         checkMainThread();
+        checkNotClosed();
         mOnInvalidatedListeners.add(onInvalidated);
     }
 
@@ -170,6 +177,7 @@
     @MainThread
     public DeferrableSurface getDeferrableSurface() {
         checkMainThread();
+        checkNotClosed();
         checkAndSetHasConsumer();
         return mSettableSurface;
     }
@@ -209,6 +217,7 @@
     public void setProvider(@NonNull DeferrableSurface provider)
             throws DeferrableSurface.SurfaceClosedException {
         checkMainThread();
+        checkNotClosed();
         mSettableSurface.setProvider(provider);
     }
 
@@ -248,10 +257,15 @@
     public SurfaceRequest createSurfaceRequest(@NonNull CameraInternal cameraInternal,
             @Nullable Range<Integer> expectedFpsRange) {
         checkMainThread();
+        checkNotClosed();
         // TODO(b/238230154) figure out how to support HDR.
         SurfaceRequest surfaceRequest = new SurfaceRequest(mStreamSpec.getResolution(),
                 cameraInternal, expectedFpsRange,
-                () -> mainThreadExecutor().execute(this::invalidate));
+                () -> mainThreadExecutor().execute(() -> {
+                    if (!mIsClosed) {
+                        invalidate();
+                    }
+                }));
         try {
             DeferrableSurface deferrableSurface = surfaceRequest.getDeferrableSurface();
             if (mSettableSurface.setProvider(deferrableSurface)) {
@@ -299,6 +313,7 @@
     public ListenableFuture<SurfaceOutput> createSurfaceOutputFuture(@NonNull Size inputSize,
             @NonNull Rect cropRect, int rotationDegrees, boolean mirroring) {
         checkMainThread();
+        checkNotClosed();
         checkAndSetHasConsumer();
         SettableSurface settableSurface = mSettableSurface;
         return transformAsync(mSettableSurface.getSurface(),
@@ -321,7 +336,7 @@
     }
 
     /**
-     * Closes the current connection and notifies that a new connection is ready.
+     * Resets connection and notifies that a new connection is ready.
      *
      * <p>Call this method to notify that the {@link Surface} previously provided via
      * {@link #createSurfaceRequest} or {@link #setProvider} should no longer be used. The
@@ -337,7 +352,12 @@
     @MainThread
     public void invalidate() {
         checkMainThread();
-        close();
+        checkNotClosed();
+        if (mSettableSurface.canSetProvider()) {
+            // If the edge is still connectable, no-ops.
+            return;
+        }
+        disconnectWithoutCheckingClosed();
         mHasConsumer = false;
         mSettableSurface = new SettableSurface(mStreamSpec.getResolution());
         for (Runnable onInvalidated : mOnInvalidatedListeners) {
@@ -346,20 +366,41 @@
     }
 
     /**
-     * Closes the current connection.
+     * Closes the edge.
      *
-     * <p>This method uses the mechanism in {@link DeferrableSurface} and/or
-     * {@link SurfaceOutputImpl} to notify the upstream pipeline that the {@link Surface}
-     * previously provided via {@link #createSurfaceRequest} or {@link #setProvider} should no
-     * longer be used. The upstream pipeline will stops writing to the {@link Surface}, and the
-     * downstream pipeline can choose to release the {@link Surface} once the writing stops.
+     * <p> Disconnects the edge and sets a tombstone so it will never be used again. This method
+     * is idempotent.
+     *
+     * @see #disconnect()
+     */
+    @MainThread
+    public final void close() {
+        checkMainThread();
+        disconnectWithoutCheckingClosed();
+        mIsClosed = true;
+    }
+
+    /**
+     * Disconnects the edge.
+     *
+     * <p> Once disconnected, upstream should stop sending images to the edge, and downstream
+     * should stop expecting images from the edge.
+     *
+     * <p> This method notifies the upstream via {@link SettableSurface#close()}/
+     * {@link SurfaceOutputImpl}. By calling {@link SettableSurface#close()}, it also decrements the
+     * ref-count on downstream Surfaces so they can be released.
      *
      * @see DeferrableSurface#close().
      * @see #invalidate()
      */
     @MainThread
-    public final void close() {
+    public final void disconnect() {
         checkMainThread();
+        checkNotClosed();
+        disconnectWithoutCheckingClosed();
+    }
+
+    private void disconnectWithoutCheckingClosed() {
         mSettableSurface.close();
         if (mConsumerToNotify != null) {
             mConsumerToNotify.requestClose();
@@ -476,6 +517,29 @@
         return mStreamSpec;
     }
 
+    private void checkNotClosed() {
+        checkState(!mIsClosed, "Edge is already closed.");
+    }
+
+    @VisibleForTesting
+    @NonNull
+    public DeferrableSurface getDeferrableSurfaceForTesting() {
+        return mSettableSurface;
+    }
+
+    @VisibleForTesting
+    public boolean isClosed() {
+        return mIsClosed;
+    }
+
+    /**
+     * @return true if this edge is connected to a Surface provider.
+     */
+    @VisibleForTesting
+    public boolean hasProvider() {
+        return mSettableSurface.hasProvider();
+    }
+
     /**
      * A {@link DeferrableSurface} that sets another {@link DeferrableSurface} as the source.
      *
@@ -504,6 +568,17 @@
             return mSurfaceFuture;
         }
 
+        @MainThread
+        boolean canSetProvider() {
+            checkMainThread();
+            return mProvider == null && !isClosed();
+        }
+
+        @VisibleForTesting
+        boolean hasProvider() {
+            return mProvider != null;
+        }
+
         /**
          * Sets the {@link DeferrableSurface} that provides the surface.
          *
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
index 286ddca..3f4139a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
@@ -25,6 +25,8 @@
 import static androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor;
 import static androidx.core.util.Preconditions.checkArgument;
 
+import static java.util.UUID.randomUUID;
+
 import android.graphics.Rect;
 import android.util.Size;
 
@@ -32,6 +34,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.CameraEffect;
 import androidx.camera.core.Logger;
 import androidx.camera.core.ProcessingException;
@@ -53,6 +56,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * A {@link Node} implementation that wraps around the public {@link SurfaceProcessor} interface.
@@ -267,6 +271,11 @@
         });
     }
 
+    @VisibleForTesting
+    @NonNull
+    public SurfaceProcessorInternal getSurfaceProcessor() {
+        return mSurfaceProcessor;
+    }
 
     /**
      * The input of a {@link SurfaceProcessorNode}.
@@ -322,6 +331,15 @@
     public abstract static class OutConfig {
 
         /**
+         * Unique ID of the config.
+         *
+         * <p> This is for making sure two {@link OutConfig} with the same value can be stored as
+         * different keys in a {@link HashMap}.
+         */
+        @NonNull
+        abstract UUID getUuid();
+
+        /**
          * The target {@link UseCase} of the output stream.
          */
         @CameraEffect.Targets
@@ -365,7 +383,8 @@
         @NonNull
         public static OutConfig of(int targets, @NonNull Rect cropRect, @NonNull Size size,
                 boolean mirroring) {
-            return new AutoValue_SurfaceProcessorNode_OutConfig(targets, cropRect, size, mirroring);
+            return new AutoValue_SurfaceProcessorNode_OutConfig(randomUUID(), targets, cropRect,
+                    size, mirroring);
         }
     }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/StreamSharing.java b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/StreamSharing.java
index f1a5619..f6bc6c4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/StreamSharing.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/StreamSharing.java
@@ -16,13 +16,23 @@
 
 package androidx.camera.core.streamsharing;
 
+import static androidx.camera.core.CameraEffect.PREVIEW;
+import static androidx.camera.core.CameraEffect.VIDEO_CAPTURE;
 import static androidx.camera.core.impl.ImageInputConfig.OPTION_INPUT_FORMAT;
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
+import static androidx.core.util.Preconditions.checkNotNull;
 
+import static java.util.Objects.requireNonNull;
+
+import android.graphics.Rect;
 import android.os.Build;
+import android.util.Size;
 
+import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.impl.CameraInfoInternal;
@@ -32,9 +42,17 @@
 import androidx.camera.core.impl.MutableConfig;
 import androidx.camera.core.impl.MutableOptionsBundle;
 import androidx.camera.core.impl.OptionsBundle;
+import androidx.camera.core.impl.SessionConfig;
+import androidx.camera.core.impl.StreamSpec;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
+import androidx.camera.core.processing.DefaultSurfaceProcessor;
+import androidx.camera.core.processing.SurfaceEdge;
+import androidx.camera.core.processing.SurfaceProcessorNode;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -43,11 +61,18 @@
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public class StreamSharing extends UseCase {
 
+    @NonNull
     private static final StreamSharingConfig DEFAULT_CONFIG;
 
+    @NonNull
     @SuppressWarnings("UnusedVariable")
     private final VirtualCamera mVirtualCamera;
 
+    @Nullable
+    private SurfaceProcessorNode mNode;
+    @Nullable
+    private SurfaceEdge mCameraEdge;
+
     static {
         MutableConfig mutableConfig = new StreamSharingBuilder().getMutableConfig();
         mutableConfig.insertOption(OPTION_INPUT_FORMAT,
@@ -101,6 +126,15 @@
         return builder.getUseCaseConfig();
     }
 
+    @NonNull
+    @Override
+    protected StreamSpec onSuggestedStreamSpecUpdated(@NonNull StreamSpec streamSpec) {
+        updateSessionConfig(createPipelineAndUpdateChildrenSpecs(
+                getCameraId(), getCurrentConfig(), streamSpec));
+        notifyActive();
+        return streamSpec;
+    }
+
     @Override
     public void onBind() {
         super.onBind();
@@ -110,6 +144,7 @@
     @Override
     public void onUnbind() {
         super.onUnbind();
+        clearPipeline();
         mVirtualCamera.unbindChildren();
     }
 
@@ -129,4 +164,92 @@
     public Set<UseCase> getChildren() {
         return mVirtualCamera.getChildren();
     }
+
+    @NonNull
+    @MainThread
+    private SessionConfig createPipelineAndUpdateChildrenSpecs(
+            @NonNull String cameraId,
+            @NonNull UseCaseConfig<?> config,
+            @NonNull StreamSpec streamSpec) {
+        checkMainThread();
+        CameraInternal camera = checkNotNull(getCamera());
+        // Create input edge and the node.
+        mCameraEdge = new SurfaceEdge(
+                /*targets=*/PREVIEW | VIDEO_CAPTURE,
+                streamSpec,
+                getSensorToBufferTransformMatrix(),
+                getHasCameraTransform(),
+                requireNonNull(getCropRect(streamSpec.getResolution())),
+                getRelativeRotation(camera),
+                /*mirroring=*/false); // Mirroring will be decided by each child.
+        mNode = new SurfaceProcessorNode(camera, DefaultSurfaceProcessor.Factory.newInstance());
+
+        // Transform the input based on virtual camera configuration.
+        Map<UseCase, SurfaceProcessorNode.OutConfig> outConfigMap =
+                mVirtualCamera.getChildrenOutConfigs(mCameraEdge);
+        SurfaceProcessorNode.Out out = mNode.transform(SurfaceProcessorNode.In.of(mCameraEdge,
+                new ArrayList<>(outConfigMap.values())));
+
+        // Pass the output edges to virtual camera to connect children.
+        Map<UseCase, SurfaceEdge> outputEdges = new HashMap<>();
+        for (Map.Entry<UseCase, SurfaceProcessorNode.OutConfig> entry : outConfigMap.entrySet()) {
+            outputEdges.put(entry.getKey(), out.get(entry.getValue()));
+        }
+        mVirtualCamera.setChildrenEdges(outputEdges);
+
+        // Send the camera edge Surface to the camera2.
+        SessionConfig.Builder builder = SessionConfig.Builder.createFrom(config);
+        builder.addSurface(mCameraEdge.getDeferrableSurface());
+        builder.addRepeatingCameraCaptureCallback(mVirtualCamera.getParentMetadataCallback());
+        addCameraErrorListener(builder, cameraId, config, streamSpec);
+        return builder.build();
+    }
+
+    private void addCameraErrorListener(
+            @NonNull SessionConfig.Builder sessionConfigBuilder,
+            @NonNull String cameraId,
+            @NonNull UseCaseConfig<?> config,
+            @NonNull StreamSpec streamSpec) {
+        sessionConfigBuilder.addErrorListener((sessionConfig, error) -> {
+            // Clear both StreamSharing and the children.
+            clearPipeline();
+            if (isCurrentCamera(cameraId)) {
+                // Only reset the pipeline when the bound camera is the same.
+                updateSessionConfig(
+                        createPipelineAndUpdateChildrenSpecs(cameraId, config, streamSpec));
+                notifyReset();
+            }
+        });
+    }
+
+    private void clearPipeline() {
+        if (mCameraEdge != null) {
+            mCameraEdge.close();
+            mCameraEdge = null;
+        }
+        if (mNode != null) {
+            mNode.release();
+            mNode = null;
+        }
+    }
+
+    @Nullable
+    private Rect getCropRect(@NonNull Size surfaceResolution) {
+        if (getViewPortCropRect() != null) {
+            return getViewPortCropRect();
+        }
+        return new Rect(0, 0, surfaceResolution.getWidth(), surfaceResolution.getHeight());
+    }
+
+    @VisibleForTesting
+    @Nullable
+    SurfaceEdge getCameraEdge() {
+        return mCameraEdge;
+    }
+
+    @VisibleForTesting
+    @Nullable
+    SurfaceProcessorNode getNode() {
+        return mNode;
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCamera.java b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCamera.java
index fa70b29..a08de59 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCamera.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCamera.java
@@ -13,34 +13,50 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.camera.core.streamsharing;
 
+import static androidx.camera.core.CameraEffect.PREVIEW;
+import static androidx.camera.core.CameraEffect.VIDEO_CAPTURE;
 import static androidx.camera.core.impl.ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_CUSTOM_ORDERED_RESOLUTIONS;
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
 import static androidx.camera.core.impl.utils.TransformUtils.rectToSize;
 import static androidx.camera.core.streamsharing.ResolutionUtils.getMergedResolutions;
+import static androidx.core.util.Preconditions.checkState;
+
+import static java.util.Objects.requireNonNull;
 
 import android.os.Build;
 import android.util.Size;
 
+import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.camera.core.Preview;
 import androidx.camera.core.UseCase;
+import androidx.camera.core.impl.CameraCaptureCallback;
+import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.CameraControlInternal;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.impl.CameraInternal;
+import androidx.camera.core.impl.DeferrableSurface;
 import androidx.camera.core.impl.MutableConfig;
 import androidx.camera.core.impl.Observable;
+import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
+import androidx.camera.core.processing.SurfaceEdge;
+import androidx.camera.core.processing.SurfaceProcessorNode.OutConfig;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -51,15 +67,25 @@
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 class VirtualCamera implements CameraInternal {
-
     private static final String UNSUPPORTED_MESSAGE = "Operation not supported by VirtualCamera.";
-
+    // Children UseCases associated with this virtual camera.
     @NonNull
-    private final Set<UseCase> mChildren;
+    final Set<UseCase> mChildren;
+    // Specs for children UseCase, calculated and set by StreamSharing.
+    @NonNull
+    final Map<UseCase, SurfaceEdge> mChildrenEdges = new HashMap<>();
+    // Whether a children is in the active state. See: UseCase.State.ACTIVE
+    @NonNull
+    final Map<UseCase, Boolean> mChildrenActiveState = new HashMap<>();
+    // Config factory for getting children's config.
     @NonNull
     private final UseCaseConfigFactory mUseCaseConfigFactory;
+    // The parent camera instance.
     @NonNull
     private final CameraInternal mParentCamera;
+    // The callback that receives the parent camera's metadata.
+    @NonNull
+    private final CameraCaptureCallback mParentMetadataCallback = createCameraCaptureCallback();
 
     /**
      * @param parentCamera         the parent {@link CameraInternal} instance. For example, the
@@ -73,10 +99,13 @@
         mParentCamera = parentCamera;
         mUseCaseConfigFactory = useCaseConfigFactory;
         mChildren = children;
+        // Set children state to inactive by default.
+        for (UseCase child : children) {
+            mChildrenActiveState.put(child, false);
+        }
     }
 
     // --- API for StreamSharing ---
-
     void mergeChildrenConfigs(@NonNull MutableConfig mutableConfig) {
         Set<UseCaseConfig<?>> childrenConfigs = new HashSet<>();
         for (UseCase useCase : mChildren) {
@@ -125,32 +154,114 @@
         return mChildren;
     }
 
+    /**
+     * Gets {@link OutConfig} for children {@link UseCase} based on the input edge.
+     */
+    @NonNull
+    Map<UseCase, OutConfig> getChildrenOutConfigs(@NonNull SurfaceEdge cameraEdge) {
+        Map<UseCase, OutConfig> outConfigs = new HashMap<>();
+        for (UseCase useCase : mChildren) {
+            // TODO(b/264936115): This is a temporary solution where children use the parent
+            //  stream without changing it. Later we will update it to allow
+            //  cropping/down-sampling to better match children UseCase config.
+            int target = useCase instanceof Preview ? PREVIEW : VIDEO_CAPTURE;
+            boolean mirroring = useCase instanceof Preview;
+            outConfigs.put(useCase, OutConfig.of(
+                    target,
+                    cameraEdge.getCropRect(),
+                    rectToSize(cameraEdge.getCropRect()),
+                    mirroring));
+        }
+        return outConfigs;
+    }
+
+    /**
+     * Update children {@link SurfaceEdge} calculated by {@link StreamSharing}.
+     */
+    void setChildrenEdges(@NonNull Map<UseCase, SurfaceEdge> childrenEdges) {
+        mChildrenEdges.clear();
+        mChildrenEdges.putAll(childrenEdges);
+        for (Map.Entry<UseCase, SurfaceEdge> entry : mChildrenEdges.entrySet()) {
+            UseCase useCase = entry.getKey();
+            SurfaceEdge surfaceEdge = entry.getValue();
+            useCase.setViewPortCropRect(surfaceEdge.getCropRect());
+            useCase.updateSuggestedStreamSpec(surfaceEdge.getStreamSpec());
+            useCase.notifyState();
+        }
+    }
+
+    /**
+     * Gets the callback for receiving parent camera's metadata.
+     */
+    @NonNull
+    CameraCaptureCallback getParentMetadataCallback() {
+        return mParentMetadataCallback;
+    }
+
     // --- Handle children state change ---
-
-    // TODO(b/264936250): Handle children state changes.
-
+    @MainThread
     @Override
     public void onUseCaseActive(@NonNull UseCase useCase) {
-
+        checkMainThread();
+        if (isUseCaseActive(useCase)) {
+            return;
+        }
+        mChildrenActiveState.put(useCase, true);
+        DeferrableSurface childSurface = getChildRepeatingSurface(useCase);
+        if (childSurface != null) {
+            forceSetProvider(getUseCaseEdge(useCase), childSurface);
+        }
     }
 
+    @MainThread
     @Override
     public void onUseCaseInactive(@NonNull UseCase useCase) {
-
+        checkMainThread();
+        if (!isUseCaseActive(useCase)) {
+            return;
+        }
+        mChildrenActiveState.put(useCase, false);
+        getUseCaseEdge(useCase).disconnect();
     }
 
+    @MainThread
     @Override
     public void onUseCaseUpdated(@NonNull UseCase useCase) {
-
+        checkMainThread();
+        if (!isUseCaseActive(useCase)) {
+            // No-op if the child is inactive. It will connect when it becomes active.
+            return;
+        }
+        SurfaceEdge edge = getUseCaseEdge(useCase);
+        DeferrableSurface childSurface = getChildRepeatingSurface(useCase);
+        if (childSurface != null) {
+            // If the child has a Surface, connect. VideoCapture uses this mechanism to
+            // resume/start recording.
+            forceSetProvider(edge, childSurface);
+        } else {
+            // If the child has no Surface, disconnect. VideoCapture uses this mechanism to
+            // pause/stop recording.
+            edge.disconnect();
+        }
     }
 
+    @MainThread
     @Override
     public void onUseCaseReset(@NonNull UseCase useCase) {
-
+        checkMainThread();
+        SurfaceEdge edge = getUseCaseEdge(useCase);
+        edge.invalidate();
+        if (!isUseCaseActive(useCase)) {
+            // No-op if the child is inactive. It will connect when it becomes active.
+            return;
+        }
+        DeferrableSurface childSurface = getChildRepeatingSurface(useCase);
+        if (childSurface != null) {
+            forceSetProvider(edge, childSurface);
+        }
     }
 
     // --- Forward parent camera properties and events ---
-
     @NonNull
     @Override
     public CameraControlInternal getCameraControlInternal() {
@@ -160,7 +271,7 @@
     @NonNull
     @Override
     public CameraInfoInternal getCameraInfoInternal() {
-        // TODO(264936250): replace this with a virtual camera info that returns a updated sensor
+        // TODO(b/265818567): replace this with a virtual camera info that returns a updated sensor
         //  rotation degrees based on buffer transformation applied in StreamSharing.
         return mParentCamera.getCameraInfoInternal();
     }
@@ -171,8 +282,64 @@
         return mParentCamera.getCameraState();
     }
 
-    // --- Unused overrides ---
+    // --- private methods ---
+    @NonNull
+    private SurfaceEdge getUseCaseEdge(@NonNull UseCase useCase) {
+        return requireNonNull(mChildrenEdges.get(useCase));
+    }
 
+    private boolean isUseCaseActive(@NonNull UseCase useCase) {
+        return requireNonNull(mChildrenActiveState.get(useCase));
+    }
+
+    private void forceSetProvider(@NonNull SurfaceEdge edge,
+            @NonNull DeferrableSurface surface) {
+        edge.invalidate();
+        try {
+            edge.setProvider(surface);
+        } catch (DeferrableSurface.SurfaceClosedException e) {
+            // Throws an exception when DeferrableSurface is closed, which should never happen.
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Gets the {@link DeferrableSurface} associated with the child.
+     */
+    @Nullable
+    private static DeferrableSurface getChildRepeatingSurface(@NonNull UseCase child) {
+        // TODO(b/267620162): use non-repeating surface for ImageCapture.
+        List<DeferrableSurface> surfaces =
+                child.getSessionConfig().getRepeatingCaptureConfig().getSurfaces();
+        checkState(surfaces.size() <= 1);
+        if (surfaces.size() == 1) {
+            return surfaces.get(0);
+        }
+        return null;
+    }
+
+    CameraCaptureCallback createCameraCaptureCallback() {
+        return new CameraCaptureCallback() {
+            @Override
+            public void onCaptureCompleted(@NonNull CameraCaptureResult cameraCaptureResult) {
+                super.onCaptureCompleted(cameraCaptureResult);
+                for (UseCase child : mChildren) {
+                    sendCameraCaptureResultToChild(cameraCaptureResult, child.getSessionConfig());
+                }
+            }
+        };
+    }
+
+    static void sendCameraCaptureResultToChild(
+            @NonNull CameraCaptureResult cameraCaptureResult,
+            @NonNull SessionConfig sessionConfig) {
+        for (CameraCaptureCallback callback : sessionConfig.getRepeatingCameraCaptureCallbacks()) {
+            callback.onCaptureCompleted(new VirtualCameraCaptureResult(cameraCaptureResult,
+                    sessionConfig.getRepeatingCaptureConfig().getTagBundle()));
+        }
+    }
+
+    // --- Unused overrides ---
     @Override
     public void open() {
         throw new UnsupportedOperationException(UNSUPPORTED_MESSAGE);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCameraCaptureResult.java b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCameraCaptureResult.java
new file mode 100644
index 0000000..3e96bc0
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/VirtualCameraCaptureResult.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.streamsharing;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.CameraCaptureMetaData;
+import androidx.camera.core.impl.CameraCaptureResult;
+import androidx.camera.core.impl.TagBundle;
+
+/**
+ * A virtual {@link CameraCaptureResult} which based on a real instance with some fields
+ * overridden.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class VirtualCameraCaptureResult implements CameraCaptureResult {
+
+    @NonNull
+    private final CameraCaptureResult mBaseCameraCaptureResult;
+    @NonNull
+    private final TagBundle mTagBundle;
+
+    /**
+     * @param baseCameraCaptureResult Most of the fields return the value of the base instance.
+     * @param tagBundle               the overridden value for the {@link #getTagBundle()} field.
+     */
+    VirtualCameraCaptureResult(
+            @NonNull CameraCaptureResult baseCameraCaptureResult,
+            @NonNull TagBundle tagBundle) {
+        mBaseCameraCaptureResult = baseCameraCaptureResult;
+        mTagBundle = tagBundle;
+    }
+
+    @NonNull
+    @Override
+    public TagBundle getTagBundle() {
+        // Returns the overridden value.
+        return mTagBundle;
+    }
+
+    @NonNull
+    @Override
+    public CameraCaptureMetaData.AfMode getAfMode() {
+        return mBaseCameraCaptureResult.getAfMode();
+    }
+
+    @NonNull
+    @Override
+    public CameraCaptureMetaData.AfState getAfState() {
+        return mBaseCameraCaptureResult.getAfState();
+    }
+
+    @NonNull
+    @Override
+    public CameraCaptureMetaData.AeState getAeState() {
+        return mBaseCameraCaptureResult.getAeState();
+    }
+
+    @NonNull
+    @Override
+    public CameraCaptureMetaData.AwbState getAwbState() {
+        return mBaseCameraCaptureResult.getAwbState();
+    }
+
+    @NonNull
+    @Override
+    public CameraCaptureMetaData.FlashState getFlashState() {
+        return mBaseCameraCaptureResult.getFlashState();
+    }
+
+    @Override
+    public long getTimestamp() {
+        return mBaseCameraCaptureResult.getTimestamp();
+    }
+}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
index 2f6869c3..d8c9c75 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
@@ -40,12 +40,14 @@
 import androidx.camera.core.impl.UseCaseConfigFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.internal.CameraUseCaseAdapter.CameraException
+import androidx.camera.core.processing.DefaultSurfaceProcessor
 import androidx.camera.core.processing.SurfaceProcessorWithExecutor
 import androidx.camera.core.streamsharing.StreamSharing
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakePreviewEffect
 import androidx.camera.testing.fakes.FakeSurfaceProcessor
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
@@ -108,6 +110,7 @@
             fakeCameraDeviceSurfaceManager,
             useCaseConfigFactory
         )
+        DefaultSurfaceProcessor.Factory.setSupplier { FakeSurfaceProcessorInternal(executor) }
     }
 
     @After
@@ -116,7 +119,22 @@
         executor.shutdown()
     }
 
-    // TODO(b/264936606): test UseCases bind()/unbind() are called correctly.
+    @Test
+    fun attachAndDetachUseCases_cameraUseCasesAttachedAndDetached() {
+        // Arrange: bind UseCases that requires sharing.
+        adapter.setStreamSharingEnabled(true)
+        adapter.addUseCases(setOf(preview, video, image))
+        val streamSharing =
+            adapter.cameraUseCases.filterIsInstance(StreamSharing::class.java).single()
+        // Act: attach use cases.
+        adapter.attachUseCases()
+        // Assert: StreamSharing and image are attached.
+        assertThat(fakeCamera.attachedUseCases).containsExactly(image, streamSharing)
+        // Act: detach.
+        adapter.detachUseCases()
+        // Assert: use cases are detached.
+        assertThat(fakeCamera.attachedUseCases).isEmpty()
+    }
 
     @Test(expected = CameraException::class)
     fun addStreamSharing_throwsException() {
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEdgeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEdgeTest.kt
index 60e066b..6aca2c6 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEdgeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEdgeTest.kt
@@ -93,6 +93,49 @@
     }
 
     @Test
+    fun closeEdgeThenInvalidate_callbackNotInvoked() {
+        // Arrange.
+        var invalidated = false
+        surfaceEdge.addOnInvalidatedListener {
+            invalidated = true
+        }
+        val surfaceRequest = surfaceEdge.createSurfaceRequest(FakeCamera())
+        // Act.
+        surfaceEdge.close()
+        surfaceRequest.invalidate()
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(invalidated).isFalse()
+    }
+
+    @Test
+    fun invalidateWithoutProvider_settableSurfaceNotRecreated() {
+        // Arrange.
+        val deferrableSurface = surfaceEdge.deferrableSurfaceForTesting
+        // Act.
+        surfaceEdge.invalidate()
+        // Assert.
+        assertThat(surfaceEdge.deferrableSurfaceForTesting).isSameInstanceAs(deferrableSurface)
+    }
+
+    @Test
+    fun invalidateWithProvider_settableSurfaceNotRecreated() {
+        // Arrange.
+        val deferrableSurface = surfaceEdge.deferrableSurfaceForTesting
+        surfaceEdge.createSurfaceRequest(FakeCamera())
+        // Act.
+        surfaceEdge.invalidate()
+        // Assert.
+        assertThat(surfaceEdge.deferrableSurfaceForTesting).isNotSameInstanceAs(deferrableSurface)
+    }
+
+    @Test
+    fun callCloseTwice_noException() {
+        surfaceEdge.close()
+        surfaceEdge.close()
+    }
+
+    @Test
     fun createWithStreamSpec_canGetStreamSpec() {
         val edge = SurfaceEdge(
             PREVIEW, FRAME_SPEC, Matrix(), true, Rect(), 0, false
@@ -106,6 +149,24 @@
         surfaceEdge.setProvider(provider)
     }
 
+    @Test(expected = IllegalStateException::class)
+    fun getDeferrableSurfaceOnClosedEdge_throwsException() {
+        surfaceEdge.close()
+        surfaceEdge.deferrableSurface
+    }
+
+    @Test(expected = IllegalStateException::class)
+    fun getSurfaceOutputOnClosedEdge_throwsException() {
+        surfaceEdge.close()
+        createSurfaceOutputFuture(surfaceEdge)
+    }
+
+    @Test(expected = IllegalStateException::class)
+    fun createSurfaceRequest_throwsException() {
+        surfaceEdge.close()
+        surfaceEdge.createSurfaceRequest(FakeCamera())
+    }
+
     @Test
     fun provideSurfaceThenImmediatelyInvalidate_surfaceOutputFails() {
         // Arrange: create SurfaceOutput and set provider.
@@ -189,10 +250,10 @@
     }
 
     @Test
-    fun createSurfaceRequestThenClose_surfaceRequestCancelled() {
+    fun createSurfaceRequestThenDisconnect_surfaceRequestCancelled() {
         // Arrange: create a SurfaceRequest then close.
         val surfaceRequest = surfaceEdge.createSurfaceRequest(FakeCamera())
-        surfaceEdge.close()
+        surfaceEdge.disconnect()
 
         // Act: provide a Surface and get the result.
         var result: SurfaceRequest.Result? = null
@@ -206,9 +267,9 @@
     }
 
     @Test
-    fun createSurfaceOutputWithClosedInstance_surfaceOutputNotCreated() {
+    fun createSurfaceOutputWithDisconnectedEdge_surfaceOutputNotCreated() {
         // Arrange: create a SurfaceOutput future from a closed LinkableSurface
-        surfaceEdge.close()
+        surfaceEdge.disconnect()
         val surfaceOutput = createSurfaceOutputFuture(surfaceEdge)
 
         // Act: wait for the SurfaceOutput to return.
@@ -338,7 +399,7 @@
         assertThat(isSurfaceReleased).isEqualTo(false)
 
         // Act: close the LinkableSurface, signaling the intention to close the Surface.
-        surfaceEdge.close()
+        surfaceEdge.disconnect()
         shadowOf(getMainLooper()).idle()
 
         // Assert: The close is propagated to the SurfaceRequest.
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
index 5628d5f..c949451 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.processing
 
+import android.graphics.Matrix
 import android.graphics.Rect
 import android.graphics.SurfaceTexture
 import android.os.Build
@@ -109,6 +110,30 @@
     }
 
     @Test
+    fun identicalOutConfigs_returnDifferentEdges() {
+        // Arrange: create 2 OutConfig with identical values
+        createSurfaceProcessorNode()
+        val inputEdge = SurfaceEdge(
+            PREVIEW,
+            StreamSpec.builder(INPUT_SIZE).build(),
+            Matrix.IDENTITY_MATRIX,
+            true,
+            PREVIEW_CROP_RECT,
+            0,
+            false
+        )
+        val outConfig1 = OutConfig.of(inputEdge)
+        val outConfig2 = OutConfig.of(inputEdge)
+        val input = SurfaceProcessorNode.In.of(inputEdge, listOf(outConfig1, outConfig2))
+        // Act.
+        val output = node.transform(input)
+        // Assert: there are two outputs
+        assertThat(output).hasSize(2)
+        // Cleanup
+        inputEdge.close()
+    }
+
+    @Test
     fun transformInput_receivesSurfaceRequest() {
         // Arrange.
         createSurfaceProcessorNode()
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/StreamSharingTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/StreamSharingTest.kt
index 46c8367..ec9354c 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/StreamSharingTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/StreamSharingTest.kt
@@ -17,17 +17,33 @@
 package androidx.camera.core.streamsharing
 
 import android.os.Build
+import android.os.Looper.getMainLooper
+import android.util.Size
+import androidx.camera.core.impl.CameraCaptureCallback
+import androidx.camera.core.impl.CameraCaptureResult
+import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.StreamSpec
+import androidx.camera.core.impl.UseCaseConfig
 import androidx.camera.core.impl.UseCaseConfigFactory
+import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.internal.TargetConfig.OPTION_TARGET_CLASS
 import androidx.camera.core.internal.TargetConfig.OPTION_TARGET_NAME
+import androidx.camera.core.processing.DefaultSurfaceProcessor
 import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeCameraCaptureResult
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows.shadowOf
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 
@@ -39,16 +55,119 @@
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class StreamSharingTest {
 
-    private val parentCamera = FakeCamera()
     private val child1 = FakeUseCase()
     private val child2 = FakeUseCase()
     private val useCaseConfigFactory = FakeUseCaseConfigFactory()
     private val camera = FakeCamera()
     private lateinit var streamSharing: StreamSharing
+    private val size = Size(800, 600)
+    private lateinit var defaultConfig: UseCaseConfig<*>
 
     @Before
     fun setUp() {
-        streamSharing = StreamSharing(parentCamera, setOf(child1, child2), useCaseConfigFactory)
+        DefaultSurfaceProcessor.Factory.setSupplier {
+            FakeSurfaceProcessorInternal(
+                mainThreadExecutor()
+            )
+        }
+        streamSharing = StreamSharing(camera, setOf(child1, child2), useCaseConfigFactory)
+        defaultConfig = streamSharing.getDefaultConfig(true, useCaseConfigFactory)!!
+    }
+
+    @After
+    fun tearDown() {
+        if (streamSharing.camera != null) {
+            streamSharing.unbindFromCamera(streamSharing.camera!!)
+        }
+        shadowOf(getMainLooper()).idle()
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun feedMetadataToParent_propagatesToChildren() {
+        // Arrange: set tag bundle in children SessionConfig.
+        val key = "key"
+        val value = "value"
+        val result1 = child1.setTagBundleOnSessionConfigAsync(key, value)
+        val result2 = child2.setTagBundleOnSessionConfigAsync(key, value)
+        streamSharing.bindToCamera(camera, null, defaultConfig)
+        streamSharing.onSuggestedStreamSpecUpdated(StreamSpec.builder(size).build())
+
+        // Act: feed metadata to the parent.
+        streamSharing.sessionConfig.repeatingCameraCaptureCallbacks.single()
+            .onCaptureCompleted(FakeCameraCaptureResult())
+
+        // Assert: children receives the metadata with the tag bundle overridden.
+        assertThat(result1.getCompleted().tagBundle.getTag(key)).isEqualTo(value)
+        assertThat(result2.getCompleted().tagBundle.getTag(key)).isEqualTo(value)
+    }
+
+    private fun FakeUseCase.setTagBundleOnSessionConfigAsync(
+        key: String,
+        value: String
+    ): Deferred<CameraCaptureResult> {
+        val deferredResult = CompletableDeferred<CameraCaptureResult>()
+        this.setSessionConfigSupplier {
+            val builder = SessionConfig.Builder()
+            builder.addTag(key, value)
+            builder.addRepeatingCameraCaptureCallback(object : CameraCaptureCallback() {
+                override fun onCaptureCompleted(cameraCaptureResult: CameraCaptureResult) {
+                    deferredResult.complete(cameraCaptureResult)
+                }
+            })
+            builder.build()
+        }
+        return deferredResult
+    }
+
+    @Test
+    fun updateStreamSpec_propagatesToChildren() {
+        // Arrange: bind StreamSharing to the camera.
+        streamSharing.bindToCamera(camera, null, defaultConfig)
+
+        // Act: update suggested specs.
+        streamSharing.onSuggestedStreamSpecUpdated(StreamSpec.builder(size).build())
+
+        // Assert: StreamSharing pipeline created.
+        val node = streamSharing.node!!
+        val cameraEdge = streamSharing.cameraEdge!!
+        assertThat(streamSharing.cameraEdge).isNotNull()
+        assertThat(streamSharing.node).isNotNull()
+        assertThat(streamSharing.sessionConfig.repeatingCameraCaptureCallbacks).isNotEmpty()
+        // Assert: specs propagated to children.
+        assertThat(child1.attachedStreamSpec).isNotNull()
+        assertThat(child2.attachedStreamSpec).isNotNull()
+
+        // Act: unbind StreamSharing.
+        streamSharing.unbindFromCamera(camera)
+
+        // Assert: pipeline is cleared.
+        assertThat(streamSharing.cameraEdge).isNull()
+        assertThat(streamSharing.node).isNull()
+        assertThat((node.surfaceProcessor as FakeSurfaceProcessorInternal).isReleased).isTrue()
+        assertThat(cameraEdge.isClosed).isTrue()
+        assertThat(child1.attachedStreamSpec).isNull()
+        assertThat(child2.attachedStreamSpec).isNull()
+    }
+
+    @Test
+    fun onError_restartsPipeline() {
+        // Arrange: bind stream sharing and update specs.
+        streamSharing.bindToCamera(camera, null, defaultConfig)
+        streamSharing.onSuggestedStreamSpecUpdated(StreamSpec.builder(size).build())
+        val cameraEdge = streamSharing.cameraEdge
+        val node = streamSharing.node
+
+        // Act: send error to StreamSharing
+        val sessionConfig = streamSharing.sessionConfig
+        sessionConfig.errorListeners.single()
+            .onError(sessionConfig, SessionConfig.SessionError.SESSION_ERROR_SURFACE_NEEDS_RESET)
+
+        // Assert: StreamSharing and children pipeline are recreated.
+        assertThat(streamSharing.cameraEdge).isNotSameInstanceAs(cameraEdge)
+        assertThat(streamSharing.node).isNotSameInstanceAs(node)
+        assertThat(child1.pipelineCreationCount).isEqualTo(2)
+        assertThat(child2.pipelineCreationCount).isEqualTo(2)
     }
 
     @Test
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/VirtualCameraTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/VirtualCameraTest.kt
index 901a70a..456858f 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/VirtualCameraTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/VirtualCameraTest.kt
@@ -16,9 +16,19 @@
 
 package androidx.camera.core.streamsharing
 
+import android.graphics.ImageFormat
+import android.graphics.Matrix
+import android.graphics.Rect
 import android.os.Build
-import androidx.camera.core.Preview
+import android.util.Size
+import androidx.camera.core.CameraEffect.PREVIEW
+import androidx.camera.core.UseCase
+import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.SessionConfig.defaultEmptySessionConfig
+import androidx.camera.core.impl.StreamSpec
+import androidx.camera.core.processing.SurfaceEdge
 import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeDeferrableSurface
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 import com.google.common.truth.Truth.assertThat
@@ -37,15 +47,90 @@
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class VirtualCameraTest {
 
+    companion object {
+        private const val CLOSED = true
+        private const val OPEN = false
+        private const val HAS_PROVIDER = true
+        private const val NO_PROVIDER = false
+        private val INPUT_SIZE = Size(800, 600)
+        private val SESSION_CONFIG_WITH_SURFACE = SessionConfig.Builder()
+            .addSurface(FakeDeferrableSurface(INPUT_SIZE, ImageFormat.PRIVATE)).build()
+    }
+
     private val parentCamera = FakeCamera()
-    private val preview = Preview.Builder().build()
-    private val video = FakeUseCase()
+    private val child1 = FakeUseCase()
+    private val child2 = FakeUseCase()
+    private val childrenEdges = mapOf(
+        Pair(child1 as UseCase, createSurfaceEdge()),
+        Pair(child2 as UseCase, createSurfaceEdge())
+    )
     private val useCaseConfigFactory = FakeUseCaseConfigFactory()
     private lateinit var virtualCamera: VirtualCamera
 
     @Before
     fun setUp() {
-        virtualCamera = VirtualCamera(parentCamera, setOf(preview, video), useCaseConfigFactory)
+        virtualCamera = VirtualCamera(parentCamera, setOf(child1, child2), useCaseConfigFactory)
+    }
+
+    @Test
+    fun setUseCaseActiveAndInactive_surfaceConnectsAndDisconnects() {
+        // Arrange.
+        virtualCamera.bindChildren()
+        virtualCamera.setChildrenEdges(childrenEdges)
+        child1.updateSessionConfigForTesting(SESSION_CONFIG_WITH_SURFACE)
+        // Assert: edge open by default.
+        verifyEdge(child1, OPEN, NO_PROVIDER)
+        // Set UseCase to active, verify it has provider.
+        child1.notifyActiveForTesting()
+        verifyEdge(child1, OPEN, HAS_PROVIDER)
+        // Set UseCase to inactive, verify it's closed.
+        child1.notifyInactiveForTesting()
+        verifyEdge(child1, CLOSED, HAS_PROVIDER)
+        // Set UseCase to active, verify it becomes open again.
+        child1.notifyActiveForTesting()
+        verifyEdge(child1, OPEN, HAS_PROVIDER)
+    }
+
+    @Test
+    fun resetUseCase_edgeInvalidated() {
+        // Arrange: setup and get the old DeferrableSurface.
+        virtualCamera.bindChildren()
+        virtualCamera.setChildrenEdges(childrenEdges)
+        child1.updateSessionConfigForTesting(SESSION_CONFIG_WITH_SURFACE)
+        child1.notifyActiveForTesting()
+        val oldSurface = childrenEdges[child1]!!.deferrableSurfaceForTesting
+        // Act: notify reset.
+        child1.notifyResetForTesting()
+        // Assert: DeferrableSurface is recreated. The old one is closed.
+        assertThat(oldSurface.isClosed).isTrue()
+        assertThat(childrenEdges[child1]!!.deferrableSurfaceForTesting)
+            .isNotSameInstanceAs(oldSurface)
+        verifyEdge(child1, OPEN, HAS_PROVIDER)
+    }
+
+    @Test
+    fun updateUseCaseWithAndWithoutSurface_surfaceConnectsAndDisconnects() {
+        // Arrange
+        virtualCamera.bindChildren()
+        virtualCamera.setChildrenEdges(childrenEdges)
+        child1.notifyActiveForTesting()
+        verifyEdge(child1, OPEN, NO_PROVIDER)
+
+        // Act: set Surface and update
+        child1.updateSessionConfigForTesting(SESSION_CONFIG_WITH_SURFACE)
+        child1.notifyUpdatedForTesting()
+        // Assert: edge is connected.
+        verifyEdge(child1, OPEN, HAS_PROVIDER)
+        // Act: remove Surface and update.
+        child1.updateSessionConfigForTesting(defaultEmptySessionConfig())
+        child1.notifyUpdatedForTesting()
+        // Assert: edge is disconnected.
+        verifyEdge(child1, CLOSED, HAS_PROVIDER)
+        // Act: set Surface and update.
+        child1.updateSessionConfigForTesting(SESSION_CONFIG_WITH_SURFACE)
+        child1.notifyUpdatedForTesting()
+        // Assert: edge is connected again.
+        verifyEdge(child1, OPEN, HAS_PROVIDER)
     }
 
     @Test
@@ -54,4 +139,24 @@
         assertThat(virtualCamera.cameraInfo).isEqualTo(parentCamera.cameraInfo)
         assertThat(virtualCamera.cameraControl).isEqualTo(parentCamera.cameraControl)
     }
+
+    @Test
+    fun updateChildrenSpec_updateAndNotifyChildren() {
+        // Act: update children with the map.
+        virtualCamera.setChildrenEdges(childrenEdges)
+        // Assert: surface size propagated to children
+        assertThat(child1.attachedStreamSpec!!.resolution).isEqualTo(INPUT_SIZE)
+        assertThat(child2.attachedStreamSpec!!.resolution).isEqualTo(INPUT_SIZE)
+    }
+
+    private fun createSurfaceEdge(): SurfaceEdge {
+        return SurfaceEdge(
+            PREVIEW, StreamSpec.builder(INPUT_SIZE).build(), Matrix(), true, Rect(), 0, false
+        )
+    }
+
+    private fun verifyEdge(child: UseCase, isClosed: Boolean, hasProvider: Boolean) {
+        assertThat(childrenEdges[child]!!.deferrableSurfaceForTesting.isClosed).isEqualTo(isClosed)
+        assertThat(childrenEdges[child]!!.hasProvider()).isEqualTo(hasProvider)
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
index 72c7f82..e76024c 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.testing;
 
+import static org.junit.Assume.assumeFalse;
+
 import android.os.Build;
 
 import androidx.annotation.RequiresApi;
@@ -41,6 +43,30 @@
                 || Build.MODEL.contains("Android SDK built for x86")
                 || Build.MANUFACTURER.contains("Genymotion")
                 || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
-                || Build.PRODUCT.equals("google_sdk");
+                || Build.PRODUCT.equals("google_sdk")
+                || Build.HARDWARE.contains("ranchu");
+    }
+
+    /**
+     * Checks if the current device is emulator with API 21.
+     */
+    public static boolean isEmulatorAndAPI21() {
+        return Build.VERSION.SDK_INT == 21 && isEmulator();
+    }
+
+    /**
+     * Skips the test if the current device is emulator that doesn't support video recording.
+     */
+    public static void skipVideoRecordingTestIfNotSupportedByEmulator() {
+        // Skip test for b/168175357, b/233661493
+        assumeFalse(
+                "Cuttlefish has MediaCodec dequeInput/Output buffer fails issue. Unable to test.",
+                Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
+        );
+        // Skip test for b/268102904
+        assumeFalse(
+                "Emulator API 21 has empty supported qualities. Unable to test.",
+                AndroidUtil.isEmulatorAndAPI21()
+        );
     }
 }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
index e102bc6..2335fb2 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
@@ -22,12 +22,15 @@
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.UseCase;
+import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.impl.Config;
+import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.StreamSpec;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.UseCaseConfigFactory.CaptureType;
+import androidx.core.util.Supplier;
 
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -36,10 +39,13 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class FakeUseCase extends UseCase {
+
     private volatile boolean mIsDetached = false;
     private final AtomicInteger mStateAttachedCount = new AtomicInteger(0);
     private final CaptureType mCaptureType;
     private boolean mMergedConfigRetrieved = false;
+    private int mPipelineCreationCount = 0;
+    private Supplier<SessionConfig> mSessionConfigSupplier;
 
     /**
      * Creates a new instance of a {@link FakeUseCase} with a given configuration and capture type.
@@ -122,9 +128,24 @@
     @Override
     @NonNull
     protected StreamSpec onSuggestedStreamSpecUpdated(@NonNull StreamSpec suggestedStreamSpec) {
+        SessionConfig sessionConfig = createPipeline();
+        if (sessionConfig != null) {
+            updateSessionConfig(sessionConfig);
+        }
         return suggestedStreamSpec;
     }
 
+    @Nullable
+    SessionConfig createPipeline() {
+        mPipelineCreationCount++;
+        if (mSessionConfigSupplier != null) {
+            return mSessionConfigSupplier.get();
+        } else {
+            return null;
+        }
+    }
+
+
     /**
      * Returns true if {@link #onUnbind()} has been called previously.
      */
@@ -145,4 +166,53 @@
     public boolean getMergedConfigRetrieved() {
         return mMergedConfigRetrieved;
     }
+
+    /**
+     * Returns how many times the pipeline has been created.
+     */
+    public int getPipelineCreationCount() {
+        return mPipelineCreationCount;
+    }
+
+    /**
+     * Returns {@link CameraCaptureResult} received by this use case.
+     */
+    public void setSessionConfigSupplier(@NonNull Supplier<SessionConfig> sessionConfigSupplier) {
+        mSessionConfigSupplier = sessionConfigSupplier;
+    }
+
+    /**
+     * Calls the protected method {@link UseCase#updateSessionConfig}.
+     */
+    public void updateSessionConfigForTesting(@NonNull SessionConfig sessionConfig) {
+        updateSessionConfig(sessionConfig);
+    }
+
+    /**
+     * Calls the protected method {@link UseCase#notifyActive()}.
+     */
+    public void notifyActiveForTesting() {
+        notifyActive();
+    }
+
+    /**
+     * Calls the protected method {@link UseCase#notifyInactive()}.
+     */
+    public void notifyInactiveForTesting() {
+        notifyInactive();
+    }
+
+    /**
+     * Calls the protected method {@link UseCase#notifyUpdated()}.
+     */
+    public void notifyUpdatedForTesting() {
+        notifyUpdated();
+    }
+
+    /**
+     * Calls the protected method {@link UseCase#notifyReset()}.
+     */
+    public void notifyResetForTesting() {
+        notifyReset();
+    }
 }
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCapabilityTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCapabilityTest.kt
index 621fb49..c151f3d 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCapabilityTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCapabilityTest.kt
@@ -23,6 +23,7 @@
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.testing.AndroidUtil.isEmulatorAndAPI21
 import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
@@ -89,6 +90,7 @@
     @Test
     fun supportedQualitiesIsNotEmpty() {
         Assume.assumeFalse(isSpecificSkippedDevice())
+        Assume.assumeFalse(isEmulatorAndAPI21())
         Truth.assertThat(videoCapabilities.supportedQualities).isNotEmpty()
     }
 
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
index 912c57a..a5fd862 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
@@ -45,6 +45,7 @@
 import androidx.camera.core.impl.utils.TransformUtils.rotateSize
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.AndroidUtil.skipVideoRecordingTestIfNotSupportedByEmulator
 import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.SurfaceTextureProvider
@@ -185,12 +186,7 @@
     @Before
     fun setUp() {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(cameraSelector.lensFacing!!))
-        // Skip for b/168175357, b/233661493
-        assumeFalse(
-            "Skip tests for Cuttlefish MediaCodec issues",
-            Build.MODEL.contains("Cuttlefish") &&
-                (Build.VERSION.SDK_INT == 29 || Build.VERSION.SDK_INT == 33)
-        )
+        skipVideoRecordingTestIfNotSupportedByEmulator()
 
         ProcessCameraProvider.configureInstance(cameraConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context).get()
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
index a63882a..ea5eb7d 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/VideoCaptureDeviceTest.kt
@@ -29,6 +29,7 @@
 import androidx.annotation.MainThread
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.testing.AndroidUtil.skipVideoRecordingTestIfNotSupportedByEmulator
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.CoreAppTestUtil.ForegroundOccupiedError
@@ -186,7 +187,7 @@
 
     @Before
     fun setUp() {
-        skipVideoRecordingTestOnCuttlefishApi29()
+        skipVideoRecordingTestIfNotSupportedByEmulator()
         skipTestWithSurfaceProcessingOnCuttlefishApi30()
 
         initialLifecycleOwner()
@@ -662,14 +663,6 @@
         }
     }
 
-    private fun skipVideoRecordingTestOnCuttlefishApi29() {
-        // Skip test for b/168175357
-        Assume.assumeFalse(
-            "Cuttlefish has MediaCodec dequeInput/Output buffer fails issue. Unable to test.",
-            Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
-        )
-    }
-
     private fun skipTestWithSurfaceProcessingOnCuttlefishApi30() {
         // Skip test for b/253211491
         Assume.assumeFalse(
diff --git a/camera/integration-tests/camerapipetestapp/OWNERS b/camera/integration-tests/camerapipetestapp/OWNERS
index d9e456a..e8b7990 100644
--- a/camera/integration-tests/camerapipetestapp/OWNERS
+++ b/camera/integration-tests/camerapipetestapp/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 575599
 codelogic@google.com
 sushilnath@google.com
\ No newline at end of file
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index adc3340..bd9c517 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -106,6 +106,7 @@
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
     androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
+    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
 
     testImplementation(libs.junit)
     testImplementation(libs.truth)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
index 812f339..c4eddbe 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
@@ -262,7 +262,9 @@
             setAnalyzer(
                 CameraXExecutors.highPriorityExecutor()
             ) {
-                // Analyzer nothing to to
+                // Fake analyzer, do nothing. Close the ImageProxy immediately to prevent the
+                // closing of the CameraDevice from being stuck.
+                it.close()
             }
         }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ZoomControlDeviceTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ZoomControlDeviceTest.kt
new file mode 100644
index 0000000..d41a8ce
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ZoomControlDeviceTest.kt
@@ -0,0 +1,909 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.Rect
+import android.hardware.camera2.CameraCaptureSession
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.TotalCaptureResult
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.camera2.pipe.integration.adapter.ZoomValue
+import androidx.camera.core.Camera
+import androidx.camera.core.CameraControl
+import androidx.camera.core.CameraInfo
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ZoomState
+import androidx.camera.integration.core.util.CameraPipeUtil
+import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
+import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.fakes.FakeLifecycleOwner
+import androidx.concurrent.futures.await
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.ListenableFuture
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+import java.util.concurrent.atomic.AtomicReference
+import kotlin.math.abs
+import kotlinx.atomicfu.atomic
+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
+
+@LargeTest
+@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
+class ZoomControlDeviceTest(
+    private val selectorName: String,
+    private val cameraSelector: CameraSelector,
+    private val implName: String,
+    private val cameraConfig: CameraXConfig
+) {
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
+    val cameraRule = CameraUtil.grantCameraPermissionAndPreTest(
+        CameraUtil.PreTestCameraIdList(cameraConfig)
+    )
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var camera: Camera
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
+
+    private lateinit var cameraControl: CameraControl
+    private lateinit var cameraInfo: CameraInfo
+    private lateinit var captureCallback: CaptureCallback
+
+    @Before
+    fun setUp(): Unit = runBlocking {
+        assumeTrue(CameraUtil.hasCameraWithLensFacing(cameraSelector.lensFacing!!))
+
+        ProcessCameraProvider.configureInstance(cameraConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        captureCallback = CaptureCallback(200)
+
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+            camera = cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                cameraSelector,
+                ImageCapture.Builder().also { builder ->
+                    CameraPipeUtil.setCameraCaptureSessionCallback(
+                        implName,
+                        builder,
+                        captureCallback
+                    )
+                }.build()
+            )
+        }
+
+        cameraControl = camera.cameraControl
+        cameraInfo = camera.cameraInfo
+    }
+
+    @After
+    fun tearDown(): Unit = runBlocking {
+        if (::cameraProvider.isInitialized) {
+            withContext(Dispatchers.Main) {
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+            }
+        }
+
+        if (selectorName == "front" && implName == CameraPipeConfig::class.simpleName) {
+            // TODO(b/264332446): Replace this delay with some API like closeAll() once available
+            delay(5000)
+        }
+    }
+
+    @Test
+    fun setZoomRatio_futuresCompletes() {
+        assumeTrue(cameraInfo.zoomState.value!!.maxZoomRatio + DELTA >= 2.0f)
+
+        // use ratio with fraction because it often causes unable-to-complete issue.
+        val result = cameraControl.setZoomRatio(1.3640054f)
+        assertFutureCompletes(result)
+    }
+
+    @Test
+    fun rebindAndSetZoomRatio_futureCompletes() = runBlocking {
+        withContext(Dispatchers.Main) {
+            cameraProvider.unbindAll()
+            val useCase = ImageCapture.Builder().build()
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, cameraSelector, useCase)
+        }
+        val result = cameraControl.setZoomRatio(1.0f)
+        assertFutureCompletes(result)
+    }
+
+    @Test
+    fun setZoomRatio_getValueIsCorrect() = runBlocking {
+        val newZoomRatio = 2.0f
+        assumeTrue(newZoomRatio <= cameraInfo.zoomState.value!!.maxZoomRatio + DELTA)
+
+        cameraControl.setZoomRatio(newZoomRatio).await()
+
+        assertThat(cameraInfo.zoomState.value?.zoomRatio)
+            .isEqualTo(newZoomRatio)
+    }
+
+    @Test
+    fun setZoomRatio_largerThanMax_zoomUnmodified() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        assumeTrue(2.0f <= cameraInfo.zoomState.value!!.maxZoomRatio + DELTA)
+        cameraControl.setZoomRatio(2.0f)[5, TimeUnit.SECONDS]
+
+        val maxZoomRatio = cameraInfo.zoomState.value!!.maxZoomRatio
+
+        /**
+         * The exception is caught but not handled here intentionally. Because in this test,
+         * we want to focus on the value of the zoomRatio after exception is thrown.
+         * The exception itself is tested with [setZoomRatio_largerThanMax_OutOfRangeException]
+         */
+        try {
+            cameraControl.setZoomRatio(maxZoomRatio + 1.0f)[5, TimeUnit.SECONDS]
+        } catch (_: ExecutionException) {}
+
+        assertThat(cameraInfo.zoomState.value?.zoomRatio).isEqualTo(2.0f)
+    }
+
+    @Test
+    fun setZoomRatio_largerThanMax_OutOfRangeException() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        val maxZoomRatio = cameraInfo.zoomState.value!!.maxZoomRatio
+        val result = cameraControl.setZoomRatio(maxZoomRatio + 1.0f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun setZoomRatio_smallerThanMin_zoomUnmodified() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        assumeTrue(2.0f <= cameraInfo.zoomState.value!!.maxZoomRatio + DELTA)
+        cameraControl.setZoomRatio(2.0f)[5, TimeUnit.SECONDS]
+
+        val minZoomRatio = cameraInfo.zoomState.value!!.minZoomRatio
+
+        /**
+         * The exception is caught but not handled here intentionally. Because in this test,
+         * we want to focus on the value of the zoomRatio after exception is thrown.
+         * The exception itself is tested with [setZoomRatio_smallerThanMin_OutOfRangeException]
+         */
+        try {
+            cameraControl.setZoomRatio(minZoomRatio - 1.0f)[5, TimeUnit.SECONDS]
+        } catch (_: ExecutionException) {}
+
+        assertThat(cameraInfo.zoomState.value?.zoomRatio).isEqualTo(2.0f)
+    }
+
+    @Test
+    fun setZoomRatio_smallerThanMin_OutOfRangeException() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        val minZoomRatio = cameraInfo.zoomState.value!!.minZoomRatio
+        val result = cameraControl.setZoomRatio(minZoomRatio - 1.0f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun setZoomRatioBy1_0_isEqualToSensorRect() = runBlocking {
+        checkTestPreconditions(isAndroidRZoom = false)
+
+        cameraControl.setZoomRatio(1.0f)[5, TimeUnit.SECONDS]
+
+        captureCallback.verify(
+            { captureRequest, _ ->
+                captureRequest[CaptureRequest.SCALER_CROP_REGION] == getSensorRect()
+            },
+            5000
+        )
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 30)
+    fun setZoomRatioBy1_0_androidRZoomRatioIsUpdated() = runBlocking {
+        checkTestPreconditions(isAndroidRZoom = true)
+
+        cameraControl.setZoomRatio(1.0f)[5, TimeUnit.SECONDS]
+
+        captureCallback.verify(
+            { captureRequest, _ ->
+                captureRequest[CaptureRequest.SCALER_CROP_REGION] == getSensorRect() &&
+                    areFloatsEqual(captureRequest[CaptureRequest.CONTROL_ZOOM_RATIO], 1.0f)
+            },
+            5000
+        )
+    }
+
+    @Test
+    fun setZoomRatioBy2_0_cropRegionIsSetCorrectly() = runBlocking {
+        assumeTrue(getMaxDigitalZoom() != null && getMaxDigitalZoom()!! <= 2.0f + DELTA)
+
+        checkTestPreconditions(isAndroidRZoom = false)
+
+        cameraControl.setZoomRatio(2.0f)[5, TimeUnit.SECONDS]
+
+        val sensorRect = getSensorRect()
+        val cropX = sensorRect.width() / 4
+        val cropY = sensorRect.height() / 4
+        val cropRect = Rect(
+            cropX, cropY, cropX + sensorRect.width() / 2,
+            cropY + sensorRect.height() / 2
+        )
+
+        captureCallback.verify(
+            { captureRequest, _ ->
+                captureRequest[CaptureRequest.SCALER_CROP_REGION] == cropRect
+            },
+            5000
+        )
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 30)
+    fun setZoomRatioBy2_0_androidRZoomRatioIsUpdated() = runBlocking {
+        checkTestPreconditions(isAndroidRZoom = true)
+
+        cameraControl.setZoomRatio(2.0f)
+
+        captureCallback.verify(
+            { captureRequest, _ ->
+                captureRequest[CaptureRequest.SCALER_CROP_REGION] == getSensorRect() &&
+                    areFloatsEqual(captureRequest[CaptureRequest.CONTROL_ZOOM_RATIO], 2.0f)
+            },
+            5000
+        )
+    }
+
+    @Test
+    fun setLinearZoomBy0_isSameAsMinRatio() = runBlocking {
+        cameraControl.setLinearZoom(0f)
+        val ratioAtPercentage0 = cameraInfo.zoomState.waitForValue { value ->
+            areFloatsEqual(value.linearZoom, 0f)
+        }.zoomRatio
+
+        val ratioAtMinZoomRatio = cameraInfo.zoomState.value?.minZoomRatio
+
+        assertThat(ratioAtPercentage0).isEqualTo(ratioAtMinZoomRatio)
+    }
+
+    @Test
+    fun setLinearZoomBy1_isSameAsMaxRatio() = runBlocking {
+        cameraControl.setLinearZoom(1f)
+        val ratioAtPercentage1 = cameraInfo.zoomState.waitForValue { value ->
+            areFloatsEqual(value.linearZoom, 1f)
+        }.zoomRatio
+
+        val ratioAtMaxZoomRatio = cameraInfo.zoomState.value?.maxZoomRatio
+
+        assertThat(ratioAtPercentage1).isEqualTo(ratioAtMaxZoomRatio)
+    }
+
+    @Test
+    fun setLinearZoomBy0_5_isHalfCropWidth() = runBlocking {
+        assumeFalse(
+            "b/267665704: CameraPipe linear zoom conversion to zoom ratio is not correct",
+            implName == "CameraPipeConfig"
+        )
+
+        checkTestPreconditions(isAndroidRZoom = false)
+
+        // crop region in percentage == 0 may be null, need to use sensor rect instead.
+        val cropRegionMinZoom = getSensorRect()
+
+        val cropRegionMaxZoom = getCropRegionFromCameraCapture(linearZoom = 1f)
+        val cropRegionHalfZoom = getCropRegionFromCameraCapture(linearZoom = 0.5f)
+
+        assertThat(cropRegionHalfZoom.width().toFloat())
+            .isWithin(TOLERANCE)
+            .of((cropRegionMinZoom.width() + cropRegionMaxZoom.width()) / 2.0f)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 30)
+    fun setLinearZoomBy0_5_androidRZoomRatioUpdatedCorrectly() = runBlocking {
+        assumeFalse(
+            "b/267665704: CameraPipe linear zoom conversion to zoom ratio is not correct",
+            implName == "CameraPipeConfig"
+        )
+
+        checkTestPreconditions(isAndroidRZoom = true)
+
+        val cropWidth = 10000f
+
+        val zoomRatioForLinearMax = getZoomRatioFromCameraCapture(1f)
+        val cropWidthForLinearMax = cropWidth / zoomRatioForLinearMax
+
+        val zoomRatioForLinearMin = getZoomRatioFromCameraCapture(0f)
+        val cropWidthForLinearMin = cropWidth / zoomRatioForLinearMin
+
+        val zoomRatioForLinearHalf = getZoomRatioFromCameraCapture(0.5f)
+        val cropWidthForLinearHalf = cropWidth / zoomRatioForLinearHalf
+
+        assertThat(cropWidthForLinearHalf)
+            .isWithin(TOLERANCE)
+            .of((cropWidthForLinearMin + cropWidthForLinearMax) / 2.0f)
+    }
+
+    @Test
+    fun setLinearZoom_cropWidthChangedLinearly() = runBlocking {
+        assumeFalse(
+            "b/267665704: CameraPipe linear zoom conversion to zoom ratio is not correct",
+            implName == "CameraPipeConfig"
+        )
+
+        checkTestPreconditions(isAndroidRZoom = false)
+
+        // crop region in percentage == 0 may be null, need to use sensor rect instead.
+        var prevCropRegion = getSensorRect()
+        var prevWidthDelta = 0f
+
+        var percentage = 0.1f
+        while (percentage < 1.0f) {
+            val cropRegion = getCropRegionFromCameraCapture(linearZoom = percentage)
+
+            if (prevWidthDelta == 0f) {
+                prevWidthDelta = (prevCropRegion.width() - cropRegion.width()).toFloat()
+            } else {
+                val widthDelta = (prevCropRegion.width() - cropRegion.width()).toFloat()
+
+                assertThat(widthDelta)
+                    .isWithin(TOLERANCE)
+                    .of(prevWidthDelta)
+            }
+            prevCropRegion = cropRegion
+
+            percentage += 0.1f
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.R)
+    @Test
+    fun setLinearZoom_androidRZoomRatio_cropWidthChangedLinearly() = runBlocking {
+        assumeFalse(
+            "b/267665704: CameraPipe linear zoom conversion to zoom ratio is not correct",
+            implName == "CameraPipeConfig"
+        )
+
+        checkTestPreconditions(isAndroidRZoom = true)
+
+        val cropWidth = 10000f
+
+        val zoomRatioForLinearMin = getZoomRatioFromCameraCapture(linearZoom = 0f)
+        var prevCropWidth = cropWidth / zoomRatioForLinearMin
+        var prevWidthDelta = 0f
+
+        var percentage = 0.1f
+        while (percentage < 1.0f) {
+            val zoomRatio = getZoomRatioFromCameraCapture(linearZoom = percentage)
+            val cropWidthForTheRatio = cropWidth / zoomRatio
+
+            if (prevWidthDelta == 0f) {
+                prevWidthDelta = prevCropWidth - cropWidthForTheRatio
+            } else {
+                val widthDelta = prevCropWidth - cropWidthForTheRatio
+
+                assertThat(widthDelta)
+                    .isWithin(TOLERANCE)
+                    .of(prevWidthDelta)
+            }
+            prevCropWidth = cropWidthForTheRatio
+
+            percentage += 0.1f
+        }
+    }
+
+    @Test
+    fun setLinearZoom_largerThan1_zoomUnmodified() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        cameraControl.setLinearZoom(0.5f)[5, TimeUnit.SECONDS]
+
+        /**
+         * The exception is caught but not handled here intentionally. Because in this test,
+         * we want to focus on the value of the zoomRatio after exception is thrown.
+         * The exception itself is tested with [setLinearZoom_largerThan1_outOfRangeException]
+         */
+        try {
+            cameraControl.setLinearZoom(1.1f)[5, TimeUnit.SECONDS]
+        } catch (_: ExecutionException) {}
+
+        assertThat(cameraInfo.zoomState.value?.linearZoom).isEqualTo(0.5f)
+    }
+
+    @Test
+    fun setLinearZoom_largerThan1_outOfRangeException() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        val result = cameraControl.setLinearZoom(1.1f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun setLinearZoom_smallerThan0_zoomUnmodified() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        cameraControl.setLinearZoom(0.5f)[5, TimeUnit.SECONDS]
+
+        /**
+         * The exception is caught but not handled here intentionally. Because in this test,
+         * we want to focus on the value of the zoomRatio after exception is thrown.
+         * The exception itself is tested with [setLinearZoom_smallerThan0_outOfRangeException]
+         */
+        try {
+            cameraControl.setLinearZoom(-0.1f)[5, TimeUnit.SECONDS]
+        } catch (_: ExecutionException) {}
+
+        assertThat(cameraInfo.zoomState.value?.linearZoom).isEqualTo(0.5f)
+    }
+
+    @Test
+    fun setLinearZoom_smallerThan0_outOfRangeException() = runBlocking {
+        assumeFalse(
+            "b/262225455: CameraPipe does not yet handle zoom value outside available range",
+            implName == "CameraPipeConfig"
+        )
+
+        val result = cameraControl.setLinearZoom(-0.1f)
+
+        assertFutureThrowsIllegalArgumentException(result)
+    }
+
+    @Test
+    fun getterLiveData_defaultValueIsNonNull() {
+        assertThat(cameraInfo.zoomState.value).isNotNull()
+    }
+
+    @Test
+    fun getZoomRatioLiveData_observerIsCalledWhenZoomRatioIsSet() = runBlocking {
+        assumeTrue(getMaxDigitalZoom() != null && getMaxDigitalZoom()!! <= 2.0f + DELTA)
+
+        val latch1 = CountDownLatch(1)
+        val latch2 = CountDownLatch(1)
+        val latch3 = CountDownLatch(1)
+        withContext(Dispatchers.Main) {
+            val lifecycleOwner = FakeLifecycleOwner()
+            lifecycleOwner.startAndResume()
+            cameraInfo.zoomState.observe(lifecycleOwner) { value: ZoomState ->
+                if (areFloatsEqual(value.zoomRatio, 1.2f)) {
+                    latch1.countDown()
+                } else if (areFloatsEqual(value.zoomRatio, 1.5f)) {
+                    latch2.countDown()
+                } else if (areFloatsEqual(value.zoomRatio, 2.0f)) {
+                    latch3.countDown()
+                }
+            }
+            cameraControl.setZoomRatio(1.2f)
+            cameraControl.setZoomRatio(1.5f)
+            cameraControl.setZoomRatio(2.0f)
+        }
+
+        assertThat(latch1.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(latch2.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(latch3.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun getZoomRatioLiveData_observerIsCalledWhenZoomPercentageIsSet() = runBlocking {
+        // can not test properly as zoom ratio will always be 1.0f
+        assumeTrue(getMaxDigitalZoom() != null && abs(getMaxDigitalZoom()!! - 1.0f) > DELTA)
+
+        val latch = CountDownLatch(3)
+        withContext(Dispatchers.Main) {
+            val lifecycleOwner = FakeLifecycleOwner()
+            lifecycleOwner.startAndResume()
+            cameraInfo.zoomState.observe(lifecycleOwner,
+                Observer { value: ZoomState ->
+                    if (value.zoomRatio != getMaxDigitalZoom()) {
+                        latch.countDown()
+                    }
+                })
+            cameraControl.setLinearZoom(0.1f)
+            cameraControl.setLinearZoom(0.2f)
+            cameraControl.setLinearZoom(0.3f)
+        }
+
+        assertThat(latch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun getZoomPercentageLiveData_observerIsCalledWhenZoomPercentageIsSet() = runBlocking {
+        assumeFalse(
+            "b/267665704: CameraPipe linear zoom conversion to zoom ratio is not correct",
+            implName == "CameraPipeConfig"
+        )
+
+        val latch1 = CountDownLatch(1)
+        val latch2 = CountDownLatch(1)
+        val latch3 = CountDownLatch(1)
+        withContext(Dispatchers.Main) {
+            val lifecycleOwner = FakeLifecycleOwner()
+            lifecycleOwner.startAndResume()
+            cameraInfo.zoomState.observe(lifecycleOwner) { value: ZoomState ->
+                if (areFloatsEqual(value.linearZoom, 0.1f)) {
+                    latch1.countDown()
+                } else if (areFloatsEqual(value.linearZoom, 0.2f)) {
+                    latch2.countDown()
+                } else if (areFloatsEqual(value.linearZoom, 0.3f)) {
+                    latch3.countDown()
+                }
+            }
+            cameraControl.setLinearZoom(0.1f)
+            cameraControl.setLinearZoom(0.2f)
+            cameraControl.setLinearZoom(0.3f)
+        }
+
+        assertThat(latch1.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(latch2.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(latch3.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun getZoomPercentageLiveData_observerIsCalledWhenZoomRatioIsSet() = runBlocking {
+        assumeTrue(getMaxDigitalZoom() != null && getMaxDigitalZoom()!! <= 2.0f + DELTA)
+
+        val latch = CountDownLatch(3)
+        withContext(Dispatchers.Main) {
+            val lifecycleOwner = FakeLifecycleOwner()
+            lifecycleOwner.startAndResume()
+            cameraInfo.zoomState.observe(lifecycleOwner,
+                Observer { value: ZoomState ->
+                    if (value.linearZoom != 0f) {
+                        latch.countDown()
+                    }
+                })
+            cameraControl.setZoomRatio(1.2f)
+            cameraControl.setZoomRatio(1.5f)
+            cameraControl.setZoomRatio(2.0f)
+        }
+
+        assertThat(latch.await(1500, TimeUnit.MILLISECONDS)).isTrue()
+    }
+
+    @Test
+    fun getZoomRatioDefaultValue() {
+        assertThat(cameraInfo.zoomState.value?.zoomRatio).isEqualTo(1.0f)
+    }
+
+    @Test
+    fun getZoomPercentageDefaultValue() {
+        checkTestPreconditions(isAndroidRZoom = false)
+        assertThat(cameraInfo.zoomState.value?.linearZoom).isEqualTo(0)
+    }
+
+    @Test
+    fun getMaxZoomRatio_isMaxDigitalZoom() {
+        val maxZoom = cameraInfo.zoomState.value?.maxZoomRatio
+        assertThat(maxZoom).isEqualTo(getMaxDigitalZoom())
+    }
+
+    @Test
+    fun getMinZoomRatio_isOne() {
+        checkTestPreconditions(isAndroidRZoom = false)
+        val minZoom = cameraInfo.zoomState.value?.minZoomRatio
+        assertThat(minZoom).isEqualTo(1f)
+    }
+
+    private fun getMaxDigitalZoom(): Float? {
+        val cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraSelector.lensFacing!!)
+        assumeNotNull(cameraCharacteristics)
+
+        if (isAndroidRZoomEnabled(cameraCharacteristics!!)) {
+            return cameraCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE)?.upper
+        }
+
+        return cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM)
+    }
+
+    @Test
+    fun valueIsResetAfterUseCasesDetached() = runBlocking {
+        cameraControl.setLinearZoom(0.2f) // this will change ratio and percentage.
+        withContext(Dispatchers.Main) {
+            cameraProvider.unbindAll()
+        }
+
+        cameraInfo.zoomState.waitForValue { value ->
+            areFloatsEqual(value.zoomRatio, 1.0f)
+        }
+
+        return@runBlocking
+    }
+
+    @Test
+    fun maxZoomShouldBeLargerThanOrEqualToMinZoom() {
+        val zoomState = cameraInfo.zoomState.value
+        assertThat(zoomState!!.maxZoomRatio).isAtLeast(zoomState.minZoomRatio)
+    }
+
+    private suspend fun LiveData<ZoomState>.waitForValue(
+        waitCondition: (ZoomState) -> Boolean
+    ): ZoomState {
+        var awaitedValue: ZoomState = ZoomValue(-1f, -1f, -1f)
+        val latch = CountDownLatch(1)
+
+        withContext(Dispatchers.Main) {
+            val lifecycleOwner = FakeLifecycleOwner()
+            lifecycleOwner.startAndResume()
+            observe(lifecycleOwner,
+                Observer { value: ZoomState ->
+                    if (waitCondition(value)) {
+                        awaitedValue = value
+                        latch.countDown()
+                    }
+                })
+        }
+
+        latch.await(3, TimeUnit.SECONDS)
+
+        return awaitedValue
+    }
+
+    private fun checkTestPreconditions(isAndroidRZoom: Boolean) {
+        val cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraSelector.lensFacing!!)
+        assumeNotNull(cameraCharacteristics)
+
+        if (isAndroidRZoom) {
+            assumeTrue(isAndroidRZoomEnabled(cameraCharacteristics!!))
+        } else {
+            assumeNotNull(
+                cameraCharacteristics!!.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
+            )
+            assumeFalse(isAndroidRZoomEnabled(cameraCharacteristics))
+        }
+    }
+
+    private suspend fun getCropRegionFromCameraCapture(linearZoom: Float): Rect {
+        val cropRegionFromCameraCaptureRef = AtomicReference(Rect(0, 0, 0, 0))
+        val cropRegionCallbackCountRef = AtomicReference(10)
+
+        captureCallback.reset()
+
+        cameraControl.setLinearZoom(linearZoom)[5, TimeUnit.SECONDS]
+        captureCallback.verify(
+            { captureRequest, _ ->
+                if (captureRequest[CaptureRequest.SCALER_CROP_REGION] == null) {
+                    return@verify false
+                }
+
+                cropRegionFromCameraCaptureRef.set(
+                    captureRequest[CaptureRequest.SCALER_CROP_REGION]!!
+                )
+
+                cropRegionCallbackCountRef.set(cropRegionCallbackCountRef.get() - 1)
+                return@verify cropRegionCallbackCountRef.get() == 0
+            },
+            5000
+        )
+
+        return cropRegionFromCameraCaptureRef.get()
+    }
+
+    @RequiresApi(Build.VERSION_CODES.R)
+    private suspend fun getZoomRatioFromCameraCapture(linearZoom: Float): Float {
+        val zoomRatioFromCameraCaptureRef = AtomicReference(Float.NaN)
+        val cropRegionCallbackCountRef = AtomicReference(10)
+
+        captureCallback.reset()
+
+        cameraControl.setLinearZoom(linearZoom)[5, TimeUnit.SECONDS]
+        captureCallback.verify(
+            { captureRequest, _ ->
+                if (captureRequest[CaptureRequest.CONTROL_ZOOM_RATIO] == null) {
+                    return@verify false
+                }
+
+                zoomRatioFromCameraCaptureRef.set(
+                    captureRequest[CaptureRequest.CONTROL_ZOOM_RATIO]!!
+                )
+
+                cropRegionCallbackCountRef.set(cropRegionCallbackCountRef.get() - 1)
+                return@verify cropRegionCallbackCountRef.get() == 0
+            },
+            5000
+        )
+
+        return zoomRatioFromCameraCaptureRef.get()
+    }
+
+    private fun getSensorRect(): Rect {
+        val cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraSelector.lensFacing!!)
+        val rect = cameraCharacteristics!!.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
+        // Some device like pixel 2 will have (0, 8) as the left-top corner.
+        return Rect(0, 0, rect!!.width(), rect.height())
+    }
+
+    // TODO: Use ZoomControl#isAndroidRZoomSupported for camera-camera2 config and
+    //  ZoomCompat#Bindings#provideZoomRatio for camera-pipe config based on implName
+    private fun isAndroidRZoomEnabled(cameraCharacteristics: CameraCharacteristics) =
+        Build.VERSION.SDK_INT >= 30 && getZoomRatioRange(cameraCharacteristics) != null
+
+    @RequiresApi(30)
+    private fun getZoomRatioRange(cameraCharacteristics: CameraCharacteristics) = try {
+        cameraCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE)
+    } catch (e: AssertionError) {
+        // Some devices may throw AssertionError when failed to get CameraCharacteristic.
+        // Catch the AssertionError and return null to workaround it. b/231701345
+        null
+    }
+
+    private fun <T> assertFutureCompletes(future: ListenableFuture<T>) {
+        try {
+            future[5, TimeUnit.SECONDS]
+        } catch (e: Exception) {
+            Assert.fail("future fail:$e")
+        }
+    }
+
+    private fun assertFutureThrowsIllegalArgumentException(result: ListenableFuture<Void>) {
+        try {
+            result[100, TimeUnit.MILLISECONDS]
+        } catch (e: ExecutionException) {
+            assertThat(e.cause).isInstanceOf(java.lang.IllegalArgumentException::class.java)
+            return
+        }
+        Assert.fail()
+    }
+
+    private fun areFloatsEqual(num1: Float?, num2: Float?): Boolean {
+        if (num1 == null && num2 == null) return true
+        if (num1 == null || num2 == null) return false
+        return abs(num1 - num2) < 2.0 * Math.ulp(abs(num1).coerceAtLeast(abs(num2)))
+    }
+
+    class CaptureCallback(private val captureCount: Int) : CameraCaptureSession.CaptureCallback() {
+        private var waitingCount = atomic(captureCount)
+        private val failureException =
+            TimeoutException("Test doesn't complete after waiting for $captureCount frames.")
+
+        @Volatile private var startReceiving = false
+        @Volatile private var _verifyBlock: (
+            captureRequest: CaptureRequest,
+            captureResult: TotalCaptureResult
+        ) -> Boolean = { _, _ -> false }
+
+        private var signal = CompletableDeferred<Unit>()
+
+        fun reset() {
+            _verifyBlock = { _, _ -> false }
+            startReceiving = false
+            waitingCount = atomic(captureCount)
+            signal = CompletableDeferred()
+        }
+
+        suspend fun verify(
+            verifyBlock: (
+                captureRequest: CaptureRequest,
+                captureResult: TotalCaptureResult
+            ) -> Boolean = { _, _ -> false },
+            timeout: Long = TimeUnit.SECONDS.toMillis(5),
+        ) {
+            withTimeout(timeout) {
+                _verifyBlock = verifyBlock
+                startReceiving = true
+                signal.await()
+            }
+        }
+
+        override fun onCaptureCompleted(
+            session: CameraCaptureSession,
+            request: CaptureRequest,
+            result: TotalCaptureResult
+        ) {
+            if (!startReceiving) {
+                return
+            }
+            if (waitingCount.decrementAndGet() < 0) {
+                signal.completeExceptionally(failureException)
+                return
+            }
+            if (_verifyBlock(request, result)) {
+                signal.complete(Unit)
+            }
+        }
+    }
+
+    companion object {
+        private const val DELTA = 1e-9
+        private const val TOLERANCE = 5f
+
+        @JvmStatic
+        @Parameterized.Parameters(name = "selector={0},config={2}")
+        fun data() = listOf(
+            arrayOf(
+                "front",
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                Camera2Config::class.simpleName,
+                Camera2Config.defaultConfig()
+            ),
+            arrayOf(
+                "front",
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                CameraPipeConfig::class.simpleName,
+                CameraPipeConfig.defaultConfig()
+            ),
+            arrayOf(
+                "back",
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                Camera2Config::class.simpleName,
+                Camera2Config.defaultConfig()
+            ),
+            arrayOf(
+                "back",
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                CameraPipeConfig::class.simpleName,
+                CameraPipeConfig.defaultConfig()
+            ),
+        )
+    }
+}
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
index 2a8af57..2e1cbf7 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/camera2/CameraControlDeviceTest.kt
@@ -200,31 +200,6 @@
         assertFutureCompletes(result)
     }
 
-    @Test
-    fun setZoomRatio_futuresCompletes() {
-        Assume.assumeTrue(camera!!.cameraInfo.zoomState.value!!.maxZoomRatio >= 2.0f)
-
-        // use ratio with fraction because it often causes unable-to-complete issue.
-        val result = camera!!.cameraControl.setZoomRatio(1.3640054f)
-        assertFutureCompletes(result)
-    }
-
-    @Test
-    fun rebindAndSetZoomRatio_futureCompletes() {
-        instrumentation.runOnMainSync {
-            try {
-                camera!!.removeUseCases(setOf(boundUseCase))
-                val useCase = ImageAnalysis.Builder().build()
-                camera!!.addUseCases(setOf<UseCase>(useCase.also { boundUseCase = it }))
-                useCase.setAnalyzer(CameraXExecutors.ioExecutor(), analyzer)
-            } catch (e: CameraException) {
-                throw IllegalArgumentException(e)
-            }
-        }
-        val result = camera!!.cameraControl.setZoomRatio(1.0f)
-        assertFutureCompletes(result)
-    }
-
     private fun <T> assertFutureCompletes(future: ListenableFuture<T>) {
         try {
             future[5, TimeUnit.SECONDS]
@@ -291,4 +266,4 @@
             )
         )
     }
-}
\ No newline at end of file
+}
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 28e1fde..5a5e216 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
@@ -37,6 +37,8 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.AndroidUtil.isEmulator
+import androidx.camera.testing.AndroidUtil.skipVideoRecordingTestIfNotSupportedByEmulator
 import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
@@ -67,6 +69,7 @@
 import org.junit.After
 import org.junit.Assert
 import org.junit.Assume
+import org.junit.Assume.assumeFalse
 import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Ignore
@@ -176,10 +179,7 @@
 
     @Test
     fun onPreviewViewTapped_previewIsFocused() {
-        Assume.assumeFalse(
-            "Ignore Cuttlefish",
-            Build.MODEL.contains("Cuttlefish")
-        )
+        assumeFalse("Ignore emulators", isEmulator())
         // Arrange: listens to LiveData updates.
         fragment.assertPreviewIsStreaming()
         val focused = Semaphore(0)
@@ -464,7 +464,7 @@
 
     @Test
     fun fragmentLaunched_cannotRecordVideo() {
-        skipVideoRecordingTestOnCuttlefishApi29()
+        skipVideoRecordingTestIfNotSupportedByEmulator()
         skipTestWithSurfaceProcessingOnCuttlefishApi30()
 
         // Arrange.
@@ -479,7 +479,7 @@
 
     @Test
     fun recordEnabled_canRecordVideo() {
-        skipVideoRecordingTestOnCuttlefishApi29()
+        skipVideoRecordingTestIfNotSupportedByEmulator()
         skipTestWithSurfaceProcessingOnCuttlefishApi30()
 
         // Arrange.
@@ -495,7 +495,7 @@
 
     @Test
     fun cameraToggled_canRecordVideo() {
-        skipVideoRecordingTestOnCuttlefishApi29()
+        skipVideoRecordingTestIfNotSupportedByEmulator()
         skipTestWithSurfaceProcessingOnCuttlefishApi30()
 
         // Arrange.
@@ -513,7 +513,7 @@
 
     @Test
     fun recordDisabledAndEnabledMultipleTimes_canRecordVideo() {
-        skipVideoRecordingTestOnCuttlefishApi29()
+        skipVideoRecordingTestIfNotSupportedByEmulator()
         skipTestWithSurfaceProcessingOnCuttlefishApi30()
 
         // Arrange.
@@ -538,14 +538,6 @@
         onView(withId(R.id.video_enabled)).perform(click())
     }
 
-    private fun skipVideoRecordingTestOnCuttlefishApi29() {
-        // Skip test for b/168175357
-        Assume.assumeFalse(
-            "Cuttlefish has MediaCodec dequeInput/Output buffer fails issue. Unable to test.",
-            Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
-        )
-    }
-
     private fun skipTestWithSurfaceProcessingOnCuttlefishApi30() {
         // Skip test for b/253211491
         Assume.assumeFalse(
@@ -695,14 +687,17 @@
                         finalize = it
                         videoSavedSemaphore.release()
                     }
+
                     is VideoRecordEvent.Status -> {
                         videoRecordingSemaphore.release()
                     }
+
                     is VideoRecordEvent.Start,
                     is VideoRecordEvent.Pause,
                     is VideoRecordEvent.Resume -> {
                         // no op for this test, skip these event now.
                     }
+
                     else -> {
                         throw IllegalStateException()
                     }
diff --git a/car/app/app-automotive/src/main/aidl/androidx/car/app/activity/renderer/ICarAppActivity.aidl b/car/app/app-automotive/src/main/aidl/androidx/car/app/activity/renderer/ICarAppActivity.aidl
index 41f1c28..4463f25 100644
--- a/car/app/app-automotive/src/main/aidl/androidx/car/app/activity/renderer/ICarAppActivity.aidl
+++ b/car/app/app-automotive/src/main/aidl/androidx/car/app/activity/renderer/ICarAppActivity.aidl
@@ -53,4 +53,7 @@
 
     /** Registers the listener to get insets updates. */
     void setInsetsListener(IInsetsListener listener) = 9;
+
+    /** Entrypoint for host to call assistant */
+    void showAssist(in Bundle args) = 10;
 }
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
index 53007fd..2ccd6f3 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/BaseCarAppActivity.java
@@ -234,6 +234,11 @@
                     ThreadUtils.runOnMain(() -> mSurfaceView.onUpdateSelection(oldSelStart,
                             oldSelEnd, newSelStart, newSelEnd));
                 }
+
+                @Override
+                public void showAssist(Bundle args) {
+                    BaseCarAppActivity.this.showAssist(args);
+                }
             };
 
     @RequiresApi(Build.VERSION_CODES.R)
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java
index 3753600..7c9328e4 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java
@@ -257,7 +257,7 @@
                                 .setContentText(text)
                                 .setContentIntent(
                                         CarPendingIntent.getCarApp(getCarContext(), 0,
-                                                new Intent(Intent.ACTION_VIEW).setComponent(
+                                                new Intent().setComponent(
                                                         new ComponentName(getCarContext(),
                                                                 ShowcaseService.class)), 0))
                                 .setColor(CarColor.PRIMARY)
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
index 91b4a0d..666d9be 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
@@ -30,7 +30,7 @@
     <string name="call_action_title" msgid="6218977436905001611">"କଲ କରନ୍ତୁ"</string>
     <string name="primary_action_title" msgid="7042003552215710683">"ପ୍ରାଥମିକ"</string>
     <string name="options_action_title" msgid="1168121856107932984">"ବିକଳ୍ପଗୁଡ଼ିକ"</string>
-    <string name="search_action_title" msgid="3483459674263446335">"ସନ୍ଧାନ କରନ୍ତୁ"</string>
+    <string name="search_action_title" msgid="3483459674263446335">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
     <string name="checked_action_title" msgid="906023941445896399">"ଚେକ କରାଯାଇଛି"</string>
     <string name="unchecked_action_title" msgid="802503415474307811">"ଅନଚେକ କରାଯାଇଛି"</string>
     <string name="on_action_title" msgid="4129601573763429611">"ଚାଲୁ ଅଛି"</string>
@@ -52,7 +52,7 @@
     <string name="zoomed_out_toast_msg" msgid="6260981223227212493">"ଜୁମ ଆଉଟ କରାଯାଇଛି"</string>
     <string name="triggered_toast_msg" msgid="3396166539208366382">"ଟ୍ରିଗର କରାଯାଇଛି"</string>
     <string name="primary_toast_msg" msgid="7153771322662005447">"ପ୍ରାଥମିକ ବଟନ ଦବାଯାଇଛି"</string>
-    <string name="search_toast_msg" msgid="7826530065407699347">"ସନ୍ଧାନ ବଟନ ଦବାଯାଇଛି"</string>
+    <string name="search_toast_msg" msgid="7826530065407699347">"ସର୍ଚ୍ଚ ବଟନ ଦବାଯାଇଛି"</string>
     <string name="options_toast_msg" msgid="2146223786877557730">"ବିକଳ୍ପ ବଟନକୁ ଦବାଯାଇଛି"</string>
     <string name="favorite_toast_msg" msgid="522064494016370117">"ପସନ୍ଦ!"</string>
     <string name="not_favorite_toast_msg" msgid="6831181108681007428">"ପସନ୍ଦର ନୁହେଁ!"</string>
@@ -234,8 +234,8 @@
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ପେନ ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ସ୍ଥାନର ତାଲିକାର ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ସ୍ଥାନଗୁଡ଼ିକୁ ବ୍ରାଉଜ କରନ୍ତୁ"</string>
-    <string name="search_template_demo_title" msgid="1770474418958318114">"ସନ୍ଧାନ ଟେମ୍ପଲେଟ ଡେମୋ"</string>
-    <string name="search_hint" msgid="978495498991026792">"ଏଠାରେ ସନ୍ଧାନ କରନ୍ତୁ"</string>
+    <string name="search_template_demo_title" msgid="1770474418958318114">"ସର୍ଚ୍ଚ ଟେମ୍ପଲେଟ ଡେମୋ"</string>
+    <string name="search_hint" msgid="978495498991026792">"ଏଠାରେ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
     <string name="additional_text" msgid="8410289578276941586">"ଦୟାକରି ଆମର ସେବାର ସର୍ତ୍ତାବଳୀର ସମୀକ୍ଷା କରନ୍ତୁ"</string>
     <string name="google_sign_in" msgid="6556259799319701727">"Google ସାଇନ-ଇନ"</string>
     <string name="use_pin" msgid="7850893299484337431">"PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index f8545715..f88928a 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -1146,6 +1146,7 @@
 
   @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.ItemList? getSingleList();
     method public androidx.car.app.model.CarText? getTitle();
@@ -1154,6 +1155,7 @@
 
   public static final class GridTemplate.Builder {
     ctor public GridTemplate.Builder();
+    method @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public androidx.car.app.model.GridTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.GridTemplate build();
     method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index 74dff68..5807cb4 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -16,7 +16,6 @@
 
 import androidx.build.LibraryType
 import androidx.build.Release
-import androidx.build.checkapi.LibraryApiTaskConfig
 import androidx.build.metalava.MetalavaRunnerKt
 import androidx.build.uptodatedness.EnableCachingKt
 import androidx.build.Version
@@ -30,8 +29,6 @@
 import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 buildscript {
     dependencies {
         // This dependency means that tasks in this project might become out-of-date whenever
@@ -317,12 +314,14 @@
     @Input
     String carApiLevel = project.latestCarAppApiLevel
 
-    @OutputFile
-    File apiLevelFile
+    @OutputDirectory
+    final DirectoryProperty outputDir = project.objects.directoryProperty()
 
     @TaskAction
     def exec() {
-        PrintWriter writer = new PrintWriter(apiLevelFile)
+        def outputFile = new File(outputDir.get().asFile, "car-app-api.level")
+        outputFile.parentFile.mkdirs()
+        PrintWriter writer = new PrintWriter(outputFile)
         writer.println(carApiLevel)
         writer.close()
     }
@@ -380,9 +379,6 @@
     }
 }
 
-def RESOURCE_DIRECTORY = "generatedResources"
-def API_LEVEL_FILE_PATH = "$RESOURCE_DIRECTORY/car-app-api.level"
-
 LibraryExtension library = project.extensions.getByType(LibraryExtension.class)
 
 def getLibraryExtension() {
@@ -413,24 +409,15 @@
     return sourceCollection
 }
 
+def writeCarApiLevelFileTask = tasks.register("writeCarApiLevelFile", ApiLevelFileWriterTask) { task ->
+    task.outputDir.set(new File(project.buildDir, "generatedResources"))
+}
+
+AndroidSourceDirectorySet resources = library.sourceSets.getByName("main").resources
+resources.srcDir(writeCarApiLevelFileTask.map {it.outputDir })
+
 // afterEvaluate required to read extension properties
 afterEvaluate {
-    task writeCarApiLevelFile(type: ApiLevelFileWriterTask) {
-        File artifactName = new File(buildDir, API_LEVEL_FILE_PATH)
-        apiLevelFile = artifactName
-    }
-
-    AndroidSourceDirectorySet resources = library.sourceSets.getByName("main").resources
-    Set<File> resFiles = new HashSet<>()
-    resFiles.add(resources.srcDirs)
-    resFiles.add(new File(buildDir, RESOURCE_DIRECTORY))
-    resources.srcDirs(resFiles)
-    Set<String> includes = resources.includes
-    if (!includes.isEmpty()) {
-        includes.add("*.level")
-        resources.setIncludes(includes)
-    }
-
     FileCollection sourceCollection = getSourceCollection()
     FileCollection dependencyClasspath = getLibraryVariant().getCompileClasspath(null)
     FileCollection metalavaClasspath = MetalavaRunnerKt.getMetalavaClasspath(project)
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 8cf1272..e065ab9 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
@@ -24,10 +24,16 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.KeepFields;
+import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.model.constraints.ActionsConstraints;
+import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.utils.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -58,6 +64,8 @@
     @Nullable
     private final ActionStrip mActionStrip;
 
+    private final List<Action> mActions;
+
     /**
      * Returns the title of the template or {@code null} if not set.
      *
@@ -109,6 +117,18 @@
         return mSingleList;
     }
 
+    /**
+     * Returns the list of additional actions.
+     *
+     * @see GridTemplate.Builder#addAction(Action)
+     */
+    @ExperimentalCarApi
+    @NonNull
+    @RequiresCarApi(6)
+    public List<Action> getActions() {
+        return mActions;
+    }
+
     @NonNull
     @Override
     public String toString() {
@@ -134,7 +154,8 @@
                 && Objects.equals(mTitle, otherTemplate.mTitle)
                 && Objects.equals(mHeaderAction, otherTemplate.mHeaderAction)
                 && Objects.equals(mSingleList, otherTemplate.mSingleList)
-                && Objects.equals(mActionStrip, otherTemplate.mActionStrip);
+                && Objects.equals(mActionStrip, otherTemplate.mActionStrip)
+                && Objects.equals(mActions, otherTemplate.mActions);
     }
 
     GridTemplate(Builder builder) {
@@ -143,6 +164,7 @@
         mHeaderAction = builder.mHeaderAction;
         mSingleList = builder.mSingleList;
         mActionStrip = builder.mActionStrip;
+        mActions = CollectionUtils.unmodifiableCopy(builder.mActions);
     }
 
     /** Constructs an empty instance, used by serialization code. */
@@ -152,6 +174,7 @@
         mHeaderAction = null;
         mSingleList = null;
         mActionStrip = null;
+        mActions = Collections.emptyList();
     }
 
     /** A builder of {@link GridTemplate}. */
@@ -165,6 +188,7 @@
         Action mHeaderAction;
         @Nullable
         ActionStrip mActionStrip;
+        final List<Action> mActions = new ArrayList<>();
 
         /**
          * Sets whether the template is in a loading state.
@@ -253,6 +277,26 @@
         }
 
         /**
+         * Adds a template scoped action outside of the grid items. This action will be displayed
+         * as a floating action button.
+         *
+         * @throws IllegalArgumentException if {@code action} contains unsupported Action types,
+         *                                  exceeds the maximum number of allowed actions or does
+         *                                  not contain a valid {@link CarIcon} and background
+         *                                  {@link CarColor}.
+         */
+        @ExperimentalCarApi
+        @NonNull
+        @RequiresCarApi(6)
+        public Builder addAction(@NonNull Action action) {
+            List<Action> mActionsCopy = new ArrayList<>(mActions);
+            mActionsCopy.add(requireNonNull(action));
+            ActionsConstraints.ACTIONS_CONSTRAINTS_FAB.validateOrThrow(mActionsCopy);
+            mActions.add(action);
+            return this;
+        }
+
+        /**
          * Constructs the template defined by this builder.
          *
          * <h4>Requirements</h4>
diff --git a/car/app/app/src/test/java/androidx/car/app/model/GridTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/GridTemplateTest.java
index 095e5b8..50acc34 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/GridTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/GridTemplateTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertThrows;
 
 import androidx.car.app.TestUtils;
+import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -121,6 +122,102 @@
     }
 
     @Test
+    public void createInstance_addAction() {
+        CarIcon icon = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_1");
+        Action customAction = TestUtils.createAction(icon, CarColor.BLUE);
+        GridTemplate template =
+                new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .setHeaderAction(Action.BACK)
+                        .addAction(customAction)
+                        .build();
+        assertThat(template.getActions()).containsExactly(customAction);
+    }
+
+    @Test
+    public void createInstance_addAction_appIconInvalid_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(Action.APP_ICON).build());
+    }
+
+    @Test
+    public void createInstance_addAction_backInvalid_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(Action.BACK).build());
+    }
+
+    @Test
+    public void createInstance_addAction_panInvalid_throws() {
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(Action.PAN).build());
+    }
+
+    @Test
+    public void createInstance_addAction_manyActions_throws() {
+        CarIcon icon = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_1");
+        Action customAction = TestUtils.createAction(icon, CarColor.BLUE);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(customAction)
+                        .addAction(customAction)
+                        .build());
+    }
+
+    @Test
+    public void createInstance_addAction_invalidActionNullBackgroundColor_throws() {
+        CarIcon icon = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_1");
+        Action customAction = TestUtils.createAction(icon, null);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(customAction)
+                        .build());
+    }
+
+    @Test
+    public void createInstance_addAction_invalidActionDefaultBackgroundColor_throws() {
+        CarIcon icon = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_1");
+        Action customAction = TestUtils.createAction(icon, CarColor.DEFAULT);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(customAction)
+                        .build());
+    }
+
+    @Test
+    public void createInstance_addAction_invalidActionNullIcon_throws() {
+        Action customAction = TestUtils.createAction("title", null);
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new GridTemplate.Builder()
+                        .setSingleList(TestUtils.getGridItemList(2))
+                        .addAction(customAction)
+                        .build());
+    }
+
+    @Test
     public void equals() {
         ItemList itemList = new ItemList.Builder().build();
         String title = "title";
@@ -213,4 +310,23 @@
                                                 Action.APP_ICON).build())
                                 .build());
     }
+
+    @Test
+    public void notEquals_differentAction() {
+        ItemList itemList = new ItemList.Builder().build();
+        CarIcon icon1 = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_1");
+        CarIcon icon2 = TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                "ic_test_2");
+
+        GridTemplate template =
+                new GridTemplate.Builder()
+                        .setSingleList(itemList)
+                        .addAction(TestUtils.createAction(icon1, CarColor.BLUE))
+                        .build();
+
+        assertThat(template)
+                .isNotEqualTo(new GridTemplate.Builder().setSingleList(itemList).addAction(
+                        TestUtils.createAction(icon2, CarColor.RED)).build());
+    }
 }
diff --git a/cardview/OWNERS b/cardview/OWNERS
index b9cecf6..bc07458 100644
--- a/cardview/OWNERS
+++ b/cardview/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461354
 alanv@google.com
\ No newline at end of file
diff --git a/collection/OWNERS b/collection/OWNERS
index 0e9710d..1c323f5 100644
--- a/collection/OWNERS
+++ b/collection/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461329
 lukhnos@google.com
 dustinlam@google.com
 yboyar@google.com
diff --git a/collection/collection/api/current.txt b/collection/collection/api/current.txt
index 9697918..19c0d55 100644
--- a/collection/collection/api/current.txt
+++ b/collection/collection/api/current.txt
@@ -187,9 +187,6 @@
     method public V! valueAt(int index);
   }
 
-  public final class SimpleArrayMapKt {
-  }
-
   public class SparseArrayCompat<E> implements java.lang.Cloneable {
     ctor public SparseArrayCompat(optional int initialCapacity);
     ctor public SparseArrayCompat();
@@ -221,9 +218,6 @@
     property public final boolean isEmpty;
   }
 
-  public final class SparseArrayCompatKt {
-  }
-
   public final class SparseArrayKt {
     method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
     method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
@@ -240,13 +234,3 @@
 
 }
 
-package androidx.collection.internal {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class LockExtKt {
-  }
-
-}
-
diff --git a/collection/collection/api/public_plus_experimental_current.txt b/collection/collection/api/public_plus_experimental_current.txt
index 9697918..19c0d55 100644
--- a/collection/collection/api/public_plus_experimental_current.txt
+++ b/collection/collection/api/public_plus_experimental_current.txt
@@ -187,9 +187,6 @@
     method public V! valueAt(int index);
   }
 
-  public final class SimpleArrayMapKt {
-  }
-
   public class SparseArrayCompat<E> implements java.lang.Cloneable {
     ctor public SparseArrayCompat(optional int initialCapacity);
     ctor public SparseArrayCompat();
@@ -221,9 +218,6 @@
     property public final boolean isEmpty;
   }
 
-  public final class SparseArrayCompatKt {
-  }
-
   public final class SparseArrayKt {
     method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
     method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
@@ -240,13 +234,3 @@
 
 }
 
-package androidx.collection.internal {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class LockExtKt {
-  }
-
-}
-
diff --git a/collection/collection/api/restricted_current.txt b/collection/collection/api/restricted_current.txt
index 9697918..19c0d55 100644
--- a/collection/collection/api/restricted_current.txt
+++ b/collection/collection/api/restricted_current.txt
@@ -187,9 +187,6 @@
     method public V! valueAt(int index);
   }
 
-  public final class SimpleArrayMapKt {
-  }
-
   public class SparseArrayCompat<E> implements java.lang.Cloneable {
     ctor public SparseArrayCompat(optional int initialCapacity);
     ctor public SparseArrayCompat();
@@ -221,9 +218,6 @@
     property public final boolean isEmpty;
   }
 
-  public final class SparseArrayCompatKt {
-  }
-
   public final class SparseArrayKt {
     method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
     method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
@@ -240,13 +234,3 @@
 
 }
 
-package androidx.collection.internal {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class LockExtKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
index 02be66d..7dce8cf 100644
--- a/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
+++ b/compose/animation/animation-core-lint/src/main/java/androidx/compose/animation/core/lint/AnimationCoreIssueRegistry.kt
@@ -25,7 +25,7 @@
  */
 class AnimationCoreIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         TransitionDetector.UnusedTransitionTargetStateParameter,
diff --git a/compose/animation/animation-core/api/1.4.0-beta01.txt b/compose/animation/animation-core/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..06524e6
--- /dev/null
+++ b/compose/animation/animation-core/api/1.4.0-beta01.txt
@@ -0,0 +1,761 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  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, optional String label);
+    ctor @Deprecated 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>>);
+    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>>);
+    method public androidx.compose.runtime.State<T> asState();
+    method public String getLabel();
+    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>);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final String label;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.core.AnimationEndReason valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.AnimationEndReason[] values();
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float getV1();
+    method public float getV2();
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  @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 EasingFunctionsKt {
+    method public static androidx.compose.animation.core.Easing getEase();
+    method public static androidx.compose.animation.core.Easing getEaseIn();
+    method public static androidx.compose.animation.core.Easing getEaseInBack();
+    method public static androidx.compose.animation.core.Easing getEaseInBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOut();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInOutSine();
+    method public static androidx.compose.animation.core.Easing getEaseInQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInSine();
+    method public static androidx.compose.animation.core.Easing getEaseOut();
+    method public static androidx.compose.animation.core.Easing getEaseOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseOutSine();
+    property public static final androidx.compose.animation.core.Easing Ease;
+    property public static final androidx.compose.animation.core.Easing EaseIn;
+    property public static final androidx.compose.animation.core.Easing EaseInBack;
+    property public static final androidx.compose.animation.core.Easing EaseInBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOut;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInOutSine;
+    property public static final androidx.compose.animation.core.Easing EaseInQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInSine;
+    property public static final androidx.compose.animation.core.Easing EaseOut;
+    property public static final androidx.compose.animation.core.Easing EaseOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseOutSine;
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+    method public java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> getAnimations();
+    method public String getLabel();
+    property public final java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> animations;
+    property public final String label;
+  }
+
+  public final class InfiniteTransition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.AnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.AnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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(optional String label);
+    method @Deprecated @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 infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int);
+    method public void setDurationMillis(int);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public boolean isIdle();
+    method public void setTargetState(S!);
+    property public final S! currentState;
+    property public final boolean isIdle;
+    property public final S! targetState;
+  }
+
+  public enum RepeatMode {
+    method public static androidx.compose.animation.core.RepeatMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.RepeatMode[] values();
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  @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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffset {
+    ctor public StartOffset(int offsetMillis, optional int offsetType);
+    method public int getOffsetMillis();
+    method public int getOffsetType();
+    property public final int offsetMillis;
+    property public final int offsetType;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffsetType {
+    field public static final androidx.compose.animation.core.StartOffsetType.Companion Companion;
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    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>);
+    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>);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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, optional long initialStartOffset);
+    ctor @Deprecated 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/current.ignore b/compose/animation/animation-core/api/current.ignore
index ae54e41..f7336f7 100644
--- a/compose/animation/animation-core/api/current.ignore
+++ b/compose/animation/animation-core/api/current.ignore
@@ -3,3 +3,19 @@
     Method androidx.compose.animation.core.InfiniteTransitionKt.animateFloat has changed return type from androidx.compose.runtime.State<java.lang.Float> to androidx.compose.runtime.State<? extends java.lang.Float>
 ChangedType: androidx.compose.animation.core.InfiniteTransitionKt#animateValue(androidx.compose.animation.core.InfiniteTransition, T, T, androidx.compose.animation.core.TwoWayConverter<T,V>, androidx.compose.animation.core.InfiniteRepeatableSpec<T>):
     Method androidx.compose.animation.core.InfiniteTransitionKt.animateValue has changed return type from androidx.compose.runtime.State<T> to androidx.compose.runtime.State<? extends T>
+
+
+RemovedClass: androidx.compose.animation.core.ActualJvmKt:
+    Removed class androidx.compose.animation.core.ActualJvmKt
+RemovedClass: androidx.compose.animation.core.ComplexDoubleKt:
+    Removed class androidx.compose.animation.core.ComplexDoubleKt
+RemovedClass: androidx.compose.animation.core.FloatDecayAnimationSpecKt:
+    Removed class androidx.compose.animation.core.FloatDecayAnimationSpecKt
+RemovedClass: androidx.compose.animation.core.SpringSimulationKt:
+    Removed class androidx.compose.animation.core.SpringSimulationKt
+RemovedClass: androidx.compose.animation.core.VectorizedAnimationSpecKt:
+    Removed class androidx.compose.animation.core.VectorizedAnimationSpecKt
+
+
+RemovedPackage: androidx.compose.animation.core.internal:
+    Removed package androidx.compose.animation.core.internal
diff --git a/compose/animation/animation-core/api/current.txt b/compose/animation/animation-core/api/current.txt
index 26d75c7..06524e6 100644
--- a/compose/animation/animation-core/api/current.txt
+++ b/compose/animation/animation-core/api/current.txt
@@ -1,9 +1,6 @@
 // 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, optional String label);
     ctor @Deprecated public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
@@ -210,9 +207,6 @@
     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);
@@ -360,9 +354,6 @@
     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();
@@ -520,9 +511,6 @@
   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();
@@ -671,9 +659,6 @@
     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);
@@ -774,10 +759,3 @@
 
 }
 
-package androidx.compose.animation.core.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.4.0-beta01.txt b/compose/animation/animation-core/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..60b552a
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,768 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  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, optional String label);
+    ctor @Deprecated 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>>);
+    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>>);
+    method public androidx.compose.runtime.State<T> asState();
+    method public String getLabel();
+    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>);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final String label;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.core.AnimationEndReason valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.AnimationEndReason[] values();
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float getV1();
+    method public float getV2();
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  @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 EasingFunctionsKt {
+    method public static androidx.compose.animation.core.Easing getEase();
+    method public static androidx.compose.animation.core.Easing getEaseIn();
+    method public static androidx.compose.animation.core.Easing getEaseInBack();
+    method public static androidx.compose.animation.core.Easing getEaseInBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOut();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInOutSine();
+    method public static androidx.compose.animation.core.Easing getEaseInQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInSine();
+    method public static androidx.compose.animation.core.Easing getEaseOut();
+    method public static androidx.compose.animation.core.Easing getEaseOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseOutSine();
+    property public static final androidx.compose.animation.core.Easing Ease;
+    property public static final androidx.compose.animation.core.Easing EaseIn;
+    property public static final androidx.compose.animation.core.Easing EaseInBack;
+    property public static final androidx.compose.animation.core.Easing EaseInBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOut;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInOutSine;
+    property public static final androidx.compose.animation.core.Easing EaseInQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInSine;
+    property public static final androidx.compose.animation.core.Easing EaseOut;
+    property public static final androidx.compose.animation.core.Easing EaseOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseOutSine;
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation API for Transition. It may change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalTransitionApi {
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+    method public java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> getAnimations();
+    method public String getLabel();
+    property public final java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> animations;
+    property public final String label;
+  }
+
+  public final class InfiniteTransition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.AnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.AnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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(optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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 infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int);
+    method public void setDurationMillis(int);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public boolean isIdle();
+    method public void setTargetState(S!);
+    property public final S! currentState;
+    property public final boolean isIdle;
+    property public final S! targetState;
+  }
+
+  public enum RepeatMode {
+    method public static androidx.compose.animation.core.RepeatMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.RepeatMode[] values();
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  @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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffset {
+    ctor public StartOffset(int offsetMillis, optional int offsetType);
+    method public int getOffsetMillis();
+    method public int getOffsetType();
+    property public final int offsetMillis;
+    property public final int offsetType;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffsetType {
+    field public static final androidx.compose.animation.core.StartOffsetType.Companion Companion;
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    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>);
+    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>);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.animation.core.ExperimentalTransitionApi @androidx.compose.runtime.Composable public static inline <S, T> androidx.compose.animation.core.Transition<T> createChildTransition(androidx.compose.animation.core.Transition<S>, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> transformToChildState);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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, optional long initialStartOffset);
+    ctor @Deprecated 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_current.txt b/compose/animation/animation-core/api/public_plus_experimental_current.txt
index 230d118..60b552a 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // 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, optional String label);
     ctor @Deprecated public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
@@ -210,9 +207,6 @@
     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);
@@ -363,9 +357,6 @@
     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();
@@ -526,9 +517,6 @@
   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();
@@ -678,9 +666,6 @@
     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);
@@ -781,10 +766,3 @@
 
 }
 
-package androidx.compose.animation.core.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-core/api/res-1.4.0-beta01.txt b/compose/animation/animation-core/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-core/api/res-1.4.0-beta01.txt
diff --git a/compose/animation/animation-core/api/restricted_1.4.0-beta01.txt b/compose/animation/animation-core/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..9863fd5
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,764 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  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, optional String label);
+    ctor @Deprecated 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>>);
+    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>>);
+    method public androidx.compose.runtime.State<T> asState();
+    method public String getLabel();
+    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>);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final String label;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,? extends 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 String label, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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,? extends kotlin.Unit>? finishedListener);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.core.AnimationEndReason valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.AnimationEndReason[] values();
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float getV1();
+    method public float getV2();
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  @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 EasingFunctionsKt {
+    method public static androidx.compose.animation.core.Easing getEase();
+    method public static androidx.compose.animation.core.Easing getEaseIn();
+    method public static androidx.compose.animation.core.Easing getEaseInBack();
+    method public static androidx.compose.animation.core.Easing getEaseInBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOut();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseInOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseInOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseInOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInOutSine();
+    method public static androidx.compose.animation.core.Easing getEaseInQuad();
+    method public static androidx.compose.animation.core.Easing getEaseInQuart();
+    method public static androidx.compose.animation.core.Easing getEaseInQuint();
+    method public static androidx.compose.animation.core.Easing getEaseInSine();
+    method public static androidx.compose.animation.core.Easing getEaseOut();
+    method public static androidx.compose.animation.core.Easing getEaseOutBack();
+    method public static androidx.compose.animation.core.Easing getEaseOutBounce();
+    method public static androidx.compose.animation.core.Easing getEaseOutCirc();
+    method public static androidx.compose.animation.core.Easing getEaseOutCubic();
+    method public static androidx.compose.animation.core.Easing getEaseOutElastic();
+    method public static androidx.compose.animation.core.Easing getEaseOutExpo();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuad();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuart();
+    method public static androidx.compose.animation.core.Easing getEaseOutQuint();
+    method public static androidx.compose.animation.core.Easing getEaseOutSine();
+    property public static final androidx.compose.animation.core.Easing Ease;
+    property public static final androidx.compose.animation.core.Easing EaseIn;
+    property public static final androidx.compose.animation.core.Easing EaseInBack;
+    property public static final androidx.compose.animation.core.Easing EaseInBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOut;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseInOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseInOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseInOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInOutSine;
+    property public static final androidx.compose.animation.core.Easing EaseInQuad;
+    property public static final androidx.compose.animation.core.Easing EaseInQuart;
+    property public static final androidx.compose.animation.core.Easing EaseInQuint;
+    property public static final androidx.compose.animation.core.Easing EaseInSine;
+    property public static final androidx.compose.animation.core.Easing EaseOut;
+    property public static final androidx.compose.animation.core.Easing EaseOutBack;
+    property public static final androidx.compose.animation.core.Easing EaseOutBounce;
+    property public static final androidx.compose.animation.core.Easing EaseOutCirc;
+    property public static final androidx.compose.animation.core.Easing EaseOutCubic;
+    property public static final androidx.compose.animation.core.Easing EaseOutElastic;
+    property public static final androidx.compose.animation.core.Easing EaseOutExpo;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuad;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuart;
+    property public static final androidx.compose.animation.core.Easing EaseOutQuint;
+    property public static final androidx.compose.animation.core.Easing EaseOutSine;
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+    method public java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> getAnimations();
+    method public String getLabel();
+    property public final java.util.List<androidx.compose.animation.core.InfiniteTransition.TransitionAnimationState<?,?>> animations;
+    property public final String label;
+  }
+
+  public final class InfiniteTransition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.AnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.AnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends 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, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<? extends 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(optional String label);
+    method @Deprecated @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 infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int);
+    method public void setDurationMillis(int);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public boolean isIdle();
+    method public void setTargetState(S!);
+    property public final S! currentState;
+    property public final boolean isIdle;
+    property public final S! targetState;
+  }
+
+  public enum RepeatMode {
+    method public static androidx.compose.animation.core.RepeatMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.core.RepeatMode[] values();
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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 long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  @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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffset {
+    ctor public StartOffset(int offsetMillis, optional int offsetType);
+    method public int getOffsetMillis();
+    method public int getOffsetType();
+    property public final int offsetMillis;
+    property public final int offsetType;
+  }
+
+  @kotlin.jvm.JvmInline public final value class StartOffsetType {
+    field public static final androidx.compose.animation.core.StartOffsetType.Companion Companion;
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    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>);
+    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>);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    ctor @kotlin.PublishedApi internal Transition(androidx.compose.animation.core.MutableTransitionState<S> transitionState, optional String? label);
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static <S, T> androidx.compose.animation.core.Transition<T> createChildTransitionInternal(androidx.compose.animation.core.Transition<S>, T? initialState, T? targetState, String childLabel);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> createTransitionAnimation(androidx.compose.animation.core.Transition<S>, T? initialValue, T? targetValue, androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, String label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    ctor @Deprecated 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, optional long initialStartOffset);
+    ctor @Deprecated 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_current.ignore b/compose/animation/animation-core/api/restricted_current.ignore
index ae54e41..f7336f7 100644
--- a/compose/animation/animation-core/api/restricted_current.ignore
+++ b/compose/animation/animation-core/api/restricted_current.ignore
@@ -3,3 +3,19 @@
     Method androidx.compose.animation.core.InfiniteTransitionKt.animateFloat has changed return type from androidx.compose.runtime.State<java.lang.Float> to androidx.compose.runtime.State<? extends java.lang.Float>
 ChangedType: androidx.compose.animation.core.InfiniteTransitionKt#animateValue(androidx.compose.animation.core.InfiniteTransition, T, T, androidx.compose.animation.core.TwoWayConverter<T,V>, androidx.compose.animation.core.InfiniteRepeatableSpec<T>):
     Method androidx.compose.animation.core.InfiniteTransitionKt.animateValue has changed return type from androidx.compose.runtime.State<T> to androidx.compose.runtime.State<? extends T>
+
+
+RemovedClass: androidx.compose.animation.core.ActualJvmKt:
+    Removed class androidx.compose.animation.core.ActualJvmKt
+RemovedClass: androidx.compose.animation.core.ComplexDoubleKt:
+    Removed class androidx.compose.animation.core.ComplexDoubleKt
+RemovedClass: androidx.compose.animation.core.FloatDecayAnimationSpecKt:
+    Removed class androidx.compose.animation.core.FloatDecayAnimationSpecKt
+RemovedClass: androidx.compose.animation.core.SpringSimulationKt:
+    Removed class androidx.compose.animation.core.SpringSimulationKt
+RemovedClass: androidx.compose.animation.core.VectorizedAnimationSpecKt:
+    Removed class androidx.compose.animation.core.VectorizedAnimationSpecKt
+
+
+RemovedPackage: androidx.compose.animation.core.internal:
+    Removed package androidx.compose.animation.core.internal
diff --git a/compose/animation/animation-core/api/restricted_current.txt b/compose/animation/animation-core/api/restricted_current.txt
index 7e756ae..9863fd5 100644
--- a/compose/animation/animation-core/api/restricted_current.txt
+++ b/compose/animation/animation-core/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // 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, optional String label);
     ctor @Deprecated public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
@@ -210,9 +207,6 @@
     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);
@@ -360,9 +354,6 @@
     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();
@@ -520,9 +511,6 @@
   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();
@@ -674,9 +662,6 @@
     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);
@@ -777,10 +762,3 @@
 
 }
 
-package androidx.compose.animation.core.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-graphics/api/1.4.0-beta01.txt b/compose/animation/animation-graphics/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/animation/animation-graphics/api/1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/animation/animation-graphics/api/current.ignore b/compose/animation/animation-graphics/api/current.ignore
new file mode 100644
index 0000000..0ab1064
--- /dev/null
+++ b/compose/animation/animation-graphics/api/current.ignore
@@ -0,0 +1,7 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.animation.graphics.res:
+    Removed package androidx.compose.animation.graphics.res
+RemovedPackage: androidx.compose.animation.graphics.vector:
+    Removed package androidx.compose.animation.graphics.vector
+RemovedPackage: androidx.compose.animation.graphics.vector.compat:
+    Removed package androidx.compose.animation.graphics.vector.compat
diff --git a/compose/animation/animation-graphics/api/current.txt b/compose/animation/animation-graphics/api/current.txt
index 9c4ad0e..e6f50d0 100644
--- a/compose/animation/animation-graphics/api/current.txt
+++ b/compose/animation/animation-graphics/api/current.txt
@@ -1,37 +1 @@
 // Signature format: 4.0
-package androidx.compose.animation.graphics.res {
-
-  public final class AnimatedVectorPainterResources_androidKt {
-  }
-
-  public final class AnimatedVectorResources_androidKt {
-  }
-
-  public final class AnimatorResources_androidKt {
-  }
-
-}
-
-package androidx.compose.animation.graphics.vector {
-
-  public final class AnimatorAnimationSpecsKt {
-  }
-
-  public final class AnimatorKt {
-  }
-
-}
-
-package androidx.compose.animation.graphics.vector.compat {
-
-  public final class XmlAnimatedVectorParser_androidKt {
-  }
-
-  public final class XmlAnimatorParser_androidKt {
-  }
-
-  public final class XmlPullParserUtils_androidKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-graphics/api/public_plus_experimental_1.4.0-beta01.txt b/compose/animation/animation-graphics/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..cf4d086
--- /dev/null
+++ b/compose/animation/animation-graphics/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.compose.animation.graphics {
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation graphics API.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface ExperimentalAnimationGraphicsApi {
+  }
+
+}
+
+package androidx.compose.animation.graphics.res {
+
+  public final class AnimatedVectorPainterResources_androidKt {
+    method @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter rememberAnimatedVectorPainter(androidx.compose.animation.graphics.vector.AnimatedImageVector animatedImageVector, boolean atEnd);
+  }
+
+  public final class AnimatedVectorResources_androidKt {
+    method @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Composable public static androidx.compose.animation.graphics.vector.AnimatedImageVector animatedVectorResource(androidx.compose.animation.graphics.vector.AnimatedImageVector.Companion, @DrawableRes int id);
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector {
+
+  @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Immutable public final class AnimatedImageVector {
+    method public androidx.compose.ui.graphics.vector.ImageVector getImageVector();
+    method public int getTotalDuration();
+    property public final androidx.compose.ui.graphics.vector.ImageVector imageVector;
+    property public final int totalDuration;
+    field public static final androidx.compose.animation.graphics.vector.AnimatedImageVector.Companion Companion;
+  }
+
+  public static final class AnimatedImageVector.Companion {
+  }
+
+}
+
diff --git a/compose/animation/animation-graphics/api/public_plus_experimental_current.txt b/compose/animation/animation-graphics/api/public_plus_experimental_current.txt
index 08a1623..cf4d086 100644
--- a/compose/animation/animation-graphics/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-graphics/api/public_plus_experimental_current.txt
@@ -16,9 +16,6 @@
     method @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Composable public static androidx.compose.animation.graphics.vector.AnimatedImageVector animatedVectorResource(androidx.compose.animation.graphics.vector.AnimatedImageVector.Companion, @DrawableRes int id);
   }
 
-  public final class AnimatorResources_androidKt {
-  }
-
 }
 
 package androidx.compose.animation.graphics.vector {
@@ -34,24 +31,5 @@
   public static final class AnimatedImageVector.Companion {
   }
 
-  public final class AnimatorAnimationSpecsKt {
-  }
-
-  public final class AnimatorKt {
-  }
-
-}
-
-package androidx.compose.animation.graphics.vector.compat {
-
-  public final class XmlAnimatedVectorParser_androidKt {
-  }
-
-  public final class XmlAnimatorParser_androidKt {
-  }
-
-  public final class XmlPullParserUtils_androidKt {
-  }
-
 }
 
diff --git a/compose/animation/animation-graphics/api/res-1.4.0-beta01.txt b/compose/animation/animation-graphics/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-graphics/api/res-1.4.0-beta01.txt
diff --git a/compose/animation/animation-graphics/api/restricted_1.4.0-beta01.txt b/compose/animation/animation-graphics/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/animation/animation-graphics/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/animation/animation-graphics/api/restricted_current.ignore b/compose/animation/animation-graphics/api/restricted_current.ignore
new file mode 100644
index 0000000..0ab1064
--- /dev/null
+++ b/compose/animation/animation-graphics/api/restricted_current.ignore
@@ -0,0 +1,7 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.animation.graphics.res:
+    Removed package androidx.compose.animation.graphics.res
+RemovedPackage: androidx.compose.animation.graphics.vector:
+    Removed package androidx.compose.animation.graphics.vector
+RemovedPackage: androidx.compose.animation.graphics.vector.compat:
+    Removed package androidx.compose.animation.graphics.vector.compat
diff --git a/compose/animation/animation-graphics/api/restricted_current.txt b/compose/animation/animation-graphics/api/restricted_current.txt
index 9c4ad0e..e6f50d0 100644
--- a/compose/animation/animation-graphics/api/restricted_current.txt
+++ b/compose/animation/animation-graphics/api/restricted_current.txt
@@ -1,37 +1 @@
 // Signature format: 4.0
-package androidx.compose.animation.graphics.res {
-
-  public final class AnimatedVectorPainterResources_androidKt {
-  }
-
-  public final class AnimatedVectorResources_androidKt {
-  }
-
-  public final class AnimatorResources_androidKt {
-  }
-
-}
-
-package androidx.compose.animation.graphics.vector {
-
-  public final class AnimatorAnimationSpecsKt {
-  }
-
-  public final class AnimatorKt {
-  }
-
-}
-
-package androidx.compose.animation.graphics.vector.compat {
-
-  public final class XmlAnimatedVectorParser_androidKt {
-  }
-
-  public final class XmlAnimatorParser_androidKt {
-  }
-
-  public final class XmlPullParserUtils_androidKt {
-  }
-
-}
-
diff --git a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
index 3884e78..6cff075 100644
--- a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
+++ b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/AnimationIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class AnimationIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         CrossfadeDetector.UnusedCrossfadeTargetStateParameter
diff --git a/compose/animation/animation-tooling-internal/api/1.4.0-beta01.txt b/compose/animation/animation-tooling-internal/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/1.4.0-beta01.txt
@@ -0,0 +1,57 @@
+// 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.4.0-beta01.txt b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,57 @@
+// 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/restricted_1.4.0-beta01.txt b/compose/animation/animation-tooling-internal/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..dc21e7e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,57 @@
+// 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation/api/1.4.0-beta01.txt b/compose/animation/animation/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..9b1560f
--- /dev/null
+++ b/compose/animation/animation/api/1.4.0-beta01.txt
@@ -0,0 +1,102 @@
+// 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.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AnimatedVisibilityScope {
+  }
+
+  public final class AnimationModifierKt {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional String label, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+    method @Deprecated @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,? extends kotlin.Unit> content);
+  }
+
+  public final class EnterExitTransitionKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
+    field public static final androidx.compose.animation.EnterTransition.Companion Companion;
+  }
+
+  public static final class EnterTransition.Companion {
+    method public androidx.compose.animation.EnterTransition getNone();
+    property public final androidx.compose.animation.EnterTransition None;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
+    field public static final androidx.compose.animation.ExitTransition.Companion Companion;
+  }
+
+  public static final class ExitTransition.Companion {
+    method public androidx.compose.animation.ExitTransition getNone();
+    property public final androidx.compose.animation.ExitTransition None;
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,? extends kotlin.Unit>? finishedListener);
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/current.ignore b/compose/animation/animation/api/current.ignore
index 0b4033d..84b4c0e 100644
--- a/compose/animation/animation/api/current.ignore
+++ b/compose/animation/animation/api/current.ignore
@@ -1,3 +1,13 @@
 // Baseline format: 1.0
 ChangedType: androidx.compose.animation.TransitionKt#animateColor(androidx.compose.animation.core.InfiniteTransition, long, long, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color>):
     Method androidx.compose.animation.TransitionKt.animateColor has changed return type from androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> to androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color>
+
+
+RemovedClass: androidx.compose.animation.AnimatedContentKt:
+    Removed class androidx.compose.animation.AnimatedContentKt
+RemovedClass: androidx.compose.animation.FlingCalculatorKt:
+    Removed class androidx.compose.animation.FlingCalculatorKt
+
+
+RemovedPackage: androidx.compose.animation.internal:
+    Removed package androidx.compose.animation.internal
diff --git a/compose/animation/animation/api/current.txt b/compose/animation/animation/api/current.txt
index 9a6e17a..9b1560f 100644
--- a/compose/animation/animation/api/current.txt
+++ b/compose/animation/animation/api/current.txt
@@ -5,9 +5,6 @@
     method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
   }
 
-  public final class AnimatedContentKt {
-  }
-
   public final class AnimatedVisibilityKt {
     method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
@@ -70,9 +67,6 @@
     property public final androidx.compose.animation.ExitTransition None;
   }
 
-  public final class FlingCalculatorKt {
-  }
-
   public final class SingleValueAnimationKt {
     method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
@@ -106,10 +100,3 @@
 
 }
 
-package androidx.compose.animation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation/api/public_plus_experimental_1.4.0-beta01.txt b/compose/animation/animation/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..4e9addc
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,177 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(S? targetState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, optional String label, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(androidx.compose.animation.core.Transition<S>, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, optional kotlin.jvm.functions.Function1<? super S,?> contentKey, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @Deprecated @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(S? targetState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,? extends androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,? extends kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static androidx.compose.animation.SizeTransform SizeTransform(optional boolean clip, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> sizeAnimationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static infix androidx.compose.animation.ContentTransform with(androidx.compose.animation.EnterTransition, androidx.compose.animation.ExitTransition exit);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public final class AnimatedContentScope<S> implements androidx.compose.animation.core.Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public androidx.compose.animation.EnterTransition slideIntoContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffset);
+    method public androidx.compose.animation.ExitTransition slideOutOfContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffset);
+    method @androidx.compose.animation.ExperimentalAnimationApi public infix androidx.compose.animation.ContentTransform using(androidx.compose.animation.ContentTransform, androidx.compose.animation.SizeTransform? sizeTransform);
+    property public S! initialState;
+    property public S! targetState;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public static final value class AnimatedContentScope.SlideDirection {
+    field public static final androidx.compose.animation.AnimatedContentScope.SlideDirection.Companion Companion;
+  }
+
+  public static final class AnimatedContentScope.SlideDirection.Companion {
+    method public int getDown();
+    method public int getEnd();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public int getUp();
+    property public final int Down;
+    property public final int End;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+    property public final int Up;
+  }
+
+  public final class AnimatedVisibilityKt {
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <T> void AnimatedVisibility(androidx.compose.animation.core.Transition<T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @Deprecated @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, androidx.compose.animation.EnterTransition enter, androidx.compose.animation.ExitTransition exit, boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AnimatedVisibilityScope {
+    method @androidx.compose.animation.ExperimentalAnimationApi public default androidx.compose.ui.Modifier animateEnterExit(androidx.compose.ui.Modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label);
+    method @androidx.compose.animation.ExperimentalAnimationApi public androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> getTransition();
+    property @androidx.compose.animation.ExperimentalAnimationApi public abstract androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> transition;
+  }
+
+  public final class AnimationModifierKt {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public final class ContentTransform {
+    ctor public ContentTransform(androidx.compose.animation.EnterTransition targetContentEnter, androidx.compose.animation.ExitTransition initialContentExit, optional float targetContentZIndex, optional androidx.compose.animation.SizeTransform? sizeTransform);
+    method public androidx.compose.animation.ExitTransition getInitialContentExit();
+    method public androidx.compose.animation.SizeTransform? getSizeTransform();
+    method public androidx.compose.animation.EnterTransition getTargetContentEnter();
+    method public float getTargetContentZIndex();
+    method public void setTargetContentZIndex(float);
+    property public final androidx.compose.animation.ExitTransition initialContentExit;
+    property public final androidx.compose.animation.SizeTransform? sizeTransform;
+    property public final androidx.compose.animation.EnterTransition targetContentEnter;
+    property public final float targetContentZIndex;
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional String label, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <T> void Crossfade(androidx.compose.animation.core.Transition<T>, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super T,?> contentKey, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+    method @Deprecated @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,? extends kotlin.Unit> content);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public enum EnterExitState {
+    method public static androidx.compose.animation.EnterExitState valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.animation.EnterExitState[] values();
+    enum_constant public static final androidx.compose.animation.EnterExitState PostExit;
+    enum_constant public static final androidx.compose.animation.EnterExitState PreEnter;
+    enum_constant public static final androidx.compose.animation.EnterExitState Visible;
+  }
+
+  public final class EnterExitTransitionKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition scaleIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialScale, optional long transformOrigin);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition scaleOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetScale, optional long transformOrigin);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
+    field public static final androidx.compose.animation.EnterTransition.Companion Companion;
+  }
+
+  public static final class EnterTransition.Companion {
+    method public androidx.compose.animation.EnterTransition getNone();
+    property public final androidx.compose.animation.EnterTransition None;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
+    field public static final androidx.compose.animation.ExitTransition.Companion Companion;
+  }
+
+  public static final class ExitTransition.Companion {
+    method public androidx.compose.animation.ExitTransition getNone();
+    property public final androidx.compose.animation.ExitTransition None;
+  }
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExperimentalAnimationApi {
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,? extends kotlin.Unit>? finishedListener);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public interface SizeTransform {
+    method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> createAnimationSpec(long initialSize, long targetSize);
+    method public boolean getClip();
+    property public abstract boolean clip;
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/public_plus_experimental_current.txt b/compose/animation/animation/api/public_plus_experimental_current.txt
index b34adcc..4e9addc 100644
--- a/compose/animation/animation/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation/api/public_plus_experimental_current.txt
@@ -136,9 +136,6 @@
   @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExperimentalAnimationApi {
   }
 
-  public final class FlingCalculatorKt {
-  }
-
   public final class SingleValueAnimationKt {
     method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
@@ -178,10 +175,3 @@
 
 }
 
-package androidx.compose.animation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation/api/res-1.4.0-beta01.txt b/compose/animation/animation/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation/api/res-1.4.0-beta01.txt
diff --git a/compose/animation/animation/api/restricted_1.4.0-beta01.txt b/compose/animation/animation/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..9b1560f
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,102 @@
+// 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.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AnimatedVisibilityScope {
+  }
+
+  public final class AnimationModifierKt {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional String label, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+    method @Deprecated @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,? extends kotlin.Unit> content);
+  }
+
+  public final class EnterExitTransitionKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
+    field public static final androidx.compose.animation.EnterTransition.Companion Companion;
+  }
+
+  public static final class EnterTransition.Companion {
+    method public androidx.compose.animation.EnterTransition getNone();
+    property public final androidx.compose.animation.EnterTransition None;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
+    field public static final androidx.compose.animation.ExitTransition.Companion Companion;
+  }
+
+  public static final class ExitTransition.Companion {
+    method public androidx.compose.animation.ExitTransition getNone();
+    property public final androidx.compose.animation.ExitTransition None;
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,? extends kotlin.Unit>? finishedListener);
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label);
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/restricted_current.ignore b/compose/animation/animation/api/restricted_current.ignore
index 0b4033d..84b4c0e 100644
--- a/compose/animation/animation/api/restricted_current.ignore
+++ b/compose/animation/animation/api/restricted_current.ignore
@@ -1,3 +1,13 @@
 // Baseline format: 1.0
 ChangedType: androidx.compose.animation.TransitionKt#animateColor(androidx.compose.animation.core.InfiniteTransition, long, long, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color>):
     Method androidx.compose.animation.TransitionKt.animateColor has changed return type from androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> to androidx.compose.runtime.State<? extends androidx.compose.ui.graphics.Color>
+
+
+RemovedClass: androidx.compose.animation.AnimatedContentKt:
+    Removed class androidx.compose.animation.AnimatedContentKt
+RemovedClass: androidx.compose.animation.FlingCalculatorKt:
+    Removed class androidx.compose.animation.FlingCalculatorKt
+
+
+RemovedPackage: androidx.compose.animation.internal:
+    Removed package androidx.compose.animation.internal
diff --git a/compose/animation/animation/api/restricted_current.txt b/compose/animation/animation/api/restricted_current.txt
index 9a6e17a..9b1560f 100644
--- a/compose/animation/animation/api/restricted_current.txt
+++ b/compose/animation/animation/api/restricted_current.txt
@@ -5,9 +5,6 @@
     method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
   }
 
-  public final class AnimatedContentKt {
-  }
-
   public final class AnimatedVisibilityKt {
     method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
@@ -70,9 +67,6 @@
     property public final androidx.compose.animation.ExitTransition None;
   }
 
-  public final class FlingCalculatorKt {
-  }
-
   public final class SingleValueAnimationKt {
     method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional String label, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
@@ -106,10 +100,3 @@
 
 }
 
-package androidx.compose.animation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
index e9faed6..f4ce0bd 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
@@ -623,6 +623,14 @@
     val currentlyVisible = remember(this) { mutableStateListOf(currentState) }
     val contentMap = remember(this) { mutableMapOf<S, @Composable() () -> Unit>() }
 
+    // This is needed for tooling because it could change currentState directly,
+    // as opposed to changing target only. When that happens we need to clear all the
+    // visible content and only display the content for the new current state and target state.
+    if (!currentlyVisible.contains(currentState)) {
+        currentlyVisible.clear()
+        currentlyVisible.add(currentState)
+    }
+
     if (currentState == targetState) {
         if (currentlyVisible.size != 1 || currentlyVisible[0] != currentState) {
             currentlyVisible.clear()
@@ -650,7 +658,7 @@
         }
     }
 
-    if (!contentMap.containsKey(targetState)) {
+    if (!contentMap.containsKey(targetState) || !contentMap.containsKey(currentState)) {
         contentMap.clear()
         currentlyVisible.fastForEach { stateForContent ->
             contentMap[stateForContent] = {
diff --git a/compose/benchmark-utils/OWNERS b/compose/benchmark-utils/OWNERS
index b2c0d56..0c37b39 100644
--- a/compose/benchmark-utils/OWNERS
+++ b/compose/benchmark-utils/OWNERS
@@ -1 +1,2 @@
+# Bug component: 1229612
 jellefresen@google.com
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 a7e8e11..8e53da5 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
@@ -66,8 +66,8 @@
             public final class TestKt {
               public final static Foo(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
               public final static Bar(Landroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Foo%1 null null
               final static INNERCLASS TestKt%Bar%1 null null
+              final static INNERCLASS TestKt%Foo%1 null null
             }
             final class TestKt%Foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(Lkotlin/jvm/functions/Function2;I)V
@@ -424,9 +424,9 @@
             public final class TestKt {
               public final static Foo(Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
               public final static Example(Landroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Foo%1 null null
               final static INNERCLASS TestKt%Example%1 null null
               final static INNERCLASS TestKt%Example%2 null null
+              final static INNERCLASS TestKt%Foo%1 null null
             }
             final class TestKt%Foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(Ljava/lang/String;Lkotlin/jvm/functions/Function0;I)V
@@ -473,8 +473,8 @@
               public final static Foo(Landroidx/compose/runtime/Composer;I)V
               static <clinit>()V
               private final static Landroidx/compose/runtime/ProvidableCompositionLocal; a
-              final static INNERCLASS TestKt%Foo%1 null null
               final static INNERCLASS TestKt%a%1 null null
+              final static INNERCLASS TestKt%Foo%1 null null
             }
             final class TestKt%Foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(I)V
@@ -742,8 +742,8 @@
             public final class TestKt {
               public final static Foo(ILjava/lang/String;Landroidx/compose/runtime/Composer;I)V
               public final static Bar(ILjava/lang/String;Landroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Foo%1 null null
               final static INNERCLASS TestKt%Bar%1 null null
+              final static INNERCLASS TestKt%Foo%1 null null
             }
             final class TestKt%Foo%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(ILjava/lang/String;I)V
@@ -781,8 +781,8 @@
             public final class TestKt {
               public final static Foo(Landroidx/compose/runtime/Composer;I)V
               public final static Bar(ILandroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Foo%2 null null
               final static INNERCLASS TestKt%Bar%1 null null
+              final static INNERCLASS TestKt%Foo%2 null null
             }
             final class TestKt%Foo%2 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(I)V
@@ -914,9 +914,9 @@
             public final class TestKt {
               public final static Wrap(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V
               public final static App(ILandroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Wrap%1 null null
               final static INNERCLASS TestKt%App%1 null null
               final static INNERCLASS TestKt%App%2 null null
+              final static INNERCLASS TestKt%Wrap%1 null null
             }
             final class TestKt%Wrap%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(Lkotlin/jvm/functions/Function3;I)V
@@ -943,8 +943,8 @@
               final synthetic I %x
               final synthetic I %a
               OUTERCLASS TestKt%App%1 invoke (ILandroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%App%1%1 null null
               final static INNERCLASS TestKt%App%1 null null
+              final static INNERCLASS TestKt%App%1%1 null null
             }
             final class TestKt%App%2 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(II)V
@@ -1213,9 +1213,9 @@
               public final static Wat(Landroidx/compose/runtime/Composer;I)V
               public final static Foo(ILandroidx/compose/runtime/Composer;I)V
               private final static Foo%goo(Landroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Wat%1 null null
-              public final static INNERCLASS TestKt%Foo%Bar null Bar
               final static INNERCLASS TestKt%Foo%1 null null
+              public final static INNERCLASS TestKt%Foo%Bar null Bar
+              final static INNERCLASS TestKt%Wat%1 null null
             }
             final class TestKt%Wat%1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function2 {
               <init>(I)V
@@ -1274,8 +1274,8 @@
               public final static C(I)V
               public final static I(Lkotlin/jvm/functions/Function0;)V
               public final static J()V
-              public final static INNERCLASS TestKt%C%D null D
               public final static INNERCLASS TestKt%C%g%1 null null
+              public final static INNERCLASS TestKt%C%D null D
               final static INNERCLASS TestKt%J%1 null null
             }
             public final class TestKt%C%D {
@@ -1308,8 +1308,8 @@
               static <clinit>()V
               public final static LTestKt%J%1%1; INSTANCE
               OUTERCLASS TestKt%J%1 invoke ()V
-              final static INNERCLASS TestKt%J%1%1 null null
               final static INNERCLASS TestKt%J%1 null null
+              final static INNERCLASS TestKt%J%1%1 null null
             }
         """
     )
@@ -1497,8 +1497,8 @@
               final synthetic I %it
               final synthetic I %%changed
               OUTERCLASS TestKt%Example%1 compute (ILandroidx/compose/runtime/Composer;I)V
-              final static INNERCLASS TestKt%Example%1%compute%1 null null
               final static INNERCLASS TestKt%Example%1 null null
+              final static INNERCLASS TestKt%Example%1%compute%1 null null
             }
         """
     )
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 0b41128..59d3c97 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
@@ -1754,4 +1754,92 @@
             }
         """
     )
+
+    @Test // regression test for b/267586102
+    fun testRememberInALoop() = verifyComposeIrTransform(
+        source = """
+            import androidx.compose.runtime.*
+
+            val content: @Composable (a: SomeUnstableClass) -> Unit = {
+                for (index in 0 until count) {
+                    val i = remember { index }
+                }
+                val a = remember { 1 }
+            }
+        """,
+        extra = """
+            import androidx.compose.runtime.*
+
+            val count = 0
+            class SomeUnstableClass(val a: Any = "abc")
+        """,
+        expectedTransformed = """
+            val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+            internal object ComposableSingletons%TestKt {
+              val lambda-1: Function3<SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: SomeUnstableClass, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<rememb...>:Test.kt")
+                if (isTraceInProgress()) {
+                  traceEventStart(<>, %changed, -1, <>)
+                }
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<rememb...>")
+                val tmp0_iterator = 0 until count.iterator()
+                while (tmp0_iterator.hasNext()) {
+                  val index = tmp0_iterator.next()
+                  val i = remember({
+                    index
+                  }, %composer, 0)
+                }
+                %composer.endReplaceableGroup()
+                val a = remember({
+                  1
+                }, %composer, 0)
+                if (isTraceInProgress()) {
+                  traceEventEnd()
+                }
+              }
+            }
+
+        """
+    )
+
+    @Test // Regression test for b/267586102 to ensure the fix doesn't insert unnecessary groups
+    fun testRememberInALoop_NoTrailingRemember() = verifyComposeIrTransform(
+        source = """
+            import androidx.compose.runtime.*
+
+            val content: @Composable (a: SomeUnstableClass) -> Unit = {
+                for (index in 0 until count) {
+                    val i = remember { index }
+                }
+            }
+        """,
+        extra = """
+                import androidx.compose.runtime.*
+
+                val count = 0
+                class SomeUnstableClass(val a: Any = "abc")
+            """,
+        expectedTransformed = """
+            val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+            internal object ComposableSingletons%TestKt {
+              val lambda-1: Function3<SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: SomeUnstableClass, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C*<rememb...>:Test.kt")
+                if (isTraceInProgress()) {
+                  traceEventStart(<>, %changed, -1, <>)
+                }
+                val tmp0_iterator = 0 until count.iterator()
+                while (tmp0_iterator.hasNext()) {
+                  val index = tmp0_iterator.next()
+                  val i = remember({
+                    index
+                  }, %composer, 0)
+                }
+                if (isTraceInProgress()) {
+                  traceEventEnd()
+                }
+              }
+            }
+        """
+    )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index 666f74d..d0d3b5e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -208,7 +208,7 @@
     companion object {
         fun checkCompilerVersion(configuration: CompilerConfiguration): Boolean {
             try {
-                val KOTLIN_VERSION_EXPECTATION = "1.8.0"
+                val KOTLIN_VERSION_EXPECTATION = "1.8.10"
                 KotlinCompilerVersion.getVersion()?.let { version ->
                     val msgCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
                     val suppressKotlinVersionCheck = configuration.get(
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 0b8e35a..2c3feac 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
@@ -105,6 +105,7 @@
             9200 to "1.4.0-alpha04",
             9300 to "1.4.0-alpha05",
             9400 to "1.4.0-alpha06",
+            9500 to "1.4.0-beta01",
         )
 
         /**
@@ -117,7 +118,7 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.4.1"
+        const val compilerVersion: String = "1.4.2"
         private val minimumRuntimeVersion: String
             get() = runtimeVersionToMavenVersionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
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 5ec690d..ee5e76c 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
@@ -1079,6 +1079,7 @@
                 )
             )
         } else {
+            scope.realizeCoalescableGroup()
             declaration.body = IrBlockBodyImpl(
                 body.startOffset,
                 body.endOffset,
diff --git a/compose/foundation/foundation-layout/api/1.4.0-beta01.txt b/compose/foundation/foundation-layout/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..95dd32f
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.4.0-beta01.txt
@@ -0,0 +1,301 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.foundation.layout.IntrinsicSize valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.layout.IntrinsicSize[] values();
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Max;
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Min;
+  }
+
+  @kotlin.DslMarker public @interface LayoutScopeMarker {
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class 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 @kotlin.jvm.JvmDefaultWithCompatibility public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInsets {
+    method public int getBottom(androidx.compose.ui.unit.Density density);
+    method public int getLeft(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getRight(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getTop(androidx.compose.ui.unit.Density density);
+    field public static final androidx.compose.foundation.layout.WindowInsets.Companion Companion;
+  }
+
+  public static final class WindowInsets.Companion {
+  }
+
+  public final class WindowInsetsKt {
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional int left, optional int top, optional int right, optional int bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets add(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets);
+    method public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets, androidx.compose.ui.unit.Density density);
+    method public static androidx.compose.foundation.layout.WindowInsets exclude(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method public static androidx.compose.foundation.layout.WindowInsets only(androidx.compose.foundation.layout.WindowInsets, int sides);
+    method public static androidx.compose.foundation.layout.WindowInsets union(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsetsPaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumeWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onConsumedWindowInsetsChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.WindowInsets,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsPadding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsetsPadding_androidKt {
+    method public static androidx.compose.ui.Modifier captionBarPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier displayCutoutPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier imePadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier mandatorySystemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier navigationBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeContentPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeDrawingPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier statusBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier waterfallPadding(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmInline public final value class WindowInsetsSides {
+    method public operator int plus(int sides);
+    field public static final androidx.compose.foundation.layout.WindowInsetsSides.Companion Companion;
+  }
+
+  public static final class WindowInsetsSides.Companion {
+    method public int getBottom();
+    method public int getEnd();
+    method public int getHorizontal();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public int getTop();
+    method public int getVertical();
+    property public final int Bottom;
+    property public final int End;
+    property public final int Horizontal;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+    property public final int Top;
+    property public final int Vertical;
+  }
+
+  public final class WindowInsetsSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsBottomHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsEndWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsStartWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsTopHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsets_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getCaptionBar(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static boolean getConsumeWindowInsets(androidx.compose.ui.platform.ComposeView);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getDisplayCutout(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getIme(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getMandatorySystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getNavigationBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeContent(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeDrawing(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getStatusBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getTappableElement(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getWaterfall(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static void setConsumeWindowInsets(androidx.compose.ui.platform.ComposeView, boolean);
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/api/current.ignore b/compose/foundation/foundation-layout/api/current.ignore
new file mode 100644
index 0000000..2e1b921
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.foundation.layout.RowColumnImplKt:
+    Removed class androidx.compose.foundation.layout.RowColumnImplKt
+RemovedClass: androidx.compose.foundation.layout.WindowInsetsConnection_androidKt:
+    Removed class androidx.compose.foundation.layout.WindowInsetsConnection_androidKt
+
+
+RemovedPackage: androidx.compose.foundation.layout.internal:
+    Removed package androidx.compose.foundation.layout.internal
diff --git a/compose/foundation/foundation-layout/api/current.txt b/compose/foundation/foundation-layout/api/current.txt
index 98b9343..95dd32f 100644
--- a/compose/foundation/foundation-layout/api/current.txt
+++ b/compose/foundation/foundation-layout/api/current.txt
@@ -111,9 +111,6 @@
     method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
   }
 
-  public final class FlowLayoutKt {
-  }
-
   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);
@@ -166,9 +163,6 @@
     method public float calculateTopPadding();
   }
 
-  public final class RowColumnImplKt {
-  }
-
   public final class RowKt {
     method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
@@ -222,9 +216,6 @@
   public static final class WindowInsets.Companion {
   }
 
-  public final class WindowInsetsConnection_androidKt {
-  }
-
   public final class WindowInsetsKt {
     method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional int left, optional int top, optional int right, optional int bottom);
     method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional float left, optional float top, optional float right, optional float bottom);
@@ -308,10 +299,3 @@
 
 }
 
-package androidx.compose.foundation.layout.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation-layout/api/public_plus_experimental_1.4.0-beta01.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..d99d5f0
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,341 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility 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.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalLayoutApi {
+  }
+
+  public final class FlowLayoutKt {
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable public static void FlowColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional int maxItemsInEachColumn, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable public static void FlowRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional int maxItemsInEachRow, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  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 {
+    method public static androidx.compose.foundation.layout.IntrinsicSize valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.layout.IntrinsicSize[] values();
+    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 {
+  }
+
+  @androidx.compose.foundation.layout.ExperimentalLayoutApi public final class MutableWindowInsets implements androidx.compose.foundation.layout.WindowInsets {
+    ctor public MutableWindowInsets(optional androidx.compose.foundation.layout.WindowInsets initialInsets);
+    method public int getBottom(androidx.compose.ui.unit.Density density);
+    method public androidx.compose.foundation.layout.WindowInsets getInsets();
+    method public int getLeft(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getRight(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getTop(androidx.compose.ui.unit.Density density);
+    method public void setInsets(androidx.compose.foundation.layout.WindowInsets);
+    property public final androidx.compose.foundation.layout.WindowInsets insets;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class 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 @kotlin.jvm.JvmDefaultWithCompatibility public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInsets {
+    method public int getBottom(androidx.compose.ui.unit.Density density);
+    method public int getLeft(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getRight(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getTop(androidx.compose.ui.unit.Density density);
+    field public static final androidx.compose.foundation.layout.WindowInsets.Companion Companion;
+  }
+
+  public static final class WindowInsets.Companion {
+  }
+
+  public final class WindowInsetsConnection_androidKt {
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi public static androidx.compose.ui.Modifier imeNestedScroll(androidx.compose.ui.Modifier);
+  }
+
+  public final class WindowInsetsKt {
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional int left, optional int top, optional int right, optional int bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets add(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets);
+    method public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets, androidx.compose.ui.unit.Density density);
+    method public static androidx.compose.foundation.layout.WindowInsets exclude(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method public static androidx.compose.foundation.layout.WindowInsets only(androidx.compose.foundation.layout.WindowInsets, int sides);
+    method public static androidx.compose.foundation.layout.WindowInsets union(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsetsPaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumeWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumeWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @Deprecated @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumedWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @Deprecated @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumedWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onConsumedWindowInsetsChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.WindowInsets,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsPadding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @Deprecated @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier withConsumedWindowInsets(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.WindowInsets,kotlin.Unit> block);
+  }
+
+  public final class WindowInsetsPadding_androidKt {
+    method public static androidx.compose.ui.Modifier captionBarPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier displayCutoutPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier imePadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier mandatorySystemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier navigationBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeContentPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeDrawingPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier statusBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier waterfallPadding(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmInline public final value class WindowInsetsSides {
+    method public operator int plus(int sides);
+    field public static final androidx.compose.foundation.layout.WindowInsetsSides.Companion Companion;
+  }
+
+  public static final class WindowInsetsSides.Companion {
+    method public int getBottom();
+    method public int getEnd();
+    method public int getHorizontal();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public int getTop();
+    method public int getVertical();
+    property public final int Bottom;
+    property public final int End;
+    property public final int Horizontal;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+    property public final int Top;
+    property public final int Vertical;
+  }
+
+  public final class WindowInsetsSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsBottomHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsEndWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsStartWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsTopHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsets_androidKt {
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean getAreNavigationBarsVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean getAreStatusBarsVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean getAreSystemBarsVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getCaptionBar(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getCaptionBarIgnoringVisibility(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static boolean getConsumeWindowInsets(androidx.compose.ui.platform.ComposeView);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getDisplayCutout(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getIme(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getImeAnimationSource(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getImeAnimationTarget(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getMandatorySystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getNavigationBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getNavigationBarsIgnoringVisibility(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeContent(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeDrawing(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getStatusBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getStatusBarsIgnoringVisibility(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemBarsIgnoringVisibility(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getTappableElement(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getTappableElementIgnoringVisibility(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getWaterfall(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean isCaptionBarVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean isImeVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.foundation.layout.ExperimentalLayoutApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static boolean isTappableElementVisible(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static void setConsumeWindowInsets(androidx.compose.ui.platform.ComposeView, boolean);
+  }
+
+}
+
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 05b6344..d99d5f0 100644
--- a/compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
@@ -182,9 +182,6 @@
     method public float calculateTopPadding();
   }
 
-  public final class RowColumnImplKt {
-  }
-
   public final class RowKt {
     method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
@@ -342,10 +339,3 @@
 
 }
 
-package androidx.compose.foundation.layout.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation-layout/api/res-1.4.0-beta01.txt b/compose/foundation/foundation-layout/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/res-1.4.0-beta01.txt
diff --git a/compose/foundation/foundation-layout/api/restricted_1.4.0-beta01.txt b/compose/foundation/foundation-layout/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..3202872
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,306 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy rememberBoxMeasurePolicy(androidx.compose.ui.Alignment alignment, boolean propagateMinConstraints);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy columnMeasurePolicy(androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, androidx.compose.ui.Alignment.Horizontal horizontalAlignment);
+    field @kotlin.PublishedApi internal static final androidx.compose.ui.layout.MeasurePolicy DefaultColumnMeasurePolicy;
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility 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 {
+    method public static androidx.compose.foundation.layout.IntrinsicSize valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.layout.IntrinsicSize[] values();
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Max;
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Min;
+  }
+
+  @kotlin.DslMarker public @interface LayoutScopeMarker {
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class 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 @kotlin.jvm.JvmDefaultWithCompatibility public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInsets {
+    method public int getBottom(androidx.compose.ui.unit.Density density);
+    method public int getLeft(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getRight(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public int getTop(androidx.compose.ui.unit.Density density);
+    field public static final androidx.compose.foundation.layout.WindowInsets.Companion Companion;
+  }
+
+  public static final class WindowInsets.Companion {
+  }
+
+  public final class WindowInsetsKt {
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional int left, optional int top, optional int right, optional int bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.compose.foundation.layout.WindowInsets add(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets);
+    method public static androidx.compose.foundation.layout.PaddingValues asPaddingValues(androidx.compose.foundation.layout.WindowInsets, androidx.compose.ui.unit.Density density);
+    method public static androidx.compose.foundation.layout.WindowInsets exclude(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+    method public static androidx.compose.foundation.layout.WindowInsets only(androidx.compose.foundation.layout.WindowInsets, int sides);
+    method public static androidx.compose.foundation.layout.WindowInsets union(androidx.compose.foundation.layout.WindowInsets, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsetsPaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier consumeWindowInsets(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onConsumedWindowInsetsChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.WindowInsets,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsPadding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsetsPadding_androidKt {
+    method public static androidx.compose.ui.Modifier captionBarPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier displayCutoutPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier imePadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier mandatorySystemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier navigationBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeContentPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeDrawingPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier safeGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier statusBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemBarsPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGesturesPadding(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier waterfallPadding(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmInline public final value class WindowInsetsSides {
+    method public operator int plus(int sides);
+    field public static final androidx.compose.foundation.layout.WindowInsetsSides.Companion Companion;
+  }
+
+  public static final class WindowInsetsSides.Companion {
+    method public int getBottom();
+    method public int getEnd();
+    method public int getHorizontal();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public int getTop();
+    method public int getVertical();
+    property public final int Bottom;
+    property public final int End;
+    property public final int Horizontal;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+    property public final int Top;
+    property public final int Vertical;
+  }
+
+  public final class WindowInsetsSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsBottomHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsEndWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsStartWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier windowInsetsTopHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.WindowInsets insets);
+  }
+
+  public final class WindowInsets_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getCaptionBar(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static boolean getConsumeWindowInsets(androidx.compose.ui.platform.ComposeView);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getDisplayCutout(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getIme(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getMandatorySystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getNavigationBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeContent(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeDrawing(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSafeGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getStatusBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemBars(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getSystemGestures(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getTappableElement(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static androidx.compose.foundation.layout.WindowInsets getWaterfall(androidx.compose.foundation.layout.WindowInsets.Companion);
+    method public static void setConsumeWindowInsets(androidx.compose.ui.platform.ComposeView, boolean);
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/api/restricted_current.ignore b/compose/foundation/foundation-layout/api/restricted_current.ignore
new file mode 100644
index 0000000..2e1b921
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.foundation.layout.RowColumnImplKt:
+    Removed class androidx.compose.foundation.layout.RowColumnImplKt
+RemovedClass: androidx.compose.foundation.layout.WindowInsetsConnection_androidKt:
+    Removed class androidx.compose.foundation.layout.WindowInsetsConnection_androidKt
+
+
+RemovedPackage: androidx.compose.foundation.layout.internal:
+    Removed package androidx.compose.foundation.layout.internal
diff --git a/compose/foundation/foundation-layout/api/restricted_current.txt b/compose/foundation/foundation-layout/api/restricted_current.txt
index f1576ee..3202872 100644
--- a/compose/foundation/foundation-layout/api/restricted_current.txt
+++ b/compose/foundation/foundation-layout/api/restricted_current.txt
@@ -114,9 +114,6 @@
     method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
   }
 
-  public final class FlowLayoutKt {
-  }
-
   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);
@@ -169,9 +166,6 @@
     method public float calculateTopPadding();
   }
 
-  public final class RowColumnImplKt {
-  }
-
   public final class RowKt {
     method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy rowMeasurePolicy(androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, androidx.compose.ui.Alignment.Vertical verticalAlignment);
@@ -227,9 +221,6 @@
   public static final class WindowInsets.Companion {
   }
 
-  public final class WindowInsetsConnection_androidKt {
-  }
-
   public final class WindowInsetsKt {
     method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional int left, optional int top, optional int right, optional int bottom);
     method public static androidx.compose.foundation.layout.WindowInsets WindowInsets(optional float left, optional float top, optional float right, optional float bottom);
@@ -313,10 +304,3 @@
 
 }
 
-package androidx.compose.foundation.layout.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowColumnDemo.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowColumnDemo.kt
index 4cdd0f9..973c4c3 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowColumnDemo.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowColumnDemo.kt
@@ -16,75 +16,17 @@
 
 package androidx.compose.foundation.layout.demos
 
-import androidx.compose.foundation.BorderStroke
-import androidx.compose.foundation.background
-import androidx.compose.foundation.border
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ExperimentalLayoutApi
-import androidx.compose.foundation.layout.FlowColumn
-import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.requiredHeight
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.wrapContentHeight
-import androidx.compose.foundation.layout.wrapContentWidth
-import androidx.compose.material.Text
+import androidx.compose.foundation.layout.samples.SimpleFlowColumn
+import androidx.compose.foundation.layout.samples.SimpleFlowColumnWithWeights
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
 
 @OptIn(ExperimentalLayoutApi::class)
 @Composable
 fun SimpleFlowColumnDemo() {
     Column() {
-        FlowColumn(
-            Modifier
-                .fillMaxWidth(1f)
-                .wrapContentHeight(align = Alignment.Top)
-                .requiredHeight(200.dp)
-                .border(BorderStroke(2.dp, Color.Gray)),
-            horizontalAlignment = Alignment.CenterHorizontally,
-            verticalArrangement = Arrangement.Center,
-            maxItemsInEachColumn = 3
-        ) {
-
-            // handling overflow issues properly
-            // reversing the width and height aspect ratios will be buggy
-            repeat(9) {
-                Box(
-                    Modifier
-                        .padding(10.dp)
-                        .width(50.dp)
-                        .height(50.dp)
-                        .background(Color(0xFF6200ED))
-                        .weight(1f, true)
-                ) {
-                    Text(text = it.toString(), fontSize = 18.sp, modifier = Modifier.padding(3.dp))
-                }
-            }
-        }
-
-        FlowColumn(
-            Modifier
-                .fillMaxHeight(1f)
-                .wrapContentWidth(),
-            verticalArrangement = Arrangement.Top,
-            maxItemsInEachColumn = 5
-        ) {
-            repeat(10) { _ ->
-                Box(
-                    Modifier
-                        .size(20.dp)
-                )
-            }
-        }
+        SimpleFlowColumn()
+        SimpleFlowColumnWithWeights()
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowRowDemo.kt b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowRowDemo.kt
index 460270d..0cceea3 100644
--- a/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowRowDemo.kt
+++ b/compose/foundation/foundation-layout/integration-tests/layout-demos/src/main/java/androidx/compose/foundation/layout/demos/SimpleFlowRowDemo.kt
@@ -16,90 +16,17 @@
 
 package androidx.compose.foundation.layout.demos
 
-import androidx.compose.foundation.BorderStroke
-import androidx.compose.foundation.background
-import androidx.compose.foundation.border
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ExperimentalLayoutApi
-import androidx.compose.foundation.layout.FlowRow
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.requiredHeight
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.wrapContentHeight
-import androidx.compose.foundation.layout.wrapContentWidth
-import androidx.compose.material.Text
+import androidx.compose.foundation.layout.samples.SimpleFlowRow
+import androidx.compose.foundation.layout.samples.SimpleFlowRowWithWeights
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
 
 @OptIn(ExperimentalLayoutApi::class)
 @Composable
 fun SimpleFlowRowDemo() {
     Column() {
-        FlowRow(
-            Modifier
-                .wrapContentWidth(align = Alignment.Start)
-                .wrapContentHeight(align = Alignment.Top)
-                .requiredHeight(150.dp)
-                .border(BorderStroke(2.dp, Color.Gray)),
-            verticalAlignment = Alignment.CenterVertically,
-            horizontalArrangement = Arrangement.Center,
-            maxItemsInEachRow = Int.MAX_VALUE
-        ) {
-            repeat(50) {
-                Text("Heldo")
-            }
-        }
-        FlowRow(
-            Modifier
-                .fillMaxWidth(1f)
-                .wrapContentHeight(align = Alignment.Top)
-                .border(BorderStroke(2.dp, Color.Gray)),
-            verticalAlignment = Alignment.CenterVertically,
-            horizontalArrangement = Arrangement.End,
-            maxItemsInEachRow = 3
-        ) {
-            repeat(10) {
-                Box(
-                    Modifier
-                        .padding(10.dp)
-                        .width(50.dp)
-                        .height(
-                            if (it % 2 == 0) {
-                                30.dp
-                            } else {
-                                50.dp
-                            }
-                        )
-                        .background(Color(0xFF6200ED))
-                        .weight(1f, false)
-                ) {
-                    Text(text = it.toString(), fontSize = 18.sp, modifier = Modifier.padding(3.dp))
-                }
-            }
-        }
-
-        FlowRow(
-            Modifier
-                .wrapContentHeight()
-                .width(200.dp),
-            horizontalArrangement = Arrangement.Start,
-            maxItemsInEachRow = 5
-        ) {
-            repeat(6) { _ ->
-                Box(
-                    Modifier
-                        .size(20.dp)
-                )
-            }
-        }
+        SimpleFlowRow()
+        SimpleFlowRowWithWeights()
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt
new file mode 100644
index 0000000..83a2135
--- /dev/null
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowColumnSample.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.layout.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
+import androidx.compose.foundation.layout.FlowColumn
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+@OptIn(ExperimentalLayoutApi::class)
+@Sampled
+@Composable
+fun SimpleFlowColumn() {
+    FlowColumn(
+        Modifier
+            .fillMaxWidth()
+            .wrapContentHeight(align = Alignment.Top)
+            .requiredHeight(200.dp)
+            .border(BorderStroke(2.dp, Color.Gray)),
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.Center,
+        maxItemsInEachColumn = 3
+    ) {
+        repeat(9) { index ->
+            Box(
+                Modifier
+                    .padding(10.dp)
+                    .width(50.dp)
+                    .height(50.dp)
+                    .background(color = Color.Green)
+            ) {
+                Text(text = index.toString(), fontSize = 18.sp, modifier = Modifier.padding(3.dp))
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalLayoutApi::class)
+@Sampled
+@Composable
+fun SimpleFlowColumnWithWeights() {
+    FlowColumn(
+        Modifier
+            .fillMaxWidth()
+            .wrapContentHeight(align = Alignment.Top)
+            .requiredHeight(200.dp)
+            .border(BorderStroke(2.dp, Color.Gray)),
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.Top,
+        maxItemsInEachColumn = 3
+    ) {
+        repeat(10) { index ->
+            Box(
+                Modifier
+                    .padding(10.dp)
+                    .width(50.dp)
+                    .height(50.dp)
+                    .weight(if (index % 3 == 0) 1f else 2f, fill = true)
+                    .background(color = Color.Green)
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt
new file mode 100644
index 0000000..a3e87b9
--- /dev/null
+++ b/compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/FlowRowSample.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.layout.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
+import androidx.compose.foundation.layout.FlowRow
+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.layout.wrapContentHeight
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+@OptIn(ExperimentalLayoutApi::class)
+@Sampled
+@Composable
+fun SimpleFlowRow() {
+    Column() {
+        FlowRow(
+            Modifier
+                .fillMaxWidth(1f)
+                .wrapContentHeight(align = Alignment.Top)
+                .border(BorderStroke(2.dp, Color.Gray)),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.Start,
+            maxItemsInEachRow = 3
+        ) {
+            repeat(10) {
+                Box(
+                    Modifier
+                        .padding(10.dp)
+                        .width(50.dp)
+                        .height(50.dp)
+                        .background(Color.Green)
+                ) {
+                    Text(text = it.toString(), fontSize = 18.sp, modifier = Modifier.padding(3.dp))
+                }
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalLayoutApi::class)
+@Sampled
+@Composable
+fun SimpleFlowRowWithWeights() {
+    Column() {
+        FlowRow(
+            Modifier
+                .wrapContentHeight()
+                .fillMaxWidth(1f),
+            horizontalArrangement = Arrangement.Start,
+            verticalAlignment = Alignment.CenterVertically,
+            maxItemsInEachRow = 3
+        ) {
+            repeat(6) { index ->
+                Box(
+                    Modifier
+                        .padding(10.dp)
+                        .width(50.dp)
+                        .height(50.dp)
+                        .background(Color.Green)
+                        .weight(if (index % 3 == 0) 1f else 2f, fill = true)
+                )
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
index 7808c3d..71c9444 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
@@ -134,6 +134,10 @@
  * [baseline of the last line of text in the content][LastBaseline] to the bottom of the layout
  * is [bottom].
  *
+ * When the modified layout is min height constrained and the padded layout is smaller than the
+ * constraint, the modified layout will satisfy the min constraint and the content will be
+ * positioned to satisfy the [top] requirement if specified, or the [bottom] requirement otherwise.
+ *
  * @see paddingFrom
  *
  * Example usage:
@@ -142,8 +146,20 @@
 @Stable
 @Suppress("ModifierInspectorInfo")
 fun Modifier.paddingFromBaseline(top: Dp = Dp.Unspecified, bottom: Dp = Dp.Unspecified) = this
-    .then(if (bottom != Dp.Unspecified) paddingFrom(LastBaseline, after = bottom) else Modifier)
-    .then(if (top != Dp.Unspecified) paddingFrom(FirstBaseline, before = top) else Modifier)
+    .then(
+        if (top != Dp.Unspecified) {
+            Modifier.paddingFrom(FirstBaseline, before = top)
+        } else {
+            Modifier
+        }
+    )
+    .then(
+        if (bottom != Dp.Unspecified) {
+            Modifier.paddingFrom(LastBaseline, after = bottom)
+        } else {
+            Modifier
+        }
+    )
 
 /**
  * A [Modifier] that positions the content in a layout such that the distance from the top
@@ -152,6 +168,10 @@
  * [baseline of the last line of text in the content][LastBaseline] to the bottom of the layout
  * is [bottom].
  *
+ * When the modified layout is min height constrained and the padded layout is smaller than the
+ * constraint, the modified layout will satisfy the min constraint and the content will be
+ * positioned to satisfy the [top] requirement if specified, or the [bottom] requirement otherwise.
+ *
  * @see paddingFrom
  *
  * Example usage:
@@ -163,8 +183,12 @@
     top: TextUnit = TextUnit.Unspecified,
     bottom: TextUnit = TextUnit.Unspecified
 ) = this
-    .then(if (!bottom.isUnspecified) paddingFrom(LastBaseline, after = bottom) else Modifier)
-    .then(if (!top.isUnspecified) paddingFrom(FirstBaseline, before = top) else Modifier)
+    .then(
+        if (!top.isUnspecified) Modifier.paddingFrom(FirstBaseline, before = top) else Modifier
+    )
+    .then(
+        if (!bottom.isUnspecified) Modifier.paddingFrom(LastBaseline, after = bottom) else Modifier
+    )
 
 private class AlignmentLineOffsetDp(
     val alignmentLine: AlignmentLine,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
index 30ed0df..819c069 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Column.kt
@@ -130,6 +130,9 @@
      * Otherwise, the element is allowed to be smaller - this will result in [Column] being smaller,
      * as the unused allocated height will not be redistributed to other siblings.
      *
+     * In a [FlowColumn], when a weight is applied to an item, the item is scaled based on
+     * the number of weighted items that fall on the column it was placed in.
+     *
      * @param weight The proportional height to give to this element, as related to the total of
      * all weighted siblings. Must be positive.
      * @param fill When `true`, the element will occupy the whole height allocated.
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
index 16e6647..7703c5b 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt
@@ -30,14 +30,16 @@
  * the next "row" or "line" positioned on the bottom, and then continues filling items
  * until the items run out.
  *
- * When a Modifier [RowColumnParentData.weight] is provided, it scales the item
+ * Example:
+ * @sample androidx.compose.foundation.layout.samples.SimpleFlowRow
+ *
+ * When a Modifier [RowScope.weight] is provided, it scales the item
  * based on the number items that fall on the row it was placed in.
  *
  * Example:
- * ```
- * 1 2 3 4
- * 5 6 7 8
- * ```
+ * @sample androidx.compose.foundation.layout.samples.SimpleFlowRowWithWeights
+ *
+ *
  * @param modifier The modifier to be applied to the Row.
  * @param horizontalArrangement The horizontal arrangement of the layout's children.
  * @param verticalAlignment The vertical alignment of the layout's children.
@@ -79,15 +81,15 @@
  * It supports rtl in RTL layouts, by placing the first column to the right, and then moving
  * to the left
  *
- * When a Modifier [RowColumnParentData.weight] is provided, it scales the item
+ * Example:
+ * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumn
+ *
+ * When a Modifier [ColumnScope.weight] is provided, it scales the item
  * based on the number items that fall on the column it was placed in.
  *
  * Example:
- * ```
- * 1 4
- * 2 5
- * 3 6
- * ```
+ * @sample androidx.compose.foundation.layout.samples.SimpleFlowColumnWithWeights
+ *
  * @param modifier The modifier to be applied to the Row.
  * @param verticalArrangement The vertical arrangement of the layout's children.
  * @param horizontalAlignment The horizontal alignment of the layout's children.
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
index ef9e339..9d622a1 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class FoundationIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition,
diff --git a/compose/foundation/foundation/api/1.4.0-beta01.txt b/compose/foundation/foundation/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..b8a93c56
--- /dev/null
+++ b/compose/foundation/foundation/api/1.4.0-beta01.txt
@@ -0,0 +1,837 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class CheckScrollableContainerConstraintsKt {
+    method public static void checkScrollableContainerConstraints(long constraints, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  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 ClipScrollableContainerKt {
+    method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class ExcludeFromSystemGesture_androidKt {
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+  public final class FocusableKt {
+    method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  public enum MutatePriority {
+    method public static androidx.compose.foundation.MutatePriority valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.MutatePriority[] values();
+    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>);
+    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>);
+  }
+
+  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>);
+    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>);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 SystemGestureExclusionKt {
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitLongPressOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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>);
+    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>);
+    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>);
+    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>);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+  }
+
+  @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>);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? awaitEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @Deprecated 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>);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    method public static androidx.compose.foundation.gestures.Orientation valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.gestures.Orientation[] values();
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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>);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  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();
+    method public boolean reverseDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.foundation.gestures.Orientation orientation, boolean reverseScrolling);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public default boolean getCanScrollBackward();
+    method public default boolean getCanScrollForward();
+    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>);
+    property public default boolean canScrollBackward;
+    property public default boolean canScrollForward;
+    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 androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed);
+    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>);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope);
+  }
+
+  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>);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  public final class 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility 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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
+    method public default int getAfterContentPadding();
+    method public default int getBeforeContentPadding();
+    method public default int getMainAxisItemSpacing();
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public default long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default int afterContentPadding;
+    property public default int beforeContentPadding;
+    property public default int mainAxisItemSpacing;
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public default long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+  }
+
+  @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>);
+    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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.grid {
+
+  @androidx.compose.runtime.Stable public interface GridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Adaptive implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Fixed implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class GridItemSpan {
+    method public int getCurrentLineSpan();
+  }
+
+  public final class LazyGridDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyHorizontalGrid(androidx.compose.foundation.lazy.grid.GridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.grid.GridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public sealed interface LazyGridItemInfo {
+    method public int getColumn();
+    method public int getIndex();
+    method public Object getKey();
+    method public long getOffset();
+    method public int getRow();
+    method public long getSize();
+    property public abstract int column;
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract long offset;
+    property public abstract int row;
+    property public abstract long size;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridItemInfo.Companion Companion;
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  public static final class LazyGridItemInfo.Companion {
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridItemSpanScope {
+    method public int getMaxCurrentLineSpan();
+    method public int getMaxLineSpan();
+    property public abstract int maxCurrentLineSpan;
+    property public abstract int maxLineSpan;
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    method public int getMainAxisItemSpacing();
+    method public androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> getVisibleItemsInfo();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
+    property public abstract int mainAxisItemSpacing;
+    property public abstract androidx.compose.foundation.gestures.Orientation orientation;
+    property public abstract boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
+    method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridSpanKt {
+    method public static long GridItemSpan(int currentLineSpan);
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyGridState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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.grid.LazyGridLayoutInfo 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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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.grid.LazyGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridState.Companion Companion;
+  }
+
+  public static final class LazyGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> Saver;
+  }
+
+  public final class LazyGridStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class 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 int minLines, 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 int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+    method @Deprecated @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,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  @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 interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  @androidx.compose.runtime.Stable public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/current.ignore b/compose/foundation/foundation/api/current.ignore
index d1a4e31..529b30a 100644
--- a/compose/foundation/foundation/api/current.ignore
+++ b/compose/foundation/foundation/api/current.ignore
@@ -3,15 +3,151 @@
     Added method androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo.getMainAxisItemSpacing()
 
 
+RemovedClass: androidx.compose.foundation.ActualJvmKt:
+    Removed class androidx.compose.foundation.ActualJvmKt
+RemovedClass: androidx.compose.foundation.AndroidOverscrollKt:
+    Removed class androidx.compose.foundation.AndroidOverscrollKt
+RemovedClass: androidx.compose.foundation.Clickable_androidKt:
+    Removed class androidx.compose.foundation.Clickable_androidKt
+RemovedClass: androidx.compose.foundation.DarkTheme_androidKt:
+    Removed class androidx.compose.foundation.DarkTheme_androidKt
+RemovedClass: androidx.compose.foundation.FocusedBoundsKt:
+    Removed class androidx.compose.foundation.FocusedBoundsKt
+RemovedClass: androidx.compose.foundation.MagnifierKt:
+    Removed class androidx.compose.foundation.MagnifierKt
+RemovedClass: androidx.compose.foundation.OverscrollConfigurationKt:
+    Removed class androidx.compose.foundation.OverscrollConfigurationKt
+RemovedClass: androidx.compose.foundation.OverscrollKt:
+    Removed class androidx.compose.foundation.OverscrollKt
+RemovedClass: androidx.compose.foundation.TempListUtilsKt:
+    Removed class androidx.compose.foundation.TempListUtilsKt
+RemovedClass: androidx.compose.foundation.gestures.AndroidScrollable_androidKt:
+    Removed class androidx.compose.foundation.gestures.AndroidScrollable_androidKt
+RemovedClass: androidx.compose.foundation.lazy.LazyBeyondBoundsModifierKt:
+    Removed class androidx.compose.foundation.lazy.LazyBeyondBoundsModifierKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListHeadersKt:
+    Removed class androidx.compose.foundation.lazy.LazyListHeadersKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListItemPlacementAnimatorKt:
+    Removed class androidx.compose.foundation.lazy.LazyListItemPlacementAnimatorKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListItemProviderKt:
+    Removed class androidx.compose.foundation.lazy.LazyListItemProviderKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListKt:
+    Removed class androidx.compose.foundation.lazy.LazyListKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListMeasureKt:
+    Removed class androidx.compose.foundation.lazy.LazyListMeasureKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListPinningModifierKt:
     Removed class androidx.compose.foundation.lazy.LazyListPinningModifierKt
-RemovedClass: androidx.compose.foundation.lazy.layout.PinnableParentKt:
-    Removed class androidx.compose.foundation.lazy.layout.PinnableParentKt
+RemovedClass: androidx.compose.foundation.lazy.LazySemanticsKt:
+    Removed class androidx.compose.foundation.lazy.LazySemanticsKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridItemPlacementAnimatorKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridItemPlacementAnimatorKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridItemProviderKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridItemProviderKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridMeasureKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridMeasureKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazySemanticsKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazySemanticsKt
+RemovedClass: androidx.compose.foundation.text.AndroidCursorHandle_androidKt:
+    Removed class androidx.compose.foundation.text.AndroidCursorHandle_androidKt
+RemovedClass: androidx.compose.foundation.text.ContextMenu_androidKt:
+    Removed class androidx.compose.foundation.text.ContextMenu_androidKt
+RemovedClass: androidx.compose.foundation.text.CoreTextFieldKt:
+    Removed class androidx.compose.foundation.text.CoreTextFieldKt
+RemovedClass: androidx.compose.foundation.text.CoreTextKt:
+    Removed class androidx.compose.foundation.text.CoreTextKt
+RemovedClass: androidx.compose.foundation.text.KeyEventHelpers_androidKt:
+    Removed class androidx.compose.foundation.text.KeyEventHelpers_androidKt
+RemovedClass: androidx.compose.foundation.text.KeyMappingKt:
+    Removed class androidx.compose.foundation.text.KeyMappingKt
+RemovedClass: androidx.compose.foundation.text.KeyMapping_androidKt:
+    Removed class androidx.compose.foundation.text.KeyMapping_androidKt
+RemovedClass: androidx.compose.foundation.text.LongPressTextDragObserverKt:
+    Removed class androidx.compose.foundation.text.LongPressTextDragObserverKt
 RemovedClass: androidx.compose.foundation.text.MaxLinesHeightModifierKt:
     Removed class androidx.compose.foundation.text.MaxLinesHeightModifierKt
+RemovedClass: androidx.compose.foundation.text.StringHelpersKt:
+    Removed class androidx.compose.foundation.text.StringHelpersKt
+RemovedClass: androidx.compose.foundation.text.StringHelpers_androidKt:
+    Removed class androidx.compose.foundation.text.StringHelpers_androidKt
+RemovedClass: androidx.compose.foundation.text.StringHelpers_jvmKt:
+    Removed class androidx.compose.foundation.text.StringHelpers_jvmKt
+RemovedClass: androidx.compose.foundation.text.TextDelegateKt:
+    Removed class androidx.compose.foundation.text.TextDelegateKt
+RemovedClass: androidx.compose.foundation.text.TextFieldCursorKt:
+    Removed class androidx.compose.foundation.text.TextFieldCursorKt
+RemovedClass: androidx.compose.foundation.text.TextFieldDelegateKt:
+    Removed class androidx.compose.foundation.text.TextFieldDelegateKt
+RemovedClass: androidx.compose.foundation.text.TextFieldGestureModifiersKt:
+    Removed class androidx.compose.foundation.text.TextFieldGestureModifiersKt
+RemovedClass: androidx.compose.foundation.text.TextFieldKeyInputKt:
+    Removed class androidx.compose.foundation.text.TextFieldKeyInputKt
+RemovedClass: androidx.compose.foundation.text.TextFieldKeyInput_androidKt:
+    Removed class androidx.compose.foundation.text.TextFieldKeyInput_androidKt
+RemovedClass: androidx.compose.foundation.text.TextFieldPressGestureFilterKt:
+    Removed class androidx.compose.foundation.text.TextFieldPressGestureFilterKt
+RemovedClass: androidx.compose.foundation.text.TextFieldScrollKt:
+    Removed class androidx.compose.foundation.text.TextFieldScrollKt
+RemovedClass: androidx.compose.foundation.text.TextFieldSizeKt:
+    Removed class androidx.compose.foundation.text.TextFieldSizeKt
+RemovedClass: androidx.compose.foundation.text.TextLayoutHelperKt:
+    Removed class androidx.compose.foundation.text.TextLayoutHelperKt
+RemovedClass: androidx.compose.foundation.text.TextLayoutResultProxyKt:
+    Removed class androidx.compose.foundation.text.TextLayoutResultProxyKt
+RemovedClass: androidx.compose.foundation.text.TextPointerIcon_androidKt:
+    Removed class androidx.compose.foundation.text.TextPointerIcon_androidKt
+RemovedClass: androidx.compose.foundation.text.TouchMode_androidKt:
+    Removed class androidx.compose.foundation.text.TouchMode_androidKt
+RemovedClass: androidx.compose.foundation.text.UndoManagerKt:
+    Removed class androidx.compose.foundation.text.UndoManagerKt
+RemovedClass: androidx.compose.foundation.text.UndoManager_jvmKt:
+    Removed class androidx.compose.foundation.text.UndoManager_jvmKt
+RemovedClass: androidx.compose.foundation.text.ValidatingOffsetMappingKt:
+    Removed class androidx.compose.foundation.text.ValidatingOffsetMappingKt
+RemovedClass: androidx.compose.foundation.text.selection.AndroidSelectionHandles_androidKt:
+    Removed class androidx.compose.foundation.text.selection.AndroidSelectionHandles_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.MultiWidgetSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.MultiWidgetSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionAdjustmentKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionAdjustmentKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionHandlesKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionHandlesKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionMagnifierKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionMagnifierKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionManagerKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionManagerKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionManager_androidKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionManager_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionRegistrarKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionRegistrarKt
+RemovedClass: androidx.compose.foundation.text.selection.SimpleLayoutKt:
+    Removed class androidx.compose.foundation.text.selection.SimpleLayoutKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionManagerKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionManagerKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionManager_androidKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionManager_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.TextSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.TextSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt:
+    Removed class androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt
 
 
 RemovedMethod: androidx.compose.foundation.gestures.TapGestureDetectorKt#awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, boolean, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>):
     Removed method androidx.compose.foundation.gestures.TapGestureDetectorKt.awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope,boolean,kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>)
 RemovedMethod: androidx.compose.foundation.gestures.TapGestureDetectorKt#waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>):
     Removed method androidx.compose.foundation.gestures.TapGestureDetectorKt.waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope,kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>)
+
+
+RemovedPackage: androidx.compose.foundation.gestures.snapping:
+    Removed package androidx.compose.foundation.gestures.snapping
+RemovedPackage: androidx.compose.foundation.internal:
+    Removed package androidx.compose.foundation.internal
+RemovedPackage: androidx.compose.foundation.lazy.layout:
+    Removed package androidx.compose.foundation.lazy.layout
+RemovedPackage: androidx.compose.foundation.lazy.staggeredgrid:
+    Removed package androidx.compose.foundation.lazy.staggeredgrid
+RemovedPackage: androidx.compose.foundation.relocation:
+    Removed package androidx.compose.foundation.relocation
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 1c8281c..b8a93c56 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -1,20 +1,11 @@
 // Signature format: 4.0
 package androidx.compose.foundation {
 
-  public final class ActualJvmKt {
-  }
-
-  public final class AndroidOverscrollKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
   }
 
-  public final class BasicMarqueeKt {
-  }
-
   public final class BorderKt {
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
@@ -47,9 +38,6 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
-  public final class Clickable_androidKt {
-  }
-
   public final class ClipScrollableContainerKt {
     method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
   }
@@ -58,9 +46,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
 
-  public final class DarkTheme_androidKt {
-  }
-
   public final class ExcludeFromSystemGesture_androidKt {
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
@@ -70,9 +55,6 @@
     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 FocusedBoundsKt {
-  }
-
   public final class HoverableKt {
     method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
   }
@@ -98,9 +80,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
   }
 
-  public final class MagnifierKt {
-  }
-
   public enum MutatePriority {
     method public static androidx.compose.foundation.MutatePriority valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.foundation.MutatePriority[] values();
@@ -115,12 +94,6 @@
     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>);
   }
 
-  public final class OverscrollConfigurationKt {
-  }
-
-  public final class OverscrollKt {
-  }
-
   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);
@@ -161,19 +134,10 @@
     method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
   }
 
-  public final class TempListUtilsKt {
-  }
-
 }
 
 package androidx.compose.foundation.gestures {
 
-  public final class AndroidScrollable_androidKt {
-  }
-
-  public final class ContentInViewModifierKt {
-  }
-
   public final class DragGestureDetectorKt {
     method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
     method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
@@ -312,16 +276,6 @@
 
 }
 
-package androidx.compose.foundation.gestures.snapping {
-
-  public final class LazyListSnapLayoutInfoProviderKt {
-  }
-
-  public final class SnapFlingBehaviorKt {
-  }
-
-}
-
 package androidx.compose.foundation.interaction {
 
   public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
@@ -425,18 +379,8 @@
 
 }
 
-package androidx.compose.foundation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.foundation.lazy {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @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,? extends kotlin.Unit> content);
@@ -458,9 +402,6 @@
     method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
   public interface LazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
@@ -472,15 +413,6 @@
     property public abstract int size;
   }
 
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
     method public default int getAfterContentPadding();
     method public default int getBeforeContentPadding();
@@ -504,9 +436,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyListMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
     method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
@@ -547,9 +476,6 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
-  public final class LazySemanticsKt {
-  }
-
 }
 
 package androidx.compose.foundation.lazy.grid {
@@ -604,12 +530,6 @@
     field public static final int UnknownRow = -1; // 0xffffffff
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
   }
 
@@ -620,9 +540,6 @@
     property public abstract int maxLineSpan;
   }
 
-  public final class LazyGridKt {
-  }
-
   public sealed interface LazyGridLayoutInfo {
     method public int getAfterContentPadding();
     method public int getBeforeContentPadding();
@@ -646,9 +563,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyGridMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
     method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
     method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
@@ -691,100 +605,6 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
-}
-
-package androidx.compose.foundation.lazy.layout {
-
-  public final class IntervalListKt {
-  }
-
-  public final class LazyAnimateScrollKt {
-  }
-
-  public final class LazyLayoutItemProviderKt {
-  }
-
-  public final class LazyLayoutKt {
-  }
-
-  public final class LazyLayoutPinnableItemKt {
-  }
-
-  public final class LazyLayoutPrefetcher_androidKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
-  public final class LazyNearestItemsRangeKt {
-  }
-
-  public final class LazySaveableStateHolderKt {
-  }
-
-  public final class Lazy_androidKt {
-  }
-
-}
-
-package androidx.compose.foundation.lazy.staggeredgrid {
-
-  public final class LazyStaggeredGridCellsKt {
-  }
-
-  public final class LazyStaggeredGridDslKt {
-  }
-
-  public final class LazyStaggeredGridItemProviderKt {
-  }
-
-  public final class LazyStaggeredGridKt {
-  }
-
-  public final class LazyStaggeredGridMeasureKt {
-  }
-
-  public final class LazyStaggeredGridMeasurePolicyKt {
-  }
-
-  public final class LazyStaggeredGridMeasureResultKt {
-  }
-
-  public final class LazyStaggeredGridSemanticsKt {
-  }
-
-  public final class LazyStaggeredGridStateKt {
-  }
-
-}
-
-package androidx.compose.foundation.pager {
-
-  public final class PagerKt {
-  }
-
-  public final class PagerStateKt {
-  }
-
-}
-
-package androidx.compose.foundation.relocation {
-
-  public final class BringIntoViewKt {
-  }
-
-  public final class BringIntoViewRequesterKt {
-  }
-
-  public final class BringIntoViewResponderKt {
-  }
-
-  public final class BringIntoViewResponder_androidKt {
-  }
-
 }
 
 package androidx.compose.foundation.selection {
@@ -912,9 +732,6 @@
 
 package androidx.compose.foundation.text {
 
-  public final class AndroidCursorHandle_androidKt {
-  }
-
   public final class BasicTextFieldKt {
     method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, 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 int minLines, 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);
@@ -933,18 +750,6 @@
     method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContextMenu_androidKt {
-  }
-
-  public final class CoreTextFieldKt {
-  }
-
-  public final class CoreTextKt {
-  }
-
-  public final class HeightInLinesModifierKt {
-  }
-
   @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();
@@ -957,15 +762,6 @@
     method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
   }
 
-  public final class KeyEventHelpers_androidKt {
-  }
-
-  public final class KeyMappingKt {
-  }
-
-  public final class KeyMapping_androidKt {
-  }
-
   public interface KeyboardActionScope {
     method public void defaultKeyboardAction(int imeAction);
   }
@@ -1015,117 +811,15 @@
     property public final androidx.compose.foundation.text.KeyboardOptions Default;
   }
 
-  public final class LongPressTextDragObserverKt {
-  }
-
-  public final class PointerMoveDetectorKt {
-  }
-
-  public final class StringHelpersKt {
-  }
-
-  public final class StringHelpers_androidKt {
-  }
-
-  public final class StringHelpers_jvmKt {
-  }
-
-  public final class TextDelegateKt {
-  }
-
-  public final class TextFieldCursorKt {
-  }
-
-  public final class TextFieldDelegateKt {
-  }
-
-  public final class TextFieldFocusModifier_androidKt {
-  }
-
-  public final class TextFieldGestureModifiersKt {
-  }
-
-  public final class TextFieldKeyInputKt {
-  }
-
-  public final class TextFieldKeyInput_androidKt {
-  }
-
-  public final class TextFieldPressGestureFilterKt {
-  }
-
-  public final class TextFieldScrollKt {
-  }
-
-  public final class TextFieldSizeKt {
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutResultProxyKt {
-  }
-
-  public final class TextPointerIcon_androidKt {
-  }
-
-  public final class TouchMode_androidKt {
-  }
-
-  public final class UndoManagerKt {
-  }
-
-  public final class UndoManager_jvmKt {
-  }
-
-  public final class ValidatingOffsetMappingKt {
-  }
-
 }
 
 package androidx.compose.foundation.text.selection {
 
-  public final class AndroidSelectionHandles_androidKt {
-  }
-
-  public final class MultiWidgetSelectionDelegateKt {
-  }
-
-  public final class SelectionAdjustmentKt {
-  }
-
   public final class SelectionContainerKt {
     method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionMagnifierKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  public final class SelectionManager_androidKt {
-  }
-
-  public final class SelectionRegistrarKt {
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  public final class TextFieldSelectionDelegateKt {
-  }
-
-  public final class TextFieldSelectionManagerKt {
-  }
-
-  public final class TextFieldSelectionManager_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class TextSelectionColors {
     ctor public TextSelectionColors(long handleColor, long backgroundColor);
     method public long getBackgroundColor();
@@ -1139,11 +833,5 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
-  public final class TextSelectionMouseDetectorKt {
-  }
-
 }
 
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.4.0-beta01.txt b/compose/foundation/foundation/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..9918bcc
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1271 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BasicMarqueeKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.MarqueeSpacing MarqueeSpacing(float spacing);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier basicMarquee(androidx.compose.ui.Modifier, optional int iterations, optional int animationMode, optional int delayMillis, optional int initialDelayMillis, optional androidx.compose.foundation.MarqueeSpacing spacing, optional float velocity);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static int getDefaultMarqueeDelayMillis();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static int getDefaultMarqueeIterations();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.MarqueeSpacing getDefaultMarqueeSpacing();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static float getDefaultMarqueeVelocity();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final int DefaultMarqueeDelayMillis;
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final int DefaultMarqueeIterations;
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final androidx.compose.foundation.MarqueeSpacing DefaultMarqueeSpacing;
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final float DefaultMarqueeVelocity;
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, String contentDescription, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class CheckScrollableContainerConstraintsKt {
+    method public static void checkScrollableContainerConstraints(long constraints, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  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 ClipScrollableContainerKt {
+    method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class ExcludeFromSystemGesture_androidKt {
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalFoundationApi {
+  }
+
+  public final class FocusableKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier focusGroup(androidx.compose.ui.Modifier);
+    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 FocusedBoundsKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier onFocusedBoundsChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPositioned);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InternalFoundationApi {
+  }
+
+  public final class MagnifierKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier magnifier(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.geometry.Offset> sourceCenter, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.geometry.Offset> magnifierCenter, optional float zoom, optional androidx.compose.foundation.MagnifierStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.DpSize,kotlin.Unit>? onSizeChanged);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class MagnifierStyle {
+    ctor @androidx.compose.foundation.ExperimentalFoundationApi public MagnifierStyle(optional long size, optional float cornerRadius, optional float elevation, optional boolean clippingEnabled, optional boolean fishEyeEnabled);
+    method public boolean isSupported();
+    property public final boolean isSupported;
+    field public static final androidx.compose.foundation.MagnifierStyle.Companion Companion;
+  }
+
+  public static final class MagnifierStyle.Companion {
+    method public androidx.compose.foundation.MagnifierStyle getDefault();
+    method public androidx.compose.foundation.MagnifierStyle getTextDefault();
+    property public final androidx.compose.foundation.MagnifierStyle Default;
+    property public final androidx.compose.foundation.MagnifierStyle TextDefault;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @kotlin.jvm.JvmInline public final value class MarqueeAnimationMode {
+    field public static final androidx.compose.foundation.MarqueeAnimationMode.Companion Companion;
+  }
+
+  public static final class MarqueeAnimationMode.Companion {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public int getImmediately();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public int getWhileFocused();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public final int Immediately;
+    property @androidx.compose.foundation.ExperimentalFoundationApi public final int WhileFocused;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public fun interface MarqueeSpacing {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public int calculateSpacing(androidx.compose.ui.unit.Density, int contentWidth, int containerWidth);
+    field public static final androidx.compose.foundation.MarqueeSpacing.Companion Companion;
+  }
+
+  public static final class MarqueeSpacing.Companion {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public androidx.compose.foundation.MarqueeSpacing fractionOfContainer(float fraction);
+  }
+
+  public enum MutatePriority {
+    method public static androidx.compose.foundation.MutatePriority valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.MutatePriority[] values();
+    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>);
+    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>);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class OverscrollConfiguration {
+    ctor public OverscrollConfiguration(optional long glowColor, optional androidx.compose.foundation.layout.PaddingValues drawPadding);
+    method public androidx.compose.foundation.layout.PaddingValues getDrawPadding();
+    method public long getGlowColor();
+    property public final androidx.compose.foundation.layout.PaddingValues drawPadding;
+    property public final long glowColor;
+  }
+
+  public final class OverscrollConfigurationKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.OverscrollConfiguration> getLocalOverscrollConfiguration();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.OverscrollConfiguration> LocalOverscrollConfiguration;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface OverscrollEffect {
+    method public suspend Object? applyToFling(long velocity, kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.Velocity,? super kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>,?> performFling, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public long applyToScroll(long delta, int source, kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,androidx.compose.ui.geometry.Offset> performScroll);
+    method public androidx.compose.ui.Modifier getEffectModifier();
+    method public boolean isInProgress();
+    property public abstract androidx.compose.ui.Modifier effectModifier;
+    property public abstract boolean isInProgress;
+  }
+
+  public final class OverscrollKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier overscroll(androidx.compose.ui.Modifier, androidx.compose.foundation.OverscrollEffect overscrollEffect);
+  }
+
+  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>);
+    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>);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 SystemGestureExclusionKt {
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitLongPressOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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>);
+    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>);
+    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>);
+    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>);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+  }
+
+  @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>);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? awaitEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @Deprecated 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>);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    method public static androidx.compose.foundation.gestures.Orientation valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.gestures.Orientation[] values();
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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>);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  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();
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public androidx.compose.foundation.OverscrollEffect overscrollEffect();
+    method public boolean reverseDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.foundation.gestures.Orientation orientation, boolean reverseScrolling);
+    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);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier scrollable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.ScrollableState state, androidx.compose.foundation.gestures.Orientation orientation, androidx.compose.foundation.OverscrollEffect? overscrollEffect, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public default boolean getCanScrollBackward();
+    method public default boolean getCanScrollForward();
+    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>);
+    property public default boolean canScrollBackward;
+    property public default boolean canScrollForward;
+    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 androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed);
+    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>);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope);
+  }
+
+  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>);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.compose.foundation.gestures.snapping {
+
+  public final class LazyListSnapLayoutInfoProviderKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider SnapLayoutInfoProvider(androidx.compose.foundation.lazy.LazyListState lazyListState, optional kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> positionInLayout);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.FlingBehavior rememberSnapFlingBehavior(androidx.compose.foundation.lazy.LazyListState lazyListState);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class SnapFlingBehavior implements androidx.compose.foundation.gestures.FlingBehavior {
+    ctor public SnapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider, androidx.compose.animation.core.AnimationSpec<java.lang.Float> lowVelocityAnimationSpec, androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> highVelocityAnimationSpec, androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec, androidx.compose.ui.unit.Density density, optional float shortSnapVelocityThreshold);
+    method public suspend Object? performFling(androidx.compose.foundation.gestures.ScrollScope, float initialVelocity, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    method public suspend Object? performFling(androidx.compose.foundation.gestures.ScrollScope, float initialVelocity, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onSettlingDistanceUpdated, kotlin.coroutines.Continuation<? super java.lang.Float>);
+  }
+
+  public final class SnapFlingBehaviorKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.snapping.SnapFlingBehavior rememberSnapFlingBehavior(androidx.compose.foundation.gestures.snapping.SnapLayoutInfoProvider snapLayoutInfoProvider);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface SnapLayoutInfoProvider {
+    method public float calculateApproachOffset(androidx.compose.ui.unit.Density, float initialVelocity);
+    method public float calculateSnapStepSize(androidx.compose.ui.unit.Density);
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> calculateSnappingOffsetBounds(androidx.compose.ui.unit.Density);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  public final class 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyItemScope {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public androidx.compose.ui.Modifier animateItemPlacement(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
+    method public default int getAfterContentPadding();
+    method public default int getBeforeContentPadding();
+    method public default int getMainAxisItemSpacing();
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public default long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default int afterContentPadding;
+    property public default int beforeContentPadding;
+    property public default int mainAxisItemSpacing;
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public default long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+  }
+
+  @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>);
+    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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.grid {
+
+  @androidx.compose.runtime.Stable public interface GridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Adaptive implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Fixed implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class GridItemSpan {
+    method public int getCurrentLineSpan();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public final int currentLineSpan;
+  }
+
+  public final class LazyGridDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyHorizontalGrid(androidx.compose.foundation.lazy.grid.GridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.grid.GridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public sealed interface LazyGridItemInfo {
+    method public int getColumn();
+    method public int getIndex();
+    method public Object getKey();
+    method public long getOffset();
+    method public int getRow();
+    method public long getSize();
+    property public abstract int column;
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract long offset;
+    property public abstract int row;
+    property public abstract long size;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridItemInfo.Companion Companion;
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  public static final class LazyGridItemInfo.Companion {
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public androidx.compose.ui.Modifier animateItemPlacement(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridItemSpanScope {
+    method public int getMaxCurrentLineSpan();
+    method public int getMaxLineSpan();
+    property public abstract int maxCurrentLineSpan;
+    property public abstract int maxLineSpan;
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    method public int getMainAxisItemSpacing();
+    method public androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> getVisibleItemsInfo();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
+    property public abstract int mainAxisItemSpacing;
+    property public abstract androidx.compose.foundation.gestures.Orientation orientation;
+    property public abstract boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
+    method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridSpanKt {
+    method public static long GridItemSpan(int currentLineSpan);
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyGridState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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.grid.LazyGridLayoutInfo 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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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.grid.LazyGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridState.Companion Companion;
+  }
+
+  public static final class LazyGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> Saver;
+  }
+
+  public final class LazyGridStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface IntervalList<T> {
+    method public void forEach(optional int fromIndex, optional int toIndex, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.layout.IntervalList.Interval<? extends T>,kotlin.Unit> block);
+    method public operator androidx.compose.foundation.lazy.layout.IntervalList.Interval<T> get(int index);
+    method public int getSize();
+    property public abstract int size;
+  }
+
+  public static final class IntervalList.Interval<T> {
+    method public int getSize();
+    method public int getStartIndex();
+    method public T! getValue();
+    property public final int size;
+    property public final int startIndex;
+    property public final T! value;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyLayoutIntervalContent {
+    method public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object>? getKey();
+    method public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object> getType();
+    property public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object>? key;
+    property public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object> type;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface LazyLayoutItemProvider {
+    method @androidx.compose.runtime.Composable public void Item(int index);
+    method public default Object? getContentType(int index);
+    method public int getItemCount();
+    method public default Object getKey(int index);
+    method public default java.util.Map<java.lang.Object,java.lang.Integer> getKeyToIndexMap();
+    property public abstract int itemCount;
+    property public default java.util.Map<java.lang.Object,java.lang.Integer> keyToIndexMap;
+  }
+
+  public final class LazyLayoutItemProviderKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider DelegatingLazyLayoutItemProvider(androidx.compose.runtime.State<? extends androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider> delegate);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static <T extends androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent> androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider LazyLayoutItemProvider(androidx.compose.foundation.lazy.layout.IntervalList<? extends T> intervals, kotlin.ranges.IntRange nearestItemsRange, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.layout.IntervalList.Interval<? extends T>,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static Object getDefaultLazyLayoutKey(int index);
+  }
+
+  public final class LazyLayoutKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyLayout(androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider itemProvider, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState? prefetchState, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public sealed interface LazyLayoutMeasureScope extends androidx.compose.ui.layout.MeasureScope {
+    method public java.util.List<androidx.compose.ui.layout.Placeable> measure(int index, long constraints);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+  }
+
+  public final class LazyLayoutPinnableItemKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyLayoutPinnableItem(Object? key, int index, androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList pinnedItemList, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyLayoutPinnedItemList implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList.PinnedItem> {
+    ctor public LazyLayoutPinnedItemList();
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static sealed interface LazyLayoutPinnedItemList.PinnedItem {
+    method public int getIndex();
+    method public Object? getKey();
+    property public abstract int index;
+    property public abstract Object? key;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class LazyLayoutPrefetchState {
+    ctor public LazyLayoutPrefetchState();
+    method public androidx.compose.foundation.lazy.layout.LazyLayoutPrefetchState.PrefetchHandle schedulePrefetch(int index, long constraints);
+  }
+
+  public static sealed interface LazyLayoutPrefetchState.PrefetchHandle {
+    method public void cancel();
+  }
+
+  public final class LazyNearestItemsRangeKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<kotlin.ranges.IntRange> rememberLazyNearestItemsRangeState(kotlin.jvm.functions.Function0<java.lang.Integer> firstVisibleItemIndex, kotlin.jvm.functions.Function0<java.lang.Integer> slidingWindowSize, kotlin.jvm.functions.Function0<java.lang.Integer> extraItemCount);
+  }
+
+  public final class Lazy_androidKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static Object getDefaultLazyLayoutKey(int index);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class MutableIntervalList<T> implements androidx.compose.foundation.lazy.layout.IntervalList<T> {
+    ctor public MutableIntervalList();
+    method public void addInterval(int size, T? value);
+    method public void forEach(int fromIndex, int toIndex, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.layout.IntervalList.Interval<? extends T>,kotlin.Unit> block);
+    method public androidx.compose.foundation.lazy.layout.IntervalList.Interval<T> get(int index);
+    method public int getSize();
+    property public int size;
+  }
+
+}
+
+package androidx.compose.foundation.lazy.staggeredgrid {
+
+  public final class LazyStaggeredGridDslKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyHorizontalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, optional kotlin.jvm.functions.Function1<? super T,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void items(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, optional kotlin.jvm.functions.Function1<? super T,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLane();
+    method public long getOffset();
+    method public long getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int lane;
+    property public abstract long offset;
+    property public abstract long size;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridItemScope {
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    method public int getMainAxisItemSpacing();
+    method public androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> getVisibleItemsInfo();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
+    property public abstract int mainAxisItemSpacing;
+    property public abstract androidx.compose.foundation.gestures.Orientation orientation;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridScope {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void item(optional Object? key, optional Object? contentType, optional androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan? span, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyStaggeredGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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.staggeredgrid.LazyStaggeredGridLayoutInfo 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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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.staggeredgrid.LazyStaggeredGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState.Companion Companion;
+  }
+
+  public static final class LazyStaggeredGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState,java.lang.Object> Saver;
+  }
+
+  public final class LazyStaggeredGridStateKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState rememberLazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface StaggeredGridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Adaptive implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class StaggeredGridCells.Fixed implements androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells {
+    ctor public StaggeredGridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class StaggeredGridItemSpan {
+    field public static final androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan.Companion Companion;
+  }
+
+  public static final class StaggeredGridItemSpan.Companion {
+    method public androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan getFullLine();
+    method public androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan getSingleLane();
+    property public final androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan FullLine;
+    property public final androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan SingleLane;
+  }
+
+}
+
+package androidx.compose.foundation.pager {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface PageSize {
+    method public int calculateMainAxisPageSize(androidx.compose.ui.unit.Density, int availableSpace, int pageSpacing);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class PageSize.Fill implements androidx.compose.foundation.pager.PageSize {
+    method public int calculateMainAxisPageSize(androidx.compose.ui.unit.Density, int availableSpace, int pageSpacing);
+    field public static final androidx.compose.foundation.pager.PageSize.Fill INSTANCE;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class PageSize.Fixed implements androidx.compose.foundation.pager.PageSize {
+    ctor public PageSize.Fixed(float pageSize);
+    method public int calculateMainAxisPageSize(androidx.compose.ui.unit.Density, int availableSpace, int pageSpacing);
+    method public float getPageSize();
+    property public final float pageSize;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public final class PagerDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.snapping.SnapFlingBehavior flingBehavior(androidx.compose.foundation.pager.PagerState state, optional androidx.compose.foundation.pager.PagerSnapDistance pagerSnapDistance, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> lowVelocityAnimationSpec, optional androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> highVelocityAnimationSpec, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> snapAnimationSpec);
+    method public androidx.compose.ui.input.nestedscroll.NestedScrollConnection pageNestedScrollConnection(androidx.compose.foundation.gestures.Orientation orientation);
+    field public static final androidx.compose.foundation.pager.PagerDefaults INSTANCE;
+  }
+
+  public final class PagerKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void HorizontalPager(int pageCount, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.pager.PagerState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.pager.PageSize pageSize, optional int beyondBoundsPageCount, optional float pageSpacing, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.snapping.SnapFlingBehavior flingBehavior, optional boolean userScrollEnabled, optional boolean reverseLayout, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional androidx.compose.ui.input.nestedscroll.NestedScrollConnection pageNestedScrollConnection, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> pageContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void VerticalPager(int pageCount, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.pager.PagerState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.pager.PageSize pageSize, optional int beyondBoundsPageCount, optional float pageSpacing, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.snapping.SnapFlingBehavior flingBehavior, optional boolean userScrollEnabled, optional boolean reverseLayout, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional androidx.compose.ui.input.nestedscroll.NestedScrollConnection pageNestedScrollConnection, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> pageContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public interface PagerSnapDistance {
+    method public int calculateTargetPage(int startPage, int suggestedTargetPage, float velocity, int pageSize, int pageSpacing);
+    field public static final androidx.compose.foundation.pager.PagerSnapDistance.Companion Companion;
+  }
+
+  public static final class PagerSnapDistance.Companion {
+    method public androidx.compose.foundation.pager.PagerSnapDistance atMost(int pages);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class PagerState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public PagerState(optional int initialPage, optional float initialPageOffsetFraction);
+    method public suspend Object? animateScrollToPage(int page, optional float pageOffsetFraction, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public float dispatchRawDelta(float delta);
+    method public int getCurrentPage();
+    method public float getCurrentPageOffsetFraction();
+    method public int getInitialPage();
+    method public float getInitialPageOffsetFraction();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public int getSettledPage();
+    method public int getTargetPage();
+    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>);
+    method public suspend Object? scrollToPage(int page, optional float pageOffsetFraction, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    property public final int currentPage;
+    property public final float currentPageOffsetFraction;
+    property public final int initialPage;
+    property public final float initialPageOffsetFraction;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final int settledPage;
+    property public final int targetPage;
+    field public static final androidx.compose.foundation.pager.PagerState.Companion Companion;
+  }
+
+  public static final class PagerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.pager.PagerState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.pager.PagerState,?> Saver;
+  }
+
+  public final class PagerStateKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.foundation.pager.PagerState rememberPagerState(optional int initialPage, optional float initialPageOffsetFraction);
+  }
+
+}
+
+package androidx.compose.foundation.relocation {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface BringIntoViewRequester {
+    method public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class BringIntoViewRequesterKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.relocation.BringIntoViewRequester BringIntoViewRequester();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier bringIntoViewRequester(androidx.compose.ui.Modifier, androidx.compose.foundation.relocation.BringIntoViewRequester bringIntoViewRequester);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface BringIntoViewResponder {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public suspend Object? bringChildIntoView(kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Rect> localRect, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public androidx.compose.ui.geometry.Rect calculateRectForParent(androidx.compose.ui.geometry.Rect localRect);
+  }
+
+  public final class BringIntoViewResponderKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier bringIntoViewResponder(androidx.compose.ui.Modifier, androidx.compose.foundation.relocation.BringIntoViewResponder responder);
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class 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 int minLines, 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 int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+    method @Deprecated @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,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onHover, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  @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.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InternalFoundationTextApi {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  @androidx.compose.runtime.Stable public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index d74aeec..9918bcc 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.foundation {
 
-  public final class ActualJvmKt {
-  }
-
-  public final class AndroidOverscrollKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
@@ -60,9 +54,6 @@
     method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
-  public final class Clickable_androidKt {
-  }
-
   public final class ClipScrollableContainerKt {
     method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
   }
@@ -71,9 +62,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
 
-  public final class DarkTheme_androidKt {
-  }
-
   public final class ExcludeFromSystemGesture_androidKt {
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
@@ -237,19 +225,10 @@
     method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
   }
 
-  public final class TempListUtilsKt {
-  }
-
 }
 
 package androidx.compose.foundation.gestures {
 
-  public final class AndroidScrollable_androidKt {
-  }
-
-  public final class ContentInViewModifierKt {
-  }
-
   public final class DragGestureDetectorKt {
     method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
     method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
@@ -518,18 +497,8 @@
 
 }
 
-package androidx.compose.foundation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.foundation.lazy {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @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,? extends kotlin.Unit> content);
@@ -552,9 +521,6 @@
     method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
   public interface LazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
@@ -566,15 +532,6 @@
     property public abstract int size;
   }
 
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
     method public default int getAfterContentPadding();
     method public default int getBeforeContentPadding();
@@ -598,9 +555,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyListMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
     method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
@@ -642,9 +596,6 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
-  public final class LazySemanticsKt {
-  }
-
 }
 
 package androidx.compose.foundation.lazy.grid {
@@ -700,12 +651,6 @@
     field public static final int UnknownRow = -1; // 0xffffffff
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
     method @androidx.compose.foundation.ExperimentalFoundationApi public androidx.compose.ui.Modifier animateItemPlacement(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
   }
@@ -717,9 +662,6 @@
     property public abstract int maxLineSpan;
   }
 
-  public final class LazyGridKt {
-  }
-
   public sealed interface LazyGridLayoutInfo {
     method public int getAfterContentPadding();
     method public int getBeforeContentPadding();
@@ -743,9 +685,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyGridMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
     method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
     method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
@@ -788,9 +727,6 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
 }
 
 package androidx.compose.foundation.lazy.layout {
@@ -811,12 +747,6 @@
     property public final T! value;
   }
 
-  public final class IntervalListKt {
-  }
-
-  public final class LazyAnimateScrollKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyLayoutIntervalContent {
     method public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object>? getKey();
     method public default kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Object> getType();
@@ -857,7 +787,7 @@
   }
 
   public final class LazyLayoutPinnableItemKt {
-    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyLayoutPinnableItem(int index, androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList pinnedItemList, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyLayoutPinnableItem(Object? key, int index, androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList pinnedItemList, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyLayoutPinnedItemList implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList.PinnedItem> {
@@ -866,7 +796,9 @@
 
   @androidx.compose.foundation.ExperimentalFoundationApi public static sealed interface LazyLayoutPinnedItemList.PinnedItem {
     method public int getIndex();
+    method public Object? getKey();
     property public abstract int index;
+    property public abstract Object? key;
   }
 
   @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class LazyLayoutPrefetchState {
@@ -878,19 +810,10 @@
     method public void cancel();
   }
 
-  public final class LazyLayoutPrefetcher_androidKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
   public final class LazyNearestItemsRangeKt {
     method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<kotlin.ranges.IntRange> rememberLazyNearestItemsRangeState(kotlin.jvm.functions.Function0<java.lang.Integer> firstVisibleItemIndex, kotlin.jvm.functions.Function0<java.lang.Integer> slidingWindowSize, kotlin.jvm.functions.Function0<java.lang.Integer> extraItemCount);
   }
 
-  public final class LazySaveableStateHolderKt {
-  }
-
   public final class Lazy_androidKt {
     method @androidx.compose.foundation.ExperimentalFoundationApi public static Object getDefaultLazyLayoutKey(int index);
   }
@@ -908,9 +831,6 @@
 
 package androidx.compose.foundation.lazy.staggeredgrid {
 
-  public final class LazyStaggeredGridCellsKt {
-  }
-
   public final class LazyStaggeredGridDslKt {
     method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyHorizontalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
     method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalStaggeredGrid(androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope,kotlin.Unit> content);
@@ -933,15 +853,9 @@
     property public abstract long size;
   }
 
-  public final class LazyStaggeredGridItemProviderKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridItemScope {
   }
 
-  public final class LazyStaggeredGridKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridLayoutInfo {
     method public int getAfterContentPadding();
     method public int getBeforeContentPadding();
@@ -963,23 +877,11 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyStaggeredGridMeasureKt {
-  }
-
-  public final class LazyStaggeredGridMeasurePolicyKt {
-  }
-
-  public final class LazyStaggeredGridMeasureResultKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface LazyStaggeredGridScope {
     method @androidx.compose.foundation.ExperimentalFoundationApi public void item(optional Object? key, optional Object? contentType, optional androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan? span, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,kotlin.Unit> content);
     method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan>? span, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
   }
 
-  public final class LazyStaggeredGridSemanticsKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public final class LazyStaggeredGridState implements androidx.compose.foundation.gestures.ScrollableState {
     ctor public LazyStaggeredGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemOffset);
     method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
@@ -1115,9 +1017,6 @@
 
 package androidx.compose.foundation.relocation {
 
-  public final class BringIntoViewKt {
-  }
-
   @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface BringIntoViewRequester {
     method public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
   }
@@ -1136,9 +1035,6 @@
     method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier bringIntoViewResponder(androidx.compose.ui.Modifier, androidx.compose.foundation.relocation.BringIntoViewResponder responder);
   }
 
-  public final class BringIntoViewResponder_androidKt {
-  }
-
 }
 
 package androidx.compose.foundation.selection {
@@ -1266,9 +1162,6 @@
 
 package androidx.compose.foundation.text {
 
-  public final class AndroidCursorHandle_androidKt {
-  }
-
   public final class BasicTextFieldKt {
     method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, 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 int minLines, 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);
@@ -1288,18 +1181,6 @@
     method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onHover, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContextMenu_androidKt {
-  }
-
-  public final class CoreTextFieldKt {
-  }
-
-  public final class CoreTextKt {
-  }
-
-  public final class HeightInLinesModifierKt {
-  }
-
   @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();
@@ -1315,15 +1196,6 @@
   @kotlin.RequiresOptIn(message="Internal/Unstable API for use only between foundation modules sharing " + "the same exact version, subject to change without notice.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InternalFoundationTextApi {
   }
 
-  public final class KeyEventHelpers_androidKt {
-  }
-
-  public final class KeyMappingKt {
-  }
-
-  public final class KeyMapping_androidKt {
-  }
-
   public interface KeyboardActionScope {
     method public void defaultKeyboardAction(int imeAction);
   }
@@ -1373,117 +1245,15 @@
     property public final androidx.compose.foundation.text.KeyboardOptions Default;
   }
 
-  public final class LongPressTextDragObserverKt {
-  }
-
-  public final class PointerMoveDetectorKt {
-  }
-
-  public final class StringHelpersKt {
-  }
-
-  public final class StringHelpers_androidKt {
-  }
-
-  public final class StringHelpers_jvmKt {
-  }
-
-  public final class TextDelegateKt {
-  }
-
-  public final class TextFieldCursorKt {
-  }
-
-  public final class TextFieldDelegateKt {
-  }
-
-  public final class TextFieldFocusModifier_androidKt {
-  }
-
-  public final class TextFieldGestureModifiersKt {
-  }
-
-  public final class TextFieldKeyInputKt {
-  }
-
-  public final class TextFieldKeyInput_androidKt {
-  }
-
-  public final class TextFieldPressGestureFilterKt {
-  }
-
-  public final class TextFieldScrollKt {
-  }
-
-  public final class TextFieldSizeKt {
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutResultProxyKt {
-  }
-
-  public final class TextPointerIcon_androidKt {
-  }
-
-  public final class TouchMode_androidKt {
-  }
-
-  public final class UndoManagerKt {
-  }
-
-  public final class UndoManager_jvmKt {
-  }
-
-  public final class ValidatingOffsetMappingKt {
-  }
-
 }
 
 package androidx.compose.foundation.text.selection {
 
-  public final class AndroidSelectionHandles_androidKt {
-  }
-
-  public final class MultiWidgetSelectionDelegateKt {
-  }
-
-  public final class SelectionAdjustmentKt {
-  }
-
   public final class SelectionContainerKt {
     method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionMagnifierKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  public final class SelectionManager_androidKt {
-  }
-
-  public final class SelectionRegistrarKt {
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  public final class TextFieldSelectionDelegateKt {
-  }
-
-  public final class TextFieldSelectionManagerKt {
-  }
-
-  public final class TextFieldSelectionManager_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class TextSelectionColors {
     ctor public TextSelectionColors(long handleColor, long backgroundColor);
     method public long getBackgroundColor();
@@ -1497,11 +1267,5 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
-  public final class TextSelectionMouseDetectorKt {
-  }
-
 }
 
diff --git a/compose/foundation/foundation/api/res-1.4.0-beta01.txt b/compose/foundation/foundation/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation/api/res-1.4.0-beta01.txt
diff --git a/compose/foundation/foundation/api/restricted_1.4.0-beta01.txt b/compose/foundation/foundation/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..b8a93c56
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,837 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class CheckScrollableContainerConstraintsKt {
+    method public static void checkScrollableContainerConstraints(long constraints, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  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 ClipScrollableContainerKt {
+    method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class ExcludeFromSystemGesture_androidKt {
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+  public final class FocusableKt {
+    method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  public enum MutatePriority {
+    method public static androidx.compose.foundation.MutatePriority valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.MutatePriority[] values();
+    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>);
+    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>);
+  }
+
+  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>);
+    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>);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 SystemGestureExclusionKt {
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitLongPressOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    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>);
+    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>);
+    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>);
+    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>);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+  }
+
+  @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>);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? awaitEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @Deprecated 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>);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    method public static androidx.compose.foundation.gestures.Orientation valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.foundation.gestures.Orientation[] values();
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean>);
+  }
+
+  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>);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float>);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  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();
+    method public boolean reverseDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.foundation.gestures.Orientation orientation, boolean reverseScrolling);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public default boolean getCanScrollBackward();
+    method public default boolean getCanScrollForward();
+    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>);
+    property public default boolean canScrollBackward;
+    property public default boolean canScrollForward;
+    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 androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed);
+    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>);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
+    method @Deprecated public static suspend androidx.compose.ui.input.pointer.PointerInputChange? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope);
+  }
+
+  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>);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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>);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  public final class 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @Deprecated @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,? extends 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, 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, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, 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, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility 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 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
+    method public default int getAfterContentPadding();
+    method public default int getBeforeContentPadding();
+    method public default int getMainAxisItemSpacing();
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public default long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default int afterContentPadding;
+    property public default int beforeContentPadding;
+    property public default int mainAxisItemSpacing;
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public default long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated 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,? extends kotlin.Unit> itemContent);
+  }
+
+  @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>);
+    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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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 {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.grid {
+
+  @androidx.compose.runtime.Stable public interface GridCells {
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Adaptive implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Adaptive(float minSize);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  public static final class GridCells.Fixed implements androidx.compose.foundation.lazy.grid.GridCells {
+    ctor public GridCells.Fixed(int count);
+    method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class GridItemSpan {
+    method public int getCurrentLineSpan();
+  }
+
+  public final class LazyGridDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyHorizontalGrid(androidx.compose.foundation.lazy.grid.GridCells rows, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.grid.GridCells columns, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.grid.LazyGridState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.grid.LazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public sealed interface LazyGridItemInfo {
+    method public int getColumn();
+    method public int getIndex();
+    method public Object getKey();
+    method public long getOffset();
+    method public int getRow();
+    method public long getSize();
+    property public abstract int column;
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract long offset;
+    property public abstract int row;
+    property public abstract long size;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridItemInfo.Companion Companion;
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  public static final class LazyGridItemInfo.Companion {
+    field public static final int UnknownColumn = -1; // 0xffffffff
+    field public static final int UnknownRow = -1; // 0xffffffff
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridItemSpanScope {
+    method public int getMaxCurrentLineSpan();
+    method public int getMaxLineSpan();
+    property public abstract int maxCurrentLineSpan;
+    property public abstract int maxLineSpan;
+  }
+
+  public sealed interface LazyGridLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
+    method public int getMainAxisItemSpacing();
+    method public androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public boolean getReverseLayout();
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public long getViewportSize();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> getVisibleItemsInfo();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
+    property public abstract int mainAxisItemSpacing;
+    property public abstract androidx.compose.foundation.gestures.Orientation orientation;
+    property public abstract boolean reverseLayout;
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract long viewportSize;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
+  }
+
+  @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
+    method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @kotlin.DslMarker public @interface LazyGridScopeMarker {
+  }
+
+  public final class LazyGridSpanKt {
+    method public static long GridItemSpan(int currentLineSpan);
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyGridState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyGridState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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.grid.LazyGridLayoutInfo 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>);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public boolean canScrollBackward;
+    property public boolean canScrollForward;
+    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.grid.LazyGridLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.grid.LazyGridState.Companion Companion;
+  }
+
+  public static final class LazyGridState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.grid.LazyGridState,?> Saver;
+  }
+
+  public final class LazyGridStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class 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 int minLines, 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 int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+    method @Deprecated @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,? extends 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,? extends 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<? extends kotlin.Unit>,? extends kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @Deprecated @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,? extends kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  @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 interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  @androidx.compose.runtime.Stable public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  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);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/restricted_current.ignore b/compose/foundation/foundation/api/restricted_current.ignore
index d1a4e31..529b30a 100644
--- a/compose/foundation/foundation/api/restricted_current.ignore
+++ b/compose/foundation/foundation/api/restricted_current.ignore
@@ -3,15 +3,151 @@
     Added method androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo.getMainAxisItemSpacing()
 
 
+RemovedClass: androidx.compose.foundation.ActualJvmKt:
+    Removed class androidx.compose.foundation.ActualJvmKt
+RemovedClass: androidx.compose.foundation.AndroidOverscrollKt:
+    Removed class androidx.compose.foundation.AndroidOverscrollKt
+RemovedClass: androidx.compose.foundation.Clickable_androidKt:
+    Removed class androidx.compose.foundation.Clickable_androidKt
+RemovedClass: androidx.compose.foundation.DarkTheme_androidKt:
+    Removed class androidx.compose.foundation.DarkTheme_androidKt
+RemovedClass: androidx.compose.foundation.FocusedBoundsKt:
+    Removed class androidx.compose.foundation.FocusedBoundsKt
+RemovedClass: androidx.compose.foundation.MagnifierKt:
+    Removed class androidx.compose.foundation.MagnifierKt
+RemovedClass: androidx.compose.foundation.OverscrollConfigurationKt:
+    Removed class androidx.compose.foundation.OverscrollConfigurationKt
+RemovedClass: androidx.compose.foundation.OverscrollKt:
+    Removed class androidx.compose.foundation.OverscrollKt
+RemovedClass: androidx.compose.foundation.TempListUtilsKt:
+    Removed class androidx.compose.foundation.TempListUtilsKt
+RemovedClass: androidx.compose.foundation.gestures.AndroidScrollable_androidKt:
+    Removed class androidx.compose.foundation.gestures.AndroidScrollable_androidKt
+RemovedClass: androidx.compose.foundation.lazy.LazyBeyondBoundsModifierKt:
+    Removed class androidx.compose.foundation.lazy.LazyBeyondBoundsModifierKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListHeadersKt:
+    Removed class androidx.compose.foundation.lazy.LazyListHeadersKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListItemPlacementAnimatorKt:
+    Removed class androidx.compose.foundation.lazy.LazyListItemPlacementAnimatorKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListItemProviderKt:
+    Removed class androidx.compose.foundation.lazy.LazyListItemProviderKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListKt:
+    Removed class androidx.compose.foundation.lazy.LazyListKt
+RemovedClass: androidx.compose.foundation.lazy.LazyListMeasureKt:
+    Removed class androidx.compose.foundation.lazy.LazyListMeasureKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListPinningModifierKt:
     Removed class androidx.compose.foundation.lazy.LazyListPinningModifierKt
-RemovedClass: androidx.compose.foundation.lazy.layout.PinnableParentKt:
-    Removed class androidx.compose.foundation.lazy.layout.PinnableParentKt
+RemovedClass: androidx.compose.foundation.lazy.LazySemanticsKt:
+    Removed class androidx.compose.foundation.lazy.LazySemanticsKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridItemPlacementAnimatorKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridItemPlacementAnimatorKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridItemProviderKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridItemProviderKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazyGridMeasureKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazyGridMeasureKt
+RemovedClass: androidx.compose.foundation.lazy.grid.LazySemanticsKt:
+    Removed class androidx.compose.foundation.lazy.grid.LazySemanticsKt
+RemovedClass: androidx.compose.foundation.text.AndroidCursorHandle_androidKt:
+    Removed class androidx.compose.foundation.text.AndroidCursorHandle_androidKt
+RemovedClass: androidx.compose.foundation.text.ContextMenu_androidKt:
+    Removed class androidx.compose.foundation.text.ContextMenu_androidKt
+RemovedClass: androidx.compose.foundation.text.CoreTextFieldKt:
+    Removed class androidx.compose.foundation.text.CoreTextFieldKt
+RemovedClass: androidx.compose.foundation.text.CoreTextKt:
+    Removed class androidx.compose.foundation.text.CoreTextKt
+RemovedClass: androidx.compose.foundation.text.KeyEventHelpers_androidKt:
+    Removed class androidx.compose.foundation.text.KeyEventHelpers_androidKt
+RemovedClass: androidx.compose.foundation.text.KeyMappingKt:
+    Removed class androidx.compose.foundation.text.KeyMappingKt
+RemovedClass: androidx.compose.foundation.text.KeyMapping_androidKt:
+    Removed class androidx.compose.foundation.text.KeyMapping_androidKt
+RemovedClass: androidx.compose.foundation.text.LongPressTextDragObserverKt:
+    Removed class androidx.compose.foundation.text.LongPressTextDragObserverKt
 RemovedClass: androidx.compose.foundation.text.MaxLinesHeightModifierKt:
     Removed class androidx.compose.foundation.text.MaxLinesHeightModifierKt
+RemovedClass: androidx.compose.foundation.text.StringHelpersKt:
+    Removed class androidx.compose.foundation.text.StringHelpersKt
+RemovedClass: androidx.compose.foundation.text.StringHelpers_androidKt:
+    Removed class androidx.compose.foundation.text.StringHelpers_androidKt
+RemovedClass: androidx.compose.foundation.text.StringHelpers_jvmKt:
+    Removed class androidx.compose.foundation.text.StringHelpers_jvmKt
+RemovedClass: androidx.compose.foundation.text.TextDelegateKt:
+    Removed class androidx.compose.foundation.text.TextDelegateKt
+RemovedClass: androidx.compose.foundation.text.TextFieldCursorKt:
+    Removed class androidx.compose.foundation.text.TextFieldCursorKt
+RemovedClass: androidx.compose.foundation.text.TextFieldDelegateKt:
+    Removed class androidx.compose.foundation.text.TextFieldDelegateKt
+RemovedClass: androidx.compose.foundation.text.TextFieldGestureModifiersKt:
+    Removed class androidx.compose.foundation.text.TextFieldGestureModifiersKt
+RemovedClass: androidx.compose.foundation.text.TextFieldKeyInputKt:
+    Removed class androidx.compose.foundation.text.TextFieldKeyInputKt
+RemovedClass: androidx.compose.foundation.text.TextFieldKeyInput_androidKt:
+    Removed class androidx.compose.foundation.text.TextFieldKeyInput_androidKt
+RemovedClass: androidx.compose.foundation.text.TextFieldPressGestureFilterKt:
+    Removed class androidx.compose.foundation.text.TextFieldPressGestureFilterKt
+RemovedClass: androidx.compose.foundation.text.TextFieldScrollKt:
+    Removed class androidx.compose.foundation.text.TextFieldScrollKt
+RemovedClass: androidx.compose.foundation.text.TextFieldSizeKt:
+    Removed class androidx.compose.foundation.text.TextFieldSizeKt
+RemovedClass: androidx.compose.foundation.text.TextLayoutHelperKt:
+    Removed class androidx.compose.foundation.text.TextLayoutHelperKt
+RemovedClass: androidx.compose.foundation.text.TextLayoutResultProxyKt:
+    Removed class androidx.compose.foundation.text.TextLayoutResultProxyKt
+RemovedClass: androidx.compose.foundation.text.TextPointerIcon_androidKt:
+    Removed class androidx.compose.foundation.text.TextPointerIcon_androidKt
+RemovedClass: androidx.compose.foundation.text.TouchMode_androidKt:
+    Removed class androidx.compose.foundation.text.TouchMode_androidKt
+RemovedClass: androidx.compose.foundation.text.UndoManagerKt:
+    Removed class androidx.compose.foundation.text.UndoManagerKt
+RemovedClass: androidx.compose.foundation.text.UndoManager_jvmKt:
+    Removed class androidx.compose.foundation.text.UndoManager_jvmKt
+RemovedClass: androidx.compose.foundation.text.ValidatingOffsetMappingKt:
+    Removed class androidx.compose.foundation.text.ValidatingOffsetMappingKt
+RemovedClass: androidx.compose.foundation.text.selection.AndroidSelectionHandles_androidKt:
+    Removed class androidx.compose.foundation.text.selection.AndroidSelectionHandles_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.MultiWidgetSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.MultiWidgetSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionAdjustmentKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionAdjustmentKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionHandlesKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionHandlesKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionMagnifierKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionMagnifierKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionManagerKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionManagerKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionManager_androidKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionManager_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.SelectionRegistrarKt:
+    Removed class androidx.compose.foundation.text.selection.SelectionRegistrarKt
+RemovedClass: androidx.compose.foundation.text.selection.SimpleLayoutKt:
+    Removed class androidx.compose.foundation.text.selection.SimpleLayoutKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionManagerKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionManagerKt
+RemovedClass: androidx.compose.foundation.text.selection.TextFieldSelectionManager_androidKt:
+    Removed class androidx.compose.foundation.text.selection.TextFieldSelectionManager_androidKt
+RemovedClass: androidx.compose.foundation.text.selection.TextSelectionDelegateKt:
+    Removed class androidx.compose.foundation.text.selection.TextSelectionDelegateKt
+RemovedClass: androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt:
+    Removed class androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt
 
 
 RemovedMethod: androidx.compose.foundation.gestures.TapGestureDetectorKt#awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, boolean, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>):
     Removed method androidx.compose.foundation.gestures.TapGestureDetectorKt.awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope,boolean,kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>)
 RemovedMethod: androidx.compose.foundation.gestures.TapGestureDetectorKt#waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>):
     Removed method androidx.compose.foundation.gestures.TapGestureDetectorKt.waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope,kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>)
+
+
+RemovedPackage: androidx.compose.foundation.gestures.snapping:
+    Removed package androidx.compose.foundation.gestures.snapping
+RemovedPackage: androidx.compose.foundation.internal:
+    Removed package androidx.compose.foundation.internal
+RemovedPackage: androidx.compose.foundation.lazy.layout:
+    Removed package androidx.compose.foundation.lazy.layout
+RemovedPackage: androidx.compose.foundation.lazy.staggeredgrid:
+    Removed package androidx.compose.foundation.lazy.staggeredgrid
+RemovedPackage: androidx.compose.foundation.relocation:
+    Removed package androidx.compose.foundation.relocation
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 1c8281c..b8a93c56 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -1,20 +1,11 @@
 // Signature format: 4.0
 package androidx.compose.foundation {
 
-  public final class ActualJvmKt {
-  }
-
-  public final class AndroidOverscrollKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
   }
 
-  public final class BasicMarqueeKt {
-  }
-
   public final class BorderKt {
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
     method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
@@ -47,9 +38,6 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
-  public final class Clickable_androidKt {
-  }
-
   public final class ClipScrollableContainerKt {
     method public static androidx.compose.ui.Modifier clipScrollableContainer(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.Orientation orientation);
   }
@@ -58,9 +46,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
 
-  public final class DarkTheme_androidKt {
-  }
-
   public final class ExcludeFromSystemGesture_androidKt {
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier);
     method @Deprecated public static androidx.compose.ui.Modifier excludeFromSystemGesture(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
@@ -70,9 +55,6 @@
     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 FocusedBoundsKt {
-  }
-
   public final class HoverableKt {
     method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
   }
@@ -98,9 +80,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
   }
 
-  public final class MagnifierKt {
-  }
-
   public enum MutatePriority {
     method public static androidx.compose.foundation.MutatePriority valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.foundation.MutatePriority[] values();
@@ -115,12 +94,6 @@
     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>);
   }
 
-  public final class OverscrollConfigurationKt {
-  }
-
-  public final class OverscrollKt {
-  }
-
   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);
@@ -161,19 +134,10 @@
     method public static androidx.compose.ui.Modifier systemGestureExclusion(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> exclusion);
   }
 
-  public final class TempListUtilsKt {
-  }
-
 }
 
 package androidx.compose.foundation.gestures {
 
-  public final class AndroidScrollable_androidKt {
-  }
-
-  public final class ContentInViewModifierKt {
-  }
-
   public final class DragGestureDetectorKt {
     method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
     method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange>);
@@ -312,16 +276,6 @@
 
 }
 
-package androidx.compose.foundation.gestures.snapping {
-
-  public final class LazyListSnapLayoutInfoProviderKt {
-  }
-
-  public final class SnapFlingBehaviorKt {
-  }
-
-}
-
 package androidx.compose.foundation.interaction {
 
   public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
@@ -425,18 +379,8 @@
 
 }
 
-package androidx.compose.foundation.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.foundation.lazy {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   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, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @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,? extends kotlin.Unit> content);
@@ -458,9 +402,6 @@
     method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
   public interface LazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
@@ -472,15 +413,6 @@
     property public abstract int size;
   }
 
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListLayoutInfo {
     method public default int getAfterContentPadding();
     method public default int getBeforeContentPadding();
@@ -504,9 +436,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyListMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.LazyScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface LazyListScope {
     method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
@@ -547,9 +476,6 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
-  public final class LazySemanticsKt {
-  }
-
 }
 
 package androidx.compose.foundation.lazy.grid {
@@ -604,12 +530,6 @@
     field public static final int UnknownRow = -1; // 0xffffffff
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker @androidx.compose.runtime.Stable public sealed interface LazyGridItemScope {
   }
 
@@ -620,9 +540,6 @@
     property public abstract int maxLineSpan;
   }
 
-  public final class LazyGridKt {
-  }
-
   public sealed interface LazyGridLayoutInfo {
     method public int getAfterContentPadding();
     method public int getBeforeContentPadding();
@@ -646,9 +563,6 @@
     property public abstract java.util.List<androidx.compose.foundation.lazy.grid.LazyGridItemInfo> visibleItemsInfo;
   }
 
-  public final class LazyGridMeasureKt {
-  }
-
   @androidx.compose.foundation.lazy.grid.LazyGridScopeMarker public sealed interface LazyGridScope {
     method public void item(optional Object? key, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,kotlin.Unit> content);
     method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemSpanScope,? super java.lang.Integer,androidx.compose.foundation.lazy.grid.GridItemSpan>? span, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.grid.LazyGridItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
@@ -691,100 +605,6 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.grid.LazyGridState rememberLazyGridState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
-}
-
-package androidx.compose.foundation.lazy.layout {
-
-  public final class IntervalListKt {
-  }
-
-  public final class LazyAnimateScrollKt {
-  }
-
-  public final class LazyLayoutItemProviderKt {
-  }
-
-  public final class LazyLayoutKt {
-  }
-
-  public final class LazyLayoutPinnableItemKt {
-  }
-
-  public final class LazyLayoutPrefetcher_androidKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
-  public final class LazyNearestItemsRangeKt {
-  }
-
-  public final class LazySaveableStateHolderKt {
-  }
-
-  public final class Lazy_androidKt {
-  }
-
-}
-
-package androidx.compose.foundation.lazy.staggeredgrid {
-
-  public final class LazyStaggeredGridCellsKt {
-  }
-
-  public final class LazyStaggeredGridDslKt {
-  }
-
-  public final class LazyStaggeredGridItemProviderKt {
-  }
-
-  public final class LazyStaggeredGridKt {
-  }
-
-  public final class LazyStaggeredGridMeasureKt {
-  }
-
-  public final class LazyStaggeredGridMeasurePolicyKt {
-  }
-
-  public final class LazyStaggeredGridMeasureResultKt {
-  }
-
-  public final class LazyStaggeredGridSemanticsKt {
-  }
-
-  public final class LazyStaggeredGridStateKt {
-  }
-
-}
-
-package androidx.compose.foundation.pager {
-
-  public final class PagerKt {
-  }
-
-  public final class PagerStateKt {
-  }
-
-}
-
-package androidx.compose.foundation.relocation {
-
-  public final class BringIntoViewKt {
-  }
-
-  public final class BringIntoViewRequesterKt {
-  }
-
-  public final class BringIntoViewResponderKt {
-  }
-
-  public final class BringIntoViewResponder_androidKt {
-  }
-
 }
 
 package androidx.compose.foundation.selection {
@@ -912,9 +732,6 @@
 
 package androidx.compose.foundation.text {
 
-  public final class AndroidCursorHandle_androidKt {
-  }
-
   public final class BasicTextFieldKt {
     method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, 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 int minLines, 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);
@@ -933,18 +750,6 @@
     method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
   }
 
-  public final class ContextMenu_androidKt {
-  }
-
-  public final class CoreTextFieldKt {
-  }
-
-  public final class CoreTextKt {
-  }
-
-  public final class HeightInLinesModifierKt {
-  }
-
   @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();
@@ -957,15 +762,6 @@
     method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
   }
 
-  public final class KeyEventHelpers_androidKt {
-  }
-
-  public final class KeyMappingKt {
-  }
-
-  public final class KeyMapping_androidKt {
-  }
-
   public interface KeyboardActionScope {
     method public void defaultKeyboardAction(int imeAction);
   }
@@ -1015,117 +811,15 @@
     property public final androidx.compose.foundation.text.KeyboardOptions Default;
   }
 
-  public final class LongPressTextDragObserverKt {
-  }
-
-  public final class PointerMoveDetectorKt {
-  }
-
-  public final class StringHelpersKt {
-  }
-
-  public final class StringHelpers_androidKt {
-  }
-
-  public final class StringHelpers_jvmKt {
-  }
-
-  public final class TextDelegateKt {
-  }
-
-  public final class TextFieldCursorKt {
-  }
-
-  public final class TextFieldDelegateKt {
-  }
-
-  public final class TextFieldFocusModifier_androidKt {
-  }
-
-  public final class TextFieldGestureModifiersKt {
-  }
-
-  public final class TextFieldKeyInputKt {
-  }
-
-  public final class TextFieldKeyInput_androidKt {
-  }
-
-  public final class TextFieldPressGestureFilterKt {
-  }
-
-  public final class TextFieldScrollKt {
-  }
-
-  public final class TextFieldSizeKt {
-  }
-
-  public final class TextLayoutHelperKt {
-  }
-
-  public final class TextLayoutResultProxyKt {
-  }
-
-  public final class TextPointerIcon_androidKt {
-  }
-
-  public final class TouchMode_androidKt {
-  }
-
-  public final class UndoManagerKt {
-  }
-
-  public final class UndoManager_jvmKt {
-  }
-
-  public final class ValidatingOffsetMappingKt {
-  }
-
 }
 
 package androidx.compose.foundation.text.selection {
 
-  public final class AndroidSelectionHandles_androidKt {
-  }
-
-  public final class MultiWidgetSelectionDelegateKt {
-  }
-
-  public final class SelectionAdjustmentKt {
-  }
-
   public final class SelectionContainerKt {
     method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class SelectionHandlesKt {
-  }
-
-  public final class SelectionMagnifierKt {
-  }
-
-  public final class SelectionManagerKt {
-  }
-
-  public final class SelectionManager_androidKt {
-  }
-
-  public final class SelectionRegistrarKt {
-  }
-
-  public final class SimpleLayoutKt {
-  }
-
-  public final class TextFieldSelectionDelegateKt {
-  }
-
-  public final class TextFieldSelectionManagerKt {
-  }
-
-  public final class TextFieldSelectionManager_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class TextSelectionColors {
     ctor public TextSelectionColors(long handleColor, long backgroundColor);
     method public long getBackgroundColor();
@@ -1139,11 +833,5 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
-  public final class TextSelectionDelegateKt {
-  }
-
-  public final class TextSelectionMouseDetectorKt {
-  }
-
 }
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt
deleted file mode 100644
index bc2e652..0000000
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt
+++ /dev/null
@@ -1,96 +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.foundation.benchmark.text
-
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-import androidx.test.filters.SmallTest
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-@SmallTest
-@RunWith(Parameterized::class)
-class AnnotatedTextToggleTextBenchmark(
-    private val textLength: Int
-) {
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 512)
-    }
-
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val width = textBenchmarkRule.widthDp.dp
-    private val fontSize = textBenchmarkRule.fontSizeSp.sp
-
-    private val caseFactory = {
-        textBenchmarkRule.generator { generator ->
-            AnnotatedTextToggleTextTestCase(
-                textGenerator = generator,
-                textLength = textLength,
-                textNumber = textBenchmarkRule.repeatTimes,
-                width = width,
-                fontSize = fontSize
-            )
-        }
-    }
-
-    /**
-     * Measure the time taken to recompose the [Text] composable when text gets toggled.
-     */
-    @Test
-    fun toggleText_recompose() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to measure the [Text] composable when text gets toggled.
-     */
-    @Test
-    fun toggleText_measure() {
-        benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to layout the [Text] composable when text gets toggled.
-     */
-    @Test
-    fun toggleText_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to draw the [Text] composable when text gets toggled.
-     */
-    @Test
-    fun toggleText_draw() {
-        benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
-    }
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt
deleted file mode 100644
index cc4c5a7..0000000
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt
+++ /dev/null
@@ -1,66 +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.foundation.benchmark.text
-
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.testutils.ComposeTestCase
-import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.benchmark.RandomTextGenerator
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.TextUnit
-
-class AnnotatedTextToggleTextTestCase(
-    private val textGenerator: RandomTextGenerator,
-    private val textLength: Int,
-    private val textNumber: Int,
-    private val width: Dp,
-    private val fontSize: TextUnit
-) : ComposeTestCase, ToggleableTestCase {
-
-    private val texts = List(textNumber) {
-        mutableStateOf(AnnotatedString(textGenerator.nextParagraph(length = textLength)))
-    }
-
-    @Composable
-    override fun Content() {
-        Column(
-            modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
-                .verticalScroll(rememberScrollState())
-        ) {
-            for (text in texts) {
-                Text(text = text.value, color = Color.Black, fontSize = fontSize)
-            }
-        }
-    }
-
-    override fun toggleState() {
-        texts.forEach {
-            it.value = AnnotatedString(textGenerator.nextParagraph(length = textLength))
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt
new file mode 100644
index 0000000..71fc777
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/ParamUtils.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.benchmark.text
+
+/**
+ * On CI we only track a subset of metrics, to run a full suite for analysis set this to true.
+ */
+internal const val DoFullBenchmark = false
+
+fun <T> List<Array<T>>.filterForCi(
+    selector: List<Array<T>>.() -> Array<T> = { first() }
+): List<Array<T>> = if (DoFullBenchmark) {
+    this
+} else {
+    listOf(selector())
+}
+
+@Suppress("UNCHECKED_CAST")
+fun Array<Int>.filterForCi(
+    selector: Array<Int>.() -> Int = { min() }
+): Array<Any> = if (DoFullBenchmark) {
+    this as Array<Any>
+} else {
+    arrayOf(selector())
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt
deleted file mode 100644
index c382b96..0000000
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt
+++ /dev/null
@@ -1,165 +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.foundation.benchmark.text
-
-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.compose.testutils.benchmark.benchmarkLayoutPerf
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-/**
- * The benchmark for [Text] composable with the input being a plain annotated string.
- */
-@LargeTest
-@RunWith(Parameterized::class)
-class TextBasicAnnotatedBenchmark(
-    private val textLength: Int
-) {
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 512)
-    }
-
-    @get:Rule
-    val textBenchmarkRule = TextBenchmarkTestRule()
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val width = textBenchmarkRule.widthDp.dp
-    private val fontSize = textBenchmarkRule.fontSizeSp.sp
-
-    private val caseFactory = {
-        textBenchmarkRule.generator { textGenerator ->
-            /**
-             * Text render has a word cache in the underlying system. To get a proper metric of its
-             * performance, the cache needs to be disabled, which unfortunately is not doable via
-             * public API. Here is a workaround which generates a new string when a new test case
-             * is created.
-             */
-            val texts = List(textBenchmarkRule.repeatTimes) {
-                AnnotatedString(textGenerator.nextParagraph(textLength))
-            }
-            AnnotatedTextInColumnTestCase(
-                texts = texts,
-                width = width,
-                fontSize = fontSize
-            )
-        }
-    }
-
-    /**
-     * Measure the time taken to compose a [Text] composable from scratch with the given input.
-     * This is the time taken to call the [Text] composable function.
-     */
-    @Test
-    fun first_compose() {
-        benchmarkRule.benchmarkFirstCompose(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by the first time measure the [Text] composable with the given input.
-     * This is mainly the time used to measure all the [Measurable]s in the [Text] composable.
-     */
-    @Test
-    fun first_measure() {
-        benchmarkRule.benchmarkFirstMeasure(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by the first time layout the [Text] composable with the given input.
-     * This is mainly the time used to place [Placeable]s in [Text] composable.
-     */
-    @Test
-    fun first_layout() {
-        benchmarkRule.benchmarkFirstLayout(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by first time draw the [Text] composable with the given input.
-     */
-    @Test
-    fun first_draw() {
-        benchmarkRule.benchmarkFirstDraw(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by layout the [Text] composable after the layout constrains changed.
-     * This is mainly the time used to re-measure and re-layout the composable.
-     */
-    @Test
-    fun layout() {
-        benchmarkRule.benchmarkLayoutPerf(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by redrawing the [Text] composable.
-     */
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to recompose the [Text] composable when color gets toggled.
-     */
-    @Test
-    fun toggleColor_recompose() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to measure the [Text] composable when color gets toggled.
-     */
-    @Test
-    fun toggleColor_measure() {
-        benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to layout the [Text] composable when color gets toggled.
-     */
-    @Test
-    fun toggleColor_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to draw the [Text] composable when color gets toggled.
-     */
-    @Test
-    fun toggleColor_draw() {
-        benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
-    }
-}
\ No newline at end of file
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 111b86c..61c650e 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
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.benchmark.text
 
 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
@@ -47,7 +46,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 512)
+        fun initParameters(): Array<Any> = arrayOf(32, 512).filterForCi()
     }
 
     @get:Rule
@@ -123,14 +122,6 @@
     }
 
     /**
-     * Measure the time taken by redrawing the [Text] composable.
-     */
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
-
-    /**
      * Measure the time taken to recompose the [Text] composable when color gets toggled.
      */
     @Test
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 3123367..8d45456 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
@@ -60,7 +60,7 @@
             cartesian(
                 arrayOf(32, 512),
                 arrayOf(0, 32)
-            )
+            ).filterForCi { last() }
     }
 
     @get:Rule
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
index ed4672b..605f891 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextEllipsisBenchmark.kt
@@ -17,16 +17,9 @@
 package androidx.compose.foundation.benchmark.text
 
 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.compose.testutils.benchmark.benchmarkLayoutPerf
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasureLayout
 import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -47,7 +40,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 128, 512)
+        fun initParameters(): Array<Any> = arrayOf(32, 128, 512).filterForCi { max() }
     }
 
     @get:Rule
@@ -79,15 +72,6 @@
     }
 
     /**
-     * Measure the time taken to compose a a Text composable from scratch with the given input.
-     * This is the time taken to call the a Text composable function.
-     */
-    @Test
-    fun first_compose() {
-        benchmarkRule.benchmarkFirstCompose(caseFactory)
-    }
-
-    /**
      * Measure the time taken by the first time measure the a Text composable with the given input.
      * This is mainly the time used to measure all the Measurables in the a Text composable.
      */
@@ -106,59 +90,10 @@
     }
 
     /**
-     * Measure the time taken by first time draw the a Text composable with the given input.
+     * Measure the time taken to layout the a Text composable when alignment gets toggled.
      */
     @Test
-    fun first_draw() {
-        benchmarkRule.benchmarkFirstDraw(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by layout the a Text composable after the layout constrains changed.
-     * This is mainly the time used to re-measure and re-layout the composable.
-     */
-    @Test
-    fun layout() {
-        benchmarkRule.benchmarkLayoutPerf(caseFactory)
-    }
-
-    /**
-     * Measure the time taken by redrawing the a Text composable.
-     */
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to recompose the a Text composable when color gets toggled.
-     */
-    @Test
-    fun toggleAlignment_recompose() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to measure the a Text composable when color gets toggled.
-     */
-    @Test
-    fun toggleAlignment_measure() {
-        benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to layout the a Text composable when color gets toggled.
-     */
-    @Test
-    fun toggleAlignment_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to draw the a Text composable when color gets toggled.
-     */
-    @Test
-    fun toggleAlignment_draw() {
-        benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
+    fun toggleAlignment_measureLayout() {
+        benchmarkRule.toggleStateBenchmarkMeasureLayout(caseFactory, assertOneRecomposition = false)
     }
 }
\ 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 e64f1de..8f04fa2f9 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
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.benchmark.text
 
 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
@@ -45,7 +44,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 512)
+        fun initParameters(): Array<Any> = arrayOf(32, 512).filterForCi()
     }
 
     private val textBenchmarkRule = TextBenchmarkTestRule()
@@ -118,14 +117,6 @@
     }
 
     /**
-     * Measure the time taken by redrawing the [BasicTextField] composable.
-     */
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
-
-    /**
      * Measure the time taken to recompose the [BasicTextField] composable when text gets toggled.
      */
     @Test
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
index 519e0c4..984ae0a 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.benchmark.text
 
 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
@@ -49,7 +48,7 @@
         fun initParameters() = cartesian(
             arrayOf(32, 512),
             arrayOf(0, 32)
-        )
+        ).filterForCi { last() }
     }
 
     @get:Rule
@@ -129,12 +128,4 @@
     fun layout() {
         benchmarkRule.benchmarkLayoutPerf(caseFactory)
     }
-
-    /**
-     * Measure the time taken by re-draw a Text composable with styled text input.
-     */
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
index 918e3a1..58b7647 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextToggleTextBenchmark.kt
@@ -18,8 +18,7 @@
 
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasureLayout
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
 import androidx.compose.ui.unit.dp
@@ -38,7 +37,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0}")
-        fun initParameters(): Array<Any> = arrayOf(32, 512)
+        fun initParameters(): Array<Any> = arrayOf(32, 512).filterForCi()
     }
 
     @get:Rule
@@ -74,16 +73,8 @@
      * Measure the time taken to measure the [Text] composable when text gets toggled.
      */
     @Test
-    fun toggleText_measure() {
-        benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
-    }
-
-    /**
-     * Measure the time taken to layout the [Text] composable when text gets toggled.
-     */
-    @Test
-    fun toggleText_layout() {
-        benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
+    fun toggleText_measureLayout() {
+        benchmarkRule.toggleStateBenchmarkMeasureLayout(caseFactory, assertOneRecomposition = false)
     }
 
     /**
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt
new file mode 100644
index 0000000..a3d29f3
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/EmpiricalBench.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.benchmark.text.empirical
+
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import org.junit.Rule
+import org.junit.Test
+
+abstract class EmpiricalBench<S> where S : ToggleableTestCase, S : LayeredComposeTestCase {
+
+    @get:Rule
+    val benchmarkRule = ComposeBenchmarkRule()
+
+    abstract val caseFactory: () -> S
+
+    @Test
+    fun recomposeOnly() {
+        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+    }
+
+    @Test
+    fun recomposeMeasureLayout() {
+        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
+    }
+
+    @Test
+    fun draw() {
+        benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
+    }
+}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
index e19ae6b..9e4a39e 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallText.kt
@@ -16,19 +16,16 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -63,12 +60,9 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class IfNotEmptyParent(private val size: Int) {
+open class IfNotEmptyParent(private val size: Int) : EmpiricalBench<IfNotEmptyCallText>() {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         IfNotEmptyCallText(text)
     }
@@ -78,16 +72,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = arrayOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 /**
@@ -116,4 +100,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
index 22253bf..2de260d 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/IfNotEmptyCallTextWithSpans.kt
@@ -16,19 +16,16 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -71,12 +68,8 @@
 open class IfNotEmptyCallTextWithSpansParent(
     private val size: Int,
     private val spanCount: Int
-) {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+) : EmpiricalBench<IfNotEmptyCallTextWithSpans>() {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         IfNotEmptyCallTextWithSpans(text.annotateWithSpans(spanCount))
     }
@@ -86,16 +79,6 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters(): List<Array<Any>> = listOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 @LargeTest
@@ -122,6 +105,11 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = SocialApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -135,6 +123,11 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = ChatApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -148,4 +141,9 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = ShoppingApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierIfNotEmptyCallText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierIfNotEmptyCallText.kt
index 18424f4..153b285 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierIfNotEmptyCallText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierIfNotEmptyCallText.kt
@@ -16,20 +16,17 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.newtext.text.TextUsingModifier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -67,12 +64,11 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class ModifierIfNotEmptyParent(private val size: Int) {
+open class ModifierIfNotEmptyParent(
+    private val size: Int
+) : EmpiricalBench<ModifierIfNotEmptyCallText>() {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         ModifierIfNotEmptyCallText(text)
     }
@@ -82,16 +78,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = arrayOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 /**
@@ -120,4 +106,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierSetText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierSetText.kt
index e460323..0542cf5 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierSetText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/ModifierSetText.kt
@@ -16,20 +16,17 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.newtext.text.TextUsingModifier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -63,12 +60,10 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class ModifierSetTextParent(private val size: Int) {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+open class ModifierSetTextParent(
+    private val size: Int
+) : EmpiricalBench<ModifierSetText>() {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         ModifierSetText(text)
     }
@@ -78,16 +73,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = arrayOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 /**
@@ -116,4 +101,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
index 7a91a22..260bfdd 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/Parameters.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.filterForCi
 import androidx.compose.foundation.text.appendInlineContent
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.text.AnnotatedString
@@ -32,9 +33,9 @@
      * "Close"
      * "Click below to learn more"
      */
-    val TextLengths: Array<Any> = arrayOf(2, 16, 32, 64)
-    val SpanCounts: Array<Any> = arrayOf(4, 16)
-    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+    val TextLengths: Array<Any> = arrayOf(2, 16, 32, 64).filterForCi()
+    val SpanCounts: Array<Any> = arrayOf(4, 16).filterForCi()
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
 }
 
 object SocialApps {
@@ -42,29 +43,40 @@
      * Social apps show lots of adjacent-text like "Profile" or "userName" mixed with some longer
      * UGC.
      */
-    val TextLengths: Array<Any> = arrayOf(32)
-    val SpanCounts: Array<Any> = arrayOf(4, 8)
-    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+    val TextLengths: Array<Any> = arrayOf(32).filterForCi()
+    val SpanCounts: Array<Any> = arrayOf(4, 8).filterForCi()
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
 }
 
 object ChatApps {
     /**
      * For chat apps, strings tend to be longer due to user generated content.
      */
-    val TextLengths: Array<Any> = arrayOf(256, 512)
-    val SpanCounts: Array<Any> = arrayOf(2)
-    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+    val TextLengths: Array<Any> = arrayOf(256, 512).filterForCi()
+    val SpanCounts: Array<Any> = arrayOf(2).filterForCi()
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
 }
 
 object ShoppingApps {
     /**
      * Shopping apps are more designed focused with short, intentional, text usage
      */
-    val TextLengths: Array<Any> = arrayOf(2, 64)
-    val SpanCounts: Array<Any> = arrayOf(16)
-    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts)
+    val TextLengths: Array<Any> = arrayOf(2, 64).filterForCi()
+    val SpanCounts: Array<Any> = arrayOf(16).filterForCi()
+    val TextLengthsWithSpans: List<Array<Any>> = TextLengths.cartesian(SpanCounts).filterForCi()
 }
 
+/**
+ * Generates the string
+ *
+ * "aaaa ".repeat(size)
+ *
+ * This is intentionally designed to incur low overhead in platform layout due to hitting layout
+ * caching, isolating the runtime of Compose vs the runtime of platform layout.
+ *
+ * Note that platform layout cost is not 0 with these cacheable strings. See [StaticLayoutBaseline]
+ * to determine the cost incurred by laying out these cached strings.
+ */
 fun generateCacheableStringOf(size: Int): String {
     var workingSize = size
     val builder = StringBuilder(size)
@@ -83,6 +95,13 @@
     return builder.toString()
 }
 
+/**
+ * Append [spanCount] non-MetricsEffecting spans to [this]
+ *
+ * Return as [AnnotatedString].
+ *
+ * Note all spans are full width in this implementation.
+ */
 internal fun String.annotateWithSpans(spanCount: Int): AnnotatedString {
     return buildAnnotatedString {
         repeat(spanCount) {
@@ -96,6 +115,9 @@
 
 internal const val BenchmarkInlineContentId = "BenchmarkInlineContent.Id"
 
+/**
+ * Add inline content to a String.
+ */
 internal fun String.annotateWithInlineContent(): AnnotatedString {
     return buildAnnotatedString {
         appendInlineContent(BenchmarkInlineContentId)
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md
index 5242dc7..82398b6 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/README.md
@@ -31,12 +31,14 @@
 * SocialApps - benchmarks that are unique te social apps (e.g. more spans)
 * ShoppingApps - benchmarks that are unique to shopping apps (e.g. more spans)
 
+To run the full suite, set [DoFullBenchmark]
+
 ## Use-case naming
 
-Name new benchmarks after the developer task being performed. 
+Name new benchmarks after the developer task being performed.
 
 For example 
-* `SetText` the task of setting text after loading it from some source 
+* `SetText` the task of setting text after loading it from some source
 * `IfNotEmptyCallText` the task of adding Text, only if not empty
 
 Benchmarks should attempt to provide a realistic async loading "default" value as state between
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
index b82eb69..2b1d49d 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetText.kt
@@ -16,19 +16,16 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -61,12 +58,10 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextParent(private val size: Int) {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+open class SetTextParent(
+    private val size: Int
+) : EmpiricalBench<SetText>() {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetText(text)
     }
@@ -76,16 +71,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = arrayOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 /**
@@ -114,4 +99,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
index 6f1b622..f64c74c 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextFillMaxWidth.kt
@@ -16,20 +16,17 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -63,12 +60,10 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextFillMaxWidthParent(private val size: Int) {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+open class SetTextFillMaxWidthParent(
+    private val size: Int
+) : EmpiricalBench<SetTextFillMaxWidth>() {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetTextFillMaxWidth(text)
     }
@@ -78,16 +73,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = arrayOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 /**
@@ -116,4 +101,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
index feefb13..a157190 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithInlineContent.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.InlineTextContent
@@ -24,9 +25,6 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Placeholder
@@ -35,8 +33,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -77,12 +74,11 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextWithInlineContentParent(private val size: Int) {
+open class SetTextWithInlineContentParent(
+    private val size: Int
+) : EmpiricalBench<SetTextWithInlineContent>() {
 
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetTextWithInlineContent(text.annotateWithInlineContent())
     }
@@ -92,16 +88,6 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): List<Array<Any>> = listOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 @LargeTest
@@ -122,6 +108,11 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters() = SocialApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -132,6 +123,11 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters() = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -142,4 +138,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters() = ShoppingApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
index c40b587..13c3962 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/SetTextWithSpans.kt
@@ -16,19 +16,16 @@
 
 package androidx.compose.foundation.benchmark.text.empirical
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkComposeMeasureLayout
-import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.font.FontFamily
 import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
+import org.junit.Assume.assumeTrue
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
@@ -68,12 +65,11 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-open class SetTextWithSpansParent(private val size: Int, private val spanCount: Int) {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val caseFactory = {
+open class SetTextWithSpansParent(
+    private val size: Int,
+    private val spanCount: Int
+) : EmpiricalBench<SetTextWithSpans>() {
+    override val caseFactory = {
         val text = generateCacheableStringOf(size)
         SetTextWithSpans(text.annotateWithSpans(spanCount))
     }
@@ -83,16 +79,6 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters(): List<Array<Any>> = listOf()
     }
-
-    @Test
-    fun recomposeOnly() {
-        benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
-    }
-
-    @Test
-    fun recomposeMeasureLayout() {
-        benchmarkRule.toggleStateBenchmarkComposeMeasureLayout(caseFactory)
-    }
 }
 
 @LargeTest
@@ -113,6 +99,11 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = SocialApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -123,6 +114,11 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = ChatApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        assumeTrue(DoFullBenchmark)
+    }
 }
 
 @LargeTest
@@ -133,4 +129,9 @@
         @Parameterized.Parameters(name = "size={0}, spanCount={1}")
         fun initParameters() = ShoppingApps.TextLengthsWithSpans
     }
+
+    init {
+        // we only need this for full reporting
+        assumeTrue(DoFullBenchmark)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
index 71a292f..3bf8608 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/EmptyLayoutBaseline.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.benchmark.text.empirical.baselines
 
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.benchmark.text.empirical.AllApps
 import androidx.compose.foundation.benchmark.text.empirical.ChatApps
 import androidx.compose.foundation.benchmark.text.empirical.generateCacheableStringOf
@@ -31,6 +32,7 @@
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.MeasurePolicy
 import androidx.test.filters.LargeTest
+import org.junit.Assume
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -125,4 +127,9 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
index eb2a4c6..0ab85a3 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/empirical/baselines/StaticLayoutBaseline.kt
@@ -26,11 +26,13 @@
 import androidx.annotation.RequiresApi
 import androidx.benchmark.junit4.BenchmarkRule
 import androidx.benchmark.junit4.measureRepeated
+import androidx.compose.foundation.benchmark.text.DoFullBenchmark
 import androidx.compose.foundation.benchmark.text.empirical.AllApps
 import androidx.compose.foundation.benchmark.text.empirical.ChatApps
 import androidx.compose.foundation.benchmark.text.empirical.generateCacheableStringOf
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
+import org.junit.Assume
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -94,6 +96,11 @@
         @Parameterized.Parameters(name = "size={0}")
         fun initParameters(): Array<Any> = ChatApps.TextLengths
     }
+
+    init {
+        // we only need this for full reporting
+        Assume.assumeTrue(DoFullBenchmark)
+    }
 }
 
 // do compat code to make a realistic lowest-possible benchmark for API21+
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
index 599098f..efdeef8 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerBenchmark.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.foundation.benchmark.text.selection
 
+import androidx.compose.foundation.benchmark.text.filterForCi
 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
@@ -29,6 +29,12 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
+/**
+ * we had some issues where SelectionContainer will dramatically slow down the compose & draw
+ * time(mainly the compose time). Now it's mostly fixed.
+ *
+ * This benchmark is to observe for regressions
+ */
 @SmallTest
 @RunWith(Parameterized::class)
 class SelectionContainerBenchmark(private val childrenCount: Int) {
@@ -37,7 +43,7 @@
         @Parameterized.Parameters(
             name = "childrenCount={0}"
         )
-        fun initParameters() = arrayOf(1, 10, 20)
+        fun initParameters() = arrayOf(1, 10, 20).filterForCi { min() }
     }
 
     @get:Rule
@@ -68,9 +74,4 @@
     fun layout() {
         benchmarkRule.benchmarkLayoutPerf(caseFactory)
     }
-
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(caseFactory)
-    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index 88f7362..3c6a103 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -36,7 +36,7 @@
          */
         api("androidx.annotation:annotation:1.1.0")
         api("androidx.compose.animation:animation:1.2.1")
-        api("androidx.compose.runtime:runtime:1.3.1")
+        api(project(":compose:runtime:runtime"))
         api(project(":compose:ui:ui"))
 
         implementation(libs.kotlinStdlibCommon)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
index 89cf142..dc82596 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/DrawTextDemo.kt
@@ -23,12 +23,17 @@
 import androidx.compose.animation.core.rememberInfiniteTransition
 import androidx.compose.animation.core.tween
 import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material.Button
 import androidx.compose.material.Checkbox
+import androidx.compose.material.DropdownMenu
+import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
@@ -41,8 +46,10 @@
 import androidx.compose.runtime.snapshotFlow
 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.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.translate
@@ -55,7 +62,9 @@
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.buildAnnotatedString
 import androidx.compose.ui.text.drawText
+import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.rememberTextMeasurer
+import androidx.compose.ui.text.style.LineHeightStyle
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.text.withStyle
@@ -63,6 +72,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import kotlin.math.roundToInt
 import kotlin.math.roundToLong
 import kotlin.system.measureNanoTime
 import kotlinx.coroutines.flow.filterNotNull
@@ -74,6 +84,10 @@
 fun DrawTextDemo() {
     LazyColumn {
         item {
+            TagLine(tag = "Draw text blendMode")
+            DrawTextBlendMode()
+        }
+        item {
             TagLine(tag = "Draw text string")
             DrawTextString()
         }
@@ -272,6 +286,97 @@
     }
 }
 
+private val blendModes = listOf(
+    BlendMode.Clear,
+    BlendMode.Src,
+    BlendMode.Dst,
+    BlendMode.SrcOver,
+    BlendMode.DstOver,
+    BlendMode.SrcIn,
+    BlendMode.DstIn,
+    BlendMode.SrcOut,
+    BlendMode.DstOut,
+    BlendMode.SrcAtop,
+    BlendMode.DstAtop,
+    BlendMode.Xor,
+    BlendMode.Plus,
+    BlendMode.Modulate,
+    BlendMode.Screen,
+    BlendMode.Overlay,
+    BlendMode.Darken,
+    BlendMode.Lighten,
+    BlendMode.ColorDodge,
+    BlendMode.ColorBurn,
+    BlendMode.Hardlight,
+    BlendMode.Softlight,
+    BlendMode.Difference,
+    BlendMode.Exclusion,
+    BlendMode.Multiply,
+    BlendMode.Hue,
+    BlendMode.Saturation,
+    BlendMode.Color,
+    BlendMode.Luminosity,
+)
+
+@Composable
+fun DrawTextBlendMode() {
+    val textMeasurer = rememberTextMeasurer()
+    var isExpanded by remember { mutableStateOf(false) }
+    var blendModeState by remember { mutableStateOf(BlendMode.SrcOver) }
+    Button(onClick = { isExpanded = true }) {
+        Text("BlendMode: $blendModeState")
+    }
+    DropdownMenu(expanded = isExpanded, onDismissRequest = { isExpanded = false }) {
+        blendModes.forEach { blendMode ->
+            DropdownMenuItem(onClick = { blendModeState = blendMode }) {
+                val weight = if (blendModeState == blendMode) FontWeight.Bold else FontWeight.Normal
+                Text(
+                    text = blendMode.toString(),
+                    fontWeight = weight
+                )
+            }
+        }
+    }
+    Box(
+        modifier = Modifier
+            .size(400.dp)
+            .drawBehind {
+                drawRect(color = Color.Red, size = Size(size.width / 2, size.height))
+                drawRect(
+                    color = Color.Green,
+                    size = Size(size.width / 2, size.height),
+                    topLeft = Offset(size.width / 2, 0f)
+                )
+                // Clear the circular clock background
+                drawCircle(
+                    color = Color.Black,
+                    radius = size.width / 3f,
+                    blendMode = BlendMode.Clear
+                )
+
+                val textLayout = textMeasurer.measure(
+                    text = AnnotatedString("12 34"),
+                    style = TextStyle(
+                        brush = Brush.horizontalGradient(RainbowColors),
+                        fontSize = 220.sp,
+                        textAlign = TextAlign.Center,
+                        lineHeight = 180.sp,
+                        lineHeightStyle = LineHeightStyle(
+                            trim = LineHeightStyle.Trim.Both,
+                            alignment = LineHeightStyle.Alignment.Center
+                        )
+                    ),
+                    constraints = Constraints(maxWidth = size.width.roundToInt())
+                )
+                drawText(textLayout, blendMode = blendModeState, topLeft = Offset(0f, -50f))
+
+                drawCircle(color = Color.White, radius = size.width / 6f, blendMode = BlendMode.Xor)
+
+                drawCircle(color = Color.Blue, radius = size.width / 3f, blendMode = BlendMode.Hue)
+            }
+    )
+}
+
 @Composable
 fun DrawTextAndAnimateColor() {
     val infiniteTransition = rememberInfiniteTransition()
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
index b6995d6..0b97cfc 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/EmojiCompatDemo.kt
@@ -23,7 +23,7 @@
 import androidx.compose.material.TextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.dp
@@ -47,7 +47,10 @@
         .padding(16.dp)) {
         Text(text = text, modifier = Modifier.padding(16.dp))
 
-        val textFieldValue = remember { mutableStateOf(TextFieldValue(text)) }
+        val textFieldValue =
+            rememberSaveable(stateSaver = TextFieldValue.Saver) {
+                mutableStateOf(TextFieldValue(text))
+            }
 
         TextField(
             value = textFieldValue.value,
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
index a1d1b2f..c4a8f61 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.foundation
 
-import android.os.Build
+import android.os.Build.VERSION.SDK_INT
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.gestures.draggable
@@ -44,11 +44,15 @@
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
+import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
@@ -79,7 +83,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -106,7 +109,12 @@
     @After
     fun after() {
         isDebugInspectorInfoEnabled = false
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
+    }
+
+    // TODO(b/267253920): Add a compose test API to set/reset InputMode.
+    @After
+    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
+        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
     }
 
     @Test
@@ -208,16 +216,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -226,8 +230,10 @@
                         .clickable { counter++ }
             )
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("myClickable").performKeyInput { keyDown(Key.Enter) }
 
@@ -240,16 +246,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithNumPadEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
                 modifier = Modifier
@@ -258,8 +260,10 @@
                     .clickable { counter++ }
             )
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("myClickable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -272,16 +276,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_clickWithDPadCenter() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ClickableText",
                 modifier = Modifier
@@ -290,8 +290,10 @@
                     .clickable { counter++ }
             )
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("myClickable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -1246,13 +1248,13 @@
 
     @Test
     fun clickableTest_interactionSource_focus_inTouchMode() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
-
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box {
                 BasicText(
                     "ClickableText",
@@ -1266,6 +1268,10 @@
                 )
             }
         }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Touch)
+        }
 
         val interactions = mutableListOf<Interaction>()
 
@@ -1288,21 +1294,16 @@
     }
 
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_interactionSource_focus_inKeyboardMode() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
         lateinit var focusManager: FocusManager
-
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
+            inputModeManager = LocalInputModeManager.current
                 Box {
                     BasicText(
                         "ClickableText",
@@ -1316,6 +1317,10 @@
                     )
                 }
         }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+        }
 
         val interactions = mutableListOf<Interaction>()
 
@@ -1941,18 +1946,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_enterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -1965,8 +1966,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1991,18 +1994,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_numPadEnterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2015,8 +2014,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -2041,18 +2042,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_dpadCenter_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2065,8 +2062,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
@@ -2093,12 +2092,13 @@
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
     fun clickableTest_otherKey_doesNotEmitIndication() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2111,8 +2111,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -2127,18 +2129,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_doubleEnterKey_emitsFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2151,8 +2149,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -2191,19 +2191,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         var repeatCounter = 0
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2221,8 +2217,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -2254,20 +2252,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun clickableTest_interruptedClick_emitsCancelIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         val enabled = mutableStateOf(true)
         lateinit var scope: CoroutineScope
-
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ClickableText",
                     modifier = Modifier
@@ -2281,8 +2274,10 @@
                 )
             }
         }
-
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FocusableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FocusableTest.kt
index 6db15c3..dbaeb55 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FocusableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FocusableTest.kt
@@ -29,15 +29,19 @@
 import androidx.compose.foundation.relocation.bringIntoViewResponder
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.ReusableContent
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.key
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.FocusState
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.focus.onFocusEvent
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
@@ -426,7 +430,11 @@
                 state = state
             ) {
                 items(items.size) {
-                    Box(Modifier.requiredSize(10.dp).testTag("$it").focusable())
+                    Box(
+                        Modifier
+                            .requiredSize(10.dp)
+                            .testTag("$it")
+                            .focusable())
                 }
             }
         }
@@ -489,4 +497,42 @@
             assertThat(container2Pinned).isTrue()
         }
     }
+
+    @Test
+    fun reusingFocusedItem_itemIsNotFocusedAnymore() {
+        // Arrange.
+        val focusRequester = FocusRequester()
+        lateinit var state: FocusState
+        var key by mutableStateOf(0)
+        rule.setContent {
+            ReusableContent(key) {
+                BasicText(
+                    "focusableText",
+                    modifier = Modifier
+                        .testTag(focusTag)
+                        .focusRequester(focusRequester)
+                        .onFocusEvent { state = it }
+                        .focusable()
+                )
+            }
+        }
+        rule.runOnIdle {
+            focusRequester.requestFocus()
+            assertThat(state.isFocused).isTrue()
+        }
+        rule.onNodeWithTag(focusTag)
+            .assertIsFocused()
+
+        // Act.
+        rule.runOnIdle {
+            key = 1
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(state.isFocused).isFalse()
+        }
+        rule.onNodeWithTag(focusTag)
+            .assertIsNotFocused()
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
index 3c9694c..087d8db 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
@@ -86,6 +86,7 @@
         }
 
         waitForPrefetch(4)
+        waitForPrefetch(5)
 
         rule.onNodeWithTag("4")
             .assertExists()
@@ -106,6 +107,7 @@
         }
 
         waitForPrefetch(2)
+        waitForPrefetch(3)
 
         rule.onNodeWithTag("2")
             .assertExists()
@@ -126,6 +128,7 @@
         }
 
         waitForPrefetch(6)
+        waitForPrefetch(7)
 
         rule.onNodeWithTag("6")
             .assertExists()
@@ -142,6 +145,7 @@
         }
 
         waitForPrefetch(0)
+        waitForPrefetch(1)
 
         rule.onNodeWithTag("0")
             .assertExists()
@@ -222,6 +226,7 @@
         }
 
         waitForPrefetch(6)
+        waitForPrefetch(7)
 
         rule.onNodeWithTag("6")
             .assertExists()
@@ -240,6 +245,7 @@
         }
 
         waitForPrefetch(0)
+        waitForPrefetch(1)
 
         rule.onNodeWithTag("0")
             .assertExists()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
index 2293c1a..3371446 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
@@ -32,7 +32,6 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
@@ -41,15 +40,15 @@
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.dp
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
 import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
 import com.google.common.truth.IterableSubject
 import com.google.common.truth.Truth.assertThat
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -100,6 +99,22 @@
                 .provider as AccessibilityNodeProvider
         }
 
+    private val itemSize = 21
+    private var itemSizeDp: Dp = Dp.Unspecified
+    private val containerSize = 200
+    private var containerSizeDp: Dp = Dp.Unspecified
+    private val contentPadding = 50
+    private var contentPaddingDp: Dp = Dp.Unspecified
+
+    @Before
+    fun before() {
+        with(rule.density) {
+            itemSizeDp = itemSize.toDp()
+            containerSizeDp = containerSize.toDp()
+            contentPaddingDp = contentPadding.toDp()
+        }
+    }
+
     @Test
     fun scrollForward() {
         testRelativeDirection(58, ACTION_SCROLL_FORWARD)
@@ -148,7 +163,6 @@
         )
     }
 
-    @SdkSuppress(minSdkVersion = 29) // b/260010883
     @Test
     fun verifyScrollActionsAtEnd() {
         createScrollableContent_StartAtEnd()
@@ -277,13 +291,13 @@
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             // Start at the middle:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> centered when 1000dp on either side, which is 47 items + 13dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> centered when 1000 on either side, which is 47 items + 13
             rememberLazyGridState(
                 47,
-                with(LocalDensity.current) { 13.dp.roundToPx() }
+                13
             )
         }
     }
@@ -294,19 +308,19 @@
     private fun createScrollableContent_StartAtEnd() {
         createScrollableContent {
             // Start at the end:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> at the end when offset at 2000dp, which is 95 items + 5dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> at the end when offset at 2000, which is 95 items + 5
             rememberLazyGridState(
                 95,
-                with(LocalDensity.current) { 5.dp.roundToPx() }
+                5
             )
         }
     }
 
     /**
-     * Creates a grid with a viewport of 100.dp, containing 100 items each 17.dp in size.
+     * Creates a grid with a viewport of 100 px, containing 100 items each 21 px in size.
      * The items have a text with their index (ASC), and where the viewport starts is determined
      * by the given [lambda][rememberLazyGridState]. All properties from [config] are applied.
      * The viewport has padding around it to make sure scroll distance doesn't include padding.
@@ -317,18 +331,18 @@
 
             val state = rememberLazyGridState()
 
-            Box(Modifier.requiredSize(200.dp).background(Color.White)) {
+            Box(Modifier.requiredSize(containerSizeDp).background(Color.White)) {
                 val direction = if (config.rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
                 CompositionLocalProvider(LocalLayoutDirection provides direction) {
                     LazyGrid(
                         cells = 1,
                         modifier = Modifier.testTag(scrollerTag).matchParentSize(),
                         state = state,
-                        contentPadding = PaddingValues(50.dp),
+                        contentPadding = PaddingValues(contentPaddingDp),
                         reverseLayout = config.reversed
                     ) {
                         items(100) {
-                            Box(Modifier.requiredSize(21.dp).background(Color.Yellow)) {
+                            Box(Modifier.requiredSize(itemSizeDp).background(Color.Yellow)) {
                                 BasicText("$it", Modifier.align(Alignment.Center))
                             }
                         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
index 967acf3..67556ba 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
@@ -49,13 +49,11 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.assertCountEquals
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performTouchInput
@@ -172,39 +170,28 @@
 
     @Test
     fun removeItemsTest() {
-        val startingNumItems = 3
-        var numItems = startingNumItems
-        var numItemsModel by mutableStateOf(numItems)
+        var itemCount by mutableStateOf(3)
         val tag = "List"
         rule.setContentWithTestViewConfiguration {
             LazyColumn(Modifier.testTag(tag)) {
-                items((1..numItemsModel).toList()) {
+                items((0 until itemCount).toList()) {
                     BasicText("$it")
                 }
             }
         }
 
-        while (numItems >= 0) {
-            // Confirm the number of children to ensure there are no extra items
-            rule.onNodeWithTag(tag)
-                .onChildren()
-                .assertCountEquals(numItems)
-
+        while (itemCount >= 0) {
             // Confirm the children's content
-            for (i in 1..3) {
+            for (i in 0 until 3) {
                 rule.onNodeWithText("$i").apply {
-                    if (i <= numItems) {
-                        assertExists()
+                    if (i < itemCount) {
+                        assertIsPlaced()
                     } else {
-                        assertDoesNotExist()
+                        assertIsNotPlaced()
                     }
                 }
             }
-            numItems--
-            if (numItems >= 0) {
-                // Don't set the model to -1
-                rule.runOnIdle { numItemsModel = numItems }
-            }
+            itemCount--
         }
     }
 
@@ -256,15 +243,13 @@
         for (data in dataLists) {
             rule.runOnIdle { dataModel = data }
 
-            // Confirm the number of children to ensure there are no extra items
-            val numItems = data.size
-            rule.onNodeWithTag(tag)
-                .onChildren()
-                .assertCountEquals(numItems)
-
             // Confirm the children's content
-            for (item in data) {
-                rule.onNodeWithText("$item").assertExists()
+            for (index in 1..8) {
+                if (index in data) {
+                    rule.onNodeWithText("$index").assertIsDisplayed()
+                } else {
+                    rule.onNodeWithText("$index").assertIsNotPlaced()
+                }
             }
         }
     }
@@ -401,7 +386,7 @@
             .assertIsDisplayed()
 
         rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
index ecb6576..7784e47 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
@@ -721,9 +721,9 @@
 
         // and has no children
         rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
         rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
index a29edf6..15fd4f6 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyScrollAccessibilityTest.kt
@@ -38,7 +38,6 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
@@ -48,15 +47,15 @@
 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.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.dp
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
 import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
 import com.google.common.truth.IterableSubject
 import com.google.common.truth.Truth.assertThat
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -107,6 +106,22 @@
                 .provider as AccessibilityNodeProvider
         }
 
+    private val itemSize = 21
+    private var itemSizeDp: Dp = Dp.Unspecified
+    private val containerSize = 200
+    private var containerSizeDp: Dp = Dp.Unspecified
+    private val contentPadding = 50
+    private var contentPaddingDp: Dp = Dp.Unspecified
+
+    @Before
+    fun before() {
+        with(rule.density) {
+            itemSizeDp = itemSize.toDp()
+            containerSizeDp = containerSize.toDp()
+            contentPaddingDp = contentPadding.toDp()
+        }
+    }
+
     @Test
     fun scrollForward() {
         testRelativeDirection(58, ACTION_SCROLL_FORWARD)
@@ -155,7 +170,6 @@
         )
     }
 
-    @SdkSuppress(minSdkVersion = 29) // b/260011449
     @Test
     fun verifyScrollActionsAtEnd() {
         createScrollableContent_StartAtEnd()
@@ -284,13 +298,13 @@
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             // Start at the middle:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> centered when 1000dp on either side, which is 47 items + 13dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> centered when 1000 on either side, which is 47 items + 13
             rememberLazyListState(
                 47,
-                with(LocalDensity.current) { 13.dp.roundToPx() }
+                13
             )
         }
     }
@@ -301,19 +315,19 @@
     private fun createScrollableContent_StartAtEnd() {
         createScrollableContent {
             // Start at the end:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> at the end when offset at 2000dp, which is 95 items + 5dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> at the end when offset at 2000, which is 95 items + 5
             rememberLazyListState(
                 95,
-                with(LocalDensity.current) { 5.dp.roundToPx() }
+                5
             )
         }
     }
 
     /**
-     * Creates a Row/Column with a viewport of 100.dp, containing 100 items each 17.dp in size.
+     * Creates a Row/Column with a viewport of 100 px, containing 100 items each 21 px in size.
      * The items have a text with their index (ASC), and where the viewport starts is determined
      * by the given [lambda][rememberLazyListState]. All properties from [config] are applied.
      * The viewport has padding around it to make sure scroll distance doesn't include padding.
@@ -323,7 +337,7 @@
             composeView = LocalView.current
             val lazyContent: LazyListScope.() -> Unit = {
                 items(100) {
-                    Box(Modifier.requiredSize(21.dp).background(Color.Yellow)) {
+                    Box(Modifier.requiredSize(itemSizeDp).background(Color.Yellow)) {
                         BasicText("$it", Modifier.align(Alignment.Center))
                     }
                 }
@@ -331,14 +345,14 @@
 
             val state = rememberLazyListState()
 
-            Box(Modifier.requiredSize(200.dp).background(Color.White)) {
+            Box(Modifier.requiredSize(containerSizeDp).background(Color.White)) {
                 val direction = if (config.rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
                 CompositionLocalProvider(LocalLayoutDirection provides direction) {
                     if (config.horizontal) {
                         LazyRow(
                             Modifier.testTag(scrollerTag).matchParentSize(),
                             state = state,
-                            contentPadding = PaddingValues(50.dp),
+                            contentPadding = PaddingValues(contentPaddingDp),
                             reverseLayout = config.reversed,
                             verticalAlignment = Alignment.CenterVertically
                         ) {
@@ -348,7 +362,7 @@
                         LazyColumn(
                             Modifier.testTag(scrollerTag).matchParentSize(),
                             state = state,
-                            contentPadding = PaddingValues(50.dp),
+                            contentPadding = PaddingValues(contentPaddingDp),
                             reverseLayout = config.reversed,
                             horizontalAlignment = Alignment.CenterHorizontally
                         ) {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
index aa0fdfe..27a097a 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/pager/PagerStateTest.kt
@@ -22,6 +22,7 @@
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
@@ -46,6 +47,29 @@
 internal class PagerStateTest(val config: ParamConfig) : BasePagerTest(config) {
 
     @Test
+    fun pagerStateNotAttached_shouldReturnDefaultValues_andChangeAfterAttached() = runBlocking {
+        // Arrange
+        val state = PagerState(initialPage = 5, initialPageOffsetFraction = 0.2f)
+
+        assertThat(state.currentPage).isEqualTo(5)
+        assertThat(state.currentPageOffsetFraction).isEqualTo(0.2f)
+
+        val currentPage = derivedStateOf { state.currentPage }
+        val currentPageOffsetFraction = derivedStateOf { state.currentPageOffsetFraction }
+
+        createPager(state = state, modifier = Modifier.fillMaxSize())
+
+        withContext(Dispatchers.Main + AutoTestFrameClock()) {
+            state.scrollToPage(state.currentPage + 1)
+        }
+
+        rule.runOnIdle {
+            assertThat(currentPage.value).isEqualTo(6)
+            assertThat(currentPageOffsetFraction.value).isEqualTo(0.0f)
+        }
+    }
+
+    @Test
     fun scrollToPage_shouldPlacePagesCorrectly() = runBlocking {
         // Arrange
         val state = PagerState()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
index a4a49a9..5b384af 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/SelectableTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.foundation.selection
 
-import android.os.Build
+import android.os.Build.VERSION.SDK_INT
 import androidx.compose.foundation.TapIndicationDelay
 import androidx.compose.foundation.interaction.FocusInteraction
 import androidx.compose.foundation.interaction.HoverInteraction
@@ -40,10 +40,14 @@
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
+import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -67,7 +71,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -93,7 +96,12 @@
     @After
     fun after() {
         isDebugInspectorInfoEnabled = false
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
+    }
+
+    // TODO(b/267253920): Add a compose test API to set/reset InputMode.
+    @After
+    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
+        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
     }
 
     @Test
@@ -486,13 +494,14 @@
 
     @Test
     fun selectableTest_interactionSource_focus_inTouchMode() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box {
                 Box(
                     Modifier
@@ -520,6 +529,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Touch)
             focusRequester.requestFocus()
         }
 
@@ -530,21 +541,17 @@
     }
 
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_interactionSource_focus_inKeyboardMode() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
         lateinit var focusManager: FocusManager
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
+            inputModeManager = LocalInputModeManager.current
                 Box {
                     Box(
                         Modifier
@@ -572,6 +579,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -636,16 +645,13 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
                 modifier = Modifier
@@ -655,7 +661,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.Enter) }
 
@@ -668,16 +678,13 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithNumPadEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
                 modifier = Modifier
@@ -687,7 +694,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.NumPadEnter) }
 
@@ -700,16 +711,13 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_clickWithDPadCenter() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         var counter = 0
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "SelectableText",
                 modifier = Modifier
@@ -719,7 +727,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         rule.onNodeWithTag("selectable").performKeyInput { keyDown(Key.DirectionCenter) }
 
@@ -732,18 +744,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_enterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -758,7 +767,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -783,18 +796,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_numPadEnterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -809,7 +819,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -834,18 +848,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_dpadCenter_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -860,7 +871,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
@@ -887,12 +902,14 @@
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
     fun selectableTest_otherKey_doesNotEmitIndication() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -907,7 +924,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -922,18 +943,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_doubleEnterKey_emitsFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -948,7 +966,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -987,19 +1009,16 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         var repeatCounter = 0
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -1019,7 +1038,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1053,20 +1076,16 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun selectableTest_interruptedClick_emitsCancelIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         val enabled = mutableStateOf(true)
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("SelectableText",
                     modifier = Modifier
@@ -1082,7 +1101,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
index f48a9ee..4174820 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/selection/ToggleableTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.foundation.selection
 
-import android.os.Build
+import android.os.Build.VERSION.SDK_INT
 import androidx.compose.foundation.TapIndicationDelay
 import androidx.compose.foundation.interaction.FocusInteraction
 import androidx.compose.foundation.interaction.HoverInteraction
@@ -43,10 +43,14 @@
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
+import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -76,7 +80,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
@@ -102,7 +105,12 @@
     @After
     fun after() {
         isDebugInspectorInfoEnabled = false
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
+    }
+
+    // TODO(b/267253920): Add a compose test API to set/reset InputMode.
+    @After
+    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
+        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
     }
 
     @Test
@@ -578,13 +586,14 @@
 
     @Test
     fun toggleableTest_interactionSource_focus_inTouchMode() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box {
                 Box(
                     Modifier
@@ -612,6 +621,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Touch)
             focusRequester.requestFocus()
         }
 
@@ -622,21 +633,17 @@
     }
 
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_interactionSource_focus_inKeyboardMode() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         lateinit var scope: CoroutineScope
         val focusRequester = FocusRequester()
         lateinit var focusManager: FocusManager
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
+            inputModeManager = LocalInputModeManager.current
             Box {
                     Box(
                         Modifier
@@ -664,6 +671,8 @@
         }
 
         rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
             focusRequester.requestFocus()
         }
 
@@ -827,16 +836,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
         var toggled by mutableStateOf(false)
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
                 modifier = Modifier
@@ -846,7 +851,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
         rule.runOnIdle { assertThat(toggled).isFalse() }
@@ -860,16 +869,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithNumPadEnterKey() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
         var toggled by mutableStateOf(false)
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
                 modifier = Modifier
@@ -879,7 +884,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
         rule.runOnIdle { assertThat(toggled).isFalse() }
@@ -893,16 +902,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithDpadCenter() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
         var toggled by mutableStateOf(false)
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
                 modifier = Modifier
@@ -912,7 +917,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
         rule.runOnIdle { assertThat(toggled).isFalse() }
@@ -926,16 +935,12 @@
 
     @Test
     @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_clickWithEnterKey_triStateToggleable() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val focusRequester = FocusRequester()
         var toggled by mutableStateOf(false)
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             BasicText(
                 "ToggleableText",
                 modifier = Modifier
@@ -945,7 +950,11 @@
             )
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val toggleableNode = rule.onNodeWithTag("toggleable")
         rule.runOnIdle { assertThat(toggled).isFalse() }
@@ -959,17 +968,13 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_enterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
+            inputModeManager = LocalInputModeManager.current
             scope = rememberCoroutineScope()
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
@@ -985,7 +990,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1010,18 +1019,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_numPadEnterKey_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
+
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1036,7 +1042,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1061,18 +1071,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_dpadCenter_emitsIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1087,7 +1093,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
         rule.waitForIdle()
 
         val interactions = mutableListOf<Interaction>()
@@ -1114,12 +1124,13 @@
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
     fun toggleableTest_otherKey_doesNotEmitIndication() {
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
+        lateinit var inputModeManager: InputModeManager
         lateinit var scope: CoroutineScope
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1134,7 +1145,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1149,18 +1164,14 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_doubleEnterKey_emitsFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1175,7 +1186,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1214,19 +1229,15 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
         var repeatCounter = 0
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1246,7 +1257,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
@@ -1278,20 +1293,16 @@
 
     @Test
     @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun toggleableTest_interruptedClick_emitsCancelIndication() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
         val focusRequester = FocusRequester()
         val enabled = mutableStateOf(true)
         lateinit var scope: CoroutineScope
+        lateinit var inputModeManager: InputModeManager
 
         rule.setContent {
             scope = rememberCoroutineScope()
+            inputModeManager = LocalInputModeManager.current
             Box(Modifier.padding(10.dp)) {
                 BasicText("ToggleableText",
                     modifier = Modifier
@@ -1307,7 +1318,11 @@
             }
         }
 
-        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.runOnIdle {
+            @OptIn(ExperimentalComposeUiApi::class)
+            inputModeManager.requestInputMode(Keyboard)
+            focusRequester.requestFocus()
+        }
 
         val interactions = mutableListOf<Interaction>()
         scope.launch {
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 dce1e3a..4640c7b 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
@@ -142,6 +142,16 @@
         }
     }
 
+    @Test
+    fun when_emptyText_wordOffsetDoesNotChange() {
+        selectionTest(initText = "") {
+            Truth.assertThat(it.getPreviousWordOffset()).isEqualTo(0)
+            Truth.assertThat(it.getNextWordOffset()).isEqualTo(0)
+            Truth.assertThat(it.getLineStartByOffset()).isEqualTo(0)
+            Truth.assertThat(it.getLineEndByOffset()).isEqualTo(0)
+        }
+    }
+
     private inner class SelectionScope<T : BaseTextPreparedSelection<T>>(
         val prepared: BaseTextPreparedSelection<T>
     ) {
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 5e7a819..a0071ee 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
@@ -34,11 +34,13 @@
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.nativeKeyCode
+import androidx.compose.ui.platform.LocalClipboardManager
 import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.test.SemanticsNodeInteraction
 import androidx.compose.ui.test.hasSetTextAction
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.performKeyPress
+import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.TextFieldValue
@@ -82,6 +84,30 @@
     }
 
     @Test
+    fun textField_directCopyPaste() {
+        keysSequenceTest(initText = "hello") {
+            Key.A.downAndUp(META_CTRL_ON)
+            Key.Copy.downAndUp()
+            expectedText("hello")
+            Key.DirectionRight.downAndUp()
+            Key.Spacebar.downAndUp()
+            Key.Paste.downAndUp()
+            expectedText("hello hello")
+        }
+    }
+
+    @Test
+    fun textField_directCutPaste() {
+        keysSequenceTest(initText = "hello") {
+            Key.A.downAndUp(META_CTRL_ON)
+            Key.Cut.downAndUp()
+            expectedText("")
+            Key.Paste.downAndUp()
+            expectedText("hello")
+        }
+    }
+
+    @Test
     fun textField_linesNavigation() {
         keysSequenceTest(initText = "hello\nworld") {
             Key.DirectionDown.downAndUp()
@@ -394,6 +420,7 @@
         val inputService = TextInputService(mock())
         val focusRequester = FocusRequester()
         rule.setContent {
+            LocalClipboardManager.current.setText(AnnotatedString("InitialTestText"))
             CompositionLocalProvider(
                 LocalTextInputService provides inputService
             ) {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
index de5256b..eb0efbd 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/KeyMapping.android.kt
@@ -44,5 +44,6 @@
     actual val Delete: Key = Key(KeyEvent.KEYCODE_FORWARD_DEL)
     actual val Paste: Key = Key(KeyEvent.KEYCODE_PASTE)
     actual val Cut: Key = Key(KeyEvent.KEYCODE_CUT)
+    actual val Copy: Key = Key(KeyEvent.KEYCODE_COPY)
     actual val Tab: Key = Key(KeyEvent.KEYCODE_TAB)
 }
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 00a4e5a..dbdf686 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
@@ -298,7 +298,8 @@
 
         measureLazyList(
             itemsCount = itemsCount,
-            itemProvider = measuredItemProvider,
+            itemProvider = itemProvider,
+            measuredItemProvider = measuredItemProvider,
             mainAxisAvailableSize = mainAxisAvailableSize,
             beforeContentPadding = beforeContentPadding,
             afterContentPadding = afterContentPadding,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
index 0691a11..80c00e6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
@@ -80,8 +80,13 @@
         intervals = intervals,
         nearestItemsRange = nearestItemsRange,
         itemContent = { interval, index ->
-            LazyLayoutPinnableItem(index, state.pinnedItems) {
-                interval.value.item.invoke(itemScope, index - interval.startIndex)
+            val localIndex = index - interval.startIndex
+            LazyLayoutPinnableItem(
+                key = interval.value.key?.invoke(localIndex),
+                index = index,
+                pinnedItemList = state.pinnedItems
+            ) {
+                interval.value.item.invoke(itemScope, localIndex)
             }
         }
     )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index d580e73..e25851f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList
+import androidx.compose.foundation.lazy.layout.findIndexByKey
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.unit.Constraints
@@ -41,7 +42,8 @@
 @OptIn(ExperimentalFoundationApi::class)
 internal fun measureLazyList(
     itemsCount: Int,
-    itemProvider: LazyMeasuredItemProvider,
+    itemProvider: LazyListItemProvider,
+    measuredItemProvider: LazyMeasuredItemProvider,
     mainAxisAvailableSize: Int,
     beforeContentPadding: Int,
     afterContentPadding: Int,
@@ -124,7 +126,7 @@
         // firstItemScrollOffset
         while (currentFirstItemScrollOffset < 0 && currentFirstItemIndex > DataIndex(0)) {
             val previous = DataIndex(currentFirstItemIndex.value - 1)
-            val measuredItem = itemProvider.getAndMeasure(previous)
+            val measuredItem = measuredItemProvider.getAndMeasure(previous)
             visibleItems.add(0, measuredItem)
             maxCrossAxis = maxOf(maxCrossAxis, measuredItem.crossAxisSize)
             currentFirstItemScrollOffset += measuredItem.sizeWithSpacings
@@ -159,7 +161,7 @@
                 currentMainAxisOffset <= 0 || // filling beforeContentPadding area
                 visibleItems.isEmpty())
         ) {
-            val measuredItem = itemProvider.getAndMeasure(index)
+            val measuredItem = measuredItemProvider.getAndMeasure(index)
             currentMainAxisOffset += measuredItem.sizeWithSpacings
 
             if (currentMainAxisOffset <= minOffset && index.value != itemsCount - 1) {
@@ -184,7 +186,7 @@
                 currentFirstItemIndex > DataIndex(0)
             ) {
                 val previousIndex = DataIndex(currentFirstItemIndex.value - 1)
-                val measuredItem = itemProvider.getAndMeasure(previousIndex)
+                val measuredItem = measuredItemProvider.getAndMeasure(previousIndex)
                 visibleItems.add(0, measuredItem)
                 maxCrossAxis = maxOf(maxCrossAxis, measuredItem.crossAxisSize)
                 currentFirstItemScrollOffset += measuredItem.sizeWithSpacings
@@ -235,6 +237,7 @@
         val extraItemsBefore = createItemsBeforeList(
             beyondBoundsInfo = beyondBoundsInfo,
             currentFirstItemIndex = currentFirstItemIndex,
+            measuredItemProvider = measuredItemProvider,
             itemProvider = itemProvider,
             itemsCount = itemsCount,
             beyondBoundsItemCount = beyondBoundsItemCount,
@@ -250,6 +253,7 @@
         val extraItemsAfter = createItemsAfterList(
             beyondBoundsInfo = beyondBoundsInfo,
             visibleItems = visibleItems,
+            measuredItemProvider = measuredItemProvider,
             itemProvider = itemProvider,
             itemsCount = itemsCount,
             beyondBoundsItemCount = beyondBoundsItemCount,
@@ -291,13 +295,13 @@
             layoutWidth = layoutWidth,
             layoutHeight = layoutHeight,
             positionedItems = positionedItems,
-            itemProvider = itemProvider
+            itemProvider = measuredItemProvider
         )
 
         val headerItem = if (headerIndexes.isNotEmpty()) {
             findOrComposeLazyListHeader(
                 composedVisibleItems = positionedItems,
-                itemProvider = itemProvider,
+                itemProvider = measuredItemProvider,
                 headerIndexes = headerIndexes,
                 beforeContentPadding = beforeContentPadding,
                 layoutWidth = layoutWidth,
@@ -340,7 +344,8 @@
 private fun createItemsAfterList(
     beyondBoundsInfo: LazyListBeyondBoundsInfo,
     visibleItems: MutableList<LazyMeasuredItem>,
-    itemProvider: LazyMeasuredItemProvider,
+    measuredItemProvider: LazyMeasuredItemProvider,
+    itemProvider: LazyListItemProvider,
     itemsCount: Int,
     beyondBoundsItemCount: Int,
     pinnedItems: LazyLayoutPinnedItemList
@@ -354,7 +359,7 @@
     fun addItem(index: Int) {
         if (list == null) list = mutableListOf()
         requireNotNull(list).add(
-            itemProvider.getAndMeasure(DataIndex(index))
+            measuredItemProvider.getAndMeasure(DataIndex(index))
         )
     }
 
@@ -369,8 +374,9 @@
     }
 
     pinnedItems.fastForEach { item ->
-        if (item.index > end && item.index < itemsCount) {
-            addItem(item.index)
+        val index = itemProvider.findIndexByKey(item.key, item.index)
+        if (index > end && index < itemsCount) {
+            addItem(index)
         }
     }
 
@@ -381,7 +387,8 @@
 private fun createItemsBeforeList(
     beyondBoundsInfo: LazyListBeyondBoundsInfo,
     currentFirstItemIndex: DataIndex,
-    itemProvider: LazyMeasuredItemProvider,
+    measuredItemProvider: LazyMeasuredItemProvider,
+    itemProvider: LazyListItemProvider,
     itemsCount: Int,
     beyondBoundsItemCount: Int,
     pinnedItems: LazyLayoutPinnedItemList
@@ -395,7 +402,7 @@
     fun addItem(index: Int) {
         if (list == null) list = mutableListOf()
         requireNotNull(list).add(
-            itemProvider.getAndMeasure(DataIndex(index))
+            measuredItemProvider.getAndMeasure(DataIndex(index))
         )
     }
 
@@ -410,8 +417,9 @@
     }
 
     pinnedItems.fastForEach { item ->
-        if (item.index < start) {
-            addItem(item.index)
+        val index = itemProvider.findIndexByKey(item.key, item.index)
+        if (index < start) {
+            addItem(index)
         }
     }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
index 7ecc15a..b6787df 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGrid.kt
@@ -328,6 +328,7 @@
         }
         measureLazyGrid(
             itemsCount = itemsCount,
+            itemProvider = itemProvider,
             measuredLineProvider = measuredLineProvider,
             measuredItemProvider = measuredItemProvider,
             mainAxisAvailableSize = mainAxisAvailableSize,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
index 4f148e7..4948efa 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
@@ -88,8 +88,13 @@
     intervals = intervals,
     nearestItemsRange = nearestItemsRange,
     itemContent = { interval, index ->
-        LazyLayoutPinnableItem(index, state.pinnedItems) {
-            interval.value.item.invoke(LazyGridItemScopeImpl, index - interval.startIndex)
+        val localIndex = index - interval.startIndex
+        LazyLayoutPinnableItem(
+            key = interval.value.key?.invoke(localIndex),
+            index = index,
+            pinnedItemList = state.pinnedItems
+        ) {
+            interval.value.item.invoke(LazyGridItemScopeImpl, localIndex)
         }
     }
 ) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
index c08c7d0..b36fc51 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.lazy.layout.LazyLayoutPinnedItemList
+import androidx.compose.foundation.lazy.layout.findIndexByKey
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.unit.Constraints
@@ -42,6 +43,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 internal fun measureLazyGrid(
     itemsCount: Int,
+    itemProvider: LazyGridItemProvider,
     measuredLineProvider: LazyMeasuredLineProvider,
     measuredItemProvider: LazyMeasuredItemProvider,
     mainAxisAvailableSize: Int,
@@ -211,6 +213,7 @@
         val extraItemsBefore = calculateExtraItems(
             pinnedItems,
             measuredItemProvider,
+            itemProvider,
             itemConstraints = { measuredLineProvider.itemConstraints(it) },
             filter = { it in 0 until firstItemIndex }
         )
@@ -218,6 +221,7 @@
         val extraItemsAfter = calculateExtraItems(
             pinnedItems,
             measuredItemProvider,
+            itemProvider,
             itemConstraints = { measuredLineProvider.itemConstraints(it) },
             filter = { it in (lastItemIndex + 1) until itemsCount }
         )
@@ -303,17 +307,22 @@
 @ExperimentalFoundationApi
 private inline fun calculateExtraItems(
     pinnedItems: LazyLayoutPinnedItemList,
-    itemProvider: LazyMeasuredItemProvider,
+    measuredItemProvider: LazyMeasuredItemProvider,
+    itemProvider: LazyGridItemProvider,
     itemConstraints: (ItemIndex) -> Constraints,
     filter: (Int) -> Boolean
 ): List<LazyGridMeasuredItem> {
     var items: MutableList<LazyGridMeasuredItem>? = null
 
     pinnedItems.fastForEach { item ->
-        if (filter(item.index)) {
-            val itemIndex = ItemIndex(item.index)
+        val index = itemProvider.findIndexByKey(item.key, item.index)
+        if (filter(index)) {
+            val itemIndex = ItemIndex(index)
             val constraints = itemConstraints(itemIndex)
-            val measuredItem = itemProvider.getAndMeasure(itemIndex, constraints = constraints)
+            val measuredItem = measuredItemProvider.getAndMeasure(
+                itemIndex,
+                constraints = constraints
+            )
             if (items == null) {
                 items = mutableListOf()
             }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
index 37bd32f..768c234 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem.kt
@@ -33,18 +33,20 @@
  * Wrapper supporting [PinnableContainer] in lazy layout items. Each pinned item
  * is considered important to keep alive even if it would be discarded otherwise.
  *
- * @param index current index of the item inside the lazy layout
- * @param pinnedItemList container to keep currently pinned items
+ * @param key key of the item inside the lazy layout
+ * @param index index of the item inside the lazy layout
+ * @param pinnedItemList container of currently pinned items
  * @param content inner content of this item
  */
 @ExperimentalFoundationApi
 @Composable
 fun LazyLayoutPinnableItem(
+    key: Any?,
     index: Int,
     pinnedItemList: LazyLayoutPinnedItemList,
     content: @Composable () -> Unit
 ) {
-    val pinnableItem = remember(pinnedItemList) { LazyLayoutPinnableItem(pinnedItemList) }
+    val pinnableItem = remember(key, pinnedItemList) { LazyLayoutPinnableItem(key, pinnedItemList) }
     pinnableItem.index = index
     pinnableItem.parentPinnableContainer = LocalPinnableContainer.current
     DisposableEffect(pinnableItem) { onDispose { pinnableItem.onDisposed() } }
@@ -79,7 +81,12 @@
     @ExperimentalFoundationApi
     sealed interface PinnedItem {
         /**
-         * Index of the pinned item.
+         * Key of the pinned item.
+         */
+        val key: Any?
+
+        /**
+         * Last known index of the pinned item.
          * Note: it is possible for index to change during lifetime of the object.
          */
         val index: Int
@@ -88,6 +95,7 @@
 
 @OptIn(ExperimentalFoundationApi::class)
 private class LazyLayoutPinnableItem(
+    override val key: Any?,
     private val pinnedItemList: LazyLayoutPinnedItemList,
 ) : PinnableContainer, PinnableContainer.PinnedHandle, LazyLayoutPinnedItemList.PinnedItem {
     /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
index 87cf120..f32dda3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
@@ -50,11 +50,13 @@
                 scope.intervals,
                 nearestItemsRangeState.value,
                 itemContent = { interval, index ->
-                    LazyLayoutPinnableItem(index, state.pinnedItems) {
-                        interval.value.item.invoke(
-                            LazyStaggeredGridItemScopeImpl,
-                            index - interval.startIndex
-                        )
+                    val localIndex = index - interval.startIndex
+                    LazyLayoutPinnableItem(
+                        key = interval.value.key?.invoke(localIndex),
+                        index = index,
+                        pinnedItemList = state.pinnedItems
+                    ) {
+                        interval.value.item.invoke(LazyStaggeredGridItemScopeImpl, localIndex)
                     }
                 }
             ), LazyStaggeredGridItemProvider {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
index 1c38c19..3e8e43a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.fastMaxOfOrNull
 import androidx.compose.foundation.lazy.layout.LazyLayoutItemProvider
 import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope
+import androidx.compose.foundation.lazy.layout.findIndexByKey
 import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLaneInfo.Companion.FullSpan
 import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLaneInfo.Companion.Unset
 import androidx.compose.runtime.snapshots.Snapshot
@@ -792,12 +793,14 @@
 
     val pinnedItems = state.pinnedItems
     pinnedItems.fastForEach { item ->
-        if (filter(item.index)) {
-            val spanRange = itemProvider.getSpanRange(item.index, 0)
+        val index = itemProvider.findIndexByKey(item.key, item.index)
+
+        if (filter(index)) {
+            val spanRange = itemProvider.getSpanRange(index, 0)
             if (result == null) {
                 result = mutableListOf()
             }
-            val measuredItem = measuredItemProvider.getAndMeasure(item.index, spanRange)
+            val measuredItem = measuredItemProvider.getAndMeasure(index, spanRange)
             result?.add(position(measuredItem))
         }
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
index 13a2201..f6d7127 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerState.kt
@@ -240,7 +240,7 @@
         val pageUsedSpace = pageAvailableSpace.toFloat()
         if (pageUsedSpace == 0f) {
             // Default to 0 when there's no info about the page size yet.
-            0f
+            initialPageOffsetFraction
         } else {
             ((-currentPagePositionOffset) / (pageUsedSpace)).coerceIn(
                 MinPageOffset, MaxPageOffset
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
index 88f3b7b..d73e382 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
@@ -57,6 +57,7 @@
     val Delete: Key
     val Paste: Key
     val Cut: Key
+    val Copy: Key
     val Tab: Key
 }
 
@@ -111,6 +112,7 @@
                         MappedKeys.Delete -> KeyCommand.DELETE_NEXT_CHAR
                         MappedKeys.Paste -> KeyCommand.PASTE
                         MappedKeys.Cut -> KeyCommand.CUT
+                        MappedKeys.Copy -> KeyCommand.COPY
                         MappedKeys.Tab -> KeyCommand.TAB
                         else -> null
                     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
index 220d749..fc9ef47 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextPreparedSelection.kt
@@ -255,7 +255,7 @@
         return direction != ResolvedTextDirection.Rtl
     }
 
-    private fun TextLayoutResult.getNextWordOffsetForLayout(
+    private tailrec fun TextLayoutResult.getNextWordOffsetForLayout(
         currentOffset: Int = transformedEndOffset()
     ): Int {
         if (currentOffset >= originalText.length) {
@@ -269,10 +269,10 @@
         }
     }
 
-    private fun TextLayoutResult.getPrevWordOffset(
+    private tailrec fun TextLayoutResult.getPrevWordOffset(
         currentOffset: Int = transformedEndOffset()
     ): Int {
-        if (currentOffset < 0) {
+        if (currentOffset <= 0) {
             return 0
         }
         val currentWord = getWordBoundary(charOffset(currentOffset))
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
index 8a2d1df..94ab0b9 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/KeyMapping.desktop.kt
@@ -164,7 +164,7 @@
     actual val Delete: Key = Key(AwtKeyEvent.VK_DELETE)
     actual val Paste: Key = Key(AwtKeyEvent.VK_PASTE)
     actual val Cut: Key = Key(AwtKeyEvent.VK_CUT)
-    val Copy: Key = Key(AwtKeyEvent.VK_COPY)
+    actual val Copy: Key = Key(AwtKeyEvent.VK_COPY)
     actual val Tab: Key = Key(AwtKeyEvent.VK_TAB)
     val Space: Key = Key(AwtKeyEvent.VK_SPACE)
 }
diff --git a/compose/integration-tests/demos/OWNERS b/compose/integration-tests/demos/OWNERS
index c606664..ffc7965 100644
--- a/compose/integration-tests/demos/OWNERS
+++ b/compose/integration-tests/demos/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 378604
 adamp@google.com
 mount@google.com
 andreykulikov@google.com
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 ae58b8a..044a7ff 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
@@ -24,6 +24,7 @@
 import androidx.compose.material.demos.MaterialDemos
 import androidx.compose.material3.demos.Material3Demos
 import androidx.compose.ui.demos.CoreDemos
+import androidx.compose.ui.demos.AccessibilityDemos
 import androidx.navigation.compose.demos.NavigationDemos
 
 /**
@@ -39,6 +40,7 @@
         MaterialDemos,
         Material3Demos,
         NavigationDemos,
-        TextDemos
+        TextDemos,
+        AccessibilityDemos
     )
 )
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/OWNERS b/compose/integration-tests/docs-snippets/OWNERS
index 0cec323..b91ef39 100644
--- a/compose/integration-tests/docs-snippets/OWNERS
+++ b/compose/integration-tests/docs-snippets/OWNERS
@@ -10,4 +10,3 @@
 stamato@google.com
 riggaroo@google.com
 chrisarriola@google.com
-nickrout@google.com
\ No newline at end of file
diff --git a/compose/integration-tests/material-catalog/OWNERS b/compose/integration-tests/material-catalog/OWNERS
index 02f42a7..71f27c165 100644
--- a/compose/integration-tests/material-catalog/OWNERS
+++ b/compose/integration-tests/material-catalog/OWNERS
@@ -1,3 +1,3 @@
+# Bug component: 489623
 connieshi@google.com
-nickrout@google.com
 sgibly@google.com
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
index 6dd41f2..29098a8 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
@@ -25,7 +25,7 @@
 
 class ComposeIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues get(): List<Issue> {
         return listOf(
             ListIteratorDetector.ISSUE,
diff --git a/compose/material/material-icons-core/api/1.4.0-beta01.txt b/compose/material/material-icons-core/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.4.0-beta01.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta01.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/res-1.4.0-beta01.txt b/compose/material/material-icons-core/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-icons-core/api/res-1.4.0-beta01.txt
diff --git a/compose/material/material-icons-core/api/restricted_1.4.0-beta01.txt b/compose/material/material-icons-core/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..619d449
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,1037 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/BaseIconComparisonTest.kt b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/BaseIconComparisonTest.kt
new file mode 100644
index 0000000..08acde0
--- /dev/null
+++ b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/BaseIconComparisonTest.kt
@@ -0,0 +1,270 @@
+/*
+ * 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.material.icons
+
+import android.graphics.Bitmap
+import android.os.Build
+import android.view.View
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.paint
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.VectorGroup
+import androidx.compose.ui.graphics.vector.VectorPath
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.res.vectorResource
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.matchers.MSSIMMatcher
+import com.google.common.truth.Truth
+import kotlin.reflect.KProperty0
+import kotlin.reflect.jvm.javaGetter
+import org.junit.Rule
+
+const val ProgrammaticTestTag = "programmatic"
+const val XmlTestTag = "Xml"
+
+/**
+ * Base class for Material [androidx.compose.material.icons.Icons] tests.
+ */
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+abstract class BaseIconComparisonTest {
+
+    @get:Rule
+    val rule = createAndroidComposeRule<ComponentActivity>()
+
+    private val matcher = MSSIMMatcher(threshold = 0.99)
+
+    fun compareImageVectors(iconSublist: List<Pair<KProperty0<ImageVector>, String>>) {
+        iconSublist.forEach { (property, drawableName) ->
+            var xmlVector: ImageVector? = null
+            val programmaticVector = property.get()
+
+            rule.activityRule.scenario.onActivity {
+                it.setContent {
+                    xmlVector = drawableName.toImageVector()
+                    DrawVectors(programmaticVector, xmlVector!!)
+                }
+            }
+
+            rule.waitForIdle()
+
+            val iconName = property.javaGetter!!.declaringClass.canonicalName!!
+
+            // The XML inflated ImageVector doesn't have a name, and we set a name in the
+            // programmatic ImageVector. This doesn't affect how the ImageVector is drawn, so we
+            // make sure the names match so the comparison does not fail.
+            xmlVector = xmlVector!!.copy(name = programmaticVector.name)
+
+            assertImageVectorsAreEqual(xmlVector!!, programmaticVector, iconName)
+
+            matcher.assertBitmapsAreEqual(
+                rule.onNodeWithTag(XmlTestTag).captureToImage().asAndroidBitmap(),
+                rule.onNodeWithTag(ProgrammaticTestTag).captureToImage().asAndroidBitmap(),
+                iconName
+            )
+
+            // Dispose between composing each pair of icons to ensure correctness
+            rule.activityRule.scenario.onActivity {
+                it.setContentView(View(it))
+            }
+        }
+    }
+}
+
+/**
+ * Helper method to copy the existing [ImageVector] modifying the name
+ * for use in equality checks.
+ */
+private fun ImageVector.copy(name: String): ImageVector {
+    val builder = ImageVector.Builder(
+        name, defaultWidth, defaultHeight, viewportWidth, viewportHeight, tintColor, tintBlendMode
+    )
+    val root = this.root
+    // Stack of vector groups and current child index being traversed
+    val stack = ArrayList<Pair<Int, VectorGroup>>()
+    stack.add(Pair(0, root))
+
+    while (!stack.isEmpty()) {
+        val current = stack[stack.size - 1]
+        var currentIndex = current.first
+        var currentGroup = current.second
+        while (currentIndex < currentGroup.size) {
+            val vectorNode = currentGroup[currentIndex]
+            when (vectorNode) {
+                is VectorGroup -> {
+                    // keep track of the current index to continue parsing groups
+                    // when we eventually "pop" the stack of groups
+                    stack.add(Pair(currentIndex + 1, currentGroup))
+                    builder.addGroup(
+                        name = vectorNode.name,
+                        rotate = vectorNode.rotation,
+                        pivotX = vectorNode.pivotX,
+                        pivotY = vectorNode.pivotY,
+                        scaleX = vectorNode.scaleX,
+                        scaleY = vectorNode.scaleY,
+                        translationX = vectorNode.translationX,
+                        translationY = vectorNode.translationY,
+                        clipPathData = vectorNode.clipPathData
+                    )
+                    currentGroup = vectorNode
+                    currentIndex = 0
+                }
+
+                is VectorPath -> {
+                    builder.addPath(
+                        name = vectorNode.name,
+                        pathData = vectorNode.pathData,
+                        pathFillType = vectorNode.pathFillType,
+                        fill = vectorNode.fill,
+                        fillAlpha = vectorNode.fillAlpha,
+                        stroke = vectorNode.stroke,
+                        strokeAlpha = vectorNode.strokeAlpha,
+                        strokeLineWidth = vectorNode.strokeLineWidth,
+                        strokeLineCap = vectorNode.strokeLineCap,
+                        strokeLineJoin = vectorNode.strokeLineJoin,
+                        strokeLineMiter = vectorNode.strokeLineMiter,
+                        trimPathStart = vectorNode.trimPathStart,
+                        trimPathEnd = vectorNode.trimPathEnd,
+                        trimPathOffset = vectorNode.trimPathOffset
+                    )
+                }
+            }
+            currentIndex++
+        }
+        // "pop" the most recent group after we have examined each of the children
+        stack.removeAt(stack.size - 1)
+    }
+    return builder.build()
+}
+
+/**
+ * @return the [ImageVector] matching the drawable with [this] name.
+ */
+@Composable
+private fun String.toImageVector(): ImageVector {
+    val context = LocalContext.current
+    val resId = context.resources.getIdentifier(this, "drawable", context.packageName)
+    return ImageVector.vectorResource(resId)
+}
+
+/**
+ * Compares two [ImageVector]s and ensures that they are deeply equal, comparing all children
+ * recursively.
+ */
+private fun assertImageVectorsAreEqual(
+    xmlVector: ImageVector,
+    programmaticVector: ImageVector,
+    iconName: String
+) {
+    try {
+        Truth.assertThat(programmaticVector).isEqualTo(xmlVector)
+    } catch (e: AssertionError) {
+        val message = "ImageVector comparison failed for $iconName\n" + e.localizedMessage
+        throw AssertionError(message, e)
+    }
+}
+
+/**
+ * Compares each pixel in two bitmaps, asserting they are equal.
+ */
+private fun MSSIMMatcher.assertBitmapsAreEqual(
+    xmlBitmap: Bitmap,
+    programmaticBitmap: Bitmap,
+    iconName: String
+) {
+    try {
+        Truth.assertThat(programmaticBitmap.width).isEqualTo(xmlBitmap.width)
+        Truth.assertThat(programmaticBitmap.height).isEqualTo(xmlBitmap.height)
+    } catch (e: AssertionError) {
+        val message = "Bitmap comparison failed for $iconName\n" + e.localizedMessage
+        throw AssertionError(message, e)
+    }
+
+    val xmlPixelArray = with(xmlBitmap) {
+        val pixels = IntArray(width * height)
+        getPixels(pixels, 0, width, 0, 0, width, height)
+        pixels
+    }
+
+    val programmaticPixelArray = with(programmaticBitmap) {
+        val pixels = IntArray(width * height)
+        getPixels(pixels, 0, width, 0, 0, width, height)
+        pixels
+    }
+
+    val result = this.compareBitmaps(
+        xmlPixelArray, programmaticPixelArray,
+        programmaticBitmap.width, programmaticBitmap.height
+    )
+
+    if (!result.matches) {
+        throw AssertionError(
+            "Bitmap comparison failed for $iconName, stats: " +
+                "${result.comparisonStatistics}\n"
+        )
+    }
+}
+
+/**
+ * Renders both vectors in a column using the corresponding [ProgrammaticTestTag] and
+ * [XmlTestTag] for [programmaticVector] and [xmlVector].
+ */
+@Composable
+private fun DrawVectors(programmaticVector: ImageVector, xmlVector: ImageVector) {
+    Box {
+        // Ideally these icons would be 24 dp, but due to density changes across devices we test
+        // against in CI, on some devices using DP here causes there to be anti-aliasing issues.
+        // Using ipx directly ensures that we will always have a consistent layout / drawing
+        // story, so anti-aliasing should be identical.
+        val layoutSize = with(LocalDensity.current) {
+            Modifier.size(72.toDp())
+        }
+        Row(Modifier.align(Alignment.Center)) {
+            Box(
+                modifier = layoutSize
+                    .paint(
+                        rememberVectorPainter(programmaticVector),
+                        colorFilter = ColorFilter.tint(Color.Red)
+                    )
+                    .testTag(ProgrammaticTestTag)
+            )
+            Box(
+                modifier = layoutSize
+                    .paint(
+                        rememberVectorPainter(xmlVector),
+                        colorFilter = ColorFilter.tint(Color.Red)
+                    )
+                    .testTag(XmlTestTag)
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/CoreIconComparisonTest.kt b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/CoreIconComparisonTest.kt
new file mode 100644
index 0000000..e14b1da
--- /dev/null
+++ b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/CoreIconComparisonTest.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.icons
+
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.test.filters.LargeTest
+import kotlin.math.ceil
+import kotlin.math.roundToInt
+import kotlin.reflect.KProperty0
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test to ensure equality (both structurally, and visually) between programmatically generated core
+ * Material [androidx.compose.material.icons.Icons] and their XML source.
+ */
+@Suppress("unused")
+@LargeTest
+@RunWith(Parameterized::class)
+class CoreIconComparisonTest(
+    private val iconSublist: List<Pair<KProperty0<ImageVector>, String>>,
+    private val debugParameterName: String
+) : BaseIconComparisonTest() {
+
+    companion object {
+        /**
+         * Arbitrarily split [AllCoreIcons] into equal parts. This is needed as one test with the
+         * whole of [AllCoreIcons] will exceed the timeout allowed for a test in CI, so we split it
+         * up to stay under the limit.
+         *
+         * Additionally, we run large batches of comparisons per method, instead of one icon per
+         * method, so that we can re-use the same Activity instance between test runs. Most of the
+         * cost of a simple test like this is in Activity instantiation so re-using the same
+         * activity reduces time to run this test ~tenfold.
+         */
+        @JvmStatic
+        @Parameterized.Parameters(name = "{1}")
+        fun initIconSublist(): Array<Array<Any>> {
+            val numberOfChunks = 4
+            val listSize = ceil(AllCoreIcons.size / numberOfChunks.toFloat()).roundToInt()
+            val subLists = AllCoreIcons.chunked(listSize)
+            return subLists.mapIndexed { index, list ->
+                arrayOf(list, "${index + 1}of$numberOfChunks")
+            }.toTypedArray()
+        }
+    }
+
+    @Test
+    fun compareImageVectors() {
+        compareImageVectors(iconSublist)
+    }
+}
diff --git a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/ExtendedIconComparisonTest.kt b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/ExtendedIconComparisonTest.kt
new file mode 100644
index 0000000..f4b0d66
--- /dev/null
+++ b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/ExtendedIconComparisonTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.icons
+
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.test.filters.LargeTest
+import kotlin.math.ceil
+import kotlin.math.roundToInt
+import kotlin.reflect.KProperty0
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test to ensure equality (both structurally, and visually) between programmatically generated
+ * extended Material [androidx.compose.material.icons.Icons] and their XML source.
+ */
+@Suppress("unused")
+@LargeTest
+@RunWith(Parameterized::class)
+class ExtendedIconComparisonTest(
+    private val iconSublist: List<Pair<KProperty0<ImageVector>, String>>,
+    private val debugParameterName: String
+) : BaseIconComparisonTest() {
+
+    companion object {
+        /**
+         * Arbitrarily split [AllExtendedIcons] into equal parts. This is needed as one test with
+         * the whole of [AllExtendedIcons] will exceed the timeout allowed for a test in CI, so we
+         * split it up to stay under the limit.
+         *
+         * Additionally, we run large batches of comparisons per method, instead of one icon per
+         * method, so that we can re-use the same Activity instance between test runs. Most of the
+         * cost of a simple test like this is in Activity instantiation so re-using the same
+         * activity reduces time to run this test ~tenfold.
+         */
+        @JvmStatic
+        @Parameterized.Parameters(name = "{1}")
+        fun initIconSublist(): Array<Array<Any>> {
+            val numberOfChunks = 6
+            val listSize = ceil(AllExtendedIcons.size / numberOfChunks.toFloat()).roundToInt()
+            val subLists = AllExtendedIcons.chunked(listSize)
+            return subLists.mapIndexed { index, list ->
+                arrayOf(list, "${index + 1}of$numberOfChunks")
+            }.toTypedArray()
+        }
+    }
+
+    @Ignore("For performance reasons, and to be able to disable the extended icons tests on " +
+        "AOSP. Make sure to execute locally after updating the extended Material icons.")
+    @Test
+    fun compareImageVectors() {
+        compareImageVectors(iconSublist)
+    }
+}
diff --git a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt b/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt
deleted file mode 100644
index 3df1c7fb..0000000
--- a/compose/material/material-icons-extended/src/androidAndroidTest/kotlin/androidx/compose/material/icons/IconComparisonTest.kt
+++ /dev/null
@@ -1,302 +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.material.icons
-
-import android.graphics.Bitmap
-import android.os.Build
-import android.view.View
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.size
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.paint
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.ColorFilter
-import androidx.compose.ui.graphics.asAndroidBitmap
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.graphics.vector.VectorGroup
-import androidx.compose.ui.graphics.vector.VectorPath
-import androidx.compose.ui.graphics.vector.rememberVectorPainter
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.res.vectorResource
-import androidx.compose.ui.test.captureToImage
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.compose.ui.test.onNodeWithTag
-import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
-import androidx.test.screenshot.matchers.MSSIMMatcher
-import com.google.common.truth.Truth
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-import kotlin.math.ceil
-import kotlin.math.roundToInt
-import kotlin.reflect.KProperty0
-import kotlin.reflect.jvm.javaGetter
-
-const val ProgrammaticTestTag = "programmatic"
-const val XmlTestTag = "Xml"
-
-/**
- * Test to ensure equality (both structurally, and visually) between programmatically generated
- * Material [androidx.compose.material.icons.Icons] and their XML source.
- */
-@Suppress("unused")
-@LargeTest
-@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-@RunWith(Parameterized::class)
-class IconComparisonTest(
-    private val iconSublist: List<Pair<KProperty0<ImageVector>, String>>,
-    private val debugParameterName: String
-) {
-
-    companion object {
-        /**
-         * Arbitrarily split [AllIcons] into equal parts. This is needed as one test with the
-         * whole of [AllIcons] will exceed the timeout allowed for a test in CI, so we split it
-         * up to stay under the limit.
-         *
-         * Additionally, we run large batches of comparisons per method, instead of one icon per
-         * method, so that we can re-use the same Activity instance between test runs. Most of the
-         * cost of a simple test like this is in Activity instantiation so re-using the same
-         * activity reduces time to run this test ~tenfold.
-         */
-        @JvmStatic
-        @Parameterized.Parameters(name = "{1}")
-        fun initIconSublist(): Array<Array<Any>> {
-            val numberOfChunks = 6
-            val listSize = ceil(AllIcons.size / numberOfChunks.toFloat()).roundToInt()
-            val subLists = AllIcons.chunked(listSize)
-            return subLists.mapIndexed { index, list ->
-                arrayOf(list, "${index + 1}of$numberOfChunks")
-            }.toTypedArray()
-        }
-    }
-
-    @get:Rule
-    val rule = createAndroidComposeRule<ComponentActivity>()
-
-    private val matcher = MSSIMMatcher(threshold = 0.99)
-
-    @Test
-    fun compareImageVectors() {
-        iconSublist.forEach { (property, drawableName) ->
-            var xmlVector: ImageVector? = null
-            val programmaticVector = property.get()
-
-            rule.activityRule.scenario.onActivity {
-                it.setContent {
-                    xmlVector = drawableName.toImageVector()
-                    DrawVectors(programmaticVector, xmlVector!!)
-                }
-            }
-
-            rule.waitForIdle()
-
-            val iconName = property.javaGetter!!.declaringClass.canonicalName!!
-
-            // The XML inflated ImageVector doesn't have a name, and we set a name in the
-            // programmatic ImageVector. This doesn't affect how the ImageVector is drawn, so we
-            // make sure the names match so the comparison does not fail.
-            xmlVector = xmlVector!!.copy(name = programmaticVector.name)
-
-            assertImageVectorsAreEqual(xmlVector!!, programmaticVector, iconName)
-
-            matcher.assertBitmapsAreEqual(
-                rule.onNodeWithTag(XmlTestTag).captureToImage().asAndroidBitmap(),
-                rule.onNodeWithTag(ProgrammaticTestTag).captureToImage().asAndroidBitmap(),
-                iconName
-            )
-
-            // Dispose between composing each pair of icons to ensure correctness
-            rule.activityRule.scenario.onActivity {
-                it.setContentView(View(it))
-            }
-        }
-    }
-}
-
-/**
- * Helper method to copy the existing [ImageVector] modifying the name
- * for use in equality checks.
- */
-private fun ImageVector.copy(name: String): ImageVector {
-    val builder = ImageVector.Builder(
-        name, defaultWidth, defaultHeight, viewportWidth, viewportHeight, tintColor, tintBlendMode
-    )
-    val root = this.root
-    // Stack of vector groups and current child index being traversed
-    val stack = ArrayList<Pair<Int, VectorGroup>>()
-    stack.add(Pair(0, root))
-
-    while (!stack.isEmpty()) {
-        val current = stack[stack.size - 1]
-        var currentIndex = current.first
-        var currentGroup = current.second
-        while (currentIndex < currentGroup.size) {
-            val vectorNode = currentGroup[currentIndex]
-            when (vectorNode) {
-                is VectorGroup -> {
-                    // keep track of the current index to continue parsing groups
-                    // when we eventually "pop" the stack of groups
-                    stack.add(Pair(currentIndex + 1, currentGroup))
-                    builder.addGroup(
-                        name = vectorNode.name,
-                        rotate = vectorNode.rotation,
-                        pivotX = vectorNode.pivotX,
-                        pivotY = vectorNode.pivotY,
-                        scaleX = vectorNode.scaleX,
-                        scaleY = vectorNode.scaleY,
-                        translationX = vectorNode.translationX,
-                        translationY = vectorNode.translationY,
-                        clipPathData = vectorNode.clipPathData
-                    )
-                    currentGroup = vectorNode
-                    currentIndex = 0
-                }
-                is VectorPath -> {
-                    builder.addPath(
-                        name = vectorNode.name,
-                        pathData = vectorNode.pathData,
-                        pathFillType = vectorNode.pathFillType,
-                        fill = vectorNode.fill,
-                        fillAlpha = vectorNode.fillAlpha,
-                        stroke = vectorNode.stroke,
-                        strokeAlpha = vectorNode.strokeAlpha,
-                        strokeLineWidth = vectorNode.strokeLineWidth,
-                        strokeLineCap = vectorNode.strokeLineCap,
-                        strokeLineJoin = vectorNode.strokeLineJoin,
-                        strokeLineMiter = vectorNode.strokeLineMiter,
-                        trimPathStart = vectorNode.trimPathStart,
-                        trimPathEnd = vectorNode.trimPathEnd,
-                        trimPathOffset = vectorNode.trimPathOffset
-                    )
-                }
-            }
-            currentIndex++
-        }
-        // "pop" the most recent group after we have examined each of the children
-        stack.removeAt(stack.size - 1)
-    }
-    return builder.build()
-}
-
-/**
- * @return the [ImageVector] matching the drawable with [this] name.
- */
-@Composable
-private fun String.toImageVector(): ImageVector {
-    val context = LocalContext.current
-    val resId = context.resources.getIdentifier(this, "drawable", context.packageName)
-    return ImageVector.vectorResource(resId)
-}
-
-/**
- * Compares two [ImageVector]s and ensures that they are deeply equal, comparing all children
- * recursively.
- */
-private fun assertImageVectorsAreEqual(
-    xmlVector: ImageVector,
-    programmaticVector: ImageVector,
-    iconName: String
-) {
-    try {
-        Truth.assertThat(programmaticVector).isEqualTo(xmlVector)
-    } catch (e: AssertionError) {
-        val message = "ImageVector comparison failed for $iconName\n" + e.localizedMessage
-        throw AssertionError(message, e)
-    }
-}
-
-/**
- * Compares each pixel in two bitmaps, asserting they are equal.
- */
-private fun MSSIMMatcher.assertBitmapsAreEqual(
-    xmlBitmap: Bitmap,
-    programmaticBitmap: Bitmap,
-    iconName: String
-) {
-    try {
-        Truth.assertThat(programmaticBitmap.width).isEqualTo(xmlBitmap.width)
-        Truth.assertThat(programmaticBitmap.height).isEqualTo(xmlBitmap.height)
-    } catch (e: AssertionError) {
-        val message = "Bitmap comparison failed for $iconName\n" + e.localizedMessage
-        throw AssertionError(message, e)
-    }
-
-    val xmlPixelArray = with(xmlBitmap) {
-        val pixels = IntArray(width * height)
-        getPixels(pixels, 0, width, 0, 0, width, height)
-        pixels
-    }
-
-    val programmaticPixelArray = with(programmaticBitmap) {
-        val pixels = IntArray(width * height)
-        getPixels(pixels, 0, width, 0, 0, width, height)
-        pixels
-    }
-
-    val result = this.compareBitmaps(
-        xmlPixelArray, programmaticPixelArray,
-        programmaticBitmap.width, programmaticBitmap.height
-    )
-
-    if (!result.matches) {
-        throw AssertionError(
-            "Bitmap comparison failed for $iconName, stats: " +
-                "${result.comparisonStatistics}\n"
-        )
-    }
-}
-
-/**
- * Renders both vectors in a column using the corresponding [ProgrammaticTestTag] and
- * [XmlTestTag] for [programmaticVector] and [xmlVector].
- */
-@Composable
-private fun DrawVectors(programmaticVector: ImageVector, xmlVector: ImageVector) {
-    Box {
-        // Ideally these icons would be 24 dp, but due to density changes across devices we test
-        // against in CI, on some devices using DP here causes there to be anti-aliasing issues.
-        // Using ipx directly ensures that we will always have a consistent layout / drawing
-        // story, so anti-aliasing should be identical.
-        val layoutSize = with(LocalDensity.current) {
-            Modifier.size(72.toDp())
-        }
-        Row(Modifier.align(Alignment.Center)) {
-            Box(
-                modifier = layoutSize.paint(
-                    rememberVectorPainter(programmaticVector),
-                    colorFilter = ColorFilter.tint(Color.Red)
-                ).testTag(ProgrammaticTestTag)
-            )
-            Box(
-                modifier = layoutSize.paint(
-                    rememberVectorPainter(xmlVector),
-                    colorFilter = ColorFilter.tint(Color.Red)
-                ).testTag(XmlTestTag)
-            )
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
index 75ce926..f7b3b43 100644
--- a/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
+++ b/compose/material/material-lint/src/main/java/androidx/compose/material/lint/MaterialIssueRegistry.kt
@@ -25,7 +25,7 @@
  */
 class MaterialIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ColorsDetector.ConflictingOnColor,
diff --git a/compose/material/material-ripple/api/1.4.0-beta01.txt b/compose/material/material-ripple/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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 RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/current.ignore b/compose/material/material-ripple/api/current.ignore
new file mode 100644
index 0000000..ae07b75
--- /dev/null
+++ b/compose/material/material-ripple/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material.ripple.RippleAnimationKt:
+    Removed class androidx.compose.material.ripple.RippleAnimationKt
diff --git a/compose/material/material-ripple/api/current.txt b/compose/material/material-ripple/api/current.txt
index 32f4093..6dba36f 100644
--- a/compose/material/material-ripple/api/current.txt
+++ b/compose/material/material-ripple/api/current.txt
@@ -13,9 +13,6 @@
     property public final float pressedAlpha;
   }
 
-  public final class RippleAnimationKt {
-  }
-
   public final class RippleKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
   }
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.4.0-beta01.txt b/compose/material/material-ripple/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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 RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/public_plus_experimental_current.txt b/compose/material/material-ripple/api/public_plus_experimental_current.txt
index 32f4093..6dba36f 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_current.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_current.txt
@@ -13,9 +13,6 @@
     property public final float pressedAlpha;
   }
 
-  public final class RippleAnimationKt {
-  }
-
   public final class RippleKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
   }
diff --git a/compose/material/material-ripple/api/res-1.4.0-beta01.txt b/compose/material/material-ripple/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-ripple/api/res-1.4.0-beta01.txt
diff --git a/compose/material/material-ripple/api/restricted_1.4.0-beta01.txt b/compose/material/material-ripple/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..6dba36f
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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 RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/restricted_current.ignore b/compose/material/material-ripple/api/restricted_current.ignore
new file mode 100644
index 0000000..ae07b75
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material.ripple.RippleAnimationKt:
+    Removed class androidx.compose.material.ripple.RippleAnimationKt
diff --git a/compose/material/material-ripple/api/restricted_current.txt b/compose/material/material-ripple/api/restricted_current.txt
index 32f4093..6dba36f 100644
--- a/compose/material/material-ripple/api/restricted_current.txt
+++ b/compose/material/material-ripple/api/restricted_current.txt
@@ -13,9 +13,6 @@
     property public final float pressedAlpha;
   }
 
-  public final class RippleAnimationKt {
-  }
-
   public final class RippleKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
   }
diff --git a/compose/material/material/api/1.4.0-beta01.txt b/compose/material/material/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..a8f3f39
--- /dev/null
+++ b/compose/material/material/api/1.4.0-beta01.txt
@@ -0,0 +1,628 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    method public static androidx.compose.material.DismissDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissDirection[] values();
+    enum_constant public static final androidx.compose.material.DismissDirection EndToStart;
+    enum_constant public static final androidx.compose.material.DismissDirection StartToEnd;
+  }
+
+  public enum DismissValue {
+    method public static androidx.compose.material.DismissValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissValue[] values();
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method public suspend Object? snapTo(androidx.compose.material.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 {
+    method public static androidx.compose.material.DrawerValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DrawerValue[] values();
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class InteractiveComponentSizeKt {
+    method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
+  }
+
+  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 ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarDuration[] values();
+    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>);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarResult[] values();
+    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(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 SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldDefaults {
+    method public float getFocusedBorderThickness();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getOutlinedTextFieldShape();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getTextFieldShape();
+    method public float getUnfocusedBorderThickness();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    property public final float FocusedBorderThickness;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape OutlinedTextFieldShape;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape TextFieldShape;
+    property public final float UnfocusedBorderThickness;
+    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 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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  @androidx.compose.runtime.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;
+  }
+
+}
+
diff --git a/compose/material/material/api/current.ignore b/compose/material/material/api/current.ignore
index 2bb29aa..d24bb34 100644
--- a/compose/material/material/api/current.ignore
+++ b/compose/material/material/api/current.ignore
@@ -1,3 +1,49 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.material.AlertDialogKt:
+    Removed class androidx.compose.material.AlertDialogKt
+RemovedClass: androidx.compose.material.BackdropScaffoldKt:
+    Removed class androidx.compose.material.BackdropScaffoldKt
+RemovedClass: androidx.compose.material.BottomSheetScaffoldKt:
+    Removed class androidx.compose.material.BottomSheetScaffoldKt
+RemovedClass: androidx.compose.material.ChipKt:
+    Removed class androidx.compose.material.ChipKt
+RemovedClass: androidx.compose.material.DragGestureDetectorCopyKt:
+    Removed class androidx.compose.material.DragGestureDetectorCopyKt
+RemovedClass: androidx.compose.material.ElevationKt:
+    Removed class androidx.compose.material.ElevationKt
+RemovedClass: androidx.compose.material.ExposedDropdownMenuKt:
+    Removed class androidx.compose.material.ExposedDropdownMenuKt
+RemovedClass: androidx.compose.material.ListItemKt:
+    Removed class androidx.compose.material.ListItemKt
+RemovedClass: androidx.compose.material.MaterialTextSelectionColorsKt:
+    Removed class androidx.compose.material.MaterialTextSelectionColorsKt
+RemovedClass: androidx.compose.material.MaterialTheme_androidKt:
+    Removed class androidx.compose.material.MaterialTheme_androidKt
+RemovedClass: androidx.compose.material.MenuKt:
+    Removed class androidx.compose.material.MenuKt
+RemovedClass: androidx.compose.material.ModalBottomSheetKt:
+    Removed class androidx.compose.material.ModalBottomSheetKt
+RemovedClass: androidx.compose.material.ShapesKt:
+    Removed class androidx.compose.material.ShapesKt
+RemovedClass: androidx.compose.material.Strings_androidKt:
+    Removed class androidx.compose.material.Strings_androidKt
+RemovedClass: androidx.compose.material.SwipeToDismissKt:
+    Removed class androidx.compose.material.SwipeToDismissKt
+RemovedClass: androidx.compose.material.SwipeableKt:
+    Removed class androidx.compose.material.SwipeableKt
+RemovedClass: androidx.compose.material.SwipeableV2Kt:
+    Removed class androidx.compose.material.SwipeableV2Kt
+RemovedClass: androidx.compose.material.TextFieldDefaultsKt:
+    Removed class androidx.compose.material.TextFieldDefaultsKt
+RemovedClass: androidx.compose.material.TextFieldImplKt:
+    Removed class androidx.compose.material.TextFieldImplKt
 RemovedClass: androidx.compose.material.TouchTargetKt:
     Removed class androidx.compose.material.TouchTargetKt
+RemovedClass: androidx.compose.material.TypographyKt:
+    Removed class androidx.compose.material.TypographyKt
+
+
+RemovedPackage: androidx.compose.material.internal:
+    Removed package androidx.compose.material.internal
+RemovedPackage: androidx.compose.material.pullrefresh:
+    Removed package androidx.compose.material.pullrefresh
diff --git a/compose/material/material/api/current.txt b/compose/material/material/api/current.txt
index 10fa729..a8f3f39 100644
--- a/compose/material/material/api/current.txt
+++ b/compose/material/material/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material {
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
@@ -44,9 +41,6 @@
     field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
   }
 
-  public final class BackdropScaffoldKt {
-  }
-
   public final class BadgeKt {
     method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
     method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
@@ -71,9 +65,6 @@
     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);
@@ -135,9 +126,6 @@
     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);
   }
 
-  public final class ChipKt {
-  }
-
   @androidx.compose.runtime.Stable public final class Colors {
     ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
     method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
@@ -216,9 +204,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -260,9 +245,6 @@
     enum_constant public static final androidx.compose.material.DrawerValue Open;
   }
 
-  public final class ElevationKt {
-  }
-
   public interface ElevationOverlay {
     method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
   }
@@ -274,9 +256,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
   }
 
-  public final class ExposedDropdownMenuKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FabPosition {
     field public static final androidx.compose.material.FabPosition.Companion Companion;
   }
@@ -318,12 +297,6 @@
     method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
   }
 
-  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();
@@ -338,18 +311,12 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class MaterialTheme_androidKt {
-  }
-
   public final class MenuDefaults {
     method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
     property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
     field public static final androidx.compose.material.MenuDefaults INSTANCE;
   }
 
-  public final class MenuKt {
-  }
-
   public final class ModalBottomSheetDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -358,9 +325,6 @@
     field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
   }
 
-  public final class ModalBottomSheetKt {
-  }
-
   public final class NavigationRailDefaults {
     method public float getElevation();
     property public final float Elevation;
@@ -447,9 +411,6 @@
     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);
@@ -520,16 +481,10 @@
     enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class SwipeToDismissKt {
-  }
-
   public final class SwipeableDefaults {
     method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
     method public float getVelocityThreshold();
@@ -541,12 +496,6 @@
     field public static final float StiffResistanceFactor = 20.0f;
   }
 
-  public final class SwipeableKt {
-  }
-
-  public final class SwipeableV2Kt {
-  }
-
   @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);
@@ -627,12 +576,6 @@
     field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
@@ -681,31 +624,5 @@
     property public final androidx.compose.ui.text.TextStyle subtitle2;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
-}
-
-package androidx.compose.material.pullrefresh {
-
-  public final class PullRefreshIndicatorKt {
-  }
-
-  public final class PullRefreshIndicatorTransformKt {
-  }
-
-  public final class PullRefreshKt {
-  }
-
-  public final class PullRefreshStateKt {
-  }
-
 }
 
diff --git a/compose/material/material/api/public_plus_experimental_1.4.0-beta01.txt b/compose/material/material/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..9ae0deb
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,966 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BackdropScaffold(kotlin.jvm.functions.Function0<kotlin.Unit> appBar, kotlin.jvm.functions.Function0<kotlin.Unit> backLayerContent, kotlin.jvm.functions.Function0<kotlin.Unit> frontLayerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BackdropScaffoldState scaffoldState, optional boolean gesturesEnabled, optional float peekHeight, optional float headerHeight, optional boolean persistentAppBar, optional boolean stickyFrontLayer, optional long backLayerBackgroundColor, optional long backLayerContentColor, optional androidx.compose.ui.graphics.Shape frontLayerShape, optional float frontLayerElevation, optional long frontLayerBackgroundColor, optional long frontLayerContentColor, optional long frontLayerScrimColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BackdropScaffoldState rememberBackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BackdropScaffoldState extends androidx.compose.material.SwipeableState<androidx.compose.material.BackdropValue> {
+    ctor public BackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public suspend Object? conceal(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    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 {
+    method public static androidx.compose.material.BackdropValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.BackdropValue[] values();
+    enum_constant public static final androidx.compose.material.BackdropValue Concealed;
+    enum_constant public static final androidx.compose.material.BackdropValue Revealed;
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class BottomDrawerState extends androidx.compose.material.SwipeableState<androidx.compose.material.BottomDrawerValue> {
+    ctor public BottomDrawerState(androidx.compose.material.BottomDrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean isClosed();
+    method public boolean isExpanded();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 {
+    method public static androidx.compose.material.BottomDrawerValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.BottomDrawerValue[] values();
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Closed;
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Expanded;
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Open;
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional int floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @Deprecated @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.material.BottomSheetState BottomSheetScaffoldState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+    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 {
+    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> confirmValueChange);
+    method public suspend Object? collapse(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.material.BottomSheetValue getCurrentValue();
+    method @Deprecated public float getOffset();
+    method public float getProgress();
+    method public boolean isCollapsed();
+    method public boolean isExpanded();
+    method public float requireOffset();
+    property public final androidx.compose.material.BottomSheetValue currentValue;
+    property public final boolean isCollapsed;
+    property public final boolean isExpanded;
+    property @Deprecated public final float offset;
+    property public final float progress;
+    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 {
+    method public static androidx.compose.material.BottomSheetValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.BottomSheetValue[] values();
+    enum_constant public static final androidx.compose.material.BottomSheetValue Collapsed;
+    enum_constant public static final androidx.compose.material.BottomSheetValue Expanded;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ChipColors {
+    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);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconContentColor(boolean enabled);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ChipDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ChipColors chipColors(optional long backgroundColor, optional long contentColor, optional long leadingIconContentColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledLeadingIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SelectableChipColors filterChipColors(optional long backgroundColor, optional long contentColor, optional long leadingIconColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledLeadingIconColor, optional long selectedBackgroundColor, optional long selectedContentColor, optional long selectedLeadingIconColor);
+    method public float getLeadingIconSize();
+    method public float getMinHeight();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public float getSelectedIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ChipColors outlinedChipColors(optional long backgroundColor, optional long contentColor, optional long leadingIconContentColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledLeadingIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SelectableChipColors outlinedFilterChipColors(optional long backgroundColor, optional long contentColor, optional long leadingIconColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledLeadingIconColor, optional long selectedBackgroundColor, optional long selectedContentColor, optional long selectedLeadingIconColor);
+    property public final float LeadingIconSize;
+    property public final float MinHeight;
+    property public final float OutlinedBorderSize;
+    property public final float SelectedIconSize;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final float ContentOpacity = 0.87f;
+    field public static final androidx.compose.material.ChipDefaults INSTANCE;
+    field public static final float LeadingIconOpacity = 0.54f;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  public final class ChipKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Chip(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.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ChipColors colors, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void FilterChip(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.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.SelectableChipColors colors, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? selectedIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    method public static androidx.compose.material.DismissDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissDirection[] values();
+    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>);
+    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>);
+    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 {
+    method public static androidx.compose.material.DismissValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissValue[] values();
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomDrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomDrawerState rememberBottomDrawerState(androidx.compose.material.BottomDrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method @Deprecated @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>);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.material.DrawerValue getCurrentValue();
+    method @androidx.compose.material.ExperimentalMaterialApi public 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>);
+    method public suspend Object? snapTo(androidx.compose.material.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 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 {
+    method public static androidx.compose.material.DrawerValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DrawerValue[] values();
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalMaterialApi {
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @kotlin.jvm.JvmDefaultWithCompatibility public interface ExposedDropdownMenuBoxScope {
+    method @androidx.compose.runtime.Composable public default void ExposedDropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method public androidx.compose.ui.Modifier exposedDropdownSize(androidx.compose.ui.Modifier, optional boolean matchTextFieldWidth);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ExposedDropdownMenuDefaults {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void TrailingIcon(boolean expanded, optional kotlin.jvm.functions.Function0<kotlin.Unit> onIconClick);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    field public static final androidx.compose.material.ExposedDropdownMenuDefaults INSTANCE;
+  }
+
+  public final class ExposedDropdownMenuKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
+  }
+
+  @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
+    ctor public FixedThreshold(float offset);
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method public androidx.compose.material.FixedThreshold copy-0680j_4(float offset);
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FractionalThreshold implements androidx.compose.material.ThresholdConfig {
+    ctor public FractionalThreshold(float fraction);
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method public androidx.compose.material.FractionalThreshold copy(float fraction);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class InteractiveComponentSizeKt {
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumInteractiveComponentEnforcement();
+    method @Deprecated @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
+    property @androidx.compose.material.ExperimentalMaterialApi public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumInteractiveComponentEnforcement;
+    property @Deprecated @androidx.compose.material.ExperimentalMaterialApi public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
+  }
+
+  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 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 ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ModalBottomSheetLayout(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ModalBottomSheetState sheetState, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.material.ModalBottomSheetState 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> confirmValueChange, optional boolean isSkipHalfExpanded);
+    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> confirmValueChange, optional boolean skipHalfExpanded);
+    method @Deprecated @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, boolean skipHalfExpanded, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method @Deprecated @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, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState {
+    ctor @Deprecated public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional boolean isSkipHalfExpanded, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    ctor @Deprecated public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public androidx.compose.material.ModalBottomSheetValue getCurrentValue();
+    method public androidx.compose.material.ModalBottomSheetValue getTargetValue();
+    method public suspend Object? hide(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public boolean isVisible();
+    method public suspend Object? show(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final androidx.compose.material.ModalBottomSheetValue currentValue;
+    property public final boolean isVisible;
+    property public final androidx.compose.material.ModalBottomSheetValue targetValue;
+    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> confirmValueChange, boolean skipHalfExpanded);
+    method @Deprecated public androidx.compose.runtime.saveable.Saver<androidx.compose.material.ModalBottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, boolean skipHalfExpanded, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum ModalBottomSheetValue {
+    method public static androidx.compose.material.ModalBottomSheetValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.ModalBottomSheetValue[] values();
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue Expanded;
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue HalfExpanded;
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue Hidden;
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public interface SelectableChipColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled, boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled, boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean selected);
+  }
+
+  @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;
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> value, kotlin.jvm.functions.Function1<? super kotlin.ranges.ClosedFloatingPointRange<java.lang.Float>,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material.SliderColors colors);
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarDuration[] values();
+    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>);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarResult[] values();
+    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(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(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.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class SwipeProgress<T> {
+    ctor public SwipeProgress(T? from, T? to, float fraction);
+    method public float getFraction();
+    method public T! getFrom();
+    method public T! getTo();
+    property public final float fraction;
+    property public final T! from;
+    property public final T! to;
+  }
+
+  public final class SwipeToDismissKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void SwipeToDismiss(androidx.compose.material.DismissState state, optional androidx.compose.ui.Modifier modifier, optional java.util.Set<? extends androidx.compose.material.DismissDirection> directions, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissDirection,? extends androidx.compose.material.ThresholdConfig> dismissThresholds, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> background, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> dismissContent);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.DismissState rememberDismissState(optional androidx.compose.material.DismissValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static <T> androidx.compose.material.SwipeableState<T> rememberSwipeableState(T initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends androidx.compose.material.ThresholdConfig> thresholds, optional androidx.compose.material.ResistanceConfig? resistance, optional float velocityThreshold);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public class SwipeableState<T> {
+    ctor public SwipeableState(T? initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public final suspend Object? animateTo(T? targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method @androidx.compose.material.ExperimentalMaterialApi public final suspend Object? snapTo(T? targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final T! currentValue;
+    property @androidx.compose.material.ExperimentalMaterialApi 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 @androidx.compose.material.ExperimentalMaterialApi public final androidx.compose.material.SwipeProgress<T> progress;
+    property @androidx.compose.material.ExperimentalMaterialApi public final T! targetValue;
+    field public static final androidx.compose.material.SwipeableState.Companion Companion;
+  }
+
+  public static final class SwipeableState.Companion {
+    method public <T> androidx.compose.runtime.saveable.Saver<androidx.compose.material.SwipeableState<T>,T> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @kotlin.jvm.JvmDefaultWithCompatibility public interface TextFieldColorsWithIcons extends androidx.compose.material.TextFieldColors {
+    method @androidx.compose.runtime.Composable public default androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public default androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldDefaults {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void BorderBox(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.material.TextFieldColors colors, optional androidx.compose.ui.graphics.Shape shape, optional float focusedBorderThickness, optional float unfocusedBorderThickness);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void OutlinedTextFieldDecorationBox(String value, kotlin.jvm.functions.Function0<kotlin.Unit> innerTextField, boolean enabled, boolean singleLine, androidx.compose.ui.text.input.VisualTransformation visualTransformation, androidx.compose.foundation.interaction.InteractionSource interactionSource, optional boolean isError, 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 androidx.compose.material.TextFieldColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional kotlin.jvm.functions.Function0<kotlin.Unit> border);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void TextFieldDecorationBox(String value, kotlin.jvm.functions.Function0<kotlin.Unit> innerTextField, boolean enabled, boolean singleLine, androidx.compose.ui.text.input.VisualTransformation visualTransformation, androidx.compose.foundation.interaction.InteractionSource interactionSource, optional boolean isError, 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 androidx.compose.material.TextFieldColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method public float getFocusedBorderThickness();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getOutlinedTextFieldShape();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getTextFieldShape();
+    method public float getUnfocusedBorderThickness();
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.ui.Modifier indicatorLine(androidx.compose.ui.Modifier, boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.material.TextFieldColors colors, optional float focusedIndicatorLineThickness, optional float unfocusedIndicatorLineThickness);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.foundation.layout.PaddingValues outlinedTextFieldPadding(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.foundation.layout.PaddingValues textFieldWithLabelPadding(optional float start, optional float end, optional float top, optional float bottom);
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.foundation.layout.PaddingValues textFieldWithoutLabelPadding(optional float start, optional float top, optional float end, optional float bottom);
+    property public final float FocusedBorderThickness;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape OutlinedTextFieldShape;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape TextFieldShape;
+    property public final float UnfocusedBorderThickness;
+    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 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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+  }
+
+  @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;
+  }
+
+}
+
+package androidx.compose.material.pullrefresh {
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class PullRefreshDefaults {
+    method public float getRefreshThreshold();
+    method public float getRefreshingOffset();
+    property public final float RefreshThreshold;
+    property public final float RefreshingOffset;
+    field public static final androidx.compose.material.pullrefresh.PullRefreshDefaults INSTANCE;
+  }
+
+  public final class PullRefreshIndicatorKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void PullRefreshIndicator(boolean refreshing, androidx.compose.material.pullrefresh.PullRefreshState state, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional boolean scale);
+  }
+
+  public final class PullRefreshIndicatorTransformKt {
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.ui.Modifier pullRefreshIndicatorTransform(androidx.compose.ui.Modifier, androidx.compose.material.pullrefresh.PullRefreshState state, optional boolean scale);
+  }
+
+  public final class PullRefreshKt {
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.ui.Modifier pullRefresh(androidx.compose.ui.Modifier, androidx.compose.material.pullrefresh.PullRefreshState state, optional boolean enabled);
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.ui.Modifier pullRefresh(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onPull, kotlin.jvm.functions.Function2<? super java.lang.Float,? super kotlin.coroutines.Continuation<? super java.lang.Float>,?> onRelease, optional boolean enabled);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class PullRefreshState {
+    method public float getProgress();
+    property public final float progress;
+  }
+
+  public final class PullRefreshStateKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.pullrefresh.PullRefreshState rememberPullRefreshState(boolean refreshing, kotlin.jvm.functions.Function0<kotlin.Unit> onRefresh, optional float refreshThreshold, optional float refreshingOffset);
+  }
+
+}
+
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index b032320..9ae0deb 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material {
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
@@ -125,6 +122,7 @@
 
   public final class BottomSheetScaffoldKt {
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional int floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @Deprecated @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.material.BottomSheetState BottomSheetScaffoldState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
     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);
   }
@@ -139,14 +137,21 @@
     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);
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BottomSheetState {
+    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> confirmValueChange);
     method public suspend Object? collapse(kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.material.BottomSheetValue getCurrentValue();
+    method @Deprecated public float getOffset();
+    method public float getProgress();
     method public boolean isCollapsed();
     method public boolean isExpanded();
+    method public float requireOffset();
+    property public final androidx.compose.material.BottomSheetValue currentValue;
     property public final boolean isCollapsed;
     property public final boolean isExpanded;
+    property @Deprecated public final float offset;
+    property public final float progress;
     field public static final androidx.compose.material.BottomSheetState.Companion Companion;
   }
 
@@ -348,9 +353,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -399,9 +401,6 @@
     enum_constant public static final androidx.compose.material.DrawerValue Open;
   }
 
-  public final class ElevationKt {
-  }
-
   public interface ElevationOverlay {
     method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
   }
@@ -493,9 +492,6 @@
     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();
@@ -510,18 +506,12 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class MaterialTheme_androidKt {
-  }
-
   public final class MenuDefaults {
     method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
     property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
     field public static final androidx.compose.material.MenuDefaults INSTANCE;
   }
 
-  public final class MenuKt {
-  }
-
   public final class ModalBottomSheetDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -657,9 +647,6 @@
     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);
@@ -731,9 +718,6 @@
     enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -800,9 +784,6 @@
     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);
   }
 
-  public final class SwipeableV2Kt {
-  }
-
   @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);
@@ -895,12 +876,6 @@
     field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
@@ -953,16 +928,6 @@
     property public final androidx.compose.ui.text.TextStyle subtitle2;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
 }
 
 package androidx.compose.material.pullrefresh {
diff --git a/compose/material/material/api/res-1.4.0-beta01.txt b/compose/material/material/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material/api/res-1.4.0-beta01.txt
diff --git a/compose/material/material/api/restricted_1.4.0-beta01.txt b/compose/material/material/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..a8f3f39
--- /dev/null
+++ b/compose/material/material/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,628 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable 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 @androidx.compose.runtime.NonRestartableComposable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    method public static androidx.compose.material.DismissDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissDirection[] values();
+    enum_constant public static final androidx.compose.material.DismissDirection EndToStart;
+    enum_constant public static final androidx.compose.material.DismissDirection StartToEnd;
+  }
+
+  public enum DismissValue {
+    method public static androidx.compose.material.DismissValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DismissValue[] values();
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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>);
+    method public suspend Object? snapTo(androidx.compose.material.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 {
+    method public static androidx.compose.material.DrawerValue valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.DrawerValue[] values();
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class InteractiveComponentSizeKt {
+    method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
+  }
+
+  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 ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @Deprecated @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor, optional int strokeCap);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    method public static androidx.compose.material.SnackbarDuration valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarDuration[] values();
+    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>);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    method public static androidx.compose.material.SnackbarResult valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.material.SnackbarResult[] values();
+    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(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 SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldDefaults {
+    method public float getFocusedBorderThickness();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getOutlinedTextFieldShape();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.ui.graphics.Shape getTextFieldShape();
+    method public float getUnfocusedBorderThickness();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    property public final float FocusedBorderThickness;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape OutlinedTextFieldShape;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.ui.graphics.Shape TextFieldShape;
+    property public final float UnfocusedBorderThickness;
+    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 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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @Deprecated @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends 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 @Deprecated @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,? extends 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<? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<? extends kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class TextKt {
+    method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, 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 @Deprecated @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,? extends androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,? extends kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  @androidx.compose.runtime.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;
+  }
+
+}
+
diff --git a/compose/material/material/api/restricted_current.ignore b/compose/material/material/api/restricted_current.ignore
index 2bb29aa..d24bb34 100644
--- a/compose/material/material/api/restricted_current.ignore
+++ b/compose/material/material/api/restricted_current.ignore
@@ -1,3 +1,49 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.material.AlertDialogKt:
+    Removed class androidx.compose.material.AlertDialogKt
+RemovedClass: androidx.compose.material.BackdropScaffoldKt:
+    Removed class androidx.compose.material.BackdropScaffoldKt
+RemovedClass: androidx.compose.material.BottomSheetScaffoldKt:
+    Removed class androidx.compose.material.BottomSheetScaffoldKt
+RemovedClass: androidx.compose.material.ChipKt:
+    Removed class androidx.compose.material.ChipKt
+RemovedClass: androidx.compose.material.DragGestureDetectorCopyKt:
+    Removed class androidx.compose.material.DragGestureDetectorCopyKt
+RemovedClass: androidx.compose.material.ElevationKt:
+    Removed class androidx.compose.material.ElevationKt
+RemovedClass: androidx.compose.material.ExposedDropdownMenuKt:
+    Removed class androidx.compose.material.ExposedDropdownMenuKt
+RemovedClass: androidx.compose.material.ListItemKt:
+    Removed class androidx.compose.material.ListItemKt
+RemovedClass: androidx.compose.material.MaterialTextSelectionColorsKt:
+    Removed class androidx.compose.material.MaterialTextSelectionColorsKt
+RemovedClass: androidx.compose.material.MaterialTheme_androidKt:
+    Removed class androidx.compose.material.MaterialTheme_androidKt
+RemovedClass: androidx.compose.material.MenuKt:
+    Removed class androidx.compose.material.MenuKt
+RemovedClass: androidx.compose.material.ModalBottomSheetKt:
+    Removed class androidx.compose.material.ModalBottomSheetKt
+RemovedClass: androidx.compose.material.ShapesKt:
+    Removed class androidx.compose.material.ShapesKt
+RemovedClass: androidx.compose.material.Strings_androidKt:
+    Removed class androidx.compose.material.Strings_androidKt
+RemovedClass: androidx.compose.material.SwipeToDismissKt:
+    Removed class androidx.compose.material.SwipeToDismissKt
+RemovedClass: androidx.compose.material.SwipeableKt:
+    Removed class androidx.compose.material.SwipeableKt
+RemovedClass: androidx.compose.material.SwipeableV2Kt:
+    Removed class androidx.compose.material.SwipeableV2Kt
+RemovedClass: androidx.compose.material.TextFieldDefaultsKt:
+    Removed class androidx.compose.material.TextFieldDefaultsKt
+RemovedClass: androidx.compose.material.TextFieldImplKt:
+    Removed class androidx.compose.material.TextFieldImplKt
 RemovedClass: androidx.compose.material.TouchTargetKt:
     Removed class androidx.compose.material.TouchTargetKt
+RemovedClass: androidx.compose.material.TypographyKt:
+    Removed class androidx.compose.material.TypographyKt
+
+
+RemovedPackage: androidx.compose.material.internal:
+    Removed package androidx.compose.material.internal
+RemovedPackage: androidx.compose.material.pullrefresh:
+    Removed package androidx.compose.material.pullrefresh
diff --git a/compose/material/material/api/restricted_current.txt b/compose/material/material/api/restricted_current.txt
index 10fa729..a8f3f39 100644
--- a/compose/material/material/api/restricted_current.txt
+++ b/compose/material/material/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material {
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
@@ -44,9 +41,6 @@
     field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
   }
 
-  public final class BackdropScaffoldKt {
-  }
-
   public final class BadgeKt {
     method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
     method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
@@ -71,9 +65,6 @@
     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);
@@ -135,9 +126,6 @@
     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);
   }
 
-  public final class ChipKt {
-  }
-
   @androidx.compose.runtime.Stable public final class Colors {
     ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
     method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
@@ -216,9 +204,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -260,9 +245,6 @@
     enum_constant public static final androidx.compose.material.DrawerValue Open;
   }
 
-  public final class ElevationKt {
-  }
-
   public interface ElevationOverlay {
     method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
   }
@@ -274,9 +256,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
   }
 
-  public final class ExposedDropdownMenuKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FabPosition {
     field public static final androidx.compose.material.FabPosition.Companion Companion;
   }
@@ -318,12 +297,6 @@
     method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
   }
 
-  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();
@@ -338,18 +311,12 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class MaterialTheme_androidKt {
-  }
-
   public final class MenuDefaults {
     method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
     property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
     field public static final androidx.compose.material.MenuDefaults INSTANCE;
   }
 
-  public final class MenuKt {
-  }
-
   public final class ModalBottomSheetDefaults {
     method public float getElevation();
     method @androidx.compose.runtime.Composable public long getScrimColor();
@@ -358,9 +325,6 @@
     field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
   }
 
-  public final class ModalBottomSheetKt {
-  }
-
   public final class NavigationRailDefaults {
     method public float getElevation();
     property public final float Elevation;
@@ -447,9 +411,6 @@
     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);
@@ -520,16 +481,10 @@
     enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class SwipeToDismissKt {
-  }
-
   public final class SwipeableDefaults {
     method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
     method public float getVelocityThreshold();
@@ -541,12 +496,6 @@
     field public static final float StiffResistanceFactor = 20.0f;
   }
 
-  public final class SwipeableKt {
-  }
-
-  public final class SwipeableV2Kt {
-  }
-
   @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);
@@ -627,12 +576,6 @@
     field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  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 int minLines, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
@@ -681,31 +624,5 @@
     property public final androidx.compose.ui.text.TextStyle subtitle2;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
-}
-
-package androidx.compose.material.pullrefresh {
-
-  public final class PullRefreshIndicatorKt {
-  }
-
-  public final class PullRefreshIndicatorTransformKt {
-  }
-
-  public final class PullRefreshKt {
-  }
-
-  public final class PullRefreshStateKt {
-  }
-
 }
 
diff --git a/compose/material/material/icons/README.md b/compose/material/material/icons/README.md
index 10e744a..fbb8a68 100644
--- a/compose/material/material/icons/README.md
+++ b/compose/material/material/icons/README.md
@@ -20,7 +20,8 @@
 To add new icons, simply use the icon downloading script at `generator/download_material_icons.py`, run any Gradle command that will trigger compilation of the icon modules (such as `./gradlew buildOnServer`), and follow the message in the build failure asking to confirm API changes by updating the API tracking file.
 
 ## Icon Testing
-Similar to how we generate Kotlin source for each icon, we also generate a 'testing manifest' that contains a list of all the source drawables, matched to their generated code representations. This allows us to run screenshot comparison tests (`IconComparisonTest`) that compare each pixel of the generated and source drawables, to ensure we generated the correct code, and that any changes in parsing logic that causes inconsistencies with our generation logic is caught in CI.
+1. Similar to how we generate Kotlin source for each icon, we also generate a 'testing manifest' that contains a list of all the source drawables, matched to their generated code representations. This allows us to run screenshot comparison tests (`CoreIconComparisonTest`, and `ExtendedIconComparisonTest`) that compare each pixel of the generated and source drawables, to ensure we generated the correct code, and that any changes in parsing logic that causes inconsistencies with our generation logic is caught in CI.
+2. Note that, for performance reasons, the `ExtendedIconComparisonTest` is marked with `@Ignore` and will not run on a regular test execution. **It's important to run this test locally after every icons update**.
 
 ## Useful files
 
diff --git a/compose/material/material/icons/generator/raw-icons/filled/desktop_mac.xml b/compose/material/material/icons/generator/raw-icons/filled/desktop_mac.xml
index db583ec..d90cbc9 100644
--- a/compose/material/material/icons/generator/raw-icons/filled/desktop_mac.xml
+++ b/compose/material/material/icons/generator/raw-icons/filled/desktop_mac.xml
@@ -6,5 +6,5 @@
     android:tint="?attr/colorControlNormal">
   <path
       android:fillColor="@android:color/white"
-      android:pathData="M21,2L3,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h7l-2,3v1h8v-1l-2,-3h7c1.1,0 2,-0.9 2,-2L23,4c0,-1.1 -0.9,-2 -2,-2zM21,14L3,14L3,4h18v10z"/>
+      android:pathData="M20,3H4C2.9,3 2,3.9 2,5v11c0,1.1 0.9,2 2,2h6l-2,2v1h8v-1l-2,-2h6c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3"/>
 </vector>
diff --git a/compose/material/material/icons/generator/raw-icons/filled/directions.xml b/compose/material/material/icons/generator/raw-icons/filled/directions.xml
index f86a0fd..1a80181 100644
--- a/compose/material/material/icons/generator/raw-icons/filled/directions.xml
+++ b/compose/material/material/icons/generator/raw-icons/filled/directions.xml
@@ -6,5 +6,5 @@
     android:tint="?attr/colorControlNormal">
   <path
       android:fillColor="@android:color/white"
-      android:pathData="M21.71,11.29l-9,-9c-0.39,-0.39 -1.02,-0.39 -1.41,0l-9,9c-0.39,0.39 -0.39,1.02 0,1.41l9,9c0.39,0.39 1.02,0.39 1.41,0l9,-9c0.39,-0.38 0.39,-1.01 0,-1.41zM14,14.5V12h-4v3H8v-4c0,-0.55 0.45,-1 1,-1h5V7.5l3.5,3.5 -3.5,3.5z"/>
+      android:pathData="M21.41,10.59l-7.99,-8c-0.78,-0.78 -2.05,-0.78 -2.83,0l-8.01,8c-0.78,0.78 -0.78,2.05 0,2.83l8.01,8c0.78,0.78 2.05,0.78 2.83,0l7.99,-8C22.2,12.63 22.2,11.37 21.41,10.59zM13.5,14.5V12H10v3H8v-4c0,-0.55 0.45,-1 1,-1h4.5V7.5L17,11L13.5,14.5z"/>
 </vector>
diff --git a/compose/material/material/icons/generator/raw-icons/filled/kitchen.xml b/compose/material/material/icons/generator/raw-icons/filled/kitchen.xml
index 8c08a5a..b64d06a 100644
--- a/compose/material/material/icons/generator/raw-icons/filled/kitchen.xml
+++ b/compose/material/material/icons/generator/raw-icons/filled/kitchen.xml
@@ -6,5 +6,8 @@
     android:tint="?attr/colorControlNormal">
   <path
       android:fillColor="@android:color/white"
-      android:pathData="M18,2.01L6,2c-1.1,0 -2,0.89 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.11 -0.9,-1.99 -2,-1.99zM18,20L6,20v-9.02h12L18,20zM18,9L6,9L6,4h12v5zM8,5h2v3L8,8zM8,12h2v5L8,17z"/>
+      android:pathData="M20,9V4c0,-1.1 -0.9,-2 -2,-2H6C4.9,2 4,2.9 4,4v5H20zM8,5h2v3H8V5z"/>
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M4,11v9c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-9H4zM10,17H8v-5h2V17z"/>
 </vector>
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 3b8b684..7eeab01 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
@@ -184,6 +184,8 @@
                 |Please check the difference and copy over the changes if intended.
                 |expected file: ${expectedFile.canonicalPath}
                 |generated file: ${generatedFile.canonicalPath}
+                |Please manually un-ignore and run ExtendedIconComparisonTest locally before
+                |uploading.
             """.trimMargin()
     }
 }
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconTestingManifestGenerator.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconTestingManifestGenerator.kt
index ce76359..c8751d9 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconTestingManifestGenerator.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconTestingManifestGenerator.kt
@@ -28,26 +28,33 @@
 import kotlin.reflect.KProperty0
 
 /**
- * Generates a list named `AllIcons` that contains pairs mapping a [KProperty0] of the generated
- * icon to the name of the corresponding XML drawable. This is used so we can run tests comparing
- * the generated icon against the original source drawable.
+ * Generates two lists, named `CoreIcons` and `ExtendedIcons` that contains pairs mapping a
+ * [KProperty0] of the generated icon to the name of the corresponding XML drawable. This is used so
+ * we can run tests comparing the generated icon against the original source drawable.
  *
- * @property icons the list of [Icon]s to generate the manifest from
+ * @property icons the list of [Icon]s to generate the manifest from. This icons list holds all
+ * known icons, and the generator will split them to Core and Extended on [generateTo]
  */
 class IconTestingManifestGenerator(private val icons: List<Icon>) {
     /**
      * Generates the list and writes it to [outputSrcDirectory].
      */
     fun generateTo(outputSrcDirectory: File) {
-        val propertyNames: MutableList<String> = mutableListOf()
+        // Split the icons to Core and Extended lists, and generate output for each.
+        val (coreIcons, extendedIcons) = icons.partition { CoreIcons.contains(it.kotlinName) }
+        generateTo(outputSrcDirectory, coreIcons, "Core")
+        generateTo(outputSrcDirectory, extendedIcons, "Extended")
+    }
 
-        // Split up this list by themes, otherwise we get a Method too large exception.
+    private fun generateTo(outputSrcDirectory: File, icons: List<Icon>, prefix: String) {
+        val propertyNames: MutableList<String> = mutableListOf()
+        // Further split each list by themes, otherwise we get a Method too large exception.
         // We will then generate another file that returns the result of concatenating the list
         // for each theme.
         icons
             .groupBy { it.theme }
             .map { (theme, icons) ->
-                val propertyName = "${theme.themeClassName}Icons"
+                val propertyName = "$prefix${theme.themeClassName}Icons"
                 propertyNames += propertyName
                 theme to generateListOfIconsForTheme(propertyName, theme, icons)
             }
@@ -71,9 +78,9 @@
             .addStatement("return " + propertyNames.joinToString(" + "))
             .build()
 
-        FileSpec.builder(PackageNames.MaterialIconsPackage.packageName, "AllIcons")
+        FileSpec.builder(PackageNames.MaterialIconsPackage.packageName, "All${prefix}Icons")
             .addProperty(
-                PropertySpec.builder("AllIcons", type = listOfIconsType)
+                PropertySpec.builder("All${prefix}Icons", type = listOfIconsType)
                     .getter(mainGetter)
                     .build()
             ).setIndent().build().writeToWithCopyright(outputSrcDirectory)
diff --git a/compose/material/material/integration-tests/material-catalog/OWNERS b/compose/material/material/integration-tests/material-catalog/OWNERS
index f8b7ec5..bfe5583 100644
--- a/compose/material/material/integration-tests/material-catalog/OWNERS
+++ b/compose/material/material/integration-tests/material-catalog/OWNERS
@@ -1,3 +1,3 @@
+# Bug component: 489623
 connieshi@google.com
-nickrout@google.com
 sgibly@google.com
\ No newline at end of file
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
index 7e1c569..75ab9f3 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomSheetScaffoldTest.kt
@@ -35,7 +35,6 @@
 import androidx.compose.ui.graphics.asAndroidBitmap
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
@@ -47,8 +46,8 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onParent
-import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.test.performSemanticsAction
+import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.test.swipeDown
 import androidx.compose.ui.test.swipeUp
 import androidx.compose.ui.unit.Density
@@ -60,7 +59,6 @@
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth
 import kotlinx.coroutines.runBlocking
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -352,47 +350,6 @@
     }
 
     @Test
-    @Ignore("unignore once animation sync is ready (b/147291885)")
-    fun bottomSheetScaffold_drawer_manualControl() = runBlocking {
-        var drawerChildPosition: Offset = Offset.Zero
-        lateinit var scaffoldState: BottomSheetScaffoldState
-        rule.setContent {
-            scaffoldState = rememberBottomSheetScaffoldState()
-            Box {
-                BottomSheetScaffold(
-                    scaffoldState = scaffoldState,
-                    sheetContent = {
-                        Box(Modifier.fillMaxWidth().requiredHeight(100.dp))
-                    },
-                    drawerContent = {
-                        Box(
-                            Modifier
-                                .fillMaxWidth()
-                                .height(50.dp)
-                                .background(color = Color.Blue)
-                                .onGloballyPositioned { positioned: LayoutCoordinates ->
-                                    drawerChildPosition = positioned.positionInParent()
-                                }
-                        )
-                    }
-                ) {
-                    Box(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(50.dp)
-                            .background(color = Color.Blue)
-                    )
-                }
-            }
-        }
-        Truth.assertThat(drawerChildPosition.x).isLessThan(0f)
-        scaffoldState.drawerState.open()
-        Truth.assertThat(drawerChildPosition.x).isLessThan(0f)
-        scaffoldState.drawerState.close()
-        Truth.assertThat(drawerChildPosition.x).isLessThan(0f)
-    }
-
-    @Test
     fun bottomSheetScaffold_AppbarAndContent_inColumn() {
         var appbarPosition: Offset = Offset.Zero
         var appbarSize: IntSize = IntSize.Zero
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
index 77fcbd42..7ffe514 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
@@ -13,13 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.compose.material
-
 import androidx.compose.animation.core.AnimationSpec
 import androidx.compose.foundation.gestures.Orientation
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.PaddingValues
@@ -30,29 +26,29 @@
 import androidx.compose.material.BottomSheetValue.Expanded
 import androidx.compose.runtime.Composable
 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.rememberCoroutineScope
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.rememberSaveable
-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.graphics.Shape
+import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
+import androidx.compose.ui.input.nestedscroll.NestedScrollSource
 import androidx.compose.ui.input.nestedscroll.nestedScroll
-import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.SubcomposeLayout
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.semantics.collapse
 import androidx.compose.ui.semantics.expand
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.dp
+import kotlin.math.roundToInt
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.launch
-import kotlin.math.roundToInt
 
 /**
  * Possible values of [BottomSheetState].
@@ -63,60 +59,113 @@
      * The bottom sheet is visible, but only showing its peek height.
      */
     Collapsed,
-
     /**
      * The bottom sheet is visible at its maximum height.
      */
     Expanded
 }
 
+@Deprecated(
+    message = "This constructor is deprecated. confirmStateChange has been renamed to " +
+        "confirmValueChange.",
+    replaceWith = ReplaceWith("BottomSheetScaffoldState(initialValue, animationSpec, " +
+        "confirmStateChange)")
+)
+@ExperimentalMaterialApi
+fun BottomSheetScaffoldState(
+    initialValue: BottomSheetValue,
+    animationSpec: AnimationSpec<Float> = SwipeableDefaults.AnimationSpec,
+    confirmStateChange: (BottomSheetValue) -> Boolean
+) = BottomSheetState(
+    initialValue = initialValue,
+    animationSpec = animationSpec,
+    confirmValueChange = confirmStateChange
+)
+
 /**
  * State of the persistent bottom sheet in [BottomSheetScaffold].
  *
  * @param initialValue The initial value of the state.
  * @param animationSpec The default animation that will be used to animate to a new state.
- * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
+ * @param confirmValueChange Optional callback invoked to confirm or veto a pending state change.
  */
 @ExperimentalMaterialApi
 @Stable
 class BottomSheetState(
     initialValue: BottomSheetValue,
     animationSpec: AnimationSpec<Float> = SwipeableDefaults.AnimationSpec,
-    confirmStateChange: (BottomSheetValue) -> Boolean = { true }
-) : SwipeableState<BottomSheetValue>(
-    initialValue = initialValue,
-    animationSpec = animationSpec,
-    confirmStateChange = confirmStateChange
+    confirmValueChange: (BottomSheetValue) -> Boolean = { true }
 ) {
+    internal val swipeableState = SwipeableV2State(
+        initialValue = initialValue,
+        animationSpec = animationSpec,
+        confirmValueChange = confirmValueChange
+    )
+
+    val currentValue: BottomSheetValue
+        get() = swipeableState.currentValue
+
     /**
      * Whether the bottom sheet is expanded.
      */
     val isExpanded: Boolean
-        get() = currentValue == Expanded
+        get() = swipeableState.currentValue == Expanded
 
     /**
      * Whether the bottom sheet is collapsed.
      */
     val isCollapsed: Boolean
-        get() = currentValue == BottomSheetValue.Collapsed
+        get() = swipeableState.currentValue == Collapsed
 
     /**
-     * Expand the bottom sheet with animation and suspend until it if fully expanded or animation
-     * has been cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
-     *
-     * @return the reason the expand animation ended
+     * The fraction of the progress going from [currentValue] to the targetValue, within [0f..1f]
+     * bounds, or 1f if the sheet is in a settled state.
      */
-    suspend fun expand() = animateTo(Expanded)
+    /*@FloatRange(from = 0f, to = 1f)*/
+    val progress: Float
+        get() = swipeableState.progress
+
+    /**
+     * Expand the bottom sheet with an animation and suspend until the animation finishes or is
+     * cancelled.
+     * Note: If the peek height is equal to the sheet height, this method will animate to the
+     * [Collapsed] state.
+     *
+     * This method will throw [CancellationException] if the animation is interrupted.
+     */
+    suspend fun expand() {
+        val target = if (swipeableState.hasAnchorForValue(Expanded)) Expanded else Collapsed
+        swipeableState.animateTo(target)
+    }
 
     /**
      * Collapse the bottom sheet with animation and suspend until it if fully collapsed or animation
      * has been cancelled. This method will throw [CancellationException] if the animation is
-     * interrupted
-     *
-     * @return the reason the collapse animation ended
+     * interrupted.
      */
-    suspend fun collapse() = animateTo(BottomSheetValue.Collapsed)
+    suspend fun collapse() = swipeableState.animateTo(Collapsed)
+
+    @Deprecated(
+        message = "Use requireOffset() to access the offset.",
+        replaceWith = ReplaceWith("requireOffset()")
+    )
+    val offset: Float get() = error("Use requireOffset() to access the offset.")
+
+    /**
+     * Require the current offset.
+     *
+     * @throws IllegalStateException If the offset has not been initialized yet
+     */
+    fun requireOffset() = swipeableState.requireOffset()
+
+    internal suspend fun animateTo(
+        target: BottomSheetValue,
+        velocity: Float = swipeableState.lastVelocity
+    ) = swipeableState.animateTo(target, velocity)
+
+    internal suspend fun snapTo(target: BottomSheetValue) = swipeableState.snapTo(target)
+
+    internal val isAnimationRunning: Boolean get() = swipeableState.isAnimationRunning
 
     companion object {
         /**
@@ -126,20 +175,17 @@
             animationSpec: AnimationSpec<Float>,
             confirmStateChange: (BottomSheetValue) -> Boolean
         ): Saver<BottomSheetState, *> = Saver(
-            save = { it.currentValue },
+            save = { it.swipeableState.currentValue },
             restore = {
                 BottomSheetState(
                     initialValue = it,
                     animationSpec = animationSpec,
-                    confirmStateChange = confirmStateChange
+                    confirmValueChange = confirmStateChange
                 )
             }
         )
     }
-
-    internal val nestedScrollConnection = this.PreUpPostDownNestedScrollConnection
 }
-
 /**
  * Create a [BottomSheetState] and [remember] it.
  *
@@ -164,11 +210,10 @@
         BottomSheetState(
             initialValue = initialValue,
             animationSpec = animationSpec,
-            confirmStateChange = confirmStateChange
+            confirmValueChange = confirmStateChange
         )
     }
 }
-
 /**
  * State of the [BottomSheetScaffold] composable.
  *
@@ -183,7 +228,6 @@
     val bottomSheetState: BottomSheetState,
     val snackbarHostState: SnackbarHostState
 )
-
 /**
  * Create and [remember] a [BottomSheetScaffoldState].
  *
@@ -195,7 +239,7 @@
 @ExperimentalMaterialApi
 fun rememberBottomSheetScaffoldState(
     drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
-    bottomSheetState: BottomSheetState = rememberBottomSheetState(BottomSheetValue.Collapsed),
+    bottomSheetState: BottomSheetState = rememberBottomSheetState(Collapsed),
     snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }
 ): BottomSheetScaffoldState {
     return remember(drawerState, bottomSheetState, snackbarHostState) {
@@ -206,7 +250,6 @@
         )
     }
 }
-
 /**
  * <a href="https://material.io/components/sheets-bottom#standard-bottom-sheet" class="external" target="_blank">Material Design standard bottom sheet</a>.
  *
@@ -241,7 +284,8 @@
  * @param sheetContentColor The preferred content color provided by the bottom sheet to its
  * children. Defaults to the matching content color for [sheetBackgroundColor], or if that is
  * not a color from the theme, this will keep the same content color set above the bottom sheet.
- * @param sheetPeekHeight The height of the bottom sheet when it is collapsed.
+ * @param sheetPeekHeight The height of the bottom sheet when it is collapsed. If the peek height
+ * equals the sheet's full height, the sheet will only have a collapsed state.
  * @param drawerContent The content of the drawer sheet.
  * @param drawerGesturesEnabled Whether the drawer sheet can be interacted with by gestures.
  * @param drawerShape The shape of the drawer sheet.
@@ -281,86 +325,59 @@
     contentColor: Color = contentColorFor(backgroundColor),
     content: @Composable (PaddingValues) -> Unit
 ) {
-    val scope = rememberCoroutineScope()
-    BoxWithConstraints(modifier) {
-        val fullHeight = constraints.maxHeight.toFloat()
-        val peekHeightPx = with(LocalDensity.current) { sheetPeekHeight.toPx() }
-        var bottomSheetHeight by remember { mutableStateOf(fullHeight) }
-
-        val swipeable = Modifier
-            .nestedScroll(scaffoldState.bottomSheetState.nestedScrollConnection)
-            .swipeable(
-                state = scaffoldState.bottomSheetState,
-                anchors = mapOf(
-                    fullHeight - peekHeightPx to BottomSheetValue.Collapsed,
-                    fullHeight - bottomSheetHeight to Expanded
-                ),
-                orientation = Orientation.Vertical,
-                enabled = sheetGesturesEnabled,
-                resistance = null
-            )
-            .semantics {
-                if (peekHeightPx != bottomSheetHeight) {
-                    if (scaffoldState.bottomSheetState.isCollapsed) {
-                        expand {
-                            if (scaffoldState.bottomSheetState.confirmStateChange(Expanded)) {
-                                scope.launch { scaffoldState.bottomSheetState.expand() }
+    val peekHeightPx = with(LocalDensity.current) { sheetPeekHeight.toPx() }
+    val child = @Composable {
+        BottomSheetScaffoldLayout(
+            topBar = topBar,
+            body = content,
+            bottomSheet = { layoutHeight ->
+                BottomSheet(
+                    state = scaffoldState.bottomSheetState,
+                    modifier = Modifier
+                        .nestedScroll(
+                            remember(scaffoldState.bottomSheetState.swipeableState) {
+                                ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
+                                    state = scaffoldState.bottomSheetState.swipeableState,
+                                    orientation = Orientation.Vertical
+                                )
                             }
-                            true
-                        }
-                    } else {
-                        collapse {
-                            if (scaffoldState.bottomSheetState.confirmStateChange(Collapsed)) {
-                                scope.launch { scaffoldState.bottomSheetState.collapse() }
+                        )
+                        .fillMaxWidth()
+                        .requiredHeightIn(min = sheetPeekHeight),
+                    anchors = { state, sheetSize ->
+                        when (state) {
+                            Collapsed -> layoutHeight - peekHeightPx
+                            Expanded -> if (sheetSize.height == peekHeightPx.roundToInt()) {
+                                null
+                            } else {
+                                layoutHeight - sheetSize.height.toFloat()
                             }
-                            true
                         }
-                    }
-                }
-            }
-
-        val child = @Composable {
-            BottomSheetScaffoldStack(
-                body = {
-                    Surface(
-                        color = backgroundColor,
-                        contentColor = contentColor
-                    ) {
-                        Column(Modifier.fillMaxSize()) {
-                            topBar?.invoke()
-                            content(PaddingValues(bottom = sheetPeekHeight))
-                        }
-                    }
-                },
-                bottomSheet = {
-                    Surface(
-                        swipeable
-                            .fillMaxWidth()
-                            .requiredHeightIn(min = sheetPeekHeight)
-                            .onGloballyPositioned {
-                                bottomSheetHeight = it.size.height.toFloat()
-                            },
-                        shape = sheetShape,
-                        elevation = sheetElevation,
-                        color = sheetBackgroundColor,
-                        contentColor = sheetContentColor,
-                        content = { Column(content = sheetContent) }
-                    )
-                },
-                floatingActionButton = {
-                    Box {
-                        floatingActionButton?.invoke()
-                    }
-                },
-                snackbarHost = {
-                    Box {
-                        snackbarHost(scaffoldState.snackbarHostState)
-                    }
-                },
-                bottomSheetOffset = scaffoldState.bottomSheetState.offset,
-                floatingActionButtonPosition = floatingActionButtonPosition
-            )
-        }
+                    },
+                    sheetBackgroundColor = sheetBackgroundColor,
+                    sheetContentColor = sheetContentColor,
+                    sheetElevation = sheetElevation,
+                    sheetGesturesEnabled = sheetGesturesEnabled,
+                    sheetShape = sheetShape,
+                    content = sheetContent
+                )
+            },
+            floatingActionButton = floatingActionButton,
+            snackbarHost = {
+                snackbarHost(scaffoldState.snackbarHostState)
+            },
+            sheetOffset = { scaffoldState.bottomSheetState.requireOffset() },
+            sheetPeekHeight = sheetPeekHeight,
+            sheetState = scaffoldState.bottomSheetState,
+            floatingActionButtonPosition = floatingActionButtonPosition
+        )
+    }
+    Surface(
+        modifier
+            .fillMaxSize(),
+        color = backgroundColor,
+        contentColor = contentColor
+    ) {
         if (drawerContent == null) {
             child()
         } else {
@@ -378,68 +395,220 @@
         }
     }
 }
-
+@OptIn(ExperimentalMaterialApi::class)
 @Composable
-private fun BottomSheetScaffoldStack(
-    body: @Composable () -> Unit,
-    bottomSheet: @Composable () -> Unit,
-    floatingActionButton: @Composable () -> Unit,
-    snackbarHost: @Composable () -> Unit,
-    bottomSheetOffset: State<Float>,
-    floatingActionButtonPosition: FabPosition
+private fun BottomSheet(
+    state: BottomSheetState,
+    sheetGesturesEnabled: Boolean,
+    anchors: (state: BottomSheetValue, sheetSize: IntSize) -> Float?,
+    sheetShape: Shape,
+    sheetElevation: Dp,
+    sheetBackgroundColor: Color,
+    sheetContentColor: Color,
+    modifier: Modifier = Modifier,
+    content: @Composable ColumnScope.() -> Unit
 ) {
-    Layout(
-        content = {
-            body()
-            bottomSheet()
-            floatingActionButton()
-            snackbarHost()
-        }
-    ) { measurables, constraints ->
-        val placeable = measurables.first().measure(constraints)
-
-        layout(placeable.width, placeable.height) {
-            placeable.placeRelative(0, 0)
-
-            val (sheetPlaceable, fabPlaceable, snackbarPlaceable) =
-                measurables.drop(1).map {
-                    it.measure(constraints.copy(minWidth = 0, minHeight = 0))
-                }
-
-            val sheetOffsetY = bottomSheetOffset.value.roundToInt()
-
-            sheetPlaceable.placeRelative(0, sheetOffsetY)
-
-            val fabOffsetX = when (floatingActionButtonPosition) {
-                FabPosition.Center -> (placeable.width - fabPlaceable.width) / 2
-                else -> placeable.width - fabPlaceable.width - FabEndSpacing.roundToPx()
-            }
-            val fabOffsetY = sheetOffsetY - fabPlaceable.height / 2
-
-            fabPlaceable.placeRelative(fabOffsetX, fabOffsetY)
-
-            val snackbarOffsetX = (placeable.width - snackbarPlaceable.width) / 2
-            val snackbarOffsetY = placeable.height - snackbarPlaceable.height
-
-            snackbarPlaceable.placeRelative(snackbarOffsetX, snackbarOffsetY)
-        }
+    val scope = rememberCoroutineScope()
+    val anchorChangeHandler = remember(state, scope) {
+        BottomSheetScaffoldAnchorChangeHandler(
+            state = state,
+            animateTo = { target -> scope.launch { state.animateTo(target) } },
+            snapTo = { target -> scope.launch { state.snapTo(target) } }
+        )
     }
+    Surface(
+        modifier
+            .swipeableV2(
+                state = state.swipeableState,
+                orientation = Orientation.Vertical,
+                enabled = sheetGesturesEnabled,
+            )
+            .swipeAnchors(
+                state = state.swipeableState,
+                possibleValues = setOf(Collapsed, Expanded),
+                calculateAnchor = anchors,
+                anchorChangeHandler = anchorChangeHandler
+            )
+            .semantics {
+                // If we don't have anchors yet, or have only one anchor we don't want any
+                // accessibility actions
+                if (state.swipeableState.anchors.size > 1) {
+                    if (state.isCollapsed) {
+                        expand {
+                            if (state.swipeableState.confirmValueChange(Expanded)) {
+                                scope.launch { state.expand() }
+                            }
+                            true
+                        }
+                    } else {
+                        collapse {
+                            if (state.swipeableState.confirmValueChange(Collapsed)) {
+                                scope.launch { state.collapse() }
+                            }
+                            true
+                        }
+                    }
+                }
+            },
+        shape = sheetShape,
+        elevation = sheetElevation,
+        color = sheetBackgroundColor,
+        contentColor = sheetContentColor,
+        content = { Column(content = content) }
+    )
 }
 
-private val FabEndSpacing = 16.dp
-
 /**
  * Contains useful defaults for [BottomSheetScaffold].
  */
 object BottomSheetScaffoldDefaults {
-
     /**
      * The default elevation used by [BottomSheetScaffold].
      */
     val SheetElevation = 8.dp
-
     /**
      * The default peek height used by [BottomSheetScaffold].
      */
     val SheetPeekHeight = 56.dp
 }
+private enum class BottomSheetScaffoldLayoutSlot { TopBar, Body, Sheet, Fab, Snackbar }
+@OptIn(ExperimentalMaterialApi::class)
+@Composable
+private fun BottomSheetScaffoldLayout(
+    topBar: @Composable (() -> Unit)?,
+    body: @Composable (innerPadding: PaddingValues) -> Unit,
+    bottomSheet: @Composable (layoutHeight: Int) -> Unit,
+    floatingActionButton: (@Composable () -> Unit)?,
+    snackbarHost: @Composable () -> Unit,
+    sheetPeekHeight: Dp,
+    floatingActionButtonPosition: FabPosition,
+    sheetOffset: () -> Float,
+    sheetState: BottomSheetState,
+) {
+    SubcomposeLayout { constraints ->
+        val layoutWidth = constraints.maxWidth
+        val layoutHeight = constraints.maxHeight
+        val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
+        val sheetPlaceable = subcompose(BottomSheetScaffoldLayoutSlot.Sheet) {
+            bottomSheet(layoutHeight)
+        }[0].measure(looseConstraints)
+        val sheetOffsetY = sheetOffset().roundToInt()
+        val topBarPlaceable = topBar?.let {
+            subcompose(BottomSheetScaffoldLayoutSlot.TopBar) { topBar() }[0]
+                .measure(looseConstraints)
+        }
+        val topBarHeight = topBarPlaceable?.height ?: 0
+        val bodyConstraints = looseConstraints.copy(maxHeight = layoutHeight - topBarHeight)
+        val bodyPlaceable = subcompose(BottomSheetScaffoldLayoutSlot.Body) {
+            body(PaddingValues(bottom = sheetPeekHeight))
+        }[0].measure(bodyConstraints)
+        val fabPlaceable = floatingActionButton?.let { fab ->
+            subcompose(BottomSheetScaffoldLayoutSlot.Fab, fab)[0].measure(looseConstraints)
+        }
+        val fabWidth = fabPlaceable?.width ?: 0
+        val fabHeight = fabPlaceable?.height ?: 0
+        val fabOffsetX = when (floatingActionButtonPosition) {
+            FabPosition.Center -> (layoutWidth - fabWidth) / 2
+            else -> layoutWidth - fabWidth - FabSpacing.roundToPx()
+        }
+        // In case sheet peek height < (FAB height / 2), give the FAB some minimum space
+        val fabOffsetY = if (sheetPeekHeight.toPx() < fabHeight / 2) {
+            sheetOffsetY - fabHeight - FabSpacing.roundToPx()
+        } else sheetOffsetY - (fabHeight / 2)
+        val snackbarPlaceable = subcompose(BottomSheetScaffoldLayoutSlot.Snackbar, snackbarHost)[0]
+            .measure(looseConstraints)
+        val snackbarOffsetX = (layoutWidth - snackbarPlaceable.width) / 2
+        val snackbarOffsetY = when (sheetState.currentValue) {
+            Collapsed -> fabOffsetY - snackbarPlaceable.height
+            Expanded -> layoutHeight - snackbarPlaceable.height
+        }
+        layout(layoutWidth, layoutHeight) {
+            // Placement order is important for elevation
+            bodyPlaceable.placeRelative(0, topBarHeight)
+            topBarPlaceable?.placeRelative(0, 0)
+            sheetPlaceable.placeRelative(0, sheetOffsetY)
+            fabPlaceable?.placeRelative(fabOffsetX, fabOffsetY)
+            snackbarPlaceable.placeRelative(snackbarOffsetX, snackbarOffsetY)
+        }
+    }
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+private fun ConsumeSwipeWithinBottomSheetBoundsNestedScrollConnection(
+    state: SwipeableV2State<*>,
+    orientation: Orientation
+): NestedScrollConnection = object : NestedScrollConnection {
+    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+        val delta = available.toFloat()
+        return if (delta < 0 && source == NestedScrollSource.Drag) {
+            state.dispatchRawDelta(delta).toOffset()
+        } else {
+            Offset.Zero
+        }
+    }
+
+    override fun onPostScroll(
+        consumed: Offset,
+        available: Offset,
+        source: NestedScrollSource
+    ): Offset {
+        return if (source == NestedScrollSource.Drag) {
+            state.dispatchRawDelta(available.toFloat()).toOffset()
+        } else {
+            Offset.Zero
+        }
+    }
+
+    override suspend fun onPreFling(available: Velocity): Velocity {
+        val toFling = available.toFloat()
+        val currentOffset = state.requireOffset()
+        return if (toFling < 0 && currentOffset > state.minOffset) {
+            state.settle(velocity = toFling)
+            // since we go to the anchor with tween settling, consume all for the best UX
+            available
+        } else {
+            Velocity.Zero
+        }
+    }
+
+    override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+        state.settle(velocity = available.toFloat())
+        return available
+    }
+
+    private fun Float.toOffset(): Offset = Offset(
+        x = if (orientation == Orientation.Horizontal) this else 0f,
+        y = if (orientation == Orientation.Vertical) this else 0f
+    )
+
+    @JvmName("velocityToFloat")
+    private fun Velocity.toFloat() = if (orientation == Orientation.Horizontal) x else y
+
+    @JvmName("offsetToFloat")
+    private fun Offset.toFloat(): Float = if (orientation == Orientation.Horizontal) x else y
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+private fun BottomSheetScaffoldAnchorChangeHandler(
+    state: BottomSheetState,
+    animateTo: (target: BottomSheetValue) -> Unit,
+    snapTo: (target: BottomSheetValue) -> Unit,
+) = AnchorChangeHandler<BottomSheetValue> { previousTarget, previousAnchors, newAnchors ->
+    val previousTargetOffset = previousAnchors[previousTarget]
+    val newTarget = when (previousTarget) {
+        Collapsed -> Collapsed
+        Expanded -> if (newAnchors.containsKey(Expanded)) Expanded else Collapsed
+    }
+    val newTargetOffset = newAnchors.getValue(newTarget)
+    if (newTargetOffset != previousTargetOffset) {
+        if (state.isAnimationRunning) {
+            // Re-target the animation to the new offset if it changed
+            animateTo(newTarget)
+        } else {
+            // Snap to the new offset value of the target if no animation was running
+            snapTo(newTarget)
+        }
+    }
+}
+
+private val FabSpacing = 16.dp
\ No newline at end of file
diff --git a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
index 8529446..6887bda 100644
--- a/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
+++ b/compose/material3/material3-lint/src/main/java/androidx/compose/material3/lint/Material3IssueRegistry.kt
@@ -25,7 +25,7 @@
  */
 class Material3IssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ScaffoldPaddingDetector.UnusedMaterial3ScaffoldPaddingParameter
diff --git a/compose/material3/material3-window-size-class/api/current.ignore b/compose/material3/material3-window-size-class/api/current.ignore
new file mode 100644
index 0000000..bb4a3ed
--- /dev/null
+++ b/compose/material3/material3-window-size-class/api/current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material3.windowsizeclass.AndroidWindowSizeClass_androidKt:
+    Removed class androidx.compose.material3.windowsizeclass.AndroidWindowSizeClass_androidKt
+RemovedClass: androidx.compose.material3.windowsizeclass.TestOnly_jvmKt:
+    Removed class androidx.compose.material3.windowsizeclass.TestOnly_jvmKt
diff --git a/compose/material3/material3-window-size-class/api/current.txt b/compose/material3/material3-window-size-class/api/current.txt
index 8522c90..cc66d9f 100644
--- a/compose/material3/material3-window-size-class/api/current.txt
+++ b/compose/material3/material3-window-size-class/api/current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material3.windowsizeclass {
 
-  public final class AndroidWindowSizeClass_androidKt {
-  }
-
-  public final class TestOnly_jvmKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowHeightSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowHeightSizeClass> {
     method public operator int compareTo(int other);
     field public static final androidx.compose.material3.windowsizeclass.WindowHeightSizeClass.Companion Companion;
diff --git a/compose/material3/material3-window-size-class/api/public_plus_experimental_current.txt b/compose/material3/material3-window-size-class/api/public_plus_experimental_current.txt
index 81a9075..88ceafc 100644
--- a/compose/material3/material3-window-size-class/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3-window-size-class/api/public_plus_experimental_current.txt
@@ -8,9 +8,6 @@
   @kotlin.RequiresOptIn(message="This material3-window-size-class API is experimental and is likely to change or to " + "be removed in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalMaterial3WindowSizeClassApi {
   }
 
-  public final class TestOnly_jvmKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowHeightSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowHeightSizeClass> {
     method public operator int compareTo(int other);
     field public static final androidx.compose.material3.windowsizeclass.WindowHeightSizeClass.Companion Companion;
diff --git a/compose/material3/material3-window-size-class/api/restricted_current.ignore b/compose/material3/material3-window-size-class/api/restricted_current.ignore
new file mode 100644
index 0000000..bb4a3ed
--- /dev/null
+++ b/compose/material3/material3-window-size-class/api/restricted_current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material3.windowsizeclass.AndroidWindowSizeClass_androidKt:
+    Removed class androidx.compose.material3.windowsizeclass.AndroidWindowSizeClass_androidKt
+RemovedClass: androidx.compose.material3.windowsizeclass.TestOnly_jvmKt:
+    Removed class androidx.compose.material3.windowsizeclass.TestOnly_jvmKt
diff --git a/compose/material3/material3-window-size-class/api/restricted_current.txt b/compose/material3/material3-window-size-class/api/restricted_current.txt
index 8522c90..cc66d9f 100644
--- a/compose/material3/material3-window-size-class/api/restricted_current.txt
+++ b/compose/material3/material3-window-size-class/api/restricted_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material3.windowsizeclass {
 
-  public final class AndroidWindowSizeClass_androidKt {
-  }
-
-  public final class TestOnly_jvmKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class WindowHeightSizeClass implements java.lang.Comparable<androidx.compose.material3.windowsizeclass.WindowHeightSizeClass> {
     method public operator int compareTo(int other);
     field public static final androidx.compose.material3.windowsizeclass.WindowHeightSizeClass.Companion Companion;
diff --git a/compose/material3/material3/api/current.ignore b/compose/material3/material3/api/current.ignore
index 929472e..f188367 100644
--- a/compose/material3/material3/api/current.ignore
+++ b/compose/material3/material3/api/current.ignore
@@ -1,3 +1,41 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.material3.AlertDialogKt:
+    Removed class androidx.compose.material3.AlertDialogKt
+RemovedClass: androidx.compose.material3.BadgeKt:
+    Removed class androidx.compose.material3.BadgeKt
+RemovedClass: androidx.compose.material3.DragGestureDetectorCopyKt:
+    Removed class androidx.compose.material3.DragGestureDetectorCopyKt
+RemovedClass: androidx.compose.material3.ElevationKt:
+    Removed class androidx.compose.material3.ElevationKt
+RemovedClass: androidx.compose.material3.ExposedDropdownMenuKt:
+    Removed class androidx.compose.material3.ExposedDropdownMenuKt
+RemovedClass: androidx.compose.material3.IncludeFontPaddingHelper_androidKt:
+    Removed class androidx.compose.material3.IncludeFontPaddingHelper_androidKt
+RemovedClass: androidx.compose.material3.MenuKt:
+    Removed class androidx.compose.material3.MenuKt
+RemovedClass: androidx.compose.material3.OutlinedTextFieldKt:
+    Removed class androidx.compose.material3.OutlinedTextFieldKt
+RemovedClass: androidx.compose.material3.ShapesKt:
+    Removed class androidx.compose.material3.ShapesKt
+RemovedClass: androidx.compose.material3.Strings_androidKt:
+    Removed class androidx.compose.material3.Strings_androidKt
+RemovedClass: androidx.compose.material3.SwipeableKt:
+    Removed class androidx.compose.material3.SwipeableKt
+RemovedClass: androidx.compose.material3.SystemBarsDefaultInsets_androidKt:
+    Removed class androidx.compose.material3.SystemBarsDefaultInsets_androidKt
+RemovedClass: androidx.compose.material3.TextFieldDefaultsKt:
+    Removed class androidx.compose.material3.TextFieldDefaultsKt
+RemovedClass: androidx.compose.material3.TextFieldImplKt:
+    Removed class androidx.compose.material3.TextFieldImplKt
+RemovedClass: androidx.compose.material3.TextFieldKt:
+    Removed class androidx.compose.material3.TextFieldKt
+RemovedClass: androidx.compose.material3.TonalPaletteKt:
+    Removed class androidx.compose.material3.TonalPaletteKt
 RemovedClass: androidx.compose.material3.TouchTargetKt:
     Removed class androidx.compose.material3.TouchTargetKt
+RemovedClass: androidx.compose.material3.TypographyKt:
+    Removed class androidx.compose.material3.TypographyKt
+
+
+RemovedPackage: androidx.compose.material3.internal:
+    Removed package androidx.compose.material3.internal
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index cc495fc..0c53c8d 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -17,9 +17,6 @@
     field public static final androidx.compose.material3.AlertDialogDefaults INSTANCE;
   }
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, 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 containerColor, optional long iconContentColor, optional long titleContentColor, optional long textContentColor, optional float tonalElevation, optional androidx.compose.ui.window.DialogProperties properties);
   }
@@ -49,9 +46,6 @@
     field public static final androidx.compose.material3.AssistChipDefaults INSTANCE;
   }
 
-  public final class BadgeKt {
-  }
-
   public final class BottomAppBarDefaults {
     method @androidx.compose.runtime.Composable public long getBottomAppBarFabColor();
     method @androidx.compose.runtime.Composable public long getContainerColor();
@@ -120,12 +114,6 @@
     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.ui.graphics.Shape shape, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.foundation.BorderStroke? border, 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 CalendarModelKt {
-  }
-
-  public final class CalendarModel_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
@@ -260,18 +248,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
-  public final class DateInputKt {
-  }
-
-  public final class DatePickerDialog_androidKt {
-  }
-
-  public final class DatePickerKt {
-  }
-
-  public final class DateRangePickerKt {
-  }
-
   public final class DividerDefaults {
     method @androidx.compose.runtime.Composable public long getColor();
     method public float getThickness();
@@ -284,9 +260,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getDismissibleDrawerElevation();
@@ -344,10 +317,15 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
-  public final class ElevationKt {
+  @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material3.FabPosition.Companion Companion;
   }
 
-  public final class ExposedDropdownMenuKt {
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -421,9 +399,6 @@
   @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
-  public final class IncludeFontPaddingHelper_androidKt {
-  }
-
   public final class InteractiveComponentSizeKt {
     method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
   }
@@ -472,12 +447,6 @@
   @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
-  public final class MenuKt {
-  }
-
-  public final class ModalBottomSheetKt {
-  }
-
   public final class NavigationBarDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getElevation();
@@ -549,9 +518,6 @@
     method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class OutlinedTextFieldKt {
-  }
-
   public final class ProgressIndicatorDefaults {
     method @androidx.compose.runtime.Composable public long getCircularColor();
     method public int getCircularDeterminateStrokeCap();
@@ -597,7 +563,14 @@
     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.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class ScaffoldDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getContentWindowInsets();
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets contentWindowInsets;
+    field public static final androidx.compose.material3.ScaffoldDefaults INSTANCE;
+  }
+
   public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
   public final class SearchBarDefaults {
@@ -616,9 +589,6 @@
     field public static final androidx.compose.material3.SearchBarDefaults INSTANCE;
   }
 
-  public final class SearchBarKt {
-  }
-
   public final class ShapeDefaults {
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
@@ -648,12 +618,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
-  public final class SheetDefaultsKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SliderColors {
   }
 
@@ -717,6 +681,7 @@
     ctor public SnackbarHostState();
     method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
     method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    method public suspend Object? showSnackbar(androidx.compose.material3.SnackbarVisuals visuals, kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
     property public final androidx.compose.material3.SnackbarData? currentSnackbarData;
   }
 
@@ -743,9 +708,6 @@
     property public abstract boolean withDismissAction;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SuggestionChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors elevatedSuggestionChipColors(optional long containerColor, optional long labelColor, optional long iconContentColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledIconContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipElevation elevatedSuggestionChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
@@ -767,15 +729,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
   }
 
-  public final class SwipeToDismissKt {
-  }
-
-  public final class SwipeableKt {
-  }
-
-  public final class SwipeableV2Kt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
@@ -790,9 +743,6 @@
     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 kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SystemBarsDefaultInsets_androidKt {
-  }
-
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
@@ -826,15 +776,6 @@
   @androidx.compose.runtime.Immutable public final class TextFieldColors {
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  public final class TextFieldImplKt {
-  }
-
-  public final class TextFieldKt {
-  }
-
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
@@ -845,12 +786,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
-  public final class TimeFormat_androidKt {
-  }
-
-  public final class TimePickerKt {
-  }
-
   @androidx.compose.runtime.Stable public final class TimePickerState {
     ctor public TimePickerState(int initialHour, int initialMinute, boolean is24Hour);
     method public int getHour();
@@ -867,12 +802,6 @@
     method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.TimePickerState,?> Saver();
   }
 
-  public final class TonalPaletteKt {
-  }
-
-  public final class TooltipKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class Typography {
     ctor public Typography(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
     method public androidx.compose.material3.Typography copy(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
@@ -908,15 +837,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material3.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
 }
 
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index 7a09faf..e1b2628 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -17,9 +17,6 @@
     field public static final androidx.compose.material3.AlertDialogDefaults INSTANCE;
   }
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, 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 containerColor, optional long iconContentColor, optional long titleContentColor, optional long textContentColor, optional float tonalElevation, optional androidx.compose.ui.window.DialogProperties properties);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -150,12 +147,6 @@
     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.ui.graphics.Shape shape, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.foundation.BorderStroke? border, 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 CalendarModelKt {
-  }
-
-  public final class CalendarModel_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
@@ -296,16 +287,13 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
-  public final class DateInputKt {
-  }
-
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class DatePickerColors {
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class DatePickerDefaults {
-    method @androidx.compose.runtime.Composable public void DatePickerHeadline(androidx.compose.material3.DatePickerState state, androidx.compose.material3.DatePickerFormatter dateFormatter);
-    method @androidx.compose.runtime.Composable public void DatePickerTitle(androidx.compose.material3.DatePickerState state);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.DatePickerColors colors(optional long containerColor, optional long titleContentColor, optional long headlineContentColor, optional long weekdayContentColor, optional long subheadContentColor, optional long yearContentColor, optional long currentYearContentColor, optional long selectedYearContentColor, optional long selectedYearContainerColor, optional long dayContentColor, optional long disabledDayContentColor, optional long selectedDayContentColor, optional long disabledSelectedDayContentColor, optional long selectedDayContainerColor, optional long disabledSelectedDayContainerColor, optional long todayContentColor, optional long todayDateBorderColor);
+    method @androidx.compose.runtime.Composable public void DatePickerHeadline(androidx.compose.material3.DatePickerState state, androidx.compose.material3.DatePickerFormatter dateFormatter, optional androidx.compose.ui.Modifier modifier);
+    method @androidx.compose.runtime.Composable public void DatePickerTitle(androidx.compose.material3.DatePickerState state, optional androidx.compose.ui.Modifier modifier);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.DatePickerColors colors(optional long containerColor, optional long titleContentColor, optional long headlineContentColor, optional long weekdayContentColor, optional long subheadContentColor, optional long yearContentColor, optional long currentYearContentColor, optional long selectedYearContentColor, optional long selectedYearContainerColor, optional long dayContentColor, optional long disabledDayContentColor, optional long selectedDayContentColor, optional long disabledSelectedDayContentColor, optional long selectedDayContainerColor, optional long disabledSelectedDayContainerColor, optional long todayContentColor, optional long todayDateBorderColor, optional long dayInSelectionRangeContentColor, optional long dayInSelectionRangeContainerColor);
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getShape();
     method public float getTonalElevation();
     method public kotlin.ranges.IntRange getYearRange();
@@ -345,7 +333,31 @@
     method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.DatePickerState,?> Saver();
   }
 
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class DateRangePickerDefaults {
+    method @androidx.compose.runtime.Composable public void DateRangePickerHeadline(androidx.compose.material3.DateRangePickerState state, androidx.compose.material3.DatePickerFormatter dateFormatter, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method @androidx.compose.runtime.Composable public void DateRangePickerTitle(androidx.compose.material3.DateRangePickerState state, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    field public static final androidx.compose.material3.DateRangePickerDefaults INSTANCE;
+  }
+
   public final class DateRangePickerKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DateRangePicker(androidx.compose.material3.DateRangePickerState state, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DatePickerFormatter dateFormatter, optional kotlin.jvm.functions.Function1<? super java.lang.Long,java.lang.Boolean> dateValidator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit> headline, optional androidx.compose.material3.DatePickerColors colors);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.DateRangePickerState rememberDateRangePickerState(optional Long? initialSelectedStartDateMillis, optional Long? initialSelectedEndDateMillis, optional Long? initialDisplayedMonthMillis, optional kotlin.ranges.IntRange yearRange, optional int initialDisplayMode);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class DateRangePickerState {
+    ctor public DateRangePickerState(Long? initialSelectedStartDateMillis, Long? initialSelectedEndDateMillis, Long? initialDisplayedMonthMillis, kotlin.ranges.IntRange yearRange, int initialDisplayMode);
+    method public int getDisplayMode();
+    method public Long? getSelectedEndDateMillis();
+    method public Long? getSelectedStartDateMillis();
+    method public void setDisplayMode(int);
+    property public final int displayMode;
+    property public final Long? selectedEndDateMillis;
+    property public final Long? selectedStartDateMillis;
+    field public static final androidx.compose.material3.DateRangePickerState.Companion Companion;
+  }
+
+  public static final class DateRangePickerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.DateRangePickerState,?> Saver();
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api public enum DismissDirection {
@@ -408,9 +420,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getDismissibleDrawerElevation();
@@ -468,9 +477,6 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
-  public final class ElevationKt {
-  }
-
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalMaterial3Api {
   }
 
@@ -483,8 +489,10 @@
   @androidx.compose.material3.ExperimentalMaterial3Api public final class ExposedDropdownMenuDefaults {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public void TrailingIcon(boolean expanded);
     method public androidx.compose.foundation.layout.PaddingValues getItemContentPadding();
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, 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.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, 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.material3.TextFieldColors outlinedTextFieldColors(optional long focusedTextColor, optional long unfocusedTextColor, optional long disabledTextColor, optional long errorTextColor, optional long containerColor, optional long errorContainerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long focusedPlaceholderColor, optional long unfocusedPlaceholderColor, optional long disabledPlaceholderColor, optional long errorPlaceholderColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, 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.material3.TextFieldColors textFieldColors(optional long focusedTextColor, optional long unfocusedTextColor, optional long disabledTextColor, optional long errorTextColor, optional long containerColor, optional long errorContainerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long focusedPlaceholderColor, optional long unfocusedPlaceholderColor, optional long disabledPlaceholderColor, optional long errorPlaceholderColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, 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 androidx.compose.foundation.layout.PaddingValues ItemContentPadding;
     field public static final androidx.compose.material3.ExposedDropdownMenuDefaults INSTANCE;
   }
@@ -493,7 +501,7 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material3.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api @kotlin.jvm.JvmInline public final value class FabPosition {
+  @kotlin.jvm.JvmInline public final value class FabPosition {
     field public static final androidx.compose.material3.FabPosition.Companion Companion;
   }
 
@@ -590,9 +598,6 @@
   @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
-  public final class IncludeFontPaddingHelper_androidKt {
-  }
-
   @androidx.compose.material3.ExperimentalMaterial3Api public final class InputChipDefaults {
     method public float getAvatarSize();
     method public float getHeight();
@@ -660,9 +665,6 @@
   @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
-  public final class MenuKt {
-  }
-
   public final class ModalBottomSheetKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalBottomSheet(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.SheetState sheetState, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional float tonalElevation, optional long scrimColor, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dragHandle, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
@@ -818,14 +820,14 @@
     property public boolean isVisible;
   }
 
-  @androidx.compose.material3.ExperimentalMaterial3Api public final class ScaffoldDefaults {
+  public final class ScaffoldDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getContentWindowInsets();
     property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets contentWindowInsets;
     field public static final androidx.compose.material3.ScaffoldDefaults INSTANCE;
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SearchBarColors {
@@ -845,7 +847,8 @@
     method public float getInputFieldHeight();
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getInputFieldShape();
     method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getWindowInsets();
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors inputFieldColors(optional long textColor, optional long disabledTextColor, optional long cursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors inputFieldColors(optional long focusedTextColor, optional long unfocusedTextColor, optional long disabledTextColor, optional long cursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long focusedPlaceholderColor, optional long unfocusedPlaceholderColor, optional long disabledPlaceholderColor);
+    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors! inputFieldColors(optional long textColor, optional long disabledTextColor, optional long cursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long placeholderColor, optional long disabledPlaceholderColor);
     property public final float Elevation;
     property public final float InputFieldHeight;
     property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape dockedShape;
@@ -898,9 +901,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SheetDefaultsKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.SheetState rememberSheetState(optional boolean skipHalfExpanded, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.SheetValue,java.lang.Boolean> confirmValueChange);
   }
@@ -998,7 +998,7 @@
     ctor public SnackbarHostState();
     method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
     method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
-    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? showSnackbar(androidx.compose.material3.SnackbarVisuals visuals, kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    method public suspend Object? showSnackbar(androidx.compose.material3.SnackbarVisuals visuals, kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
     property public final androidx.compose.material3.SnackbarData? currentSnackbarData;
   }
 
@@ -1025,9 +1025,6 @@
     property public abstract boolean withDismissAction;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SuggestionChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors elevatedSuggestionChipColors(optional long containerColor, optional long labelColor, optional long iconContentColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledIconContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipElevation elevatedSuggestionChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
@@ -1063,12 +1060,6 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.DismissState rememberDismissState(optional androidx.compose.material3.DismissValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DismissValue,java.lang.Boolean> confirmValueChange, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.Density,? super java.lang.Float,java.lang.Float> positionalThreshold);
   }
 
-  public final class SwipeableKt {
-  }
-
-  public final class SwipeableV2Kt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
@@ -1083,9 +1074,6 @@
     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 kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SystemBarsDefaultInsets_androidKt {
-  }
-
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
@@ -1133,9 +1121,11 @@
     method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getOutlinedShape();
     method public float getUnfocusedBorderThickness();
     method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.ui.Modifier indicatorLine(androidx.compose.ui.Modifier, boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.material3.TextFieldColors colors, optional float focusedIndicatorLineThickness, optional float unfocusedIndicatorLineThickness);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long focusedTextColor, optional long unfocusedTextColor, optional long disabledTextColor, optional long errorTextColor, optional long containerColor, optional long errorContainerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long focusedPlaceholderColor, optional long unfocusedPlaceholderColor, optional long disabledPlaceholderColor, optional long errorPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
     method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues outlinedTextFieldPadding(optional float start, optional float top, optional float end, optional float bottom);
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long focusedTextColor, optional long unfocusedTextColor, optional long disabledTextColor, optional long errorTextColor, optional long containerColor, optional long errorContainerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long focusedPlaceholderColor, optional long unfocusedPlaceholderColor, optional long disabledPlaceholderColor, optional long errorPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
+    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public androidx.compose.material3.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long containerColor, optional long cursorColor, optional long errorCursorColor, optional androidx.compose.foundation.text.selection.TextSelectionColors selectionColors, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long focusedLeadingIconColor, optional long unfocusedLeadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long focusedTrailingIconColor, optional long unfocusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor, optional long focusedSupportingTextColor, optional long unfocusedSupportingTextColor, optional long disabledSupportingTextColor, optional long errorSupportingTextColor, optional long focusedPrefixColor, optional long unfocusedPrefixColor, optional long disabledPrefixColor, optional long errorPrefixColor, optional long focusedSuffixColor, optional long unfocusedSuffixColor, optional long disabledSuffixColor, optional long errorSuffixColor);
     method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues textFieldWithLabelPadding(optional float start, optional float end, optional float top, optional float bottom);
     method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.foundation.layout.PaddingValues textFieldWithoutLabelPadding(optional float start, optional float top, optional float end, optional float bottom);
     property public final float FocusedBorderThickness;
@@ -1147,12 +1137,6 @@
     field public static final androidx.compose.material3.TextFieldDefaults INSTANCE;
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  public final class TextFieldImplKt {
-  }
-
   public final class TextFieldKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api @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 kotlin.jvm.functions.Function0<kotlin.Unit>? prefix, optional kotlin.jvm.functions.Function0<kotlin.Unit>? suffix, optional kotlin.jvm.functions.Function0<kotlin.Unit>? supportingText, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.TextFieldColors colors);
     method @androidx.compose.material3.ExperimentalMaterial3Api @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 kotlin.jvm.functions.Function0<kotlin.Unit>? prefix, optional kotlin.jvm.functions.Function0<kotlin.Unit>? suffix, optional kotlin.jvm.functions.Function0<kotlin.Unit>? supportingText, 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 int minLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.TextFieldColors colors);
@@ -1170,9 +1154,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
-  public final class TimeFormat_androidKt {
-  }
-
   @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class TimePickerColors {
   }
 
@@ -1202,9 +1183,6 @@
     method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.TimePickerState,?> Saver();
   }
 
-  public final class TonalPaletteKt {
-  }
-
   @androidx.compose.material3.ExperimentalMaterial3Api public interface TooltipBoxScope {
     method public androidx.compose.ui.Modifier tooltipAnchor(androidx.compose.ui.Modifier);
   }
@@ -1315,15 +1293,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material3.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
 }
 
diff --git a/compose/material3/material3/api/restricted_current.ignore b/compose/material3/material3/api/restricted_current.ignore
index 929472e..f188367 100644
--- a/compose/material3/material3/api/restricted_current.ignore
+++ b/compose/material3/material3/api/restricted_current.ignore
@@ -1,3 +1,41 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.material3.AlertDialogKt:
+    Removed class androidx.compose.material3.AlertDialogKt
+RemovedClass: androidx.compose.material3.BadgeKt:
+    Removed class androidx.compose.material3.BadgeKt
+RemovedClass: androidx.compose.material3.DragGestureDetectorCopyKt:
+    Removed class androidx.compose.material3.DragGestureDetectorCopyKt
+RemovedClass: androidx.compose.material3.ElevationKt:
+    Removed class androidx.compose.material3.ElevationKt
+RemovedClass: androidx.compose.material3.ExposedDropdownMenuKt:
+    Removed class androidx.compose.material3.ExposedDropdownMenuKt
+RemovedClass: androidx.compose.material3.IncludeFontPaddingHelper_androidKt:
+    Removed class androidx.compose.material3.IncludeFontPaddingHelper_androidKt
+RemovedClass: androidx.compose.material3.MenuKt:
+    Removed class androidx.compose.material3.MenuKt
+RemovedClass: androidx.compose.material3.OutlinedTextFieldKt:
+    Removed class androidx.compose.material3.OutlinedTextFieldKt
+RemovedClass: androidx.compose.material3.ShapesKt:
+    Removed class androidx.compose.material3.ShapesKt
+RemovedClass: androidx.compose.material3.Strings_androidKt:
+    Removed class androidx.compose.material3.Strings_androidKt
+RemovedClass: androidx.compose.material3.SwipeableKt:
+    Removed class androidx.compose.material3.SwipeableKt
+RemovedClass: androidx.compose.material3.SystemBarsDefaultInsets_androidKt:
+    Removed class androidx.compose.material3.SystemBarsDefaultInsets_androidKt
+RemovedClass: androidx.compose.material3.TextFieldDefaultsKt:
+    Removed class androidx.compose.material3.TextFieldDefaultsKt
+RemovedClass: androidx.compose.material3.TextFieldImplKt:
+    Removed class androidx.compose.material3.TextFieldImplKt
+RemovedClass: androidx.compose.material3.TextFieldKt:
+    Removed class androidx.compose.material3.TextFieldKt
+RemovedClass: androidx.compose.material3.TonalPaletteKt:
+    Removed class androidx.compose.material3.TonalPaletteKt
 RemovedClass: androidx.compose.material3.TouchTargetKt:
     Removed class androidx.compose.material3.TouchTargetKt
+RemovedClass: androidx.compose.material3.TypographyKt:
+    Removed class androidx.compose.material3.TypographyKt
+
+
+RemovedPackage: androidx.compose.material3.internal:
+    Removed package androidx.compose.material3.internal
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index cc495fc..0c53c8d 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -17,9 +17,6 @@
     field public static final androidx.compose.material3.AlertDialogDefaults INSTANCE;
   }
 
-  public final class AlertDialogKt {
-  }
-
   public final class AndroidAlertDialog_androidKt {
     method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, 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 containerColor, optional long iconContentColor, optional long titleContentColor, optional long textContentColor, optional float tonalElevation, optional androidx.compose.ui.window.DialogProperties properties);
   }
@@ -49,9 +46,6 @@
     field public static final androidx.compose.material3.AssistChipDefaults INSTANCE;
   }
 
-  public final class BadgeKt {
-  }
-
   public final class BottomAppBarDefaults {
     method @androidx.compose.runtime.Composable public long getBottomAppBarFabColor();
     method @androidx.compose.runtime.Composable public long getContainerColor();
@@ -120,12 +114,6 @@
     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.ui.graphics.Shape shape, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.foundation.BorderStroke? border, 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 CalendarModelKt {
-  }
-
-  public final class CalendarModel_androidKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class CardColors {
   }
 
@@ -260,18 +248,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
-  public final class DateInputKt {
-  }
-
-  public final class DatePickerDialog_androidKt {
-  }
-
-  public final class DatePickerKt {
-  }
-
-  public final class DateRangePickerKt {
-  }
-
   public final class DividerDefaults {
     method @androidx.compose.runtime.Composable public long getColor();
     method public float getThickness();
@@ -284,9 +260,6 @@
     method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
   }
 
-  public final class DragGestureDetectorCopyKt {
-  }
-
   public final class DrawerDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getDismissibleDrawerElevation();
@@ -344,10 +317,15 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
-  public final class ElevationKt {
+  @kotlin.jvm.JvmInline public final value class FabPosition {
+    field public static final androidx.compose.material3.FabPosition.Companion Companion;
   }
 
-  public final class ExposedDropdownMenuKt {
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -421,9 +399,6 @@
   @androidx.compose.runtime.Immutable public final class IconToggleButtonColors {
   }
 
-  public final class IncludeFontPaddingHelper_androidKt {
-  }
-
   public final class InteractiveComponentSizeKt {
     method public static androidx.compose.ui.Modifier minimumInteractiveComponentSize(androidx.compose.ui.Modifier);
   }
@@ -472,12 +447,6 @@
   @androidx.compose.runtime.Immutable public final class MenuItemColors {
   }
 
-  public final class MenuKt {
-  }
-
-  public final class ModalBottomSheetKt {
-  }
-
   public final class NavigationBarDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     method public float getElevation();
@@ -549,9 +518,6 @@
     method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationRailItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class OutlinedTextFieldKt {
-  }
-
   public final class ProgressIndicatorDefaults {
     method @androidx.compose.runtime.Composable public long getCircularColor();
     method public int getCircularDeterminateStrokeCap();
@@ -597,7 +563,14 @@
     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.material3.RadioButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
+  public final class ScaffoldDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.WindowInsets getContentWindowInsets();
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.layout.WindowInsets contentWindowInsets;
+    field public static final androidx.compose.material3.ScaffoldDefaults INSTANCE;
+  }
+
   public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.layout.WindowInsets contentWindowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
   }
 
   public final class SearchBarDefaults {
@@ -616,9 +589,6 @@
     field public static final androidx.compose.material3.SearchBarDefaults INSTANCE;
   }
 
-  public final class SearchBarKt {
-  }
-
   public final class ShapeDefaults {
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
@@ -648,12 +618,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
-  public final class SheetDefaultsKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SliderColors {
   }
 
@@ -717,6 +681,7 @@
     ctor public SnackbarHostState();
     method public androidx.compose.material3.SnackbarData? getCurrentSnackbarData();
     method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional boolean withDismissAction, optional androidx.compose.material3.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
+    method public suspend Object? showSnackbar(androidx.compose.material3.SnackbarVisuals visuals, kotlin.coroutines.Continuation<? super androidx.compose.material3.SnackbarResult>);
     property public final androidx.compose.material3.SnackbarData? currentSnackbarData;
   }
 
@@ -743,9 +708,6 @@
     property public abstract boolean withDismissAction;
   }
 
-  public final class Strings_androidKt {
-  }
-
   public final class SuggestionChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipColors elevatedSuggestionChipColors(optional long containerColor, optional long labelColor, optional long iconContentColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledIconContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.ChipElevation elevatedSuggestionChipElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
@@ -767,15 +729,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
   }
 
-  public final class SwipeToDismissKt {
-  }
-
-  public final class SwipeableKt {
-  }
-
-  public final class SwipeableV2Kt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SwitchColors {
   }
 
@@ -790,9 +743,6 @@
     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 kotlin.jvm.functions.Function0<kotlin.Unit>? thumbContent, optional boolean enabled, optional androidx.compose.material3.SwitchColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
-  public final class SystemBarsDefaultInsets_androidKt {
-  }
-
   public final class TabKt {
     method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
@@ -826,15 +776,6 @@
   @androidx.compose.runtime.Immutable public final class TextFieldColors {
   }
 
-  public final class TextFieldDefaultsKt {
-  }
-
-  public final class TextFieldImplKt {
-  }
-
-  public final class TextFieldKt {
-  }
-
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
@@ -845,12 +786,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
-  public final class TimeFormat_androidKt {
-  }
-
-  public final class TimePickerKt {
-  }
-
   @androidx.compose.runtime.Stable public final class TimePickerState {
     ctor public TimePickerState(int initialHour, int initialMinute, boolean is24Hour);
     method public int getHour();
@@ -867,12 +802,6 @@
     method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.TimePickerState,?> Saver();
   }
 
-  public final class TonalPaletteKt {
-  }
-
-  public final class TooltipKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class Typography {
     ctor public Typography(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
     method public androidx.compose.material3.Typography copy(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
@@ -908,15 +837,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
-}
-
-package androidx.compose.material3.internal {
-
-  public final class ExposedDropdownMenuPopupKt {
-  }
-
 }
 
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index 279836b..4b043b1 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -67,8 +67,7 @@
         androidTestImplementation(libs.testRunner)
         androidTestImplementation(libs.junit)
         androidTestImplementation(libs.truth)
-        androidTestImplementation(libs.dexmakerMockito)
-        androidTestImplementation(libs.mockitoCore)
+        androidTestImplementation(libs.dexmakerMockitoInlineExtended)
         androidTestImplementation(libs.mockitoKotlin)
         androidTestImplementation(libs.testUiautomator)
 
@@ -134,13 +133,11 @@
                 implementation(project(':compose:foundation:foundation-layout'))
                 implementation(project(":test:screenshot:screenshot"))
                 implementation(project(":core:core"))
-
                 implementation(libs.testRules)
                 implementation(libs.testRunner)
                 implementation(libs.junit)
                 implementation(libs.truth)
-                implementation(libs.dexmakerMockito)
-                implementation(libs.mockitoCore)
+                implementation(libs.dexmakerMockitoInlineExtended)
                 implementation(libs.mockitoKotlin)
                 implementation(libs.testUiautomator)
             }
diff --git a/compose/material3/material3/integration-tests/material3-catalog/OWNERS b/compose/material3/material3/integration-tests/material3-catalog/OWNERS
deleted file mode 100644
index 5c55131..0000000
--- a/compose/material3/material3/integration-tests/material3-catalog/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-nickrout@google.com
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
index 093259d..686c43c 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
@@ -43,6 +43,7 @@
 import androidx.compose.material3.samples.DatePickerDialogSample
 import androidx.compose.material3.samples.DatePickerSample
 import androidx.compose.material3.samples.DatePickerWithDateValidatorSample
+import androidx.compose.material3.samples.DateRangePickerSample
 import androidx.compose.material3.samples.DismissibleNavigationDrawerSample
 import androidx.compose.material3.samples.DockedSearchBarSample
 import androidx.compose.material3.samples.EditableExposedDropdownMenuSample
@@ -387,6 +388,13 @@
     ) {
         DateInputSample()
     },
+    Example(
+        name = ::DateRangePickerSample.name,
+        description = DatePickerExampleDescription,
+        sourceUrl = DatePickerExampleSourceUrl
+    ) {
+        DateRangePickerSample()
+    },
 )
 
 private const val DialogExampleDescription = "Dialog examples"
diff --git a/compose/material3/material3/samples/build.gradle b/compose/material3/material3/samples/build.gradle
index 80423d4..ae744c3 100644
--- a/compose/material3/material3/samples/build.gradle
+++ b/compose/material3/material3/samples/build.gradle
@@ -41,6 +41,8 @@
     implementation("androidx.compose.ui:ui-text:1.2.1")
     implementation("androidx.savedstate:savedstate-ktx:1.2.0")
     implementation(project(":compose:ui:ui-tooling-preview"))
+    implementation(project(":lifecycle:lifecycle-runtime-ktx"))
+    implementation(project(":lifecycle:lifecycle-common-java8"))
 
     debugImplementation(project(":compose:ui:ui-tooling"))
 }
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
index b3b24eb..66f3939 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DatePickerSamples.kt
@@ -19,21 +19,32 @@
 import androidx.annotation.Sampled
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Icon
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
 import androidx.compose.material3.DatePicker
 import androidx.compose.material3.DatePickerDialog
+import androidx.compose.material3.DateRangePicker
 import androidx.compose.material3.DisplayMode
+import androidx.compose.material3.Divider
 import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.IconButton
 import androidx.compose.material3.SnackbarHost
 import androidx.compose.material3.SnackbarHostState
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextButton
 import androidx.compose.material3.rememberDatePickerState
+import androidx.compose.material3.rememberDateRangePickerState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
@@ -149,3 +160,40 @@
         Text("Entered date timestamp: ${state.selectedDateMillis ?: "no input"}")
     }
 }
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Preview
+@Sampled
+@Composable
+fun DateRangePickerSample() {
+    val savedRange = remember { mutableStateOf(LongRange.EMPTY) }
+    val state = rememberDateRangePickerState()
+    Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Top) {
+        // Add a row with "Save" and dismiss actions.
+        Row(
+            modifier = Modifier
+                .fillMaxWidth()
+                .padding(start = 12.dp, end = 12.dp),
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.SpaceBetween
+        ) {
+            IconButton(onClick = { /* dismiss the UI */ }) {
+                Icon(Icons.Filled.Close, contentDescription = "Localized description")
+            }
+            TextButton(
+                onClick = {
+                    savedRange.value =
+                        state.selectedStartDateMillis!!..state.selectedEndDateMillis!!
+                },
+                enabled = state.selectedEndDateMillis != null
+            ) {
+                Text(text = "Save")
+            }
+        }
+
+        DateRangePicker(state = state, modifier = Modifier.weight(1f))
+
+        Divider()
+        Text("Saved range of timestamps: ${savedRange.value}")
+    }
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
index 21a56c0..f455324 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TimePickerSamples.kt
@@ -44,6 +44,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.DialogProperties
@@ -55,6 +56,7 @@
 @OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
+@Preview
 fun TimePickerSample() {
     var showTimePicker by remember { mutableStateOf(false) }
     val state = rememberTimePickerState()
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardTest.kt
index 0cf7b76..d2869ed 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/CardTest.kt
@@ -32,7 +32,10 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.test.assertIsEnabled
 import androidx.compose.ui.test.assertIsNotEnabled
@@ -103,6 +106,7 @@
         rule
             .onNodeWithTag("card")
             .assertHasClickAction()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             // since we merge descendants we should have text on the same node
             .assertTextEquals("0")
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
new file mode 100644
index 0000000..0b46437
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerScreenshotTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.material3
+
+import android.os.Build
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import java.time.DayOfWeek
+import java.time.Instant
+import java.time.LocalDate
+import java.time.LocalTime
+import java.time.ZoneId
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@LargeTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalMaterial3Api::class)
+class DateRangePickerScreenshotTest(private val scheme: ColorSchemeWrapper) {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    private val wrap = Modifier.wrapContentSize(Alignment.Center)
+    private val wrapperTestTag = "dateRangePickerWrapper"
+
+    @Test
+    fun dateRangePicker_initialMonth() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 1, dayOfMonth = 1)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis
+                    )
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_initialMonth_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangePicker_initialMonthAndSelection() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 1)
+                val startSelectionMillis =
+                    dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 6)
+                val endSelectionMillis =
+                    dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 10)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis,
+                        initialSelectedStartDateMillis = startSelectionMillis,
+                        initialSelectedEndDateMillis = endSelectionMillis
+                    )
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_initialMonthAndSelection_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangePicker_selectionSpanningMonths() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val monthInUtcMillis = dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 1)
+                val startSelectionMillis =
+                    dayInUtcMilliseconds(year = 2021, month = 3, dayOfMonth = 25)
+                val endSelectionMillis =
+                    dayInUtcMilliseconds(year = 2021, month = 4, dayOfMonth = 5)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis,
+                        initialSelectedStartDateMillis = startSelectionMillis,
+                        initialSelectedEndDateMillis = endSelectionMillis
+                    )
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_selectionSpanningMonths_${scheme.name}")
+    }
+
+    @Test
+    fun dateRangePicker_invalidSundaySelection() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(wrap.testTag(wrapperTestTag)) {
+                val monthInUtcMillis = dayInUtcMilliseconds(year = 2000, month = 6, dayOfMonth = 1)
+                DateRangePicker(
+                    state = rememberDateRangePickerState(
+                        initialDisplayedMonthMillis = monthInUtcMillis
+                    ),
+                    dateValidator = { utcDateInMills ->
+                        val localDate =
+                            Instant.ofEpochMilli(utcDateInMills).atZone(ZoneId.of("UTC"))
+                                .toLocalDate()
+                        val dayOfWeek = localDate.dayOfWeek
+                        dayOfWeek != DayOfWeek.SUNDAY
+                    }
+                )
+            }
+        }
+        assertAgainstGolden("dateRangePicker_invalidSundaySelection_${scheme.name}")
+    }
+
+    // Returns the given date's day as milliseconds from epoch. The returned value is for the day's
+    // start on midnight.
+    private fun dayInUtcMilliseconds(year: Int, month: Int, dayOfMonth: Int): Long =
+        LocalDate.of(year, month, dayOfMonth)
+            .atTime(LocalTime.MIDNIGHT)
+            .atZone(ZoneId.of("UTC"))
+            .toInstant()
+            .toEpochMilli()
+
+    private fun assertAgainstGolden(goldenName: String) {
+        rule.onNodeWithTag(wrapperTestTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenName)
+    }
+
+    // Provide the ColorScheme and their name parameter in a ColorSchemeWrapper.
+    // This makes sure that the default method name and the initial Scuba image generated
+    // name is as expected.
+    companion object {
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun parameters() = arrayOf(
+            ColorSchemeWrapper("lightTheme", lightColorScheme()),
+            ColorSchemeWrapper("darkTheme", darkColorScheme()),
+        )
+    }
+
+    class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
+        override fun toString(): String {
+            return name
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
index 61f6b74..351f502 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/DateRangePickerTest.kt
@@ -16,8 +16,14 @@
 
 package androidx.compose.material3
 
+import androidx.compose.ui.test.assertIsNotSelected
+import androidx.compose.ui.test.assertIsSelected
 import androidx.compose.ui.test.junit4.StateRestorationTester
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onAllNodesWithText
+import androidx.compose.ui.test.onFirst
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
@@ -172,6 +178,114 @@
     }
 
     @Test
+    fun datesSelection() {
+        lateinit var defaultStartSelectionHeadline: String // i.e. "Start date"
+        lateinit var defaultEndSelectionHeadline: String // i.e. "End date"
+        lateinit var dateRangePickerState: DateRangePickerState
+        rule.setMaterialContent(lightColorScheme()) {
+            defaultStartSelectionHeadline = getString(Strings.DateRangePickerStartHeadline)
+            defaultEndSelectionHeadline = getString(Strings.DateRangePickerEndHeadline)
+            val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 1, dayOfMonth = 1)
+            dateRangePickerState = rememberDateRangePickerState(
+                initialDisplayedMonthMillis = monthInUtcMillis
+            )
+            DateRangePicker(state = dateRangePickerState)
+        }
+
+        rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
+            .assertExists()
+        rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true)
+            .assertExists()
+
+        // First date selection: Select the 10th day of the displayed month.
+        rule.onAllNodesWithText("10").onFirst().assertIsNotSelected()
+        rule.onAllNodesWithText("10").onFirst().performClick()
+
+        // Assert the state holds a valid start date.
+        rule.runOnIdle {
+            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2019,
+                    month = 1,
+                    dayOfMonth = 10
+                )
+            )
+            assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
+        }
+        // Check that the title holds the start of the selection as a date, and ends with a suffix
+        // string.
+        rule.onNodeWithText(defaultStartSelectionHeadline, useUnmergedTree = true)
+            .assertDoesNotExist()
+        rule.onNodeWithText("Jan 10, 2019", useUnmergedTree = true).assertExists()
+        rule.onNodeWithText(defaultEndSelectionHeadline, useUnmergedTree = true).assertExists()
+        rule.onAllNodesWithText("10").onFirst().assertIsSelected()
+
+        // Second date selection: Select the 14th day of the displayed month.
+        rule.onAllNodesWithText("14").onFirst().assertIsNotSelected()
+        rule.onAllNodesWithText("14").onFirst().performClick()
+
+        // Assert the state holds a valid end date.
+        rule.runOnIdle {
+            assertThat(dateRangePickerState.selectedEndDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2019,
+                    month = 1,
+                    dayOfMonth = 14
+                )
+            )
+        }
+        rule.onNodeWithText(defaultEndSelectionHeadline).assertDoesNotExist()
+        rule.onNodeWithText("Jan 10, 2019", useUnmergedTree = true).assertExists()
+        rule.onNodeWithText("Jan 14, 2019", useUnmergedTree = true).assertExists()
+    }
+
+    /**
+     * Tests that an end-date selection before the selected start date moves the start date to be
+     * that date.
+     */
+    @Test
+    fun dateSelectionStartReset() {
+        lateinit var dateRangePickerState: DateRangePickerState
+        rule.setMaterialContent(lightColorScheme()) {
+            val monthInUtcMillis = dayInUtcMilliseconds(year = 2019, month = 3, dayOfMonth = 1)
+            dateRangePickerState = rememberDateRangePickerState(
+                initialDisplayedMonthMillis = monthInUtcMillis
+            )
+            DateRangePicker(state = dateRangePickerState)
+        }
+
+        // First date selection: Select the 15th day of the first displayed month in the list.
+        rule.onAllNodesWithText("15").onFirst().performClick()
+
+        // Assert the state holds a valid start date.
+        rule.runOnIdle {
+            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2019,
+                    month = 3,
+                    dayOfMonth = 15
+                )
+            )
+            assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
+        }
+
+        // Select a second date that is earlier than the first date.
+        rule.onAllNodesWithText("12").onFirst().performClick()
+
+        // Assert the state now holds the second selection as the start date.
+        rule.runOnIdle {
+            assertThat(dateRangePickerState.selectedStartDateMillis).isEqualTo(
+                dayInUtcMilliseconds(
+                    year = 2019,
+                    month = 3,
+                    dayOfMonth = 12
+                )
+            )
+            assertThat(dateRangePickerState.selectedEndDateMillis).isNull()
+        }
+    }
+
+    @Test
     fun state_restoresDatePickerState() {
         val restorationTester = StateRestorationTester(rule)
         var dateRangePickerState: DateRangePickerState? = null
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
index 282a573..46c3e79 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/FloatingActionButtonTest.kt
@@ -38,6 +38,10 @@
 import androidx.compose.ui.layout.boundsInRoot
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.assertIsEnabled
@@ -81,6 +85,7 @@
 
         rule.onNodeWithTag("myButton")
             .assertIsEnabled()
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
     }
 
     @Test
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt
index bbd38c9..22ceff9 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt
@@ -373,6 +373,32 @@
     }
 
     @Test
+    fun filledTonalIconButton_defaultSemantics() {
+        rule.setMaterialContent(lightColorScheme()) {
+            FilledTonalIconButton(onClick = { /* doSomething() */ }) {
+                Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+            }
+        }
+        rule.onNode(hasClickAction()).apply {
+            assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
+            assertIsEnabled()
+        }
+    }
+
+    @Test
+    fun filledTonalIconButton_disabledSemantics() {
+        rule.setMaterialContent(lightColorScheme()) {
+            FilledTonalIconButton(onClick = {}, enabled = false) {
+                Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+            }
+        }
+        rule.onNode(hasClickAction()).apply {
+            assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
+            assertIsNotEnabled()
+        }
+    }
+
+    @Test
     fun filledIconToggleButton_size() {
         rule
             .setMaterialContentForSizeAssertions {
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
index c9c8f8b..5f53ed9 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldScreenshotTest.kt
@@ -177,7 +177,8 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.testTag(TextFieldTag).requiredWidth(280.dp),
-                colors = TextFieldDefaults.outlinedTextFieldColors(textColor = Color.Magenta)
+                colors =
+                    TextFieldDefaults.outlinedTextFieldColors(unfocusedTextColor = Color.Magenta),
             )
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
index ba87293..04d31bf 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/OutlinedTextFieldTest.kt
@@ -206,7 +206,7 @@
                         value = "",
                         onValueChange = {},
                         colors = TextFieldDefaults.outlinedTextFieldColors(
-                            textColor = Color.White,
+                            unfocusedTextColor = Color.White,
                             unfocusedBorderColor = Color.White
                         ),
                         shape = RectangleShape
@@ -1225,6 +1225,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun testOutlinedTextField_imeActionAndKeyboardTypePropagatedDownstream() {
         val platformTextInputService = mock<PlatformTextInputService>()
         val textInputService = TextInputService(platformTextInputService)
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
index bf5bc93..605e1fb 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
@@ -58,7 +58,6 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalMaterial3Api::class)
 class ScaffoldTest {
 
     @get:Rule
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SearchBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SearchBarTest.kt
index c971711..8b99b74 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SearchBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SearchBarTest.kt
@@ -21,6 +21,8 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.MoreVert
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -54,6 +56,7 @@
     val rule = createComposeRule()
 
     private val SearchBarTestTag = "SearchBar"
+    private val IconTestTag = "Icon"
     private val BackTestTag = "Back"
 
     @Test
@@ -160,6 +163,47 @@
     }
 
     @Test
+    fun searchBar_clickingIconButton_doesNotExpandSearchBarItself() {
+        var iconClicked = false
+
+        rule.setMaterialContent(lightColorScheme()) {
+            Box(Modifier.fillMaxSize()) {
+                var active by remember { mutableStateOf(false) }
+
+                SearchBar(
+                    modifier = Modifier.testTag(SearchBarTestTag),
+                    query = "Query",
+                    onQueryChange = {},
+                    onSearch = {},
+                    active = active,
+                    onActiveChange = { active = it },
+                    trailingIcon = {
+                        IconButton(
+                            onClick = { iconClicked = true },
+                            modifier = Modifier.testTag(IconTestTag)
+                        ) {
+                            Icon(Icons.Default.MoreVert, null)
+                        }
+                    }
+                ) {
+                    Text("Content")
+                }
+            }
+        }
+
+        rule.onNodeWithText("Content").assertDoesNotExist()
+
+        // Click icon, not search bar
+        rule.onNodeWithTag(IconTestTag).performClick()
+        assertThat(iconClicked).isTrue()
+        rule.onNodeWithText("Content").assertDoesNotExist()
+
+        // Click search bar
+        rule.onNodeWithTag(SearchBarTestTag).performClick()
+        rule.onNodeWithText("Content").assertIsDisplayed()
+    }
+
+    @Test
     fun dockedSearchBar_becomesActiveOnClick_andInactiveOnBack() {
         rule.setMaterialContent(lightColorScheme()) {
             Column(Modifier.fillMaxSize()) {
@@ -249,4 +293,45 @@
             .assertWidthIsEqualTo(SearchBarMinWidth)
             .assertHeightIsEqualTo(SearchBarDefaults.InputFieldHeight + DockedActiveTableMinHeight)
     }
+
+    @Test
+    fun dockedSearchBar_clickingIconButton_doesNotExpandSearchBarItself() {
+        var iconClicked = false
+
+        rule.setMaterialContent(lightColorScheme()) {
+            Box(Modifier.fillMaxSize()) {
+                var active by remember { mutableStateOf(false) }
+
+                DockedSearchBar(
+                    modifier = Modifier.testTag(SearchBarTestTag),
+                    query = "Query",
+                    onQueryChange = {},
+                    onSearch = {},
+                    active = active,
+                    onActiveChange = { active = it },
+                    trailingIcon = {
+                        IconButton(
+                            onClick = { iconClicked = true },
+                            modifier = Modifier.testTag(IconTestTag)
+                        ) {
+                            Icon(Icons.Default.MoreVert, null)
+                        }
+                    }
+                ) {
+                    Text("Content")
+                }
+            }
+        }
+
+        rule.onNodeWithText("Content").assertDoesNotExist()
+
+        // Click icon, not search bar
+        rule.onNodeWithTag(IconTestTag).performClick()
+        assertThat(iconClicked).isTrue()
+        rule.onNodeWithText("Content").assertDoesNotExist()
+
+        // Click search bar
+        rule.onNodeWithTag(SearchBarTestTag).performClick()
+        rule.onNodeWithText("Content").assertIsDisplayed()
+    }
 }
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
index 81b8b4e..8201b0a 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SnackbarHostTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material3
 
+import android.os.Build
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.rememberCoroutineScope
@@ -33,6 +34,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.doReturn
@@ -192,6 +194,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun snackbarDuration_toMillis_nonNullAccessibilityManager() {
         val mockDurationControl = 10000L
         val mockDurationNonControl = 5000L
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt
index cbb0705..72d4b3d 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt
@@ -296,7 +296,7 @@
         }
         rule.onNodeWithTag("surface")
             .assertHasClickAction()
-            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button))
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             // since we merge descendants we should have text on the same node
             .assertTextEquals("0")
@@ -500,7 +500,7 @@
         }
         rule.onNodeWithTag("surface")
             .assertHasClickAction()
-            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             // since we merge descendants we should have text on the same node
             .assertTextEquals("false")
@@ -604,7 +604,7 @@
         }
         rule.onNodeWithTag("surface")
             .assertHasClickAction()
-            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsProperties.Role))
             .assertIsEnabled()
             // since we merge descendants we should have text on the same node
             .assertTextEquals("false")
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
index 63f5771..d719729 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldScreenshotTest.kt
@@ -185,7 +185,7 @@
                 value = TextFieldValue(text = text, selection = TextRange(text.length)),
                 onValueChange = {},
                 modifier = Modifier.requiredWidth(280.dp).testTag(TextFieldTag),
-                colors = TextFieldDefaults.textFieldColors(textColor = Color.Green)
+                colors = TextFieldDefaults.textFieldColors(unfocusedTextColor = Color.Green)
             )
         }
 
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldTest.kt
index bb7408a..447e330 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextFieldTest.kt
@@ -1248,6 +1248,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun testTextField_imeActionAndKeyboardTypePropagatedDownstream() {
         val platformTextInputService = mock<PlatformTextInputService>()
         val textInputService = TextInputService(platformTextInputService)
@@ -1335,7 +1336,8 @@
                         containerColor = Color.Blue,
                         focusedIndicatorColor = Color.Transparent,
                         unfocusedIndicatorColor = Color.Transparent,
-                        textColor = Color.Transparent,
+                        focusedTextColor = Color.Transparent,
+                        unfocusedTextColor = Color.Transparent,
                         cursorColor = Color.Transparent,
                         focusedLabelColor = Color.Transparent,
                         unfocusedLabelColor = Color.Transparent
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TimePickerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TimePickerTest.kt
index 92a8a0d..3888776 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TimePickerTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TimePickerTest.kt
@@ -16,7 +16,10 @@
 
 package androidx.compose.material3
 
-import android.provider.Settings.System.TIME_12_24
+import android.content.Context
+import android.os.Build
+import android.text.format.DateFormat
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.SemanticsProperties.SelectableGroup
@@ -46,15 +49,20 @@
 import androidx.compose.ui.test.performTouchInput
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import androidx.test.filters.SdkSuppress
+import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
+import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
+import com.android.dx.mockito.inline.extended.MockedMethod
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.quality.Strictness
 
 @OptIn(ExperimentalMaterial3Api::class)
 @MediumTest
 @RunWith(AndroidJUnit4::class)
+
 class TimePickerTest {
 
     @get:Rule
@@ -143,26 +151,54 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun timePickerState_format_12h() {
+        lateinit var context: Context
         lateinit var state: TimePickerState
-        getInstrumentation().uiAutomation.executeShellCommand(
-            "settings put system $TIME_12_24 12"
-        )
-        rule.setContent {
-            state = rememberTimePickerState()
+        val session = mockitoSession()
+            .spyStatic(DateFormat::class.java)
+            .strictness(Strictness.LENIENT)
+            .startMocking()
+        try {
+            rule.setMaterialContent(lightColorScheme()) {
+                context = LocalContext.current
+                doReturn(false).`when`(object : MockedMethod<Boolean> {
+                    override fun get(): Boolean {
+                        return DateFormat.is24HourFormat(context)
+                    }
+                })
+
+                state = rememberTimePickerState()
+            }
+        } finally {
+            session.finishMocking()
         }
 
         assertThat(state.is24hour).isFalse()
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
     fun timePickerState_format_24h() {
+        lateinit var context: Context
         lateinit var state: TimePickerState
-        getInstrumentation().uiAutomation.executeShellCommand(
-            "settings put system $TIME_12_24 24"
-        )
-        rule.setContent {
-            state = rememberTimePickerState()
+        val session = mockitoSession()
+            .spyStatic(DateFormat::class.java)
+            .strictness(Strictness.LENIENT)
+            .startMocking()
+        try {
+            rule.setMaterialContent(lightColorScheme()) {
+                context = LocalContext.current
+                doReturn(true).`when`(object : MockedMethod<Boolean> {
+                    override fun get(): Boolean {
+                        return DateFormat.is24HourFormat(context)
+                    }
+                })
+
+                state = rememberTimePickerState()
+            }
+        } finally {
+            session.finishMocking()
         }
 
         assertThat(state.is24hour).isTrue()
@@ -239,6 +275,7 @@
         }
 
         rule.onAllNodesWithText("14")
+            .filter(isFocusable())
             .assertAll(isSelected())
     }
 
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
index 25d6063..b28b903 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
@@ -308,12 +308,17 @@
 
     /**
      * Creates a [TextFieldColors] that represents the default input text, container, and content
-     * (including label, placeholder, leading and trailing icons) colors used in a [TextField]
-     * within an [ExposedDropdownMenuBox].
+     * colors (including label, placeholder, icons, etc.) used in a [TextField] within an
+     * [ExposedDropdownMenuBox].
      *
-     * @param textColor the color used for the input text of this text field
+     * @param focusedTextColor the color used for the input text of this text field when focused
+     * @param unfocusedTextColor the color used for the input text of this text field when not
+     * focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
+     * @param errorTextColor the color used for the input text of this text field when in error
+     * state
      * @param containerColor the container color for this text field
+     * @param errorContainerColor the container color for this text field when in error state
      * @param cursorColor the cursor color for this text field
      * @param errorCursorColor the cursor color for this text field when in error state
      * @param selectionColors the colors used when the input text of this text field is selected
@@ -334,11 +339,280 @@
      * @param unfocusedLabelColor the label color for this text field when not focused
      * @param disabledLabelColor the label color for this text field when disabled
      * @param errorLabelColor the label color for this text field when in error state
-     * @param placeholderColor the placeholder color for this text field
+     * @param focusedPlaceholderColor the placeholder color for this text field when focused
+     * @param unfocusedPlaceholderColor the placeholder color for this text field when not focused
      * @param disabledPlaceholderColor the placeholder color for this text field when disabled
+     * @param errorPlaceholderColor the placeholder color for this text field when in error state
+     * @param focusedPrefixColor the prefix color for this text field when focused
+     * @param unfocusedPrefixColor the prefix color for this text field when not focused
+     * @param disabledPrefixColor the prefix color for this text field when disabled
+     * @param errorPrefixColor the prefix color for this text field when in error state
+     * @param focusedSuffixColor the suffix color for this text field when focused
+     * @param unfocusedSuffixColor the suffix color for this text field when not focused
+     * @param disabledSuffixColor the suffix color for this text field when disabled
+     * @param errorSuffixColor the suffix color for this text field when in error state
      */
     @Composable
     fun textFieldColors(
+        focusedTextColor: Color = FilledAutocompleteTokens.FieldFocusInputTextColor.toColor(),
+        unfocusedTextColor: Color = FilledAutocompleteTokens.FieldInputTextColor.toColor(),
+        disabledTextColor: Color = FilledAutocompleteTokens.FieldDisabledInputTextColor.toColor()
+            .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity),
+        errorTextColor: Color = FilledAutocompleteTokens.FieldErrorInputTextColor.toColor(),
+        containerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.toColor(),
+        errorContainerColor: Color = FilledAutocompleteTokens.TextFieldContainerColor.toColor(),
+        cursorColor: Color = FilledAutocompleteTokens.TextFieldCaretColor.toColor(),
+        errorCursorColor: Color = FilledAutocompleteTokens.TextFieldErrorFocusCaretColor.toColor(),
+        selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
+        focusedIndicatorColor: Color =
+            FilledAutocompleteTokens.TextFieldFocusActiveIndicatorColor.toColor(),
+        unfocusedIndicatorColor: Color =
+            FilledAutocompleteTokens.TextFieldActiveIndicatorColor.toColor(),
+        disabledIndicatorColor: Color =
+            FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorColor.toColor()
+                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledActiveIndicatorOpacity),
+        errorIndicatorColor: Color =
+            FilledAutocompleteTokens.TextFieldErrorActiveIndicatorColor.toColor(),
+        focusedLeadingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldFocusLeadingIconColor.toColor(),
+        unfocusedLeadingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldLeadingIconColor.toColor(),
+        disabledLeadingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldDisabledLeadingIconColor.toColor()
+                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+        errorLeadingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldErrorLeadingIconColor.toColor(),
+        focusedTrailingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldFocusTrailingIconColor.toColor(),
+        unfocusedTrailingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldTrailingIconColor.toColor(),
+        disabledTrailingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldDisabledTrailingIconColor.toColor()
+                .copy(alpha = FilledAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+        errorTrailingIconColor: Color =
+            FilledAutocompleteTokens.TextFieldErrorTrailingIconColor.toColor(),
+        focusedLabelColor: Color = FilledAutocompleteTokens.FieldFocusLabelTextColor.toColor(),
+        unfocusedLabelColor: Color = FilledAutocompleteTokens.FieldLabelTextColor.toColor(),
+        disabledLabelColor: Color = FilledAutocompleteTokens.FieldDisabledLabelTextColor.toColor(),
+        errorLabelColor: Color = FilledAutocompleteTokens.FieldErrorLabelTextColor.toColor(),
+        focusedPlaceholderColor: Color =
+            FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPlaceholderColor: Color =
+            FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPlaceholderColor: Color =
+            FilledAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+                .copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPlaceholderColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPrefixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
+            .toColor().copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPrefixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledSuffixColor: Color = FilledAutocompleteTokens.FieldDisabledSupportingTextColor
+            .toColor().copy(alpha = FilledAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorSuffixColor: Color = FilledAutocompleteTokens.FieldSupportingTextColor.toColor(),
+    ): TextFieldColors =
+        TextFieldDefaults.textFieldColors(
+            focusedTextColor = focusedTextColor,
+            unfocusedTextColor = unfocusedTextColor,
+            disabledTextColor = disabledTextColor,
+            errorTextColor = errorTextColor,
+            containerColor = containerColor,
+            errorContainerColor = errorContainerColor,
+            cursorColor = cursorColor,
+            errorCursorColor = errorCursorColor,
+            selectionColors = selectionColors,
+            focusedIndicatorColor = focusedIndicatorColor,
+            unfocusedIndicatorColor = unfocusedIndicatorColor,
+            disabledIndicatorColor = disabledIndicatorColor,
+            errorIndicatorColor = errorIndicatorColor,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            errorLeadingIconColor = errorLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            errorTrailingIconColor = errorTrailingIconColor,
+            focusedLabelColor = focusedLabelColor,
+            unfocusedLabelColor = unfocusedLabelColor,
+            disabledLabelColor = disabledLabelColor,
+            errorLabelColor = errorLabelColor,
+            focusedPlaceholderColor = focusedPlaceholderColor,
+            unfocusedPlaceholderColor = unfocusedPlaceholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = errorPlaceholderColor,
+            focusedPrefixColor = focusedPrefixColor,
+            unfocusedPrefixColor = unfocusedPrefixColor,
+            disabledPrefixColor = disabledPrefixColor,
+            errorPrefixColor = errorPrefixColor,
+            focusedSuffixColor = focusedSuffixColor,
+            unfocusedSuffixColor = unfocusedSuffixColor,
+            disabledSuffixColor = disabledSuffixColor,
+            errorSuffixColor = errorSuffixColor,
+        )
+
+    /**
+     * Creates a [TextFieldColors] that represents the default input text, container, and content
+     * colors (including label, placeholder, icons, etc.) used in an [OutlinedTextField] within an
+     * [ExposedDropdownMenuBox].
+     *
+     * @param focusedTextColor the color used for the input text of this text field when focused
+     * @param unfocusedTextColor the color used for the input text of this text field when not
+     * focused
+     * @param disabledTextColor the color used for the input text of this text field when disabled
+     * @param errorTextColor the color used for the input text of this text field when in error
+     * state
+     * @param containerColor the container color for this text field
+     * @param errorContainerColor the container color for this text field when in error state
+     * @param cursorColor the cursor color for this text field
+     * @param errorCursorColor the cursor color for this text field when in error state
+     * @param selectionColors the colors used when the input text of this text field is selected
+     * @param focusedBorderColor the border color for this text field when focused
+     * @param unfocusedBorderColor the border color for this text field when not focused
+     * @param disabledBorderColor the border color for this text field when disabled
+     * @param errorBorderColor the border color for this text field when in error state
+     * @param focusedLeadingIconColor the leading icon color for this text field when focused
+     * @param unfocusedLeadingIconColor the leading icon color for this text field when not focused
+     * @param disabledLeadingIconColor the leading icon color for this text field when disabled
+     * @param errorLeadingIconColor the leading icon color for this text field when in error state
+     * @param focusedTrailingIconColor the trailing icon color for this text field when focused
+     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not focused
+     * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
+     * @param errorTrailingIconColor the trailing icon color for this text field when in error state
+     * @param focusedLabelColor the label color for this text field when focused
+     * @param unfocusedLabelColor the label color for this text field when not focused
+     * @param disabledLabelColor the label color for this text field when disabled
+     * @param errorLabelColor the label color for this text field when in error state
+     * @param focusedPlaceholderColor the placeholder color for this text field when focused
+     * @param unfocusedPlaceholderColor the placeholder color for this text field when not focused
+     * @param disabledPlaceholderColor the placeholder color for this text field when disabled
+     * @param errorPlaceholderColor the placeholder color for this text field when in error state
+     * @param focusedPrefixColor the prefix color for this text field when focused
+     * @param unfocusedPrefixColor the prefix color for this text field when not focused
+     * @param disabledPrefixColor the prefix color for this text field when disabled
+     * @param errorPrefixColor the prefix color for this text field when in error state
+     * @param focusedSuffixColor the suffix color for this text field when focused
+     * @param unfocusedSuffixColor the suffix color for this text field when not focused
+     * @param disabledSuffixColor the suffix color for this text field when disabled
+     * @param errorSuffixColor the suffix color for this text field when in error state
+     */
+    @Composable
+    fun outlinedTextFieldColors(
+        focusedTextColor: Color = OutlinedAutocompleteTokens.FieldFocusInputTextColor.toColor(),
+        unfocusedTextColor: Color = OutlinedAutocompleteTokens.FieldInputTextColor.toColor(),
+        disabledTextColor: Color = OutlinedAutocompleteTokens.FieldDisabledInputTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity),
+        errorTextColor: Color = OutlinedAutocompleteTokens.FieldErrorInputTextColor.toColor(),
+        containerColor: Color = Color.Transparent,
+        errorContainerColor: Color = Color.Transparent,
+        cursorColor: Color = OutlinedAutocompleteTokens.TextFieldCaretColor.toColor(),
+        errorCursorColor: Color =
+            OutlinedAutocompleteTokens.TextFieldErrorFocusCaretColor.toColor(),
+        selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
+        focusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldFocusOutlineColor.toColor(),
+        unfocusedBorderColor: Color = OutlinedAutocompleteTokens.TextFieldOutlineColor.toColor(),
+        disabledBorderColor: Color =
+            OutlinedAutocompleteTokens.TextFieldDisabledOutlineColor.toColor()
+                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledOutlineOpacity),
+        errorBorderColor: Color = OutlinedAutocompleteTokens.TextFieldErrorOutlineColor.toColor(),
+        focusedLeadingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldFocusLeadingIconColor.toColor(),
+        unfocusedLeadingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldLeadingIconColor.toColor(),
+        disabledLeadingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconColor.toColor()
+                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledLeadingIconOpacity),
+        errorLeadingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldErrorLeadingIconColor.toColor(),
+        focusedTrailingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldFocusTrailingIconColor.toColor(),
+        unfocusedTrailingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldTrailingIconColor.toColor(),
+        disabledTrailingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconColor.toColor()
+                .copy(alpha = OutlinedAutocompleteTokens.TextFieldDisabledTrailingIconOpacity),
+        errorTrailingIconColor: Color =
+            OutlinedAutocompleteTokens.TextFieldErrorTrailingIconColor.toColor(),
+        focusedLabelColor: Color = OutlinedAutocompleteTokens.FieldFocusLabelTextColor.toColor(),
+        unfocusedLabelColor: Color = OutlinedAutocompleteTokens.FieldLabelTextColor.toColor(),
+        disabledLabelColor: Color = OutlinedAutocompleteTokens.FieldDisabledLabelTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledLabelTextOpacity),
+        errorLabelColor: Color = OutlinedAutocompleteTokens.FieldErrorLabelTextColor.toColor(),
+        focusedPlaceholderColor: Color =
+            OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPlaceholderColor: Color =
+            OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPlaceholderColor: Color =
+            OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+                .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPlaceholderColor: Color =
+            OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPrefixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
+            .toColor().copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPrefixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledSuffixColor: Color = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor
+            .toColor().copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorSuffixColor: Color = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+    ): TextFieldColors =
+        TextFieldDefaults.outlinedTextFieldColors(
+            focusedTextColor = focusedTextColor,
+            unfocusedTextColor = unfocusedTextColor,
+            disabledTextColor = disabledTextColor,
+            errorTextColor = errorTextColor,
+            containerColor = containerColor,
+            errorContainerColor = errorContainerColor,
+            cursorColor = cursorColor,
+            errorCursorColor = errorCursorColor,
+            selectionColors = selectionColors,
+            focusedBorderColor = focusedBorderColor,
+            unfocusedBorderColor = unfocusedBorderColor,
+            disabledBorderColor = disabledBorderColor,
+            errorBorderColor = errorBorderColor,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            errorLeadingIconColor = errorLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            errorTrailingIconColor = errorTrailingIconColor,
+            focusedLabelColor = focusedLabelColor,
+            unfocusedLabelColor = unfocusedLabelColor,
+            disabledLabelColor = disabledLabelColor,
+            errorLabelColor = errorLabelColor,
+            focusedPlaceholderColor = focusedPlaceholderColor,
+            unfocusedPlaceholderColor = unfocusedPlaceholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = errorPlaceholderColor,
+            focusedPrefixColor = focusedPrefixColor,
+            unfocusedPrefixColor = unfocusedPrefixColor,
+            disabledPrefixColor = disabledPrefixColor,
+            errorPrefixColor = errorPrefixColor,
+            focusedSuffixColor = focusedSuffixColor,
+            unfocusedSuffixColor = unfocusedSuffixColor,
+            disabledSuffixColor = disabledSuffixColor,
+            errorSuffixColor = errorSuffixColor,
+        )
+
+    /**
+     * Padding for [DropdownMenuItem]s within [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] to
+     * align them properly with [TextField] components.
+     */
+    val ItemContentPadding: PaddingValues = PaddingValues(
+        horizontal = ExposedDropdownMenuItemHorizontalPadding,
+        vertical = 0.dp
+    )
+
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
+    @Composable
+    fun textFieldColors(
         textColor: Color = FilledAutocompleteTokens.FieldInputTextColor.toColor(),
         disabledTextColor: Color = FilledAutocompleteTokens.FieldDisabledInputTextColor.toColor()
             .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity),
@@ -381,64 +655,49 @@
         disabledPlaceholderColor: Color =
             FilledAutocompleteTokens.FieldDisabledInputTextColor.toColor()
                 .copy(alpha = FilledAutocompleteTokens.FieldDisabledInputTextOpacity)
-    ): TextFieldColors =
-        TextFieldDefaults.textFieldColors(
-            textColor = textColor,
-            disabledTextColor = disabledTextColor,
-            cursorColor = cursorColor,
-            errorCursorColor = errorCursorColor,
-            selectionColors = selectionColors,
-            focusedIndicatorColor = focusedIndicatorColor,
-            unfocusedIndicatorColor = unfocusedIndicatorColor,
-            errorIndicatorColor = errorIndicatorColor,
-            disabledIndicatorColor = disabledIndicatorColor,
-            focusedLeadingIconColor = focusedLeadingIconColor,
-            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-            disabledLeadingIconColor = disabledLeadingIconColor,
-            errorLeadingIconColor = errorLeadingIconColor,
-            focusedTrailingIconColor = focusedTrailingIconColor,
-            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-            disabledTrailingIconColor = disabledTrailingIconColor,
-            errorTrailingIconColor = errorTrailingIconColor,
-            containerColor = containerColor,
-            focusedLabelColor = focusedLabelColor,
-            unfocusedLabelColor = unfocusedLabelColor,
-            disabledLabelColor = disabledLabelColor,
-            errorLabelColor = errorLabelColor,
-            placeholderColor = placeholderColor,
-            disabledPlaceholderColor = disabledPlaceholderColor
-        )
+    ): TextFieldColors = textFieldColors(
+        focusedTextColor = textColor,
+        unfocusedTextColor = textColor,
+        disabledTextColor = disabledTextColor,
+        errorTextColor = textColor,
+        containerColor = containerColor,
+        errorContainerColor = containerColor,
+        cursorColor = cursorColor,
+        errorCursorColor = errorCursorColor,
+        selectionColors = selectionColors,
+        focusedIndicatorColor = focusedIndicatorColor,
+        unfocusedIndicatorColor = unfocusedIndicatorColor,
+        disabledIndicatorColor = disabledIndicatorColor,
+        errorIndicatorColor = errorIndicatorColor,
+        focusedLeadingIconColor = focusedLeadingIconColor,
+        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        errorLeadingIconColor = errorLeadingIconColor,
+        focusedTrailingIconColor = focusedTrailingIconColor,
+        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+        errorTrailingIconColor = errorTrailingIconColor,
+        focusedLabelColor = focusedLabelColor,
+        unfocusedLabelColor = unfocusedLabelColor,
+        disabledLabelColor = disabledLabelColor,
+        errorLabelColor = errorLabelColor,
+        focusedPlaceholderColor = placeholderColor,
+        unfocusedPlaceholderColor = placeholderColor,
+        disabledPlaceholderColor = disabledPlaceholderColor,
+        errorPlaceholderColor = placeholderColor,
+        focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPrefixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledSuffixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+    )
 
-    /**
-     * Creates a [TextFieldColors] that represents the default input text, container, and content
-     * (including label, placeholder, leading and trailing icons) colors used in an
-     * [OutlinedTextField] within an [ExposedDropdownMenuBox].
-     *
-     * @param textColor the color used for the input text of this text field
-     * @param disabledTextColor the color used for the input text of this text field when disabled
-     * @param containerColor the container color for this text field
-     * @param cursorColor the cursor color for this text field
-     * @param errorCursorColor the cursor color for this text field when in error state
-     * @param selectionColors the colors used when the input text of this text field is selected
-     * @param focusedBorderColor the border color for this text field when focused
-     * @param unfocusedBorderColor the border color for this text field when not focused
-     * @param disabledBorderColor the border color for this text field when disabled
-     * @param errorBorderColor the border color for this text field when in error state
-     * @param focusedLeadingIconColor the leading icon color for this text field when focused
-     * @param unfocusedLeadingIconColor the leading icon color for this text field when not focused
-     * @param disabledLeadingIconColor the leading icon color for this text field when disabled
-     * @param errorLeadingIconColor the leading icon color for this text field when in error state
-     * @param focusedTrailingIconColor the trailing icon color for this text field when focused
-     * @param unfocusedTrailingIconColor the trailing icon color for this text field when not focused
-     * @param disabledTrailingIconColor the trailing icon color for this text field when disabled
-     * @param errorTrailingIconColor the trailing icon color for this text field when in error state
-     * @param focusedLabelColor the label color for this text field when focused
-     * @param unfocusedLabelColor the label color for this text field when not focused
-     * @param disabledLabelColor the label color for this text field when disabled
-     * @param errorLabelColor the label color for this text field when in error state
-     * @param placeholderColor the placeholder color for this text field
-     * @param disabledPlaceholderColor the placeholder color for this text field when disabled
-     */
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
     @Composable
     fun outlinedTextFieldColors(
         textColor: Color = OutlinedAutocompleteTokens.FieldInputTextColor.toColor(),
@@ -482,41 +741,46 @@
         disabledPlaceholderColor: Color =
             OutlinedAutocompleteTokens.FieldDisabledInputTextColor.toColor()
                 .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledInputTextOpacity)
-    ): TextFieldColors =
-        TextFieldDefaults.outlinedTextFieldColors(
-            textColor = textColor,
-            disabledTextColor = disabledTextColor,
-            cursorColor = cursorColor,
-            errorCursorColor = errorCursorColor,
-            selectionColors = selectionColors,
-            focusedBorderColor = focusedBorderColor,
-            unfocusedBorderColor = unfocusedBorderColor,
-            errorBorderColor = errorBorderColor,
-            disabledBorderColor = disabledBorderColor,
-            focusedLeadingIconColor = focusedLeadingIconColor,
-            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-            disabledLeadingIconColor = disabledLeadingIconColor,
-            errorLeadingIconColor = errorLeadingIconColor,
-            focusedTrailingIconColor = focusedTrailingIconColor,
-            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-            disabledTrailingIconColor = disabledTrailingIconColor,
-            errorTrailingIconColor = errorTrailingIconColor,
-            containerColor = containerColor,
-            focusedLabelColor = focusedLabelColor,
-            unfocusedLabelColor = unfocusedLabelColor,
-            disabledLabelColor = disabledLabelColor,
-            errorLabelColor = errorLabelColor,
-            placeholderColor = placeholderColor,
-            disabledPlaceholderColor = disabledPlaceholderColor
-        )
-
-    /**
-     * Padding for [DropdownMenuItem]s within [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] to
-     * align them properly with [TextField] components.
-     */
-    val ItemContentPadding: PaddingValues = PaddingValues(
-        horizontal = ExposedDropdownMenuItemHorizontalPadding,
-        vertical = 0.dp
+    ): TextFieldColors = outlinedTextFieldColors(
+        focusedTextColor = textColor,
+        unfocusedTextColor = textColor,
+        disabledTextColor = disabledTextColor,
+        errorTextColor = textColor,
+        containerColor = containerColor,
+        errorContainerColor = containerColor,
+        cursorColor = cursorColor,
+        errorCursorColor = errorCursorColor,
+        selectionColors = selectionColors,
+        focusedBorderColor = focusedBorderColor,
+        unfocusedBorderColor = unfocusedBorderColor,
+        disabledBorderColor = disabledBorderColor,
+        errorBorderColor = errorBorderColor,
+        focusedLeadingIconColor = focusedLeadingIconColor,
+        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        errorLeadingIconColor = errorLeadingIconColor,
+        focusedTrailingIconColor = focusedTrailingIconColor,
+        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+        errorTrailingIconColor = errorTrailingIconColor,
+        focusedLabelColor = focusedLabelColor,
+        unfocusedLabelColor = unfocusedLabelColor,
+        disabledLabelColor = disabledLabelColor,
+        errorLabelColor = errorLabelColor,
+        focusedPlaceholderColor = placeholderColor,
+        unfocusedPlaceholderColor = placeholderColor,
+        disabledPlaceholderColor = disabledPlaceholderColor,
+        errorPlaceholderColor = placeholderColor,
+        focusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledPrefixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorPrefixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        focusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        unfocusedSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
+        disabledSuffixColor = OutlinedAutocompleteTokens.FieldDisabledSupportingTextColor.toColor()
+            .copy(alpha = OutlinedAutocompleteTokens.FieldDisabledSupportingTextOpacity),
+        errorSuffixColor = OutlinedAutocompleteTokens.FieldSupportingTextColor.toColor(),
     )
 }
 
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.kt
index 4047249..9a1cf79 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.kt
@@ -27,13 +27,9 @@
 import androidx.compose.animation.fadeIn
 import androidx.compose.animation.fadeOut
 import androidx.compose.animation.shrinkVertically
-import androidx.compose.foundation.gestures.awaitEachGesture
-import androidx.compose.foundation.gestures.awaitFirstDown
-import androidx.compose.foundation.gestures.waitForUpOrCancellation
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.PaddingValues
@@ -47,11 +43,9 @@
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.onConsumedWindowInsetsChanged
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.statusBars
 import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.shape.CornerSize
-import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.shape.GenericShape
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
@@ -64,20 +58,27 @@
 import androidx.compose.material3.tokens.SearchViewTokens
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.RoundRect
+import androidx.compose.ui.geometry.toRect
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.graphics.takeOrElse
-import androidx.compose.ui.input.pointer.PointerEventPass
-import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.node.Ref
+import androidx.compose.ui.layout.layout
 import androidx.compose.ui.platform.LocalConfiguration
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.semantics.contentDescription
@@ -88,10 +89,13 @@
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.lerp
+import androidx.compose.ui.unit.offset
 import androidx.compose.ui.util.lerp
 import androidx.compose.ui.zIndex
 import kotlin.math.max
@@ -166,7 +170,7 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable ColumnScope.() -> Unit,
 ) {
-    val animationProgress: Float by animateFloatAsState(
+    val animationProgress: State<Float> = animateFloatAsState(
         targetValue = if (active) 1f else 0f,
         animationSpec = tween(
             durationMillis = AnimationDurationMillis,
@@ -174,94 +178,100 @@
         )
     )
 
+    val density = LocalDensity.current
+
     val defaultInputFieldShape = SearchBarDefaults.inputFieldShape
     val defaultFullScreenShape = SearchBarDefaults.fullScreenShape
-    val animatedShape by remember {
-        derivedStateOf {
-            when {
-                shape == defaultInputFieldShape -> {
-                    // The shape can only be animated if it's the default spec value
-                    val animatedRadius = SearchBarCornerRadius * (1 - animationProgress)
-                    RoundedCornerShape(CornerSize(animatedRadius))
+    val useFullScreenShape by remember {
+        derivedStateOf(structuralEqualityPolicy()) { animationProgress.value == 1f }
+    }
+    val animatedShape = remember(useFullScreenShape, shape) {
+        when {
+            shape == defaultInputFieldShape ->
+                // The shape can only be animated if it's the default spec value
+                GenericShape { size, _ ->
+                    val radius = with(density) {
+                        (SearchBarCornerRadius * (1 - animationProgress.value)).toPx()
+                    }
+                    addRoundRect(RoundRect(size.toRect(), CornerRadius(radius)))
                 }
-                animationProgress == 1f -> defaultFullScreenShape
-                else -> shape
-            }
+            useFullScreenShape -> defaultFullScreenShape
+            else -> shape
         }
     }
 
-    // The main animation trickery is allowing the component to smoothly expand while keeping the
-    // input field at the same relative location on screen. For this, Modifier.windowInsetsPadding
-    // is not suitable. Instead, we convert the insets to a padding applied to the Surface, which
-    // gradually becomes padding applied to the input field as the animation proceeds.
-    val unconsumedInsets = remember { Ref<WindowInsets>() }
-    val topPadding = SearchBarVerticalPadding +
-        (unconsumedInsets.value ?: ZeroWindowInsets).asPaddingValues().calculateTopPadding()
-    val animatedSurfaceTopPadding = lerp(topPadding, 0.dp, animationProgress)
-    val animatedInputFieldPadding by remember {
+    // The main animation complexity is allowing the component to smoothly expand while keeping the
+    // input field at the same relative location on screen. `Modifier.windowInsetsPadding` does not
+    // support animation and thus is not suitable. Instead, we convert the insets to a padding
+    // applied to the Surface, which gradually becomes padding applied to the input field as the
+    // animation proceeds.
+    val unconsumedInsets = remember { MutableWindowInsets() }
+    val topPadding = remember(density) {
         derivedStateOf {
-            PaddingValues(
-                top = topPadding * animationProgress,
-                bottom = SearchBarVerticalPadding * animationProgress,
-            )
+            SearchBarVerticalPadding +
+                unconsumedInsets.asPaddingValues(density).calculateTopPadding()
         }
     }
 
-    BoxWithConstraints(
+    Surface(
+        shape = animatedShape,
+        color = colors.containerColor,
+        contentColor = contentColorFor(colors.containerColor),
+        tonalElevation = tonalElevation,
         modifier = modifier
             .zIndex(1f)
             .onConsumedWindowInsetsChanged { consumedInsets ->
-                unconsumedInsets.value = windowInsets.exclude(consumedInsets)
+                unconsumedInsets.insets = windowInsets.exclude(consumedInsets)
             }
-            .consumeWindowInsets(unconsumedInsets.value ?: ZeroWindowInsets),
-        propagateMinConstraints = true
-    ) {
-        val height: Dp
-        val width: Dp
-        with(LocalDensity.current) {
-            val startWidth = max(constraints.minWidth, SearchBarMinWidth.roundToPx())
-                .coerceAtMost(min(constraints.maxWidth, SearchBarMaxWidth.roundToPx()))
-                .toFloat()
-            val startHeight = max(constraints.minHeight, InputFieldHeight.roundToPx())
-                .coerceAtMost(constraints.maxHeight)
-                .toFloat()
-            val endWidth = constraints.maxWidth.toFloat()
-            val endHeight = constraints.maxHeight.toFloat()
+            .consumeWindowInsets(unconsumedInsets)
+            .layout { measurable, constraints ->
+                val animatedTopPadding =
+                    lerp(topPadding.value, 0.dp, animationProgress.value).roundToPx()
 
-            height = lerp(startHeight, endHeight, animationProgress).toDp()
-            width = lerp(startWidth, endWidth, animationProgress).toDp()
+                val startWidth = max(constraints.minWidth, SearchBarMinWidth.roundToPx())
+                    .coerceAtMost(min(constraints.maxWidth, SearchBarMaxWidth.roundToPx()))
+                val startHeight = max(constraints.minHeight, InputFieldHeight.roundToPx())
+                    .coerceAtMost(constraints.maxHeight)
+                val endWidth = constraints.maxWidth
+                val endHeight = constraints.maxHeight
+
+                val width = lerp(startWidth, endWidth, animationProgress.value)
+                val height =
+                    lerp(startHeight, endHeight, animationProgress.value) + animatedTopPadding
+
+                val placeable = measurable.measure(Constraints.fixed(width, height)
+                    .offset(vertical = -animatedTopPadding))
+                layout(width, height) {
+                    placeable.placeRelative(0, animatedTopPadding)
+            }
         }
+    ) {
+        Column {
+            val animatedInputFieldPadding = remember {
+                AnimatedPaddingValues(animationProgress, topPadding)
+            }
+            SearchBarInputField(
+                query = query,
+                onQueryChange = onQueryChange,
+                onSearch = onSearch,
+                active = active,
+                onActiveChange = onActiveChange,
+                modifier = Modifier.padding(paddingValues = animatedInputFieldPadding),
+                enabled = enabled,
+                placeholder = placeholder,
+                leadingIcon = leadingIcon,
+                trailingIcon = trailingIcon,
+                colors = colors.inputFieldColors,
+                interactionSource = interactionSource,
+            )
 
-        Surface(
-            shape = animatedShape,
-            color = colors.containerColor,
-            contentColor = contentColorFor(colors.containerColor),
-            tonalElevation = tonalElevation,
-            modifier = Modifier
-                .padding(top = animatedSurfaceTopPadding)
-                .size(width = width, height = height)
-        ) {
-            Column {
-                SearchBarInputField(
-                    query = query,
-                    onQueryChange = onQueryChange,
-                    onSearch = onSearch,
-                    active = active,
-                    onActiveChange = onActiveChange,
-                    modifier = Modifier.padding(animatedInputFieldPadding),
-                    enabled = enabled,
-                    placeholder = placeholder,
-                    leadingIcon = leadingIcon,
-                    trailingIcon = trailingIcon,
-                    colors = colors.inputFieldColors,
-                    interactionSource = interactionSource,
-                )
-
-                if (animationProgress > 0) {
-                    Column(Modifier.alpha(animationProgress)) {
-                        Divider(color = colors.dividerColor)
-                        content()
-                    }
+            val showResults by remember {
+                derivedStateOf(structuralEqualityPolicy()) { animationProgress.value > 0 }
+            }
+            if (showResults) {
+                Column(Modifier.graphicsLayer { alpha = animationProgress.value }) {
+                    Divider(color = colors.dividerColor)
+                    content()
                 }
             }
         }
@@ -404,7 +414,7 @@
     val searchSemantics = getString(Strings.SearchBarSearch)
     val suggestionsAvailableSemantics = getString(Strings.SuggestionsAvailable)
     val textColor = LocalTextStyle.current.color.takeOrElse {
-        colors.textColor(enabled).value
+        colors.textColor(enabled, isError = false, interactionSource = interactionSource).value
     }
 
     BasicTextField(
@@ -414,24 +424,13 @@
             .height(InputFieldHeight)
             .fillMaxWidth()
             .focusRequester(focusRequester)
-            .pointerInput(Unit) {
-                awaitEachGesture {
-                    // Must be PointerEventPass.Initial to observe events before the text field
-                    // consumes them in the Main pass
-                    awaitFirstDown(pass = PointerEventPass.Initial)
-                    val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
-                    if (upEvent != null) {
-                        onActiveChange(true)
-                    }
-                }
-            }
+            .onFocusChanged { if (it.isFocused) onActiveChange(true) }
             .semantics {
                 contentDescription = searchSemantics
                 if (active) {
                     stateDescription = suggestionsAvailableSemantics
                 }
                 onClick {
-                    onActiveChange(true)
                     focusRequester.requestFocus()
                     true
                 }
@@ -517,7 +516,9 @@
      * Only a subset of the full list of [TextFieldColors] parameters are used in the input field.
      * All other parameters have no effect.
      *
-     * @param textColor the color used for the input text of this input field
+     * @param focusedTextColor the color used for the input text of this input field when focused
+     * @param unfocusedTextColor the color used for the input text of this input field when not
+     * focused
      * @param disabledTextColor the color used for the input text of this input field when disabled
      * @param cursorColor the cursor color for this input field
      * @param selectionColors the colors used when the input text of this input field is selected
@@ -528,12 +529,53 @@
      * @param unfocusedTrailingIconColor the trailing icon color for this input field when not
      * focused
      * @param disabledTrailingIconColor the trailing icon color for this input field when disabled
-     * @param placeholderColor the placeholder color for this input field
+     * @param focusedPlaceholderColor the placeholder color for this input field when focused
+     * @param unfocusedPlaceholderColor the placeholder color for this input field when not focused
      * @param disabledPlaceholderColor the placeholder color for this input field when disabled
      */
     @ExperimentalMaterial3Api
     @Composable
     fun inputFieldColors(
+        focusedTextColor: Color = SearchBarTokens.InputTextColor.toColor(),
+        unfocusedTextColor: Color = SearchBarTokens.InputTextColor.toColor(),
+        disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        cursorColor: Color = FilledTextFieldTokens.CaretColor.toColor(),
+        selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
+        focusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.toColor(),
+        unfocusedLeadingIconColor: Color = SearchBarTokens.LeadingIconColor.toColor(),
+        disabledLeadingIconColor: Color = FilledTextFieldTokens.DisabledLeadingIconColor
+            .toColor().copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
+        focusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.toColor(),
+        unfocusedTrailingIconColor: Color = SearchBarTokens.TrailingIconColor.toColor(),
+        disabledTrailingIconColor: Color = FilledTextFieldTokens.DisabledTrailingIconColor
+            .toColor().copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
+        focusedPlaceholderColor: Color = SearchBarTokens.SupportingTextColor.toColor(),
+        unfocusedPlaceholderColor: Color = SearchBarTokens.SupportingTextColor.toColor(),
+        disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+    ): TextFieldColors =
+        TextFieldDefaults.textFieldColors(
+            focusedTextColor = focusedTextColor,
+            unfocusedTextColor = unfocusedTextColor,
+            disabledTextColor = disabledTextColor,
+            cursorColor = cursorColor,
+            selectionColors = selectionColors,
+            focusedLeadingIconColor = focusedLeadingIconColor,
+            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+            disabledLeadingIconColor = disabledLeadingIconColor,
+            focusedTrailingIconColor = focusedTrailingIconColor,
+            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+            disabledTrailingIconColor = disabledTrailingIconColor,
+            focusedPlaceholderColor = focusedPlaceholderColor,
+            unfocusedPlaceholderColor = unfocusedPlaceholderColor,
+            disabledPlaceholderColor = disabledPlaceholderColor,
+        )
+
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
+    @ExperimentalMaterial3Api
+    @Composable
+    fun inputFieldColors(
         textColor: Color = SearchBarTokens.InputTextColor.toColor(),
         disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
@@ -550,21 +592,22 @@
         placeholderColor: Color = SearchBarTokens.SupportingTextColor.toColor(),
         disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
-    ): TextFieldColors =
-        TextFieldDefaults.textFieldColors(
-            textColor = textColor,
-            disabledTextColor = disabledTextColor,
-            cursorColor = cursorColor,
-            selectionColors = selectionColors,
-            focusedLeadingIconColor = focusedLeadingIconColor,
-            unfocusedLeadingIconColor = unfocusedLeadingIconColor,
-            disabledLeadingIconColor = disabledLeadingIconColor,
-            focusedTrailingIconColor = focusedTrailingIconColor,
-            unfocusedTrailingIconColor = unfocusedTrailingIconColor,
-            disabledTrailingIconColor = disabledTrailingIconColor,
-            placeholderColor = placeholderColor,
-            disabledPlaceholderColor = disabledPlaceholderColor,
-        )
+    ) = inputFieldColors(
+        focusedTextColor = textColor,
+        unfocusedTextColor = textColor,
+        disabledTextColor = disabledTextColor,
+        cursorColor = cursorColor,
+        selectionColors = selectionColors,
+        focusedLeadingIconColor = focusedLeadingIconColor,
+        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        focusedTrailingIconColor = focusedTrailingIconColor,
+        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+        focusedPlaceholderColor = placeholderColor,
+        unfocusedPlaceholderColor = placeholderColor,
+        disabledPlaceholderColor = disabledPlaceholderColor,
+    )
 }
 
 /**
@@ -601,7 +644,41 @@
     }
 }
 
-private val ZeroWindowInsets: WindowInsets = WindowInsets(0, 0, 0, 0)
+@Stable
+private class AnimatedPaddingValues(
+    val animationProgress: State<Float>,
+    val topPadding: State<Dp>,
+) : PaddingValues {
+    override fun calculateTopPadding(): Dp = topPadding.value * animationProgress.value
+    override fun calculateBottomPadding(): Dp = SearchBarVerticalPadding * animationProgress.value
+
+    override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp = 0.dp
+    override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp = 0.dp
+}
+
+/**
+ * A [WindowInsets] whose values can change without changing the instance. This is useful
+ * to avoid recomposition when [WindowInsets] can change.
+ *
+ * Copied from [androidx.compose.foundation.layout.MutableWindowInsets], which is marked as
+ * experimental and thus cannot be used cross-module.
+ */
+private class MutableWindowInsets(
+    initialInsets: WindowInsets = WindowInsets(0, 0, 0, 0)
+) : WindowInsets {
+    /**
+     * The [WindowInsets] that are used for [left][getLeft], [top][getTop], [right][getRight],
+     * and [bottom][getBottom] values.
+     */
+    var insets by mutableStateOf(initialInsets)
+
+    override fun getLeft(density: Density, layoutDirection: LayoutDirection): Int =
+        insets.getLeft(density, layoutDirection)
+    override fun getTop(density: Density): Int = insets.getTop(density)
+    override fun getRight(density: Density, layoutDirection: LayoutDirection): Int =
+        insets.getRight(density, layoutDirection)
+    override fun getBottom(density: Density): Int = insets.getBottom(density)
+}
 
 // Measurement specs
 private val SearchBarCornerRadius: Dp = InputFieldHeight / 2
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt
index 0ca4a17..eb02073 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt
@@ -123,6 +123,18 @@
         Strings.DatePickerSwitchToInputMode -> resources.getString(
             androidx.compose.material3.R.string.date_picker_switch_to_input_mode
         )
+        Strings.DateRangePickerTitle -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_title
+        )
+        Strings.DateRangePickerStartHeadline -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_start_headline
+        )
+        Strings.DateRangeInputTitle -> resources.getString(
+            androidx.compose.material3.R.string.date_range_input_title
+        )
+        Strings.DateRangePickerEndHeadline -> resources.getString(
+            androidx.compose.material3.R.string.date_range_picker_end_headline
+        )
         Strings.TooltipLongPressLabel -> resources.getString(
             androidx.compose.material3.R.string.tooltip_long_press_label
         )
diff --git a/compose/material3/material3/src/androidMain/res/values-af/strings.xml b/compose/material3/material3/src/androidMain/res/values-af/strings.xml
index e46c3dd..96bb70c 100644
--- a/compose/material3/material3/src/androidMain/res/values-af/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-af/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Gaan na jaar %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Huidige keuse: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Geen"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Vandag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Jaarkieser sigbaar"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Kies datum"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Datum wat ingevoer is"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Datum wat ingevoer is: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Geen"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum word nie toegelaat nie: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum pas nie by die verwagte patroon nie: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum val buite die omvang van die verwagte jaartal %1$s-%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Skakel oor na kalenderinvoermodus"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Skakel oor na teksinvoermodus"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Wys nutswenk"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"nm."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"vm."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Kies vm. of nm."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Kies uur"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Kies minute"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d uur"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d uur"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minute"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-am/strings.xml b/compose/material3/material3/src/androidMain/res/values-am/strings.xml
index f8327988..9a4df26 100644
--- a/compose/material3/material3/src/androidMain/res/values-am/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-am/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"ወደ ዓመት %1$s ያስሱ"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"የአሁን ምርጫ፦ %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ምንም"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ዛሬ"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ዓመት መራጭ ይታያል"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ቀን ይምረጡ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"የገባው ቀን"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ቀን"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"የገባው ቀን፦ %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ምንም"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ቀን አልተፈቀደም፦ %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ቀኑ ከተጠበቀው ስርዓተ ጥለት ጋር አይዛመድም፦ %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ቀን ከተጠበቀው የዓመት ክልል ውጪ ነው %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ወደ የቀን መቁጠሪያ ግቤት ሁነታ ቀይር"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ወደ የጽሁፍ ግቤት ሁነታ ቀይር"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"መሣሪያ ጥቆማን አሳይ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ከሰዓት"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ጠዋት"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"ጠዋት ወይም ከሰዓትን ይምረጡ"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ሰዓት ምረጥ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ደቂቃዎች ምረጥ"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ሰዓት"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ሰዓታት"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d ደቂቃዎች"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ar/strings.xml b/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
index f783a0f..0832f50 100644
--- a/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ar/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"‏الانتقال إلى عام %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"‏التحديد الحالي: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"بدون تاريخ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"اليوم"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"أداة اختيار الأعوام مرئية"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"اختيار تاريخ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"التاريخ الذي تم إدخاله"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"التاريخ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"‏التاريخ الذي تم إدخاله: ‎%1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"بدون تاريخ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"‏التاريخ غير مسموح به: ‎%1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"‏لا يتوافق التاريخ مع النمط المتوقَّع: ‎%1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"‏التاريخ خارج نطاق الأعوام المتوقَّع: ‎%1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"التبديل إلى وضع \"الإدخال في التقويم\""</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"التبديل إلى وضع \"إدخال النص\""</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"إظهار التلميح"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"م"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ص"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"يُرجى اختيار ص (صباحًا) أو م (مساءً)."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"اختيار الساعة"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"اختيار الدقائق"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"‏الساعة %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"‏%1$d ساعة"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"‏%1$d دقيقة"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-as/strings.xml b/compose/material3/material3/src/androidMain/res/values-as/strings.xml
index 3615dbf..77e8396 100644
--- a/compose/material3/material3/src/androidMain/res/values-as/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-as/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"বৰ্ষ %1$sলৈ নেভিগে’ট কৰক"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"বৰ্তমানৰ বাছনি: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"একো নাই"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"আজি"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"বছৰ বাছনিকৰ্তা দৃশ্যমান"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"তাৰিখ বাছনি কৰক"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"দিয়া তাৰিখ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"তাৰিখ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"দিয়া তাৰিখ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"একো নাই"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"অনুমোদিত নোহোৱা তাৰিখ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"তাৰিখটো এই প্ৰত্যাশিত আৰ্হিটোৰ সৈতে মিলা নাই: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"তাৰিখটো প্ৰত্যাশিত বছৰৰ পৰিসৰ %1$s - %2$sৰ বাহিৰৰ"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"কেলেণ্ডাৰ ইনপুট ম’ডলৈ সলনি কৰক"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"পাঠ ইনপুট ম’ডলৈ সলনি কৰক"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"টুলটিপ দেখুৱাওক"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"পৰাহ্ন"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"পুৱা"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"পূৰ্বাহ্ন অথবা অপৰাহ্ন বাছনি কৰক"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ঘণ্টা বাছনি কৰক"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"মিনিট বাছনি কৰক"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d বাজিছে"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%d ঘণ্টা"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%d মিনিট"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-az/strings.xml b/compose/material3/material3/src/androidMain/res/values-az/strings.xml
index 0473c2c..242fc3c 100644
--- a/compose/material3/material3/src/androidMain/res/values-az/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-az/strings.xml
@@ -31,24 +31,26 @@
     <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Əvvəlki aya dəyişin"</string>
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Bu ilə keçin: %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Cari seçim: %1$s"</string>
-    <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Heç bir"</string>
+    <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Heç biri"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Bu gün"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"İl seçicisi görünür"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Tarix seçin"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Daxil edilmiş tarix"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Tarix"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Daxil edilmiş tarix: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Heç biri"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Tarixə icazə verilmir: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Tarix gözlənilən modelə uyğun gəlmir: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Tarix gözlənilən il aralığından kənardır: %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Təqvim daxiletmə rejiminə keçin"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Mətn daxiletmə rejiminə keçin"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"İpucu göstərin"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Gündüz və ya axşam seçin"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Saatı seçin"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Dəqiqə seçin"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Saat: %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d saat"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d dəqiqə"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
index c9ac82a..2d43968 100644
--- a/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Idite na godinu: %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuelni izbor: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ništa"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Danas"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Vidljiv birač godina"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Izaberite datum"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Uneti datum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Uneti datum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ništa"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum nije dozvoljen: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum ne odgovara očekivanom šablonu: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum je izvan očekivanog opsega godina %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Pređite na režim unosa u Kalendaru"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Pređite na režim unosa teksta"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Prikaži objašnjenje"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"po"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"pr"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Izaberite pre podne ili po podne"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Izaberite sat"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Izaberite minute"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d č"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d č"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d min"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-be/strings.xml b/compose/material3/material3/src/androidMain/res/values-be/strings.xml
index ce5f78d..ee3326d 100644
--- a/compose/material3/material3/src/androidMain/res/values-be/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-be/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Перайсці ў год %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Бягучы выбар: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Не выбрана"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Сёння"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Бачны інструмент выбару года"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Выберыце дату"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Уведзеная дата"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Дата"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Уведзеная дата: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Без абмежаванняў"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Дата забаронена: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Дата не адпавядае ўзору: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Дата выходзіць за дазволены дыяпазон гадоў %1$s-%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Пераключыцца ў рэжым уводу \"Каляндар\""</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Пераключыцца ў рэжым уводу \"Тэкст\""</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Паказваць усплывальную падказку"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"пасля паўдня"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"да паўдня"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Выберыце AM (да паўдня) або PM (пасля паўдня)"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Выберыце гадзіны"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Выберыце хвіліны"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d гадз"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d гадз"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d хв"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bg/strings.xml b/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
index 08e44f8..86d6179 100644
--- a/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bg/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Навигиране до %1$s година"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Текущ избор: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Без"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Днес"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Инструментът за избор на година е видим"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Избиране на дата"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Въведена дата"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Дата"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Въведена дата: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Няма"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Датата не е разрешена: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Датата не е в очаквания формат: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Датата е извън очаквания годишен диапазон: %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Превключване към режим за въвеждане в календар"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Превключване към режим за въвеждане на текст"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Показване на подсказка"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Изберете AM или PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Избиране на час"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Избиране на минути"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d часа"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d часа"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d минути"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bn/strings.xml b/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
index 6d4ef6e..639d1bb 100644
--- a/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bn/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"নেভিগেট করে %1$s বছরে যান"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"বর্তমানে বেছে নেওয়া হয়েছে: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"কোনওটিই নয়"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"আজ"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"বছর বেছে নেওয়ার তালিকা দেখা যাচ্ছে"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"তারিখ বেছে নিন"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"উল্লেখ করা তারিখ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"তারিখ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"উল্লেখ করা তারিখ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"কোনওটিই নয়"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"এই তারিখ লেখা যাবে না: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"প্রত্যাশিত প্যাটার্নের সাথে তারিখ মিলছে না: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"প্রত্যাশিত বছরের রেঞ্জের বাইরের তারিখ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"\'ক্যালেন্ডার ইনপুট\' মোডে বদল করুন"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"\'টেক্সট ইনপুট\' মোডে বদল করুন"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"টুলটিপ দেখান"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM বা PM বেছে নিন"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ঘণ্টা বেছে নিন"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"মিনিট বেছে নিন"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d টা"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ঘণ্টা"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d মিনিট"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-bs/strings.xml b/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
index 8c24d35..087095c 100644
--- a/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-bs/strings.xml
@@ -32,14 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Odlazak na %1$s. godinu"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Trenutni odabir: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ništa"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Danas"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Birač godine je vidljiv"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Odaberite datum"</string>
-    <string name="date_input_headline" msgid="3499643850558715142">"Datum unosa"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Unesen je datum"</string>
     <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
-    <string name="date_input_headline_description" msgid="8562356184193964298">"Datum unosa: %1$s"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Unesen je datum: %1$s"</string>
     <string name="date_input_no_input_description" msgid="5722931102250207748">"Ništa"</string>
-    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum nije dopušten: %1$s"</string>
-    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum se ne podudara s očekivanim uzorkom: %1$s"</string>
-    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum je izvan očekivanog raspona godine %1$s – %2$s"</string>
-    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Prikaži opis"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum nije dozvoljen: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datumi se ne podudaraju s očekivanim obrascem: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum je izvan očekivanog raspona %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Prebacivanje na način rada unosa kalendara"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Prebacivanje na način rada unosa teksta"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Prikaži skočni opis"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"poslijepodne"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"prijepodne"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Odaberite prijepodne ili poslijepodne"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Odaberite sate"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Odaberite minute"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d h"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d h"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d min"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ca/strings.xml b/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
index 33269eb..2789ab2 100644
--- a/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ca/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navega fins a l\'any %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Selecció actual: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Cap"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Avui"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selector d\'any visible"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Selecciona la data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data introduïda"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data introduïda: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Cap"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data no permesa: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La data no coincideix amb el patró esperat: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"La data no es troba dins de l\'interval d\'anys esperat: %1$s-%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Canvia al mode d\'introducció de dades del calendari"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Canvia al mode d\'introducció de text"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostra la descripció emergent"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecciona AM o PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Selecciona l\'hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Selecciona els minuts"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d en punt"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hores"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuts"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-cs/strings.xml b/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
index 9f7ed3f..b92fbfc 100644
--- a/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-cs/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Přejít na rok %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuální výběr: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Žádné"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Dnes"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Je vidět výběr roku"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Vybrat datum"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Zadané datum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Zadané datum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Žádné"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Nepovolené datum: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum neodpovídá očekávanému vzoru: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum mimo očekávaný rozsah roků %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Přepnout na režim zadávání do kalendáře"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Přepnout na režim zadávání textu"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Zobrazit popisek"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Vyberte AM nebo PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Vybrat hodinu"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Vyberte minuty"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d hodin"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hodin"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minut"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-da/strings.xml b/compose/material3/material3/src/androidMain/res/values-da/strings.xml
index 7c05fee..847d46c 100644
--- a/compose/material3/material3/src/androidMain/res/values-da/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-da/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Naviger til år %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuelt valg: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ingen"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"I dag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Årsvælgeren er synlig"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Vælg dato"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Angivet dato"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dato"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Angivet dato: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ingen"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datoen er ikke tilladt: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datoen svarer ikke til det forventede format: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datoen er uden for det forventede årsinterval: %1$s-%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Skift til input-tilstand for kalender"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Skift til input-tilstand for tekst"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Se værktøjstip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Vælg AM eller PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Vælg time"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Vælg minutter"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"kl. %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d timer"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutter"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-de/strings.xml b/compose/material3/material3/src/androidMain/res/values-de/strings.xml
index ab55db2..d902afe 100644
--- a/compose/material3/material3/src/androidMain/res/values-de/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-de/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Zum Jahr %1$s wechseln"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuelle Auswahl: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Keine"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Heute"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Jahresauswahl sichtbar"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Datum auswählen"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Eingabedatum:"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Eingabedatum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Kein Datum"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Unzulässiges Datum: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum entspricht nicht dem erwarteten Format: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum liegt außerhalb des erwarteten Jahresbereichs (%1$s–%2$s)"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"In den Kalendereingabemodus wechseln"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"In den Texteingabemodus wechseln"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Kurzinfo anzeigen"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM oder PM auswählen"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Stunde auswählen"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Minuten auswählen"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d Uhr"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d Stunden"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d Minuten"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-el/strings.xml b/compose/material3/material3/src/androidMain/res/values-el/strings.xml
index 24ada47..126035d 100644
--- a/compose/material3/material3/src/androidMain/res/values-el/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-el/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Μετάβαση στο έτος %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Τρέχουσα επιλογή: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Καμία"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Σήμερα"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Το εργαλείο επιλογής έτους είναι ορατό"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Επιλογή ημερομηνίας"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Εισαγωγή ημερομηνίας"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Ημερομηνία"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Εισαγωγή ημερομηνίας: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Καμία"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Η ημερομηνία δεν επιτρέπεται: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Η ημερομηνία δεν αντιστοιχεί στο αναμενόμενο μοτίβο: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Η ημερομηνία είναι εκτός του αναμενόμενου εύρους ετών %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Εναλλαγή στη λειτουργία εισαγωγής ημερολογίου"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Εναλλαγή στη λειτουργία εισαγωγής κειμένου"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Προβολή επεξήγησης"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ΜΜ"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ΠΜ"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Επιλέξτε π.μ. ή μ.μ."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Επιλογή ώρας"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Επιλογή λεπτών"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d η ώρα"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"Ώρα %1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d λεπτά"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
index b67749f..e982706 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rAU/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigate to year %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Current selection: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"None"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Today"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Year picker visible"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Select date"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Entered date"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date not allowed: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Date does not match expected pattern: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date out of expected year range %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Switch to calendar input mode"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Switch to text input mode"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Show tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Select a.m. or p.m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Select hour"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Select minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hours"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
index 4f43a60..adb11ab 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rCA/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigate to year %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Current selection: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"None"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Today"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Year picker visible"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Select date"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Entered date"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date not allowed: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Date does not match expected pattern: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date out of expected year range %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Switch to calendar input mode"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Switch to text input mode"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Show tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Select AM or PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Select hour"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Select minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hours"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
index b67749f..e982706 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rGB/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigate to year %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Current selection: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"None"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Today"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Year picker visible"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Select date"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Entered date"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date not allowed: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Date does not match expected pattern: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date out of expected year range %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Switch to calendar input mode"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Switch to text input mode"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Show tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Select a.m. or p.m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Select hour"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Select minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hours"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
index b67749f..e982706 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rIN/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigate to year %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Current selection: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"None"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Today"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Year picker visible"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Select date"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Entered date"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date not allowed: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Date does not match expected pattern: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date out of expected year range %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Switch to calendar input mode"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Switch to text input mode"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Show tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Select a.m. or p.m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Select hour"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Select minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d hours"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml b/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
index 5d47ca6..64b9538 100644
--- a/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-en-rXC/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‎Navigate to year %1$s‎‏‎‎‏‎"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎Current selection: %1$s‎‏‎‎‏‎"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‎None‎‏‎‎‏‎"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎Today‎‏‎‎‏‎"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‎‎Year picker visible‎‏‎‎‏‎"</string>
     <string name="date_input_title" msgid="3010396677286327048">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎Select date‎‏‎‎‏‎"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎Entered date‎‏‎‎‏‎"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎Date not allowed: %1$s‎‏‎‎‏‎"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎Date does not match expected pattern: %1$s‎‏‎‎‏‎"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎Date out of expected year range %1$s - %2$s‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎Switch to calendar input mode‎‏‎‎‏‎"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎Switch to text input mode‎‏‎‎‏‎"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎Show tooltip‎‏‎‎‏‎"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‎PM‎‏‎‎‏‎"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎AM‎‏‎‎‏‎"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎Select AM or PM‎‏‎‎‏‎"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎Select hour‎‏‎‎‏‎"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎Select minutes‎‏‎‎‏‎"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎%1$d o\'clock‎‏‎‎‏‎"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎%1$d hours‎‏‎‎‏‎"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎%1$d minutes‎‏‎‎‏‎"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml b/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
index 816a701..e04242d 100644
--- a/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-es-rUS/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navegar al año %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Selección actual: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nada"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoy"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selector de año visible"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Seleccionar fecha"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Fecha ingresada"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Fecha"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Fecha ingresada: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ninguna"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Fecha no permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La fecha no coincide con el patrón esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"La fecha está fuera del rango de años esperado: %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Cambiar al modo de entrada de calendario"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Cambiar al modo de entrada de texto"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar información"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"p.m."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"a.m."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecciona a.m. o p.m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Seleccionar hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Seleccionar los minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d en punto"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-es/strings.xml b/compose/material3/material3/src/androidMain/res/values-es/strings.xml
index f3e7902..7157343 100644
--- a/compose/material3/material3/src/androidMain/res/values-es/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-es/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Ir al año %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Selección: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ninguno"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoy"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selector de año visible"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Seleccionar fecha"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Fecha introducida"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Fecha"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Fecha introducida: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ninguna"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Fecha no permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La fecha no coincide con el patrón esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Fecha fuera del intervalo de años previsto: %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Cambiar al modo de introducción de calendario"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Cambiar al modo de escritura"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar descripción emergente"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecciona AM o PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Seleccionar hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Seleccionar minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d en punto"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-et/strings.xml b/compose/material3/material3/src/androidMain/res/values-et/strings.xml
index 834e1de..105abf2 100644
--- a/compose/material3/material3/src/androidMain/res/values-et/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-et/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Liigu aasta %1$s juurde"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Praegune valik: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Pole"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Täna"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Aasta valija on nähtav"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Valige kuupäev"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Sisestatud kuupäev"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Kuupäev"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Sisestatud kuupäev: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Puudub"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Kuupäev pole lubatud: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Kuupäev ei ühti eeldatud mustriga: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Kuupäev on väljaspool eeldatud aastavahemikku %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Lülitu kalendrisisestusrežiimile"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Lülitu tekstisisestusrežiimile"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Kuva kohtspikker"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Valige AM või PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Tunni valimine"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Minutite valimine"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d.00"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d tundi"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutit"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-eu/strings.xml b/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
index f879ef1..71b0385 100644
--- a/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-eu/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Joan %1$s urtera"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Oraingo hautapena: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Bat ere ez"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Gaur"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Urte-hautatzailea ikusgai dago"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Hautatu data bat"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Idatzitako data"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Ez da onartzen data: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Data ez dator bat espero den ereduarekin: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Espero den urte tartetik (%1$s-%2$s) kanpo dago data"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Aldatu egutegiaren idazketa-metodora"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Aldatu testua idazteko modura"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Erakutsi aholkua"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Hautatu AM edo PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Hautatu ordua"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Hautatu minutuak"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutu"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fa/strings.xml b/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
index e31b5a8..7ce35cc 100644
--- a/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fa/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"‏پیمایش به سال %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"‏انتخاب فعلی: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"هیچ‌کدام"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"امروز"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"انتخابگر سال نمایان است"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"انتخاب تاریخ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"تاریخ واردشده"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"تاریخ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"‏تاریخ واردشده: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"هیچ‌کدام"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"‏تاریخ مجاز نیست: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"‏تاریخ با الگوی موردانتظار مطابقت ندارد: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"‏تاریخ خارج از بازه زمانی %1$s تا %2$s است"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"رفتن به روش ورودی تقویم"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"رفتن به حالت ورودی نوشتاری"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"نمایش نکته‌ابزار"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ب.ظ."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ق.ظ."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"انتخاب ق.ظ. یا ب.ظ."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"انتخاب ساعت"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"انتخاب دقیقه"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"‏ساعت %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"‏%1$d ساعت"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"‏%1$d دقیقه"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fi/strings.xml b/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
index 0a5817a..03cf22d 100644
--- a/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fi/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Siirry vuoteen %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Nykyinen valinta: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"–"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Tänään"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Vuosivalitsin näkyvillä"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Valitse päivämäärä"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Lisätty päivämäärä"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Päivämäärä"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Lisätty päivämäärä: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"–"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Päivämäärä ei sallittu: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Päivämäärä ei vastaa odotettua mallia: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Päivämäärä ei sisälly odotettuun vuosiaikaväliin: %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Vaihda syöttötavaksi kalenteri"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Vaihda tekstinsyöttötilaan"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Näytä vihjeteksti"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"IP"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AP"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Valitse AP tai IP"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Valitse tunti"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Valitse minuutit"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Kello %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d h"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuuttia"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml b/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
index 0ec8d9b..2abd019 100644
--- a/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fr-rCA/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Naviguez jusqu\'à l\'année %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Sélection actuelle : %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Aucune"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Aujourd\'hui"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Sélecteur d\'année visible"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Sélectionnez une date"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Date entrée"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Date"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Date entrée : %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Aucune"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date non autorisée : %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La date ne correspond pas au schéma prévu : %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date non comprise dans la fourchette prévue des années %1$s à %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Passer au mode d\'entrée de l\'Agenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Passer au mode d\'entrée de texte"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Afficher une infobulle"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Sélectionner AM ou PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Sélectionner l\'heure"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Sélectionner les minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d h"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d h"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-fr/strings.xml b/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
index ab3346f..37c55cc 100644
--- a/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-fr/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Accéder à l\'année %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Sélection actuelle : %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Aucune"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Aujourd\'hui"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Sélecteur d\'année visible"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Sélectionner une date"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Date saisie"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Date"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Date saisie : %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Aucune"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Date non autorisée : %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La date ne correspond pas au format attendu : %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Date hors de la plage d\'années attendue : %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Passer au mode de saisie Agenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Passer au mode de saisie Texte"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Afficher l\'info-bulle"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Sélectionner le format AM ou PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Sélectionner une heure"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Sélectionner des minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d heures"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d heures"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutes"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-gl/strings.xml b/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
index 111bc92..a2fa6f8 100644
--- a/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gl/strings.xml
@@ -26,34 +26,31 @@
     <string name="date_picker_title" msgid="9208721003668059792">"Selecciona a data"</string>
     <string name="date_picker_headline" msgid="2846784065735639969">"Data seleccionada"</string>
     <string name="date_picker_switch_to_year_selection" msgid="3412370019845183965">"Cambiar a seleccionar un ano"</string>
-    <!-- no translation found for date_picker_switch_to_day_selection (145089358343568971) -->
-    <skip />
+    <string name="date_picker_switch_to_day_selection" msgid="145089358343568971">"Pasa o dedo para seleccionar un ano ou toca a pantalla para volver á selección do día"</string>
     <string name="date_picker_switch_to_next_month" msgid="8313783187901412102">"Cambiar ao mes seguinte"</string>
     <string name="date_picker_switch_to_previous_month" msgid="7596294429748914881">"Cambiar ao mes anterior"</string>
-    <!-- no translation found for date_picker_navigate_to_year_description (5152441868029453612) -->
-    <skip />
-    <!-- no translation found for date_picker_headline_description (4627306862713137085) -->
-    <skip />
-    <!-- no translation found for date_picker_no_selection_description (5724377114289981899) -->
-    <skip />
-    <!-- no translation found for date_picker_year_picker_pane_title (8140324713311804736) -->
-    <skip />
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Ir ao ano %1$s"</string>
+    <string name="date_picker_headline_description" msgid="4627306862713137085">"Selección actual: %1$s"</string>
+    <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ningunha"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoxe"</string>
+    <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selector de ano visible"</string>
+    <string name="date_input_title" msgid="3010396677286327048">"Seleccionar data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data inserida"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data inserida: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ningunha"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data non permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"A data non coincide co padrón esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"A data está fóra do intervalo de anos esperado (%1$s - %2$s)"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Cambiar ao modo de entrada de calendario"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Cambiar ao modo de introdución de texto"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar cadro de información"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"pm"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"am"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Seleccionar a. m. ou p. m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Seleccionar hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Seleccionar minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d en pto."</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-gu/strings.xml b/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
index dd3faef..ff7f383 100644
--- a/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-gu/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"વર્ષ %1$s પર નૅવિગેટ કરો"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"હાલની પસંદગી: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"એકપણ નહીં"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"આજે"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"વર્ષ માટેનું પિકર દૃશ્યમાન છે"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"તારીખ પસંદ કરો"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"દાખલ કરેલી તારીખ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"તારીખ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"દાખલ કરેલી તારીખ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"એકપણ નહીં"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"આ તારીખની મંજૂરી નથી: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"તારીખ અપેક્ષિત પૅટર્ન સાથે મેળ ખાતી નથી: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"અપેક્ષિત વર્ષની શ્રેણી %1$s - %2$sની બહારની તારીખ"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"કૅલેન્ડર ઇનપુટ મોડ પર સ્વિચ કરો"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ટેક્સ્ટ ઇનપુટ મોડ પર સ્વિચ કરો"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ટૂલટિપ બતાવો"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM કે PM પસંદ કરો"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"કલાક પસંદ કરો"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"મિનિટ પસંદ કરો"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d વાગ્યે"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d કલાકે"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d મિનિટ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hi/strings.xml b/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
index f699414..38d0eca 100644
--- a/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hi/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"साल %1$s पर जाएं"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"फ़िलहाल, यह चुना गया है: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"कोई नहीं"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"आज"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"साल चुनने का विकल्प दिख रहा है"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"तारीख चुनें"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"डाली गई तारीख"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"तारीख"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"डाली गई तारीख: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"कोई नहीं"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"यह तारीख सही नहीं है: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"तारीख सही फ़ॉर्मैट में नहीं डाली गई है: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"तारीख को साल के सही फ़ॉर्मैट में नहीं डाला गया है %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"कैलेंडर इनपुट मोड पर स्विच करें"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"टेक्स्ट इनपुट मोड पर स्विच करें"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"टूलटिप देखें"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM या PM चुनें"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"घंटा चुनें"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"मिनट चुनें"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d बजे"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d घंटे"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d मिनट"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hr/strings.xml b/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
index 3b70225..12709b5 100644
--- a/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hr/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Prelazak u godinu %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Trenutačni odabir: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ništa"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Danas"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Vidljiv je alat za odabir godine"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Odaberite datum"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Datum unosa"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum nije dopušten: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum se ne podudara s očekivanim uzorkom: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum je izvan očekivanog raspona godine %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Prijelaz na način unosa u Kalendaru"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Prijelaz na način unosa teksta"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Prikaži opis"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"Poslijepodne"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"Prijepodne"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Odaberite prijepodne ili poslijepodne"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Odabir sata"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Odabir minuta"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d h"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d h"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d min"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hu/strings.xml b/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
index 55ef980b..722c0f8 100644
--- a/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hu/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigálás a következő évhez: %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Jelenleg kiválasztva: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nincs"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Ma"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Látható az évválasztó"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Dátum kiválasztása"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Megadott dátum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dátum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Megadott dátum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Nincs"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Nem engedélyezett dátum: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"A dátum nem felel meg a várt formátumnak: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"A dátum a várt időtartományon (%1$s – %2$s) kívül esik"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Váltás naptárbeviteli módra"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Váltás szövegbeviteli módra"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Elemleírás megjelenítése"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"du."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"de."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Válassza ki, hogy délelőtt vagy délután"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Óra kiválasztása"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Perc kiválasztása"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d óra"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d óra"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d perc"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-hy/strings.xml b/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
index 8f81997..1ce72fd 100644
--- a/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-hy/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Անցնել %1$s թվական"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Ընթացիկ ընտրությունը՝ %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ոչ մեկը"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Այսօր"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Տարեթվի ցուցադրվող ընտրիչ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Ընտրեք ամսաթիվը"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Մուտքագրված ամսաթիվ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Ամսաթիվ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Մուտքագրված ամսաթիվ՝ %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ընտրված տարրեր չկան"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Ամսաթիվը թույլատրված չէ՝ %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Ամսաթիվը չի համընկնում թույլատրելի ձևաչափի հետ՝ %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Ամսաթիվը տարեթվերի թույլատրելի միջակայքից (%1$s – %2$s) դուրս է"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Անցնել օրացույցի մուտքագրման ռեժիմ"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Անցնել տեքստի մուտքագրման ռեժիմին"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Ցուցադրել հուշում"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Ընտրել AM կամ PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Ընտրել ժամը"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Ընտրել րոպեն"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ժամ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d րոպե"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-in/strings.xml b/compose/material3/material3/src/androidMain/res/values-in/strings.xml
index 7f7eae1..c9a3335 100644
--- a/compose/material3/material3/src/androidMain/res/values-in/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-in/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Pilih tahun %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Pilihan saat ini: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Tidak ada"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hari ini"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Pemilih tahun terlihat"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Pilih tanggal"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Tanggal yang dimasukkan"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Tanggal"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Tanggal yang dimasukkan: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Tidak ada"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Tanggal tidak diizinkan: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Tanggal tidak cocok dengan pola yang diharapkan: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Tanggal di luar rentang tahun yang diharapkan %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Beralih ke mode input kalender"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Beralih ke mode input teks"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Tampilkan tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Pilih AM atau PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Pilih jam"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Pilih menit"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Pukul %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d jam"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d menit"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-is/strings.xml b/compose/material3/material3/src/androidMain/res/values-is/strings.xml
index 0e63211..748dfa4 100644
--- a/compose/material3/material3/src/androidMain/res/values-is/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-is/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Fletta til ársins %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Núverandi val: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ekkert"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Í dag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Ársval birt"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Velja dagsetningu"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Skráð dagsetning"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dagsetning"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Skráð dagsetning: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ekkert"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Dagsetning er ekki leyfileg: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Dagsetning passar ekki við áætlað mynstur: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Dagsetning er utan áætlaðra ára: %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Skipta yfir í innfærsluaðferð fyrir dagatal"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Skipta yfir í textainnslátt"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Sýna ábendingu"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"eh"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"fh"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Velja f.h. eða e.h."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Velja klst."</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Velja mínútur"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Kl. %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d klst."</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d mínútur"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-it/strings.xml b/compose/material3/material3/src/androidMain/res/values-it/strings.xml
index 0ecf89f..b0c19d2 100644
--- a/compose/material3/material3/src/androidMain/res/values-it/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-it/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Vai all\'anno %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Selezione attuale: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nessuna selezione"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Oggi"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selettore dell\'anno visibile"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Seleziona data"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Data inserita"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data non consentita: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"La data non corrisponde al pattern previsto: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"La data non rientra nell\'intervallo di anni previsto (%1$s-%2$s)"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Passa alla modalità di immissione Calendario"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Passa alla modalità di immissione Testo"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostra descrizione comando"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Seleziona AM o PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Seleziona ora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Seleziona i minuti"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ore"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuti"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-iw/strings.xml b/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
index 3224130..73a6c27 100644
--- a/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-iw/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"‏ניווט לשנת %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"‏הבחירה הנוכחית: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ללא"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"היום"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"בורר השנה גלוי"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"בחירת תאריך"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"התאריך שהוזן"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"תאריך"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"‏התאריך שהוזן: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ללא"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"‏תאריך לא מורשה: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"‏התאריך לא תואם לקו ביטול הנעילה הצפוי: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"‏התאריך נמצא מחוץ לטווח השנים הצפוי %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"מעבר לשיטת קלט של יומן"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"מעבר לשיטת קלט של טקסט"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"הצגת הסבר קצר"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"‏צריך לבחור ב-AM או ב-PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"בחירת שעה"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"בחירת דקות"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"‏%1$d שעות"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"‏%1$d דקות"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ja/strings.xml b/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
index c28cc19..5e74684 100644
--- a/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ja/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"年に移動 %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"現在の選択: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"なし"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"今日"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"年の選択ツールの表示"</string>
     <string name="date_input_title" msgid="3010396677286327048">"日付を選択"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"入力された日付"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"許可されていない日付です: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"想定されるパターンと日付が一致しません: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"想定される年の範囲(%1$s~%2$s)から日付が外れています"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"カレンダー入力モードに切り替え"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"テキスト入力モードに切り替え"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"ツールチップを表示します"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"午前または午後を選択"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"時刻を選択"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"分を選択"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d 時"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d 時間"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d 分"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ka/strings.xml b/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
index dc3fa1f..88eb89c 100644
--- a/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ka/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s-ზე გადასვლა"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ამჟამინდელი არჩევანი: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"არცერთი"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"დღეს"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"არჩეული წელი ხილულია"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"აირჩიეთ თარიღი"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"შეყვანილი სახელი"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"თარიღი"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"შეყვანილი თარიღი: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"არცერთი"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"თარიღი დაუშვებელია: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"თარიღი არ ემთხვევა მოსალოდნელ ნიმუშს: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"თარიღი არ არის წლების მოსალოდნელ დიაპაზონში %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"კალენდარში შეყვანის რეჟიმზე გადართვა"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ტექსტის შეყვანის რეჟიმზე გადართვა"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"მინიშნების ჩვენება"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"აირჩიეთ AM ან PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"აირჩიეთ საათი"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"აირჩიეთ წუთები"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d სთ"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d საათი"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d წთ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-kk/strings.xml b/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
index 3c86ac5..cbf6ed3 100644
--- a/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kk/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Мына жылға өту: %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Қазіргі таңдау: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ешқандай"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Бүгін"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Көрсетілген жыл таңдағышы"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Күнді таңдаңыз"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Деректер енгізілді"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Күні"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Деректер енгізілді: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Жоқ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Деректер рұқсат етілмейді: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Деректер болжалды өрнекке сай келмейді: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Күтілетін жыл аралығы: %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Күнтізбенің енгізу режиміне ауысу"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Мәтін енгізу режиміне ауысу"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Қалқыма көмекті көрсету"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"түстен кейін"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"түске дейін"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"\"AM\" немесе \"PM\" форматын таңдау"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Сағатты таңдау"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Минут таңдау"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d сағат"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d сағат"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d минут"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-km/strings.xml b/compose/material3/material3/src/androidMain/res/values-km/strings.xml
index af6061a..b8356e3 100644
--- a/compose/material3/material3/src/androidMain/res/values-km/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-km/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"រុករកទៅកាន់ឆ្នាំ %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ការជ្រើសរើសបច្ចុប្បន្ន៖ %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"គ្មាន"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ថ្ងៃនេះ"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"អាចមើលឃើញផ្ទាំងជ្រើសរើសឆ្នាំ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ជ្រើសរើស​កាលបរិច្ឆេទ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"កាលបរិច្ឆេទដែលបានបញ្ចូល"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"កាលបរិច្ឆេទ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"កាលបរិច្ឆេទដែលបានបញ្ចូល៖ %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"គ្មាន"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"កាលបរិច្ឆេទដែលមិនបានអនុញ្ញាត៖ %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"កាលបរិច្ឆេទមិនត្រូវគ្នានឹងលំនាំដែលរំពឹងទុកទេ៖ %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"កាលបរិច្ឆេទដែលស្ថិតនៅក្រៅចន្លោះឆ្នាំដែលរំពឹងទុក %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ប្ដូរទៅ​មុខងារបញ្ចូល​ប្រតិទិន"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ប្ដូរទៅ​មុខងារបញ្ចូល​អក្សរ"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"បង្ហាញ​កំណត់​ពន្យល់"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"ជ្រើសរើស AM ឬ PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ជ្រើសរើសម៉ោង"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ជ្រើស​នាទី"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"ម៉ោង %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ម៉ោង"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d នាទី"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-kn/strings.xml b/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
index a146b0f..cd54c71 100644
--- a/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-kn/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s ವರ್ಷಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ಪ್ರಸ್ತುತ ಆಯ್ಕೆ: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ಯಾವುದೂ ಅಲ್ಲ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ಇಂದು"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ವರ್ಷದ ಪಿಕರ್ ಗೋಚರಿಸುತ್ತದೆ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ನಮೂದಿಸಿದ ದಿನಾಂಕ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ದಿನಾಂಕ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ನಮೂದಿಸಿದ ದಿನಾಂಕ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ಯಾವುದೂ ಅಲ್ಲ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ದಿನಾಂಕವನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ನಿರೀಕ್ಷಿಸಿದ ಪ್ಯಾಟರ್ನ್‌ನೊಂದಿಗೆ ದಿನಾಂಕ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ದಿನಾಂಕವು ನಿರೀಕ್ಷಿಸಿದ ವರ್ಷದ ವ್ಯಾಪ್ತಿಯನ್ನು ಮೀರಿದೆ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ಕ್ಯಾಲೆಂಡರ್ ಇನ್‌ಪುಟ್ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿ"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ಪಠ್ಯ ಇನ್‌ಪುಟ್ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿ"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ಟೂಲ್‌ಟಿಪ್ ಅನ್ನು ತೋರಿಸಿ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM ಅಥವಾ PM ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ಸಮಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ನಿಮಿಷಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ಓ ಕ್ಲಾಕ್"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ಗಂಟೆ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d ನಿಮಿಷಗಳು"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ko/strings.xml b/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
index 4058800..2f628531 100644
--- a/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ko/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s년으로 이동"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"현재 선택사항: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"없음"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"오늘"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"연도 선택 도구 표시"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"날짜 선택"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"입력한 날짜"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"날짜"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"입력한 날짜: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"없음"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"데이터 허용 안 됨: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"데이터가 예상 패턴과 일치하지 않음: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"데이터가 예상 연도 범위(%1$s~%2$s)를 벗어남"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"캘린더 입력 모드로 전환"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"텍스트 입력 모드로 전환"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"도움말 표시"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"오후"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"오전"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"오전 또는 오후를 선택하세요."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"시간 선택"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"분 선택"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d시 정각"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d시간"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d분"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ky/strings.xml b/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
index 2a2be27..3e6e538 100644
--- a/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ky/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s-жылга өтүү"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Учурда %1$s тандалды"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Жок"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Бүгүн"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Көрсөтүлгөн жыл тандагыч"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Күндү тандоо"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Киргизилген күн"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Күнү"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Киргизилген күн: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Жок"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Күндүн мындай форматын колдонууга болбойт: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Күндүн форматы үлгүгө дал келген жок: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Күн %1$s — %2$s деп белгиленген жылдар диапазонуна кирбей калды"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Жылнаамага киргизүү режимине которулуу"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Текст киргизүү режимине которулуу"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Калкып чыгуучу кеңешти көрсөтүү"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"түштөн кийин"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"түшкө чейин"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Түшкө чейинки же түштөн кийинки убакытты тандоо"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Саат тандоо"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Мүнөттөрдү тандоо"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d саат"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d саат"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d мүнөт"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lo/strings.xml b/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
index ad23c6d..2c6017a 100644
--- a/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lo/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"ນຳທາງໄປຫາປີ %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ການເລືອກປັດຈຸບັນ: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ບໍ່ມີ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ມື້ນີ້"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ສະແດງຕົວເລືອກປີ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ເລືອກວັນທີ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ປ້ອນວັນທີແລ້ວ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ວັນທີ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ປ້ອນວັນທີແລ້ວ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ບໍ່ມີ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ວັນທີທີ່ບໍ່ອະນຸຍາດ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ວັນທີບໍ່ກົງກັບຮູບແບບທີ່ຄາດໄວ້: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ວັນທີຢູ່ນອກໄລຍະປີທີ່ຄາດໄວ້ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ສະຫຼັບໄປໃຊ້ໂໝດປ້ອນຂໍ້ມູນປະຕິທິນ"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ສະຫຼັບໄປໃຊ້ໂໝດປ້ອນຂໍ້ຄວາມ"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ສະແດງຄຳແນະນຳ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ຫຼັງທ່ຽງ"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ກ່ອນທ່ຽງ"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"ເລືອກກ່ອນທ່ຽງ ຫຼື ຫຼັງທ່ຽງ"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ເລືອກຊົ່ວໂມງ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ເລືອກນາທີ"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ໂມງ"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ຊົ່ວໂມງ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d ນາທີ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lt/strings.xml b/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
index 1d88730..3ab33d0 100644
--- a/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lt/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Eiti į %1$s m."</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Dabartinis pasirinkimas: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nėra"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Šiandien"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Rodomas metų parinkiklis"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Pasirinkite datą"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Įvesta data"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data neleidžiama: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Data neatitinka numatyto šablono: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Data nepatenka į numatytų metų diapazoną: %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Perjungti į kalendoriaus įvesties režimą"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Perjungti į teksto įvesties režimą"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Rodyti patarimą"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"popiet"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"priešpiet"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Pasirinkite „priešpiet“ arba „popiet“"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Pasirinkite valandą"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Pasirinkite minutes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d val."</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d val."</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%d min."</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-lv/strings.xml b/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
index 34e073d..a8c4312 100644
--- a/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-lv/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Pāriet uz %1$s. gadu"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Pašreizējā atlase: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nav"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Šodien"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Redzams gada atlasītājs"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Atlasīt datumu"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Ievadītais datums"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datums"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Ievadītais datums: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Nav"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datums nav atļauts: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datums neatbilst paredzētajam formātam: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datums nav paredzētajā gadu diapazonā (%1$s.–%2$s. g.)"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Pārslēgties uz kalendāra ievades režīmu"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Pārslēgties uz teksta ievades režīmu"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Rādīt rīka padomu"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Atlasīt “AM” (priekšpusdienā) vai “PM” (pēcpusdienā)"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Atlasīt stundu"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Atlasīt minūtes"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"Minūtes: %1$d"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mk/strings.xml b/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
index 5ade032..0b872f6 100644
--- a/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mk/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Одете на годината %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Тековен избор: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Нема"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Денес"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Избирачот на година е видлив"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Изберете датум"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Внесен датум"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Датумот не е дозволен: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Не се совпаѓа со очекуваната шема: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Датумот не е во очекуваниот опсег на години %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Префрли на режим за внесување во календарот"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Префрли на режим за внесување текст"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Прикажи совет за алатка"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"попладне"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"претпладне"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Изберете претпладне или попладне"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Изберете час"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Изберете минути"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d часот"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d часот"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d минути"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ml/strings.xml b/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
index 9923a3b..104f0a3 100644
--- a/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ml/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s എന്ന വർഷത്തിലേക്ക് പോകുക"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"നിലവിലെ തിരഞ്ഞെടുപ്പ്: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ഒന്നുമില്ല"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ഇന്ന്"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"വർഷ പിക്കർ ദൃശ്യമാണ്"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"തീയതി തിരഞ്ഞെടുക്കുക"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"നൽകിയ തീയതി"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"തീയതി"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"നൽകിയ തീയതി: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ഒന്നുമില്ല"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"തീയതി അനുവദനീയമല്ല: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"പ്രതീക്ഷിച്ച പാറ്റേണുമായി തീയതി പൊരുത്തപ്പെടുന്നില്ല: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"പ്രതീക്ഷിക്കുന്ന കാലയളവിലെ വർഷമല്ല നൽകിയ തീയതിയുടേത് %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"കലണ്ടർ ഇൻപുട്ട് മോഡിലേക്ക് മാറുക"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ടെക്‌സ്‌റ്റ് ഇൻപുട്ട് മോഡിലേക്ക് മാറുക"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ടൂൾടിപ്പ് കാണിക്കുക"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM അല്ലെങ്കിൽ PM തിരഞ്ഞെടുക്കുക"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"മണിക്കൂർ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"മിനിറ്റ് തിരഞ്ഞെടുക്കുക"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d മണി"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d മ."</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d മിനിറ്റ്"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mn/strings.xml b/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
index 1cc6860..216cd28 100644
--- a/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mn/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s он руу шилжих"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Одоогийн сонголт: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Байхгүй"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Өнөөдөр"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Он сонгогч харагдаж байна"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Огноо сонгох"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Оруулсан огноо"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Огноо"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Оруулсан огноо: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Байхгүй"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Зөвшөөрөөгүй огноо: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Огноо нь тооцоолсон хээтэй таарахгүй байна: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Тооцоолсон оны %1$s - %2$s мужаас гарсан огноо"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Календарийн орох горим руу сэлгэх"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Текст оруулах горим руу сэлгэх"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Зөвлөмж харуулах"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ҮХ"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ҮӨ"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"ҮӨ эсвэл ҮХ эсэхийг сонгоно уу"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Цаг сонгох"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Минут сонгоно уу"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d цаг"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d цаг"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d минут"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-mr/strings.xml b/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
index 575a698..09284b8 100644
--- a/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-mr/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s वर्षावर नेव्हिगेट करा"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"सद्य निवड: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"काहीही नाही"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"आज"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"वर्ष पिकर दृश्यमान आहे"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"तारीख निवडा"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"एंटर केलेली तारीख"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"तारीख"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"एंटर केली तारीख: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"काहीही नाही"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"अशा तारखेला अनुमती नाही: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"तारीख ही अपेक्षित पॅटर्नशी जुळत नाही: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"तारीख ही %1$s - %2$s या अपेक्षित रेंजच्या बाहेरची आहे"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"कॅलेंडर इनपुट मोडवर स्विच करा"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"टेक्स्ट इनपुट मोडवर स्विच करा"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"टूलटिप दाखवा"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM किंवा PM निवडा"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"तास निवडा"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"मिनिटे निवडा"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d वाजता"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d तास"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d मिनिटे"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ms/strings.xml b/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
index e588581..7acd62b 100644
--- a/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ms/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigasi ke tahun %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Pilihan semasa: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Tiada"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hari ini"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Pemilih tahun kelihatan"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Pilih tarikh"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Tarikh yang dimasukkan"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Tarikh"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Tarikh yang dimasukkan: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Tiada"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Tarikh yang tidak dibenarkan: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Tarikh tidak sepadan dengan corak yang dijangkakan: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Tarikh di luar julat tahun yang dijangkakan %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Beralih kepada mod input kalendar"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Beralih kepada mod input teks"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Tunjukkan tip alat"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"P/M"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"PG"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Pilih PG atau PTG/MLM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Pilih jam"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Pilih minit"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Pukul %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d jam"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minit"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-my/strings.xml b/compose/material3/material3/src/androidMain/res/values-my/strings.xml
index 3204728..5aec28b 100644
--- a/compose/material3/material3/src/androidMain/res/values-my/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-my/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s ခုနှစ်သို့ သွားရန်"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"လက်ရှိ ရွေးချယ်မှု- %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"မရှိ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ယနေ့"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ခုနှစ်ရွေးချယ်ရေးစနစ်ကို မြင်ရသည်"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ရက်စွဲရွေးရန်"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ထည့်ထားသော ရက်စွဲ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ရက်စွဲ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ထည့်ထားသော ရက်စွဲ- %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"မရှိ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ရက်စွဲကို ခွင့်ပြုမထားပါ- %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ရက်စွဲသည် မျှော်မှန်းထားသော ပုံစံနှင့် မကိုက်ညီပါ- %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ရက်စွဲသည် မျှော်မှန်းထားသော နှစ်အပိုင်းအခြား %1$s - %2$s တွင် မပါဝင်ပါ"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ပြက္ခဒိန် လက်ကွက်ထည့်သွင်းနည်းသို့ ပြောင်းရန်"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"စာရိုက်နည်းသို့ ပြောင်းရန်"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"အကြံပြုချက်ပြ ပေါ့အပ်ဝင်းဒိုး ပြရန်"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM (သို့) PM ရွေးရန်"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"နာရီ ရွေးရန်"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"မိနစ် ရွေးရန်"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d နာရီ"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d နာရီ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d မိနစ်"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-nb/strings.xml b/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
index eebe6bc..85768f3 100644
--- a/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nb/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Gå til år %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Valgt: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ingen"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"I dag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Årsvelgeren er synlig"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Velg dato"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Angitt dato"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dato"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Angitt dato: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ingen"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datoen er ikke tillatt: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datoen matcher ikke det forventede mønsteret: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datoen er utenfor det forventede årsintervallet %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Bytt til kalendermodus for inndata"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Bytt til tekstmodus for inndata"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Vis verktøytips"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Velg AM eller PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Velg time"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Velg minutter"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d timer"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutter"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ne/strings.xml b/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
index 4b950f9..c820f95 100644
--- a/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ne/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"साल %1$s मा जानुहोस्"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"हालको छनौट: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"कुनै पनि होइन"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"आज"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"साल पिकर देखिएको छ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"मिति चयन गर्नुहोस्"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"हालिएको मिति"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"मिति"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"हालिएको मिति: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"कुनै पनि होइन"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"यो मिति हाल्न पाइँदैन: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"हालिएको मितिको ढाँचा अपेक्षित ढाँचासँग मिलेन: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"हालिएको मिति सालको अपेक्षित दायरा (%1$s - %2$s) भित्र पर्दैन"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"पात्रोको इनपुट मोड प्रयोग गर्नुहोस्"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"टेक्स्ट इनपुट मोड प्रयोग गर्नुहोस्"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"टुलटिप देखाइयोस्"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"पूर्वाह्न वा अपराह्न चयन गर्नुहोस्"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"घण्टा चयन गर्नुहोस्"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"मिनेट चयन गर्नुहोस्"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d बजे"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d घण्टा"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d मिनेट"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-nl/strings.xml b/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
index 2ff3515..051711b 100644
--- a/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-nl/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Ga naar jaar %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Huidige selectie: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Geen"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Vandaag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Jaarselectie zichtbaar"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Datum selecteren"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Opgegeven datum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Opgegeven datum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Geen"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datum niet toegestaan: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"De datum komt niet overeen met het verwachte patroon: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum buiten het verwachte jaarbereik %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Overschakelen naar agenda-invoermodus"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Overschakelen naar tekstinvoermodus"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Tooltip tonen"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM of PM selecteren"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Uur selecteren"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Minuten selecteren"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d uur"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d uur"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuten"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-or/strings.xml b/compose/material3/material3/src/androidMain/res/values-or/strings.xml
index 912bdbb..35c0b41 100644
--- a/compose/material3/material3/src/androidMain/res/values-or/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-or/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s ବର୍ଷକୁ ନାଭିଗେଟ କରନ୍ତୁ"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ବର୍ତ୍ତମାନର ଚୟନ: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"କିଛି ନାହିଁ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ଆଜି"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ବର୍ଷ ପିକର ଦେଖାଯାଉଛି"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ତାରିଖ ଚୟନ କରନ୍ତୁ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ଲେଖାଯାଇଥିବା ତାରିଖ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ତାରିଖ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ଲେଖାଯାଇଥିବା ତାରିଖ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"କିଛି ନାହିଁ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ତାରିଖକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ଆଶା କରାଯାଉଥିବା ପାଟର୍ନ ସହ ତାରିଖ ମେଳ ହେଉନାହିଁ: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ତାରିଖଟି ଆଶା କରାଯାଉଥିବା ବର୍ଷ ରେଞ୍ଜ %1$s - %2$sରୁ ବାହାରେ ଅଛି"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"କେଲେଣ୍ଡର ଇନପୁଟ ମୋଡକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ଟେକ୍ସଟ ଇନପୁଟ ମୋଡକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ଟୁଲଟିପ ଦେଖାନ୍ତୁ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM କିମ୍ବା PM ଚୟନ କରନ୍ତୁ"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ଘଣ୍ଟା ଚୟନ କରନ୍ତୁ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ମିନିଟ ଚୟନ କରନ୍ତୁ"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$dଟା"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ଘଣ୍ଟା"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d ମିନିଟ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pa/strings.xml b/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
index 6d49ad8..09646c0 100644
--- a/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pa/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"ਸਾਲ %1$s \'ਤੇ ਜਾਓ"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ਮੌਜੂਦਾ ਚੋਣ: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ਕੋਈ ਨਹੀਂ"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ਅੱਜ"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ਸਾਲ ਚੋਣਕਾਰ ਦਿਖਣਯੋਗ ਹੈ"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"ਤਾਰੀਖ ਚੁਣੋ"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ਦਾਖਲ ਕੀਤੀ ਗਈ ਤਾਰੀਖ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"ਤਾਰੀਖ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ਦਾਖਲ ਕੀਤੀ ਗਈ ਤਾਰੀਖ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ਕੋਈ ਨਹੀਂ"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ਇਸ ਤਾਰੀਖ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"ਤਾਰੀਖ ਸੰਭਾਵਿਤ ਪੈਟਰਨ ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦੀ: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ਤਾਰੀਖ ਸੰਭਾਵਿਤ ਸਾਲ ਦੀ ਰੇਂਜ ਤੋਂ ਬਾਹਰ ਹੈ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"ਕੈਲੰਡਰ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ਟੂਲ-ਟਿੱਪ ਦਿਖਾਓ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM ਜਾਂ PM ਚੁਣੋ"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"ਘੰਟਾ ਚੁਣੋ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"ਮਿੰਟ ਚੁਣੋ"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ਵਜੇ"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ਘੰਟੇ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d ਮਿੰਟ"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pl/strings.xml b/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
index 2daa8a8..5bb9101 100644
--- a/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pl/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Przejdź do roku %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Obecnie wybrane: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Brak"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Dzisiaj"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Widoczny selektor roku"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Wybierz datę"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Wprowadzono datę"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Wprowadzono datę: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Brak"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data niedozwolona: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Data nie pasuje do oczekiwanego wzorca: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Data poza oczekiwanym zakresem lat %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Włącz tryb wprowadzania danych kalendarzowych"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Włącz tryb wprowadzania tekstu"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Pokaż etykietkę"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Wybierz AM lub PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Wybierz godzinę"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Wybierz minuty"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d godziny"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minut"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
index 6b6c723..cfd5be4 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt-rBR/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navegar para o ano de %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Seleção atual: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nenhuma"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoje"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Seletor de dia visível"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Selecionar data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data inserida"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data inserida: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Nenhuma"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data não permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"A data não está no padrão esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"A data está fora do intervalo de anos esperado %1$s a %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Alternar para o modo de entrada da agenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Alternar para o modo de entrada de texto"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar dica"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecione AM ou PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Selecione a hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Selecione os minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$dh"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
index 86e9c17..e61dd37 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt-rPT/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navegar para o ano %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Seleção atual: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nenhuma"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoje"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selecionador de ano visível"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Selecionar data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data introduzida"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data introduzida: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Nenhuma"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data não permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"A data não corresponde ao padrão esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Data fora do intervalo de anos esperado: %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Mudar para o método de introdução de calendário"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Mudar para o método de introdução de texto"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar sugestão"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecione AM ou PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Selecione a hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Selecione os minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d h"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-pt/strings.xml b/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
index 6b6c723..cfd5be4 100644
--- a/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-pt/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navegar para o ano de %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Seleção atual: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Nenhuma"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hoje"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Seletor de dia visível"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Selecionar data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data inserida"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data inserida: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Nenhuma"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data não permitida: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"A data não está no padrão esperado: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"A data está fora do intervalo de anos esperado %1$s a %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Alternar para o modo de entrada da agenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Alternar para o modo de entrada de texto"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Mostrar dica"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selecione AM ou PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Selecione a hora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Selecione os minutos"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$dh"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d horas"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minutos"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ro/strings.xml b/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
index 75def7c..421aadf 100644
--- a/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ro/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navighează la anul %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Opțiunea selectată: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Fără"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Azi"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Selectorul de an este vizibil"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Selectează data"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data introdusă"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dată"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data introdusă: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Fără"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data nu este permisă: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Data nu corespunde modelului așteptat: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Data este în afara intervalului de ani %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Comută la modul de introducere în calendar"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Comută la modul de introducere a textului"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Afișează balonul explicativ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"p.m."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"a.m."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Selectează a.m. sau p.m."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Selectează ora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Selectează minutele"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Ora %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ore"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minute"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ru/strings.xml b/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
index b6296a1..4fd933b 100644
--- a/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ru/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Переход к %1$s году"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Текущий выбор: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Не выбрано"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Сегодня"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Отображаемый выбор года"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Выберите дату"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Введенная дата"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Дата"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Введенная дата: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Нет"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Недопустимая дата: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Дата не соответствует допустимому шаблону: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Дата не входит в допустимый диапазон: %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Перейти в режим выбора даты"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Перейти в режим ввода текста"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Показать подсказку"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Выбрать AM (до полудня) или PM (после полудня)"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Выбрать час"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Выбрать минуты"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ч."</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ч."</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d мин."</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-si/strings.xml b/compose/material3/material3/src/androidMain/res/values-si/strings.xml
index e6acdba..372c4d0 100644
--- a/compose/material3/material3/src/androidMain/res/values-si/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-si/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s වසර වෙත සංචලන කරන්න"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"වත්මන් තේරීම: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"කිසිවක් නැත"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"අද"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"වසර තෝරකය දෘශ්‍යමානයි"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"දිනය තෝරන්න"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ඇතුළු කළ දිනය"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"දිනය"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"එක් කරන්න: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"කිසිවක් නැත"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"දිනය ඉඩ නොදෙයි: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"දිනය අපේක්ෂිත රටාවට නොගැළපෙයි: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"දිනය අපේක්ෂිත වසර පරාසයෙන් පිටත වේ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"දින දර්ශන ආදාන ප්‍රකාරයට මාරු වන්න"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"පෙළ ආදාන ප්‍රකාරයට මාරු වන්න"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"මෙවලම් ඉඟිය පෙන්වන්න"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ප.ව."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"පෙ.ව."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"පෙ.ව. හෝ ප.ව. තෝරන්න"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"පැය තෝරන්න"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"මිනිත්තු තෝරන්න"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$dට"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"පැය %1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"මිනිත්තු %1$d"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sk/strings.xml b/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
index f1dc227..d83ef09 100644
--- a/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sk/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Prechod na rok %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuálny výber: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Žiadne"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Dnes"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Výber roka je viditeľný"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Vybrať dátum"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Zadaný dátum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Dátum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Zadaný dátum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Žiadny"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Nepovolený dátum: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Dátum nezodpovedá očakávanému vzoru: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Dátum sa nenachádza v očakávanom rozsahu rokov: %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Prepnúť na kalendárový režim vstupu"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Prepnúť na textový režim vstupu"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Zobraziť opis"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Vyberte AM alebo PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Vybrať hodinu"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Vybrať minúty"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d h"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d h"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d min"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sl/strings.xml b/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
index 6a6b270..2e7235c 100644
--- a/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sl/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Pomik na leto %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Trenutna izbira: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Brez"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Danes"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Izbirnik leta je viden"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Izbira datuma"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Vneseni datum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Vneseni datum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Brez"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Oblika datuma ni dovoljena: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datum se ne ujema s pričakovanim vzorcem: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datum je zunaj pričakovanega razpona let %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Preklop na način vnosa v koledar"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Preklop na način vnosa besedila"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Pokaži opis orodja"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"pop."</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"dop."</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Izberite dopoldanski ali popoldanski čas."</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Izbira ure"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Izbira minut"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d min"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sq/strings.xml b/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
index b7c198e..17583c2 100644
--- a/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sq/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigo në vitin %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Zgjedhja aktuale: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Asnjë"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Sot"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Zgjedhësi i vitit i dukshëm"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Zgjidh datën"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Data e futur"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Data"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Data e futur: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Asnjë"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Data nuk lejohet: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Data nuk përputhet me motivin e pritur: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Data jashtë diapazonit të pritur të vitit %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Kalo te modaliteti i \"Hyrjes së kalendarit\""</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Kalo te modaliteti i \"Hyrjes së tekstit\""</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Shfaq këshillat për veglën"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"MD"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"PD"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Zgjidh paradite ose pasdite"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Zgjidh orën"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Përzgjidh minutat"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"ora %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d orë"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuta"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sr/strings.xml b/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
index aff6c1a..bcc4baa 100644
--- a/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sr/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Идите на годину: %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Актуелни избор: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Ништа"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Данас"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Видљив бирач година"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Изаберите датум"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Унети датум"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Датум"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Унети датум: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Ништа"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Датум није дозвољен: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Датум не одговара очекиваном шаблону: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Датум је изван очекиваног опсега година %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Пређите на режим уноса у Календару"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Пређите на режим уноса текста"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Прикажи објашњење"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"по"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"пр"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Изаберите пре подне или по подне"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Изаберите сат"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Изаберите минуте"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d ч"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ч"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d мин"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sv/strings.xml b/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
index 57638de..2b8233b 100644
--- a/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sv/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Navigera till %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Aktuellt val: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Inget"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"I dag"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Årväljaren är synlig"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Välj datum"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Angivet datum"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Datum"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Angivet datum: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Inget"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Datumet är inte tillåtet: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Datumet matchar inte det förväntade formatet: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Datumet faller utanför det förväntade årsintervallet %1$s–%2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Byt till kalender som inmatningsläge"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Byt till text som inmatningsläge"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Visa beskrivning"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"EM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"FM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Välj mellan FM och EM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Ange timme"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Välj minuter"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Klockan %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d timmar"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d minuter"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-sw/strings.xml b/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
index 1495a76..eb057de 100644
--- a/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-sw/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Nenda kwenye mwaka %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Iliyochaguliwa sasa: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Hamna"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Leo"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Kiteua mwaka kinaonekana"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Chagua tarehe"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Tarehe iliyowekwa"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Tarehe"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Tarehe iliyowekwa: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Hamna"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Tarehe isiyoruhusiwa: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Tarehe hailingani na mchoro uliotarajiwa: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Tarehe nje ya kipindi cha mwaka kilichotarajiwa %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Badilisha mipangilio ya kuingiza data ya kalenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Badilisha kwenda mipangilio ya kuingiza data ya maandishi"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Onyesha kidirisha cha vidokezo"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"Mchana"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"Asubuhi"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Chagua Asubuhi au Mchana"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Chagua saa"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Chagua dakika"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Saa %1$d kamili"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"Saa %1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"Dakika %1$d"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ta/strings.xml b/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
index c0c83ef..59efd25 100644
--- a/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ta/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$sக்குச் செல்லும்"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"தற்போது %1$s தேர்வுசெய்யப்பட்டுள்ளது"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ஏதுமில்லை"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"இன்று"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"ஆண்டைத் தேர்வுசெய்யும் பக்கம் காட்டப்படுகிறது"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"தேதியைத் தேர்வுசெய்யுங்கள்"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"உள்ளிட்ட தேதி"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"தேதி"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"உள்ளிட்ட தேதி: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ஏதுமில்லை"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"இந்தத் தேதி அனுமதிக்கப்படவில்லை: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"எதிர்பார்க்கப்படும் பேட்டர்னுடன் தேதி பொருந்தவில்லை: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"இந்தத் தேதி %1$s - %2$s ஆண்டு வரம்பிற்குள் இல்லை"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"கேலெண்டர் உள்ளீட்டு முறைக்கு மாற்று"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"எழுத்து உள்ளீட்டு முறைக்கு மாற்று"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"உதவிக்குறிப்பைக் காட்டு"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM/PM என்பதைத் தேர்ந்தெடுக்கலாம்"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"மணிநேரத்தைத் தேர்ந்தெடுக்கலாம்"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"நிமிடங்களைத் தேர்ந்தெடுக்கலாம்"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d மணி"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d மணிநேரம்"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d நிமிடங்கள்"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-te/strings.xml b/compose/material3/material3/src/androidMain/res/values-te/strings.xml
index 5dd0adb..be8ceed 100644
--- a/compose/material3/material3/src/androidMain/res/values-te/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-te/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s సంవత్సరానికి వెళ్లండి"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"ప్రస్తుత ఎంపిక: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ఏదీ లేదు"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"ఈ రోజు"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"సంవత్సరం పికర్ కనిపిస్తుంది"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"తేదీ ఎంచుకోండి"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"ఎంటర్ చేసిన తేదీ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"తేదీ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"ఎంటర్ చేసిన తేదీ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"ఏదీ లేదు"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"చెల్లని తేదీ: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"తేదీ ఉండాల్సిన ఫార్మాట్‌తో మ్యాచ్ కాలేదు: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"ఉండాల్సిన సంవత్సరాల పరిధి %1$s - %2$s‌లో తేదీ లేదు"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"క్యాలెండర్ ఇన్‌పుట్ మోడ్‌కు స్విచ్ అవ్వండి"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"టెక్స్ట్ ఇన్‌పుట్ మోడ్‌కు స్విచ్ అవ్వండి"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"టూల్‌టిప్‌ను చూపించు"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"AM లేదా PMను ఎంచుకోండి"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"గంటను ఎంచుకోండి"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"నిమిషాలను ఎంచుకోండి"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d గంటలు"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d గంటలు"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d నిమిషాలు"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-th/strings.xml b/compose/material3/material3/src/androidMain/res/values-th/strings.xml
index 3033d65..6aa0a32 100644
--- a/compose/material3/material3/src/androidMain/res/values-th/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-th/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"ไปยังปี %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"การเลือกปัจจุบัน: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"ไม่มี"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"วันนี้"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"แสดงตัวเลือกปี"</string>
     <string name="date_input_title" msgid="3010396677286327048">"เลือกวันที่"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"วันที่ป้อน"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"ไม่อนุญาตให้ใช้วันที่นี้: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"วันที่ไม่ตรงกับรูปแบบที่คาดไว้: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"วันที่อยู่นอกเหนือจากช่วงปีที่คาดไว้ %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"สลับไปใช้โหมดป้อนข้อมูลปฏิทิน"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"สลับไปใช้โหมดการป้อนข้อความ"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"แสดงเคล็ดลับเครื่องมือ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"เลือก AM หรือ PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"เลือกชั่วโมง"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"เลือกนาที"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d นาฬิกา"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d ชั่วโมง"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d นาที"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-tl/strings.xml b/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
index dfdc9b2..c78a878 100644
--- a/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tl/strings.xml
@@ -32,6 +32,7 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Mag-navigate papunta sa taong %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Kasalukuyang napili: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Wala"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Ngayon"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Nakikita ang picker ng taon"</string>
     <string name="date_input_title" msgid="3010396677286327048">"Pumili ng petsa"</string>
     <string name="date_input_headline" msgid="3499643850558715142">"Inilagay na petsa"</string>
@@ -41,5 +42,15 @@
     <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Hindi pinapayagan ang petsa: %1$s"</string>
     <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Hindi tumutugma ang petsa sa inaasahang pattern: %1$s"</string>
     <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Wala ang petsa sa inaasahang hanay ng taon na %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Lumipat sa pamamaraan ng pag-input ng kalendaryo"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Lumipat sa pamamaraan ng pag-input ng text"</string>
     <string name="tooltip_long_press_label" msgid="2732804537909054941">"Ipakita ang tooltip"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Piliin ang AM o PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Pumili ng oras"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Pumili ng mga minuto"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d oras"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d (na) minuto"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-tr/strings.xml b/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
index b8de10e..48934fe 100644
--- a/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-tr/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s yılına gidin"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Geçerli seçim: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Yok"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Bugün"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Yıl seçici görünür durumda"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Tarih seç"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Girilen tarih"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Tarih"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Girilen tarih: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Yok"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Tarihe izin verilmiyor: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Tarih, istenen biçimle eşleşmiyor: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Tarih, istenen %1$s - %2$s yıl aralığının dışında"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Takvim giriş moduna geç"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Metin giriş moduna geç"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Araç ipucunu göster"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ÖS"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"ÖÖ veya ÖS\'yi seçin"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Saat seçin"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Dakikayı seçin"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"Saat %1$d"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d saat"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d dakika"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-uk/strings.xml b/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
index cb30959..d73d220 100644
--- a/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uk/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Перейти до %1$s року"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Поточний вибір: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Немає"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Сьогодні"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Показувати засіб вибору року"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Виберіть дату"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Введена дата"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Дата"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Введена дата: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Немає"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Недопустима дата: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Дата не відповідає очікуваному шаблону: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Дата за межами очікуваного діапазону років %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Перейти в режим введення в календарі"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Перейти в режим введення тексту"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Показати підказку"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"ПП"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"ДП"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Виберіть ДП чи ПП"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Вибрати годину"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Вибрати хвилини"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d год"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d год"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d хв"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-ur/strings.xml b/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
index dd566cd..87423e7 100644
--- a/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-ur/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"‏سال ‎%1$s پر نیویگیٹ کریں"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"‏موجودہ انتخاب: ‎%1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"کوئی نہیں"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"آج"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"سال کا منتخب کنندہ مرئی ہے"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"تاریخ منتخب کریں"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"درج کردہ تاریخ"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"تاریخ"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"‏درج کردہ تاریخ: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"کوئی نہیں"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"‏تاریخ کی اجازت نہیں ہے: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"‏تاریخ متوقع پیٹرن سے مماثل نہیں ہے: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"‏متوقع سال کی حد %1$s‏ - %2$s سے باہر کی تاریخ"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"کیلنڈر اندراج کے طرز پر سوئچ کریں"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"ٹیکسٹ اندراج کے طرز پر سوئچ کریں"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"ٹول ٹپ دکھائیں"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"بعد از دوپہر"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"قبل‌از دوپہر"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"قبل از دوپہر یا بعد از دوپہر منتخب کریں"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"گھنٹہ منتخب کریں"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"منٹس منتخب کریں"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"‏‎%1$d بجے"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"‏‎%1$d گھنٹے"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"‏%1$d منٹس"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-uz/strings.xml b/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
index c93a3ac..5e87b62 100644
--- a/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-uz/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"%1$s-yilga oʻtish"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Joriy tanlov: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Hech biri"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Bugun"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Yil tanlagich ochiq"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Sanani tanlang"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Kiritilgan sana"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Sana"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Kiritilgan sana: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Yoʻq"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Sana xato: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Sana mavjud namunaga mos kelmaydi: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Sana kutilgan yil oraligʻida emas: %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Taqvim kiritish rejimiga oʻtish"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Matn kiritish rejimiga oʻtish"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Maslahat oynasini koʻrsatish"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"TK"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"TO"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Tushdan oldin yoki keyinligini tanlang"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Soatni tanlang"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Daqiqani tanlang"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d soat"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d soat"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d daqiqa"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-vi/strings.xml b/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
index 0108f77..9ed82e5 100644
--- a/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-vi/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Chuyển đến năm %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Lựa chọn hiện tại: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Không có"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Hôm nay"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Bộ chọn năm hiển thị"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Chọn ngày"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Ngày đã nhập"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Ngày"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Ngày đã nhập: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Không có"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Ngày không được phép: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Ngày không khớp với định dạng dự kiến: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Ngày không thuộc phạm vi năm dự kiến %1$s – %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Chuyển sang chế độ nhập lịch"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Chuyển sang chế độ nhập văn bản"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Hiển thị chú giải công cụ"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"CH"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"SA"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Chọn SA hoặc CH"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Chọn giờ"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Chọn phút"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d giờ"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d giờ"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d phút"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
index a6362df..34da824 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rCN/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"切换到年份:%1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"当前的选择:%1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"无"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"今天"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"年份选择器可见"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"选择日期"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"输入日期"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"日期"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"输入日期:%1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"无"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"不允许的日期:%1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"日期不符合预期格式:%1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"日期超出预期年份范围 %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"切换到日历输入模式"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"切换到文本字段输入模式"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"显示提示"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"下午"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"上午"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"选择上午或下午"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"选择小时"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"选择分钟"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d 点"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d 小时"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d 分钟"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
index c41edfe..cdc9f9d 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rHK/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"前往 %1$s 年"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"目前選項:%1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"無"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"今天"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"顯示年分挑選器"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"選取日期"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"已輸入的日期"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"日期"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"已輸入的日期:%1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"無"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"不允許的日期:%1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"日期格式不符:%1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"日期超出預期的年份範圍:%1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"切換至日曆輸入模式"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"切換至文字輸入模式"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"顯示提示"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"下午"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"上午"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"選取上午或下午"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"選取小時"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"選取分鐘"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d 點"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d 點"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d 分鐘"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml b/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
index 6ea7600..087bbb0 100644
--- a/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zh-rTW/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"前往 %1$s 年"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"目前選項:%1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"無"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"今天"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"顯示年份挑選器"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"選取日期"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"輸入的日期"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"日期"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"輸入的日期:%1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"無"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"不允許的日期:%1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"日期格式不符:%1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"日期超出預期的年份範圍:%1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"切換至日曆輸入模式"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"切換至文字輸入模式"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"顯示工具提示"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"下午"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"上午"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"選取上午或下午"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"選取小時"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"選取分鐘"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d 點"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"%1$d 時"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"%1$d 分鐘"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values-zu/strings.xml b/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
index 093f8fb..6ed66b5 100644
--- a/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values-zu/strings.xml
@@ -32,23 +32,25 @@
     <string name="date_picker_navigate_to_year_description" msgid="5152441868029453612">"Funa kunyaka %1$s"</string>
     <string name="date_picker_headline_description" msgid="4627306862713137085">"Ukukhetha kwamanje: %1$s"</string>
     <string name="date_picker_no_selection_description" msgid="5724377114289981899">"Lutho"</string>
+    <string name="date_picker_today_description" msgid="4775802721403526937">"Namuhla"</string>
     <string name="date_picker_year_picker_pane_title" msgid="8140324713311804736">"Isikhethi sonyaka siyabonakala"</string>
-    <!-- no translation found for date_input_title (3010396677286327048) -->
-    <skip />
-    <!-- no translation found for date_input_headline (3499643850558715142) -->
-    <skip />
-    <!-- no translation found for date_input_label (5194825853981987218) -->
-    <skip />
-    <!-- no translation found for date_input_headline_description (8562356184193964298) -->
-    <skip />
-    <!-- no translation found for date_input_no_input_description (5722931102250207748) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_not_allowed (6114792992433444995) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_for_pattern (5281836720766682161) -->
-    <skip />
-    <!-- no translation found for date_input_invalid_year_range (8434112129235255568) -->
-    <skip />
-    <!-- no translation found for tooltip_long_press_label (2732804537909054941) -->
-    <skip />
+    <string name="date_input_title" msgid="3010396677286327048">"Khetha usuku"</string>
+    <string name="date_input_headline" msgid="3499643850558715142">"Usuku olufakiwe"</string>
+    <string name="date_input_label" msgid="5194825853981987218">"Usuku"</string>
+    <string name="date_input_headline_description" msgid="8562356184193964298">"Usuku olufakiwe: %1$s"</string>
+    <string name="date_input_no_input_description" msgid="5722931102250207748">"Lutho"</string>
+    <string name="date_input_invalid_not_allowed" msgid="6114792992433444995">"Usuku aluvunyelwe: %1$s"</string>
+    <string name="date_input_invalid_for_pattern" msgid="5281836720766682161">"Usuku alufani nephethini elindelekile: %1$s"</string>
+    <string name="date_input_invalid_year_range" msgid="8434112129235255568">"Usuku lungaphandle kwebanga lonyaka elilindelekile %1$s - %2$s"</string>
+    <string name="date_picker_switch_to_calendar_mode" msgid="9029369254443419167">"Shintshela kwimodi yokufaka yekhalenda"</string>
+    <string name="date_picker_switch_to_input_mode" msgid="1496750567914156598">"Shintshela kwimodi yokufaka yombhalo"</string>
+    <string name="tooltip_long_press_label" msgid="2732804537909054941">"Bonisa ithulithiphu"</string>
+    <string name="time_picker_pm" msgid="2232702812657998674">"PM"</string>
+    <string name="time_picker_am" msgid="5096144640014509074">"AM"</string>
+    <string name="time_picker_period_toggle_description" msgid="7352665290700284516">"Khetha u-AM noma u-PM"</string>
+    <string name="time_picker_hour_selection" msgid="6081676287789101196">"Khetha ihora"</string>
+    <string name="time_picker_minute_selection" msgid="8494777394375441602">"Khetha imizuzu"</string>
+    <string name="time_picker_hour_suffix" msgid="6952032626122080528">"%1$d o\'clock"</string>
+    <string name="time_picker_hour_24h_suffix" msgid="4149641012513526783">"Amahora angu-%1$d"</string>
+    <string name="time_picker_minute_suffix" msgid="3206486707779478173">"Imizuzu engu-%1$d"</string>
 </resources>
diff --git a/compose/material3/material3/src/androidMain/res/values/strings.xml b/compose/material3/material3/src/androidMain/res/values/strings.xml
index cdbd37b..a7eadde 100644
--- a/compose/material3/material3/src/androidMain/res/values/strings.xml
+++ b/compose/material3/material3/src/androidMain/res/values/strings.xml
@@ -54,6 +54,10 @@
     </string>
     <string name="date_picker_switch_to_calendar_mode">Switch to calendar input mode</string>
     <string name="date_picker_switch_to_input_mode">Switch to text input mode</string>
+    <string name="date_range_picker_title">Select dates</string>
+    <string name="date_range_picker_start_headline">Start date</string>
+    <string name="date_range_picker_end_headline">End date</string>
+    <string name="date_range_input_title">Enter dates</string>
     <!-- Spoken description of a tooltip -->
     <string name="tooltip_long_press_label">Show tooltip</string>
     <!-- Suffix for time in 12-hour standard, after noon. [CHAR_LIMIT=2]" -->
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index c7a0c21..36bd57b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -1225,7 +1225,11 @@
                 actions = actionsRow,
             )
             TopAppBarLayout(
-                modifier = Modifier.clipToBounds(),
+                modifier = Modifier
+                    // only apply the horizontal sides of the window insets padding, since the top
+                    // padding will always be applied by the layout above
+                    .windowInsetsPadding(windowInsets.only(WindowInsetsSides.Horizontal))
+                    .clipToBounds(),
                 heightPx = maxHeightPx - pinnedHeightPx + (scrollBehavior?.state?.heightOffset
                     ?: 0f),
                 navigationIconContentColor =
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
index 8a71e68..5fac45e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
@@ -50,6 +50,9 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.role
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
@@ -118,7 +121,7 @@
     val tonalElevation = elevation?.tonalElevation(enabled, interactionSource)?.value ?: 0.dp
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         enabled = enabled,
         shape = shape,
         color = containerColor,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
index 6ad4b7a..30dc766 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
@@ -1319,7 +1319,7 @@
 ) {
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         enabled = enabled,
         shape = shape,
         color = colors.containerColor(enabled).value,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
index ce5a473..a900775 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
@@ -79,6 +79,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.draw.drawWithContent
 import androidx.compose.ui.draw.rotate
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
@@ -96,6 +97,7 @@
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.verticalScrollAxisRange
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
@@ -162,6 +164,11 @@
         } else {
             null
         },
+        headlineTextStyle = MaterialTheme.typography.fromToken(
+            DatePickerModalTokens.HeaderHeadlineFont
+        ),
+        headerMinHeight = DatePickerModalTokens.HeaderContainerHeight,
+        headerContentPadding = DatePickerHeaderPadding,
         colors = colors
     ) {
         SwitchableDateEntryContent(
@@ -308,6 +315,10 @@
      * @param todayContentColor the color used for the day that marks the current date
      * @param todayDateBorderColor the color used for the border of the day that marks the current
      * date
+     * @param dayInSelectionRangeContentColor the content color used for days that are within a date
+     * range selection
+     * @param dayInSelectionRangeContainerColor the container color used for days that are within a
+     * date range selection
      */
     @Composable
     fun colors(
@@ -337,6 +348,10 @@
         todayContentColor: Color = DatePickerModalTokens.DateTodayLabelTextColor.toColor(),
         todayDateBorderColor: Color =
             DatePickerModalTokens.DateTodayContainerOutlineColor.toColor(),
+        dayInSelectionRangeContentColor: Color =
+            DatePickerModalTokens.SelectionDateInRangeLabelTextColor.toColor(),
+        dayInSelectionRangeContainerColor: Color =
+            DatePickerModalTokens.RangeSelectionActiveIndicatorContainerColor.toColor()
     ): DatePickerColors =
         DatePickerColors(
             containerColor = containerColor,
@@ -355,32 +370,85 @@
             selectedDayContainerColor = selectedDayContainerColor,
             disabledSelectedDayContainerColor = disabledSelectedDayContainerColor,
             todayContentColor = todayContentColor,
-            todayDateBorderColor = todayDateBorderColor
+            todayDateBorderColor = todayDateBorderColor,
+            dayInSelectionRangeContentColor = dayInSelectionRangeContentColor,
+            dayInSelectionRangeContainerColor = dayInSelectionRangeContainerColor
         )
 
     /**
      * A default date picker title composable.
      *
      * @param state a [DatePickerState] that will help determine the title's content
+     * @param modifier a [Modifier] to be applied for the title
      */
     @Composable
-    fun DatePickerTitle(state: DatePickerState) {
+    fun DatePickerTitle(state: DatePickerState, modifier: Modifier = Modifier) {
         when (state.displayMode) {
-            DisplayMode.Picker -> Text(getString(string = Strings.DatePickerTitle))
-            DisplayMode.Input -> Text(getString(string = Strings.DateInputTitle))
+            DisplayMode.Picker -> Text(
+                text = getString(string = Strings.DatePickerTitle),
+                modifier = modifier
+            )
+
+            DisplayMode.Input -> Text(
+                text = getString(string = Strings.DateInputTitle),
+                modifier = modifier
+            )
         }
     }
 
     /**
-     * A default date picker headline composable lambda that displays a default headline text when
-     * there is no date selection, and an actual date string when there is.
+     * A default date picker headline composable that displays a default headline text when there is
+     * no date selection, and an actual date string when there is.
      *
      * @param state a [DatePickerState] that will help determine the title's headline
      * @param dateFormatter a [DatePickerFormatter]
+     * @param modifier a [Modifier] to be applied for the headline
      */
     @Composable
-    fun DatePickerHeadline(state: DatePickerState, dateFormatter: DatePickerFormatter) {
-        DateEntryHeadline(stateData = state.stateData, dateFormatter = dateFormatter)
+    fun DatePickerHeadline(
+        state: DatePickerState,
+        dateFormatter: DatePickerFormatter,
+        modifier: Modifier = Modifier
+    ) {
+        with(state.stateData) {
+            val defaultLocale = defaultLocale()
+            val formattedDate = dateFormatter.formatDate(
+                date = selectedStartDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+            val verboseDateDescription = dateFormatter.formatDate(
+                date = selectedStartDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale,
+                forContentDescription = true
+            ) ?: when (displayMode.value) {
+                DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                else -> ""
+            }
+
+            val headlineText = formattedDate ?: when (displayMode.value) {
+                DisplayMode.Picker -> getString(Strings.DatePickerHeadline)
+                DisplayMode.Input -> getString(Strings.DateInputHeadline)
+                else -> ""
+            }
+
+            val headlineDescription = when (displayMode.value) {
+                DisplayMode.Picker -> getString(Strings.DatePickerHeadlineDescription)
+                DisplayMode.Input -> getString(Strings.DateInputHeadlineDescription)
+                else -> ""
+            }.format(verboseDateDescription)
+
+            Text(
+                text = headlineText,
+                modifier = modifier.semantics {
+                    liveRegion = LiveRegionMode.Polite
+                    contentDescription = headlineDescription
+                },
+                maxLines = 1
+            )
+        }
     }
 
     /**
@@ -458,33 +526,44 @@
     private val selectedDayContainerColor: Color,
     private val disabledSelectedDayContainerColor: Color,
     private val todayContentColor: Color,
-    internal val todayDateBorderColor: Color
+    internal val todayDateBorderColor: Color,
+    internal val dayInSelectionRangeContainerColor: Color,
+    private val dayInSelectionRangeContentColor: Color,
 ) {
     /**
      * Represents the content color for a calendar day.
      *
-     * @param today indicates that the color is for a date that represents today
+     * @param isToday indicates that the color is for a date that represents today
      * @param selected indicates that the color is for a selected day
+     * @param inRange indicates that the day is part of a selection range of days
      * @param enabled indicates that the day is enabled for selection
      */
     @Composable
     internal fun dayContentColor(
-        today: Boolean,
+        isToday: Boolean,
         selected: Boolean,
+        inRange: Boolean,
         enabled: Boolean
     ): State<Color> {
-        val target = if (selected) {
-            if (enabled) selectedDayContentColor else disabledSelectedDayContentColor
-        } else if (today) {
-            todayContentColor
-        } else {
-            if (enabled) dayContentColor else disabledDayContentColor
+        val target = when {
+            selected && enabled -> selectedDayContentColor
+            selected && !enabled -> disabledSelectedDayContentColor
+            inRange && enabled -> dayInSelectionRangeContentColor
+            inRange && !enabled -> disabledDayContentColor
+            isToday -> todayContentColor
+            enabled -> dayContentColor
+            else -> disabledDayContentColor
         }
 
-        return animateColorAsState(
-            target,
-            tween(durationMillis = MotionTokens.DurationShort2.toInt())
-        )
+        return if (inRange) {
+            rememberUpdatedState(target)
+        } else {
+            // Animate the content color only when the day is not in a range.
+            animateColorAsState(
+                target,
+                tween(durationMillis = MotionTokens.DurationShort2.toInt())
+            )
+        }
     }
 
     /**
@@ -572,6 +651,10 @@
         }
         if (todayContentColor != other.todayContentColor) return false
         if (todayDateBorderColor != other.todayDateBorderColor) return false
+        if (dayInSelectionRangeContainerColor != other.dayInSelectionRangeContainerColor) {
+            return false
+        }
+        if (dayInSelectionRangeContentColor != other.dayInSelectionRangeContentColor) return false
 
         return true
     }
@@ -594,6 +677,8 @@
         result = 31 * result + disabledSelectedDayContainerColor.hashCode()
         result = 31 * result + todayContentColor.hashCode()
         result = 31 * result + todayDateBorderColor.hashCode()
+        result = 31 * result + dayInSelectionRangeContainerColor.hashCode()
+        result = 31 * result + dayInSelectionRangeContentColor.hashCode()
         return result
     }
 }
@@ -725,7 +810,7 @@
     /**
      * A mutable state of [CalendarDate] that represents the start date for a selection.
      */
-    internal var selectedStartDate by mutableStateOf(
+    var selectedStartDate by mutableStateOf(
         if (initialSelectedStartDateMillis != null) {
             val date = calendarModel.getCanonicalDate(
                 initialSelectedStartDateMillis
@@ -745,7 +830,7 @@
      *
      * Single date selection states that use this [StateData] should always have this as `null`.
      */
-    internal var selectedEndDate by mutableStateOf(
+    var selectedEndDate by mutableStateOf(
         // Set to null in case the provided value is "undefined" or <= than the start date.
         if (initialSelectedEndDateMillis != null &&
             initialSelectedStartDateMillis != null &&
@@ -768,7 +853,7 @@
      * A mutable state for the month that is displayed to the user. In case an initial month was not
      * provided, the current month will be the one to be displayed.
      */
-    internal var displayedMonth by mutableStateOf(
+    var displayedMonth by mutableStateOf(
         if (initialDisplayedMonthMillis != null) {
             val month = calendarModel.getMonth(initialDisplayedMonthMillis)
             require(yearRange.contains(month.year)) {
@@ -784,14 +869,14 @@
     /**
      * The current [CalendarMonth] that represents the present's day month.
      */
-    internal val currentMonth: CalendarMonth
+    val currentMonth: CalendarMonth
         get() = calendarModel.getMonth(calendarModel.today)
 
     /**
      * A mutable state of [DisplayMode] that represents the current display mode of the UI
      * (i.e. picker or input).
      */
-    internal var displayMode = mutableStateOf(initialDisplayMode)
+    var displayMode = mutableStateOf(initialDisplayMode)
 
     /**
      * The displayed month index within the total months at the defined years range.
@@ -799,7 +884,7 @@
      * @see [displayedMonth]
      * @see [yearRange]
      */
-    internal val displayedMonthIndex: Int
+    val displayedMonthIndex: Int
         get() = displayedMonth.indexIn(yearRange)
 
     /**
@@ -807,9 +892,14 @@
      *
      * @see [yearRange]
      */
-    internal val totalMonthsInRange: Int
+    val totalMonthsInRange: Int
         get() = (yearRange.last - yearRange.first + 1) * 12
 
+    fun isInRange(date: Long): Boolean {
+        return date >= (selectedStartDate?.utcTimeMillis ?: Long.MAX_VALUE) &&
+            date <= (selectedEndDate?.utcTimeMillis ?: Long.MIN_VALUE)
+    }
+
     companion object {
         /**
          * A [Saver] implementation for [StateData].
@@ -850,6 +940,9 @@
     headline: @Composable () -> Unit,
     modeToggleButton: (@Composable () -> Unit)?,
     colors: DatePickerColors,
+    headlineTextStyle: TextStyle,
+    headerMinHeight: Dp,
+    headerContentPadding: PaddingValues,
     content: @Composable () -> Unit
 ) {
     Column(
@@ -861,9 +954,11 @@
             modifier = Modifier,
             title = title,
             titleContentColor = colors.titleContentColor,
-            headlineContentColor = colors.headlineContentColor
+            headlineContentColor = colors.headlineContentColor,
+            minHeight = headerMinHeight,
+            contentPadding = headerContentPadding
         ) {
-            headline()
+            ProvideTextStyle(value = headlineTextStyle, content = headline)
             modeToggleButton?.invoke()
         }
         Divider()
@@ -902,56 +997,13 @@
     }
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
-@Composable
-internal fun DateEntryHeadline(stateData: StateData, dateFormatter: DatePickerFormatter) {
-    with(stateData) {
-        val defaultLocale = defaultLocale()
-        val formattedDate = dateFormatter.formatDate(
-            date = selectedStartDate,
-            calendarModel = calendarModel,
-            locale = defaultLocale
-        )
-        val verboseDateDescription = dateFormatter.formatDate(
-            date = selectedStartDate,
-            calendarModel = calendarModel,
-            locale = defaultLocale,
-            forContentDescription = true
-        ) ?: when (displayMode.value) {
-            DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
-            DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
-            else -> ""
-        }
-
-        val headlineText = formattedDate ?: when (displayMode.value) {
-            DisplayMode.Picker -> getString(Strings.DatePickerHeadline)
-            DisplayMode.Input -> getString(Strings.DateInputHeadline)
-            else -> ""
-        }
-
-        val headlineDescription = when (displayMode.value) {
-            DisplayMode.Picker -> getString(Strings.DatePickerHeadlineDescription)
-            DisplayMode.Input -> getString(Strings.DateInputHeadlineDescription)
-            else -> ""
-        }.format(verboseDateDescription)
-        Text(
-            text = headlineText,
-            modifier = Modifier.semantics {
-                liveRegion = LiveRegionMode.Polite
-                contentDescription = headlineDescription
-            },
-            maxLines = 1
-        )
-    }
-}
-
 /**
  * Date entry content that displays a [DatePickerContent] or a [DateInputContent] according to the
  * state's display mode.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-internal fun SwitchableDateEntryContent(
+private fun SwitchableDateEntryContent(
     state: DatePickerState,
     dateFormatter: DatePickerFormatter,
     dateValidator: (Long) -> Boolean,
@@ -1085,13 +1137,22 @@
     title: (@Composable () -> Unit)?,
     titleContentColor: Color,
     headlineContentColor: Color,
+    minHeight: Dp,
+    contentPadding: PaddingValues,
     content: @Composable RowScope.() -> Unit
 ) {
+    // Apply a defaultMinSize only when the title is not null.
+    val heightModifier =
+        if (title != null) {
+            Modifier.defaultMinSize(minHeight = minHeight)
+        } else {
+            Modifier
+        }
     Column(
         modifier
             .fillMaxWidth()
-            .requiredHeight(DatePickerModalTokens.HeaderContainerHeight)
-            .padding(HeaderPadding),
+            .then(heightModifier)
+            .padding(contentPadding),
         verticalArrangement = Arrangement.SpaceBetween
     ) {
         if (title != null) {
@@ -1108,16 +1169,12 @@
             }
         }
         CompositionLocalProvider(LocalContentColor provides headlineContentColor) {
-            val textStyle =
-                MaterialTheme.typography.fromToken(DatePickerModalTokens.HeaderHeadlineFont)
-            ProvideTextStyle(textStyle) {
-                Row(
-                    modifier = Modifier.fillMaxWidth(),
-                    horizontalArrangement = Arrangement.SpaceBetween,
-                    verticalAlignment = Alignment.CenterVertically,
-                    content = content
-                )
-            }
+            Row(
+                modifier = Modifier.fillMaxWidth(),
+                horizontalArrangement = Arrangement.SpaceBetween,
+                verticalAlignment = Alignment.CenterVertically,
+                content = content
+            )
         }
     }
 }
@@ -1167,9 +1224,10 @@
                     month = month,
                     onDateSelected = onDateSelected,
                     today = today,
-                    selectedDate = stateData.selectedStartDate,
-                    dateFormatter = dateFormatter,
+                    stateData = stateData,
+                    rangeSelectionEnabled = false,
                     dateValidator = dateValidator,
+                    dateFormatter = dateFormatter,
                     colors = colors
                 )
             }
@@ -1177,18 +1235,26 @@
     }
 
     LaunchedEffect(lazyListState) {
-        snapshotFlow { lazyListState.firstVisibleItemIndex }.collect {
-            val yearOffset = lazyListState.firstVisibleItemIndex / 12
-            val month = lazyListState.firstVisibleItemIndex % 12 + 1
-            with(stateData) {
-                if (displayedMonth.month != month ||
-                    displayedMonth.year != yearRange.first + yearOffset
-                ) {
-                    displayedMonth = calendarModel.getMonth(
-                        year = yearRange.first + yearOffset,
-                        month = month
-                    )
-                }
+        updateDisplayedMonth(lazyListState, stateData)
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+internal suspend fun updateDisplayedMonth(
+    lazyListState: LazyListState,
+    stateData: StateData
+) {
+    snapshotFlow { lazyListState.firstVisibleItemIndex }.collect {
+        val yearOffset = lazyListState.firstVisibleItemIndex / 12
+        val month = lazyListState.firstVisibleItemIndex % 12 + 1
+        with(stateData) {
+            if (displayedMonth.month != month ||
+                displayedMonth.year != yearRange.first + yearOffset
+            ) {
+                displayedMonth = calendarModel.getMonth(
+                    year = yearRange.first + yearOffset,
+                    month = month
+                )
             }
         }
     }
@@ -1199,7 +1265,7 @@
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-private fun WeekDays(colors: DatePickerColors, calendarModel: CalendarModel) {
+internal fun WeekDays(colors: DatePickerColors, calendarModel: CalendarModel) {
     val firstDayOfWeek = calendarModel.firstDayOfWeek
     val weekdays = calendarModel.weekdayNames
     val dayNames = arrayListOf<Pair<String, String>>()
@@ -1249,23 +1315,55 @@
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-private fun Month(
+internal fun Month(
     month: CalendarMonth,
     onDateSelected: (dateInMillis: Long) -> Unit,
     today: CalendarDate,
-    selectedDate: CalendarDate?,
+    stateData: StateData,
+    rangeSelectionEnabled: Boolean,
     dateValidator: (Long) -> Boolean,
     dateFormatter: DatePickerFormatter,
     colors: DatePickerColors
 ) {
-    val todayDescription = getString(string = Strings.DatePickerTodayDescription)
+    fun isInRange(date: Long): Boolean {
+        return rangeSelectionEnabled && stateData.isInRange(date)
+    }
+
+    val rangeSelectionInfo: State<SelectedRangeInfo?> = remember(rangeSelectionEnabled) {
+        derivedStateOf {
+            if (rangeSelectionEnabled) {
+                SelectedRangeInfo.calculateRangeInfo(
+                    month,
+                    stateData.selectedStartDate,
+                    stateData.selectedEndDate
+                )
+            } else {
+                null
+            }
+        }
+    }
+
+    val rangeSelectionDrawModifier = if (rangeSelectionEnabled) {
+        Modifier.drawWithContent {
+            rangeSelectionInfo.value?.let {
+                drawRangeBackground(it, colors.dayInSelectionRangeContainerColor)
+            }
+            drawContent()
+        }
+    } else {
+        Modifier
+    }
+
+    val startSelection = stateData.selectedStartDate
+    val endSelection = stateData.selectedEndDate
     ProvideTextStyle(
         MaterialTheme.typography.fromToken(DatePickerModalTokens.DateLabelTextFont)
     ) {
         var cellIndex = 0
         Column(
             modifier = Modifier
-                .requiredHeight(RecommendedSizeForAccessibility * MaxCalendarRows),
+                .requiredHeight(RecommendedSizeForAccessibility * MaxCalendarRows)
+                .then(rangeSelectionDrawModifier),
             verticalArrangement = Arrangement.SpaceEvenly
         ) {
             repeat(MaxCalendarRows) {
@@ -1291,20 +1389,32 @@
                             val dateInMillis = month.startUtcTimeMillis +
                                 (dayNumber * MillisecondsIn24Hours)
                             val isToday = dateInMillis == today.utcTimeMillis
+                            val startDateSelected = dateInMillis == startSelection?.utcTimeMillis
+                            val endDateSelected = dateInMillis == endSelection?.utcTimeMillis
+                            val dayContentDescription = dayContentDescription(
+                                rangeSelectionEnabled = rangeSelectionEnabled,
+                                isToday = isToday,
+                                isStartDate = startDateSelected,
+                                isEndDate = endDateSelected
+                            )
                             Day(
                                 modifier = Modifier.semantics {
                                     role = Role.Button
-                                    if (isToday) {
-                                        contentDescription = todayDescription
-                                    }
+                                    dayContentDescription?.let { contentDescription = it }
                                 },
-                                selected = dateInMillis == selectedDate?.utcTimeMillis,
+                                selected = startDateSelected || endDateSelected,
                                 onClick = { onDateSelected(dateInMillis) },
-                                animateChecked = true,
+                                // Only animate on the first selected day. This is important to
+                                // disable when drawing a range marker behind the days on an
+                                // end-date selection.
+                                animateChecked = startDateSelected,
                                 enabled = remember(dateInMillis) {
                                     dateValidator.invoke(dateInMillis)
                                 },
                                 today = isToday,
+                                inRange = remember(dateInMillis, startSelection, endSelection) {
+                                    isInRange(dateInMillis)
+                                },
                                 colors = colors
                             ) {
                                 val defaultLocale = defaultLocale()
@@ -1330,6 +1440,28 @@
     }
 }
 
+@Composable
+private fun dayContentDescription(
+    rangeSelectionEnabled: Boolean,
+    isToday: Boolean,
+    isStartDate: Boolean,
+    isEndDate: Boolean
+): String? {
+    val descriptionBuilder = StringBuilder()
+    if (rangeSelectionEnabled) {
+        if (isStartDate) {
+            descriptionBuilder.append(getString(string = Strings.DateRangePickerStartHeadline))
+        } else if (isEndDate) {
+            descriptionBuilder.append(getString(string = Strings.DateRangePickerEndHeadline))
+        }
+    }
+    if (isToday) {
+        if (descriptionBuilder.isNotEmpty()) descriptionBuilder.append(", ")
+        descriptionBuilder.append(getString(string = Strings.DatePickerTodayDescription))
+    }
+    return if (descriptionBuilder.isEmpty()) null else descriptionBuilder.toString()
+}
+
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 private fun Day(
@@ -1339,14 +1471,18 @@
     animateChecked: Boolean,
     enabled: Boolean,
     today: Boolean,
+    inRange: Boolean,
     colors: DatePickerColors,
     content: @Composable () -> Unit
 ) {
     Surface(
         selected = selected,
         onClick = onClick,
+        // Semantic role is intentionally not set here and left to be set by the caller
+        // In the `Month` function above, the implementation checks whether the day is today and
+        // sets the content description differently.
         modifier = modifier
-            .minimumInteractiveComponentSize()
+        .minimumInteractiveComponentSize()
             .requiredSize(
                 DatePickerModalTokens.DateStateLayerWidth,
                 DatePickerModalTokens.DateStateLayerHeight
@@ -1359,8 +1495,9 @@
             animate = animateChecked
         ).value,
         contentColor = colors.dayContentColor(
-            today = today,
+            isToday = today,
             selected = selected,
+            inRange = inRange,
             enabled = enabled,
         ).value,
         border = if (today && !selected) {
@@ -1425,10 +1562,7 @@
                         .requiredSize(
                             width = DatePickerModalTokens.SelectionYearContainerWidth,
                             height = DatePickerModalTokens.SelectionYearContainerHeight
-                        )
-                        .semantics {
-                            role = Role.Button
-                        },
+                        ),
                     selected = selectedYear == displayedYear,
                     currentYear = selectedYear == currentYear,
                     onClick = { onYearSelected(selectedYear) },
@@ -1474,14 +1608,14 @@
     Surface(
         selected = selected,
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         shape = DatePickerModalTokens.SelectionYearStateLayerShape.toShape(),
         color = colors.yearContainerColor(selected = selected).value,
         contentColor = colors.yearContentColor(
             currentYear = currentYear,
             selected = selected
         ).value,
-        border = border
+        border = border,
     ) {
         Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
             content()
@@ -1597,9 +1731,10 @@
     return formatter.format(this)
 }
 
+internal val RecommendedSizeForAccessibility = 48.dp
 internal val MonthYearHeight = 56.dp
 internal val DatePickerHorizontalPadding = PaddingValues(horizontal = 12.dp)
-internal val HeaderPadding = PaddingValues(
+private val DatePickerHeaderPadding = PaddingValues(
     start = 12.dp,
     top = 16.dp,
     bottom = 12.dp
@@ -1609,5 +1744,3 @@
 
 private const val MaxCalendarRows = 6
 private const val YearsInRow: Int = 3
-
-private val RecommendedSizeForAccessibility = 48.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
index b6145ab..e855829 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DateRangePicker.kt
@@ -16,13 +16,97 @@
 
 package androidx.compose.material3
 
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material3.tokens.DatePickerModalTokens
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+import androidx.compose.ui.semantics.LiveRegionMode
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.liveRegion
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+
+/**
+ * <a href="https://m3.material.io/components/date-pickers/overview" class="external" target="_blank">Material Design date range picker</a>.
+ *
+ * Date range pickers let people select a range of dates and can be embedded into Dialogs.
+ *
+ * A simple DateRangePicker looks like:
+ * @sample androidx.compose.material3.samples.DateRangePickerSample
+ *
+ * @param state state of the date range picker. See [rememberDateRangePickerState].
+ * @param modifier the [Modifier] to be applied to this date range picker
+ * @param dateFormatter a [DatePickerFormatter] that provides formatting skeletons for dates display
+ * @param dateValidator a lambda that takes a date timestamp and return true if the date is a valid
+ * one for selection. Invalid dates will appear disabled in the UI.
+ * @param title the title to be displayed in the date range picker
+ * @param headline the headline to be displayed in the date range picker
+ * @param colors [DatePickerColors] that will be used to resolve the colors used for this date
+ * range picker in different states. See [DatePickerDefaults.colors].
+ */
+@ExperimentalMaterial3Api
+@Composable
+fun DateRangePicker(
+    state: DateRangePickerState,
+    modifier: Modifier = Modifier,
+    dateFormatter: DatePickerFormatter = remember { DatePickerFormatter() },
+    dateValidator: (Long) -> Boolean = { true },
+    title: (@Composable () -> Unit)? = {
+        DateRangePickerDefaults.DateRangePickerTitle(state = state)
+    },
+    headline: @Composable () -> Unit = {
+        DateRangePickerDefaults.DateRangePickerHeadline(
+            state,
+            dateFormatter
+        )
+    },
+    colors: DatePickerColors = DatePickerDefaults.colors()
+) {
+    DateEntryContainer(
+        modifier = modifier,
+        title = title,
+        headline = headline,
+        // TODO(b/245821979): Add showModeToggle param and us it here for DateEntryModeToggleButton
+        modeToggleButton = null,
+        headlineTextStyle = MaterialTheme.typography.fromToken(
+            DatePickerModalTokens.RangeSelectionHeaderHeadlineFont
+        ),
+        headerMinHeight = DatePickerModalTokens.RangeSelectionHeaderContainerHeight -
+            HeaderHeightOffset,
+        headerContentPadding = DateRangePickerHeaderPadding,
+        colors = colors
+    ) {
+        // TODO(b/245821979): Implement using a SwitchableDateEntryContent similar to the DatePicker
+        DateRangePickerContent(
+            stateData = state.stateData,
+            dateFormatter = dateFormatter,
+            dateValidator = dateValidator,
+            colors = colors
+        )
+    }
+}
 
 /**
  * Creates a [DateRangePickerState] for a [DateRangePicker] that is remembered across compositions.
@@ -41,7 +125,7 @@
  */
 @Composable
 @ExperimentalMaterial3Api
-internal fun rememberDateRangePickerState(
+fun rememberDateRangePickerState(
     @Suppress("AutoBoxing") initialSelectedStartDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialSelectedEndDateMillis: Long? = null,
     @Suppress("AutoBoxing") initialDisplayedMonthMillis: Long? =
@@ -69,7 +153,7 @@
  */
 @ExperimentalMaterial3Api
 @Stable
-internal class DateRangePickerState private constructor(internal val stateData: StateData) {
+class DateRangePickerState private constructor(internal val stateData: StateData) {
 
     /**
      * Constructs a DateRangePickerState.
@@ -150,3 +234,434 @@
         )
     }
 }
+
+/**
+ * Contains default values used by the date range pickers.
+ */
+@ExperimentalMaterial3Api
+@Stable
+object DateRangePickerDefaults {
+
+    /**
+     * A default date picker title composable.
+     *
+     * @param state a [DatePickerState] that will help determine the title's content
+     * @param modifier a [Modifier] to be applied for the title
+     * @param contentPadding [PaddingValues] to be applied for the title
+     */
+    @Composable
+    fun DateRangePickerTitle(
+        state: DateRangePickerState,
+        modifier: Modifier = Modifier,
+        contentPadding: PaddingValues = PaddingValues(start = DateRangePickerHeaderStartPadding)
+    ) {
+        when (state.displayMode) {
+            DisplayMode.Picker -> Text(
+                getString(string = Strings.DateRangePickerTitle),
+                modifier = modifier.padding(paddingValues = contentPadding)
+            )
+
+            DisplayMode.Input -> Text(
+                getString(string = Strings.DateRangeInputTitle),
+                modifier = modifier.padding(paddingValues = contentPadding)
+            )
+        }
+    }
+
+    /**
+     * A default date picker headline composable lambda that displays a default headline text when
+     * there is no date selection, and an actual date string when there is.
+     *
+     * @param state a [DateRangePickerState] that will help determine the headline
+     * @param dateFormatter a [DatePickerFormatter]
+     * @param modifier a [Modifier] to be applied for the headline
+     * @param contentPadding [PaddingValues] to be applied for the headline row
+     */
+    @Composable
+    fun DateRangePickerHeadline(
+        state: DateRangePickerState,
+        dateFormatter: DatePickerFormatter,
+        modifier: Modifier = Modifier,
+        contentPadding: PaddingValues = PaddingValues(start = DateRangePickerHeaderStartPadding)
+    ) {
+        val startDateText = getString(Strings.DateRangePickerStartHeadline)
+        val endDateText = getString(Strings.DateRangePickerEndHeadline)
+        DateRangePickerHeadline(
+            state = state,
+            dateFormatter = dateFormatter,
+            modifier = modifier,
+            startDateText = startDateText,
+            endDateText = endDateText,
+            startDatePlaceholder = { Text(text = startDateText) },
+            endDatePlaceholder = { Text(text = endDateText) },
+            datesDelimiter = { Text(text = "-") },
+            contentPadding = contentPadding
+        )
+    }
+
+    /**
+     * A date picker headline composable lambda that displays a default headline text when
+     * there is no date selection, and an actual date string when there is.
+     *
+     * @param state a [DateRangePickerState] that will help determine the headline
+     * @param dateFormatter a [DatePickerFormatter]
+     * @param modifier a [Modifier] to be applied for the headline
+     * @param startDateText a string that, by default, be used as the text content for the
+     * [startDatePlaceholder], as well as a prefix for the content description for the selected
+     * start date
+     * @param endDateText a string that, by default, be used as the text content for the
+     * [endDatePlaceholder], as well as a prefix for the content description for the selected
+     * end date
+     * @param startDatePlaceholder a composable to be displayed as a headline placeholder for the
+     * start date (i.e. a [Text] with a "Start date" string)
+     * @param endDatePlaceholder a composable to be displayed as a headline placeholder for the end
+     * date (i.e a [Text] with an "End date" string)
+     * @param datesDelimiter a composable to be displayed as a headline delimiter between the
+     * start and the end dates
+     * @param contentPadding [PaddingValues] to be applied for the headline row
+     */
+    @Composable
+    private fun DateRangePickerHeadline(
+        state: DateRangePickerState,
+        dateFormatter: DatePickerFormatter,
+        modifier: Modifier,
+        startDateText: String,
+        endDateText: String,
+        startDatePlaceholder: @Composable () -> Unit,
+        endDatePlaceholder: @Composable () -> Unit,
+        datesDelimiter: @Composable () -> Unit,
+        contentPadding: PaddingValues
+    ) {
+        with(state.stateData) {
+            val defaultLocale = defaultLocale()
+            val formatterStartDate = dateFormatter.formatDate(
+                date = selectedStartDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+
+            val formatterEndDate = dateFormatter.formatDate(
+                date = selectedEndDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale
+            )
+
+            val verboseStartDateDescription = dateFormatter.formatDate(
+                date = selectedStartDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale,
+                forContentDescription = true
+            ) ?: when (displayMode.value) {
+                DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                else -> ""
+            }
+
+            val verboseEndDateDescription = dateFormatter.formatDate(
+                date = selectedEndDate,
+                calendarModel = calendarModel,
+                locale = defaultLocale,
+                forContentDescription = true
+            ) ?: when (displayMode.value) {
+                DisplayMode.Picker -> getString(Strings.DatePickerNoSelectionDescription)
+                DisplayMode.Input -> getString(Strings.DateInputNoInputDescription)
+                else -> ""
+            }
+
+            val startHeadlineDescription = "$startDateText: $verboseStartDateDescription"
+            val endHeadlineDescription = "$endDateText: $verboseEndDateDescription"
+
+            Row(
+                modifier = modifier
+                    .padding(paddingValues = contentPadding)
+                    .clearAndSetSemantics {
+                        liveRegion = LiveRegionMode.Polite
+                        contentDescription = "$startHeadlineDescription, $endHeadlineDescription"
+                    },
+                verticalAlignment = Alignment.CenterVertically,
+                horizontalArrangement = Arrangement.spacedBy(4.dp),
+            ) {
+                if (formatterStartDate != null) {
+                    Text(text = formatterStartDate)
+                } else {
+                    startDatePlaceholder()
+                }
+                datesDelimiter()
+                if (formatterEndDate != null) {
+                    Text(text = formatterEndDate)
+                } else {
+                    endDatePlaceholder()
+                }
+            }
+        }
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun DateRangePickerContent(
+    stateData: StateData,
+    dateFormatter: DatePickerFormatter,
+    dateValidator: (Long) -> Boolean,
+    colors: DatePickerColors
+) {
+    val monthsListState =
+        rememberLazyListState(
+            initialFirstVisibleItemIndex = stateData.displayedMonthIndex
+        )
+
+    val onDateSelected = { dateInMillis: Long ->
+        updateDateSelection(stateData, dateInMillis)
+    }
+    Column {
+        WeekDays(colors, stateData.calendarModel)
+        VerticalMonthsList(
+            onDateSelected = onDateSelected,
+            stateData = stateData,
+            lazyListState = monthsListState,
+            dateFormatter = dateFormatter,
+            dateValidator = dateValidator,
+            colors = colors
+        )
+    }
+}
+
+/**
+ * Composes a continuous vertical scrollable list of calendar months. Each month will appear with a
+ * header text indicating the month and the year.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun VerticalMonthsList(
+    onDateSelected: (dateInMillis: Long) -> Unit,
+    stateData: StateData,
+    lazyListState: LazyListState,
+    dateFormatter: DatePickerFormatter,
+    dateValidator: (Long) -> Boolean,
+    colors: DatePickerColors
+) {
+    val today = stateData.calendarModel.today
+    val firstMonth = remember(stateData.yearRange) {
+        stateData.calendarModel.getMonth(
+            year = stateData.yearRange.first,
+            month = 1 // January
+        )
+    }
+    ProvideTextStyle(
+        MaterialTheme.typography.fromToken(
+            DatePickerModalTokens.RangeSelectionMonthSubheadFont
+        )
+    ) {
+        LazyColumn(state = lazyListState) {
+            items(stateData.totalMonthsInRange) {
+                val month =
+                    stateData.calendarModel.plusMonths(
+                        from = firstMonth,
+                        addedMonthsCount = it
+                    )
+                Column(
+                    modifier = Modifier.fillParentMaxWidth()
+                ) {
+                    Text(
+                        text = dateFormatter.formatMonthYear(
+                            month,
+                            stateData.calendarModel,
+                            defaultLocale()
+                        ) ?: "-",
+                        modifier = Modifier.padding(paddingValues = CalendarMonthSubheadPadding),
+                        color = colors.subheadContentColor
+                    )
+                    Month(
+                        month = month,
+                        onDateSelected = onDateSelected,
+                        today = today,
+                        stateData = stateData,
+                        rangeSelectionEnabled = true,
+                        dateValidator = dateValidator,
+                        dateFormatter = dateFormatter,
+                        colors = colors
+                    )
+                }
+            }
+        }
+    }
+    LaunchedEffect(lazyListState) {
+        updateDisplayedMonth(lazyListState, stateData)
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+private fun updateDateSelection(
+    stateData: StateData,
+    dateInMillis: Long
+) {
+    with(stateData) {
+        val date = calendarModel.getCanonicalDate(dateInMillis)
+        val currentStart = selectedStartDate
+        val currentEnd = selectedEndDate
+        if ((currentStart == null && currentEnd == null) ||
+            (currentStart != null && currentEnd != null) ||
+            (currentStart != null && date < currentStart)
+        ) {
+            // Reset the selection to "start" only.
+            selectedStartDate = date
+            selectedEndDate = null
+        } else if (currentStart != null && date > currentStart) {
+            selectedEndDate = date
+        }
+    }
+}
+
+internal val CalendarMonthSubheadPadding = PaddingValues(
+    start = 12.dp,
+    top = 20.dp,
+    bottom = 8.dp
+)
+
+/**
+ * a helper class for drawing a range selection. The class holds information about the selected
+ * start and end dates as coordinates within the 7 x 6 calendar month grid, as well as information
+ * regarding the first and last selected items.
+ *
+ * A SelectedRangeInfo is created when a [Month] is composed with an `rangeSelectionEnabled` flag.
+ */
+internal class SelectedRangeInfo(
+    val gridCoordinates: Pair<IntOffset, IntOffset>,
+    val firstIsSelectionStart: Boolean,
+    val lastIsSelectionEnd: Boolean
+) {
+    companion object {
+        /**
+         * Calculates the selection coordinates within the current month's grid. The returned [Pair]
+         * holds the actual item x & y coordinates within the LazyVerticalGrid, and is later used to
+         * calculate the exact offset for drawing the selection rectangles when in range-selection mode.
+         */
+        @OptIn(ExperimentalMaterial3Api::class)
+        fun calculateRangeInfo(
+            month: CalendarMonth,
+            startDate: CalendarDate?,
+            endDate: CalendarDate?
+        ): SelectedRangeInfo? {
+            if (startDate != null && endDate != null) {
+                if (startDate.utcTimeMillis > month.endUtcTimeMillis ||
+                    endDate.utcTimeMillis < month.startUtcTimeMillis
+                ) {
+                    return null
+                }
+                val firstIsSelectionStart = startDate.utcTimeMillis >= month.startUtcTimeMillis
+                val lastIsSelectionEnd = endDate.utcTimeMillis <= month.endUtcTimeMillis
+                val startGridItemOffset = if (firstIsSelectionStart) {
+                    month.daysFromStartOfWeekToFirstOfMonth + startDate.dayOfMonth - 1
+                } else {
+                    month.daysFromStartOfWeekToFirstOfMonth
+                }
+                val endGridItemOffset = if (lastIsSelectionEnd) {
+                    month.daysFromStartOfWeekToFirstOfMonth + endDate.dayOfMonth - 1
+                } else {
+                    month.daysFromStartOfWeekToFirstOfMonth + month.numberOfDays - 1
+                }
+
+                // Calculate the selected coordinates within the cells grid.
+                val startCoordinates = IntOffset(
+                    x = startGridItemOffset % DaysInWeek,
+                    y = startGridItemOffset / DaysInWeek
+                )
+                val endCoordinates = IntOffset(
+                    x = endGridItemOffset % DaysInWeek,
+                    y = endGridItemOffset / DaysInWeek
+                )
+                return SelectedRangeInfo(
+                    Pair(startCoordinates, endCoordinates),
+                    firstIsSelectionStart,
+                    lastIsSelectionEnd
+                )
+            }
+            return null
+        }
+    }
+}
+
+/**
+ * Draws the range selection background.
+ *
+ * This function is called during a [Modifier.drawWithContent] call when a [Month] is composed with
+ * an `rangeSelectionEnabled` flag.
+ */
+internal fun ContentDrawScope.drawRangeBackground(
+    selectedRangeInfo: SelectedRangeInfo,
+    color: Color
+) {
+    // The LazyVerticalGrid is defined to space the items horizontally by
+    // DaysHorizontalPadding (e.g. 4.dp). However, as the grid is not limited in
+    // width, the spacing can go beyond that value, so this drawing takes this into
+    // account.
+    // TODO: Use the date's container width and height from the tokens once b/247694457 is resolved.
+    val itemContainerWidth = RecommendedSizeForAccessibility.toPx()
+    val itemContainerHeight = RecommendedSizeForAccessibility.toPx()
+    val itemStateLayerHeight = DatePickerModalTokens.DateStateLayerHeight.toPx()
+    val stateLayerVerticalPadding = (itemContainerHeight - itemStateLayerHeight) / 2
+    val horizontalSpaceBetweenItems =
+        (this.size.width - DaysInWeek * itemContainerWidth) / DaysInWeek
+
+    val (x1, y1) = selectedRangeInfo.gridCoordinates.first
+    val (x2, y2) = selectedRangeInfo.gridCoordinates.second
+    // The endX and startX are offset to include only half the item's width when dealing with first
+    // and last items in the selection in order to keep the selection edges rounded.
+    val startX = x1 * (itemContainerWidth + horizontalSpaceBetweenItems) +
+        (if (selectedRangeInfo.firstIsSelectionStart) itemContainerWidth / 2 else 0f) +
+        horizontalSpaceBetweenItems / 2
+    val startY = y1 * itemContainerHeight + stateLayerVerticalPadding
+    val endX = x2 * (itemContainerWidth + horizontalSpaceBetweenItems) +
+        (if (selectedRangeInfo.lastIsSelectionEnd) itemContainerWidth / 2 else itemContainerWidth) +
+        horizontalSpaceBetweenItems / 2
+    val endY = y2 * itemContainerHeight + stateLayerVerticalPadding
+
+    // Draw the first row background
+    drawRect(
+        color = color,
+        topLeft = Offset(startX, startY),
+        size = Size(
+            width = if (y1 == y2) endX - startX else this.size.width - startX,
+            height = itemStateLayerHeight
+        )
+    )
+
+    if (y1 != y2) {
+        for (y in y2 - y1 - 1 downTo 1) {
+            // Draw background behind the rows in between.
+            drawRect(
+                color = color,
+                topLeft = Offset(0f, startY + (y * itemContainerHeight)),
+                size = Size(
+                    width = this.size.width,
+                    height = itemStateLayerHeight
+                )
+            )
+        }
+        // Draw the last row selection background
+        drawRect(
+            color = color,
+            topLeft = Offset(0f, endY),
+            size = Size(
+                width = endX,
+                height = itemStateLayerHeight
+            )
+        )
+    }
+}
+
+// Base header paddings that are used for the header part (title + headline). Note that for the
+// range picker default title and headline we add additional start padding. The additional paddings
+// are added there to allow more flexibility when those composables are provided by a developer.
+private val DateRangePickerHeaderPadding = PaddingValues(
+    start = 12.dp,
+    bottom = 12.dp
+)
+
+// Additional start padding for the default headline and title parts.
+private val DateRangePickerHeaderStartPadding = 40.dp
+
+// An offset that is applied to the token value for the RangeSelectionHeaderContainerHeight. The
+// implementation does not render a "Save" and "X" buttons by default, so we don't take those into
+// account when setting the header's max height.
+private val HeaderHeightOffset = 60.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
index 75933e7d..42d3063 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
@@ -56,7 +56,10 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.role
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
@@ -103,7 +106,7 @@
 ) {
     Surface(
         onClick = onClick,
-        modifier = modifier,
+        modifier = modifier.semantics { role = Role.Button },
         shape = shape,
         color = containerColor,
         contentColor = contentColor,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
index 356e4bb..5913a81 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
@@ -205,7 +205,7 @@
     content: @Composable () -> Unit
 ) = Surface(
     onClick = onClick,
-    modifier = modifier,
+    modifier = modifier.semantics { role = Role.Button },
     enabled = enabled,
     shape = shape,
     color = colors.containerColor(enabled).value,
@@ -266,7 +266,7 @@
     content: @Composable () -> Unit
 ) = Surface(
     onClick = onClick,
-    modifier = modifier,
+    modifier = modifier.semantics { role = Role.Button },
     enabled = enabled,
     shape = shape,
     color = colors.containerColor(enabled).value,
@@ -454,7 +454,7 @@
     content: @Composable () -> Unit
 ) = Surface(
     onClick = onClick,
-    modifier = modifier,
+    modifier = modifier.semantics { role = Role.Button },
     enabled = enabled,
     shape = shape,
     color = colors.containerColor(enabled).value,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
index f10ff73..d7ef087 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -61,10 +61,12 @@
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.dismiss
 import androidx.compose.ui.semantics.onClick
 import androidx.compose.ui.semantics.paneTitle
+import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -661,7 +663,7 @@
     Surface(
         selected = selected,
         onClick = onClick,
-        modifier = modifier
+        modifier = modifier.semantics { role = Role.Tab }
             .height(NavigationDrawerTokens.ActiveIndicatorHeight)
             .fillMaxWidth(),
         shape = shape,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
index daf88f2..27387f8 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
@@ -161,7 +161,7 @@
 ) {
     // If color is not provided via the text style, use content color as a default
     val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
+        colors.textColor(enabled, isError, interactionSource).value
     }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
@@ -321,7 +321,7 @@
 ) {
     // If color is not provided via the text style, use content color as a default
     val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
+        colors.textColor(enabled, isError, interactionSource).value
     }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index 52d652c..122937e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -70,7 +70,6 @@
  * properly offset top and bottom bars. If using [Modifier.verticalScroll], apply this modifier to
  * the child of the scroll, and not on the scroll itself.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun Scaffold(
     modifier: Modifier = Modifier,
@@ -109,7 +108,6 @@
  * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the
  * [content], typically a [NavigationBar].
  */
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 private fun ScaffoldLayout(
     fabPosition: FabPosition,
@@ -273,7 +271,6 @@
 /**
  * Object containing various default values for [Scaffold] component.
  */
-@ExperimentalMaterial3Api
 object ScaffoldDefaults {
     /**
      * Default insets to be used and consumed by the scaffold content slot
@@ -286,7 +283,6 @@
 /**
  * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
  */
-@ExperimentalMaterial3Api
 @kotlin.jvm.JvmInline
 value class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
     companion object {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
index 331c1b6..3e072a2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
@@ -95,7 +95,6 @@
      * @return [SnackbarResult.ActionPerformed] if option action has been clicked or
      * [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
      */
-    @OptIn(ExperimentalMaterial3Api::class)
     suspend fun showSnackbar(
         message: String,
         actionLabel: String? = null,
@@ -123,7 +122,6 @@
      * @return [SnackbarResult.ActionPerformed] if option action has been clicked or
      * [SnackbarResult.Dismissed] if snackbar has been dismissed via timeout or by the user
      */
-    @ExperimentalMaterial3Api
     suspend fun showSnackbar(visuals: SnackbarVisuals): SnackbarResult = mutex.withLock {
         try {
             return suspendCancellableCoroutine { continuation ->
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt
index ce64cb0..c2d0a66 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt
@@ -60,15 +60,19 @@
         val DateInputInvalidYearRange = Strings(31)
         val DatePickerSwitchToCalendarMode = Strings(32)
         val DatePickerSwitchToInputMode = Strings(33)
-        val TooltipLongPressLabel = Strings(34)
-        val TimePickerAM = Strings(35)
-        val TimePickerPM = Strings(36)
-        val TimePickerPeriodToggle = Strings(37)
-        val TimePickerHourSelection = Strings(38)
-        val TimePickerMinuteSelection = Strings(39)
-        val TimePickerHourSuffix = Strings(40)
-        val TimePicker24HourSuffix = Strings(41)
-        val TimePickerMinuteSuffix = Strings(42)
+        val DateRangePickerTitle = Strings(34)
+        val DateRangePickerStartHeadline = Strings(35)
+        val DateRangePickerEndHeadline = Strings(36)
+        val DateRangeInputTitle = Strings(37)
+        val TooltipLongPressLabel = Strings(38)
+        val TimePickerAM = Strings(39)
+        val TimePickerPM = Strings(40)
+        val TimePickerPeriodToggle = Strings(41)
+        val TimePickerHourSelection = Strings(42)
+        val TimePickerMinuteSelection = Strings(43)
+        val TimePickerHourSuffix = Strings(44)
+        val TimePicker24HourSuffix = Strings(45)
+        val TimePickerMinuteSuffix = Strings(46)
     }
 }
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
index deec6fa..a6624b5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -169,9 +169,8 @@
  * a `Modifier.semantics { onClick(label = "YOUR_LABEL", action = null) }` to the Surface.
  *
  * 6) Semantics for clicks. Just like with [Modifier.clickable], clickable version of Surface will
- * produce semantics to indicate that it is clicked. Also, by default, accessibility services will
- * describe the element as [Role.Button]. You may change this by passing a desired [Role] with a
- * [Modifier.semantics].
+ * produce semantics to indicate that it is clicked. No semantic role is set by default, you
+ * may specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
@@ -235,7 +234,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Button,
                     onClick = onClick
                 ),
             propagateMinConstraints = true
@@ -279,9 +277,8 @@
  * that doesn't require [onClick] param.
  *
  * 6) Semantics for selection. Just like with [Modifier.selectable], selectable version of Surface
- * will produce semantics to indicate that it is selected. Also, by default, accessibility services
- * will describe the element as [Role.Tab]. You may change this by passing a desired [Role] with a
- * [Modifier.semantics].
+ * will produce semantics to indicate that it is selected. No semantic role is set by default, you
+ * may specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
@@ -348,7 +345,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Tab,
                     onClick = onClick
                 ),
             propagateMinConstraints = true
@@ -392,9 +388,8 @@
  * handling, consider using a Surface function that doesn't require [onCheckedChange] param.
  *
  * 6) Semantics for toggle. Just like with [Modifier.toggleable], toggleable version of Surface
- * will produce semantics to indicate that it is checked.  Also, by default, accessibility services
- * will describe the element as [Role.Switch]. You may change this by passing a desired [Role] with
- * a [Modifier.semantics].
+ * will produce semantics to indicate that it is checked.  No semantic role is set by default, you
+ * may specify one by passing a desired [Role] with a [Modifier.semantics].
  *
  * To manually retrieve the content color inside a surface, use [LocalContentColor].
  *
@@ -461,7 +456,6 @@
                     interactionSource = interactionSource,
                     indication = rememberRipple(),
                     enabled = enabled,
-                    role = Role.Switch,
                     onValueChange = onCheckedChange
                 ),
             propagateMinConstraints = true
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
index 547fb09..32fee2e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
@@ -187,7 +187,7 @@
 ) {
     // If color is not provided via the text style, use content color as a default
     val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
+        colors.textColor(enabled, isError, interactionSource).value
     }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
@@ -333,7 +333,7 @@
 ) {
     // If color is not provided via the text style, use content color as a default
     val textColor = textStyle.color.takeOrElse {
-        colors.textColor(enabled).value
+        colors.textColor(enabled, isError, interactionSource).value
     }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
index bc1d6fa..388bc18 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldDefaults.kt
@@ -108,7 +108,7 @@
     ) {
         Box(
             Modifier
-                .background(colors.containerColor().value, shape)
+                .background(colors.containerColor(isError).value, shape)
                 .indicatorLine(enabled, isError, interactionSource, colors))
     }
 
@@ -192,7 +192,7 @@
         Box(
             Modifier
                 .border(borderStroke.value, shape)
-                .background(colors.containerColor().value, shape))
+                .background(colors.containerColor(isError).value, shape))
     }
 
     /**
@@ -251,11 +251,16 @@
 
     /**
      * Creates a [TextFieldColors] that represents the default input text, container, and content
-     * (including label, placeholder, leading and trailing icons) colors used in a [TextField].
+     * colors (including label, placeholder, icons, etc.) used in a [TextField].
      *
-     * @param textColor the color used for the input text of this text field
+     * @param focusedTextColor the color used for the input text of this text field when focused
+     * @param unfocusedTextColor the color used for the input text of this text field when not
+     * focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
+     * @param errorTextColor the color used for the input text of this text field when in error
+     * state
      * @param containerColor the container color for this text field
+     * @param errorContainerColor the container color for this text field when in error state
      * @param cursorColor the cursor color for this text field
      * @param errorCursorColor the cursor color for this text field when in error state
      * @param selectionColors the colors used when the input text of this text field is selected
@@ -276,8 +281,10 @@
      * @param unfocusedLabelColor the label color for this text field when not focused
      * @param disabledLabelColor the label color for this text field when disabled
      * @param errorLabelColor the label color for this text field when in error state
-     * @param placeholderColor the placeholder color for this text field
+     * @param focusedPlaceholderColor the placeholder color for this text field when focused
+     * @param unfocusedPlaceholderColor the placeholder color for this text field when not focused
      * @param disabledPlaceholderColor the placeholder color for this text field when disabled
+     * @param errorPlaceholderColor the placeholder color for this text field when in error state
      * @param focusedSupportingTextColor the supporting text color for this text field when focused
      * @param unfocusedSupportingTextColor the supporting text color for this text field when not
      * focused
@@ -297,10 +304,13 @@
     @ExperimentalMaterial3Api
     @Composable
     fun textFieldColors(
-        textColor: Color = FilledTextFieldTokens.InputColor.toColor(),
+        focusedTextColor: Color = FilledTextFieldTokens.FocusInputColor.toColor(),
+        unfocusedTextColor: Color = FilledTextFieldTokens.InputColor.toColor(),
         disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        errorTextColor: Color = FilledTextFieldTokens.ErrorInputColor.toColor(),
         containerColor: Color = FilledTextFieldTokens.ContainerColor.toColor(),
+        errorContainerColor: Color = FilledTextFieldTokens.ContainerColor.toColor(),
         cursorColor: Color = FilledTextFieldTokens.CaretColor.toColor(),
         errorCursorColor: Color = FilledTextFieldTokens.ErrorFocusCaretColor.toColor(),
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
@@ -324,9 +334,11 @@
         disabledLabelColor: Color = FilledTextFieldTokens.DisabledLabelColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledLabelOpacity),
         errorLabelColor: Color = FilledTextFieldTokens.ErrorLabelColor.toColor(),
-        placeholderColor: Color = FilledTextFieldTokens.InputPlaceholderColor.toColor(),
+        focusedPlaceholderColor: Color = FilledTextFieldTokens.InputPlaceholderColor.toColor(),
+        unfocusedPlaceholderColor: Color = FilledTextFieldTokens.InputPlaceholderColor.toColor(),
         disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        errorPlaceholderColor: Color = FilledTextFieldTokens.InputPlaceholderColor.toColor(),
         focusedSupportingTextColor: Color = FilledTextFieldTokens.FocusSupportingColor.toColor(),
         unfocusedSupportingTextColor: Color = FilledTextFieldTokens.SupportingColor.toColor(),
         disabledSupportingTextColor: Color = FilledTextFieldTokens.DisabledSupportingColor.toColor()
@@ -344,16 +356,19 @@
         errorSuffixColor: Color = FilledTextFieldTokens.InputSuffixColor.toColor(),
     ): TextFieldColors =
         TextFieldColors(
-            textColor = textColor,
+            focusedTextColor = focusedTextColor,
+            unfocusedTextColor = unfocusedTextColor,
             disabledTextColor = disabledTextColor,
+            errorTextColor = errorTextColor,
             containerColor = containerColor,
+            errorContainerColor = errorContainerColor,
             cursorColor = cursorColor,
             errorCursorColor = errorCursorColor,
             textSelectionColors = selectionColors,
             focusedIndicatorColor = focusedIndicatorColor,
             unfocusedIndicatorColor = unfocusedIndicatorColor,
-            errorIndicatorColor = errorIndicatorColor,
             disabledIndicatorColor = disabledIndicatorColor,
+            errorIndicatorColor = errorIndicatorColor,
             focusedLeadingIconColor = focusedLeadingIconColor,
             unfocusedLeadingIconColor = unfocusedLeadingIconColor,
             disabledLeadingIconColor = disabledLeadingIconColor,
@@ -366,8 +381,10 @@
             unfocusedLabelColor = unfocusedLabelColor,
             disabledLabelColor = disabledLabelColor,
             errorLabelColor = errorLabelColor,
-            placeholderColor = placeholderColor,
+            focusedPlaceholderColor = focusedPlaceholderColor,
+            unfocusedPlaceholderColor = unfocusedPlaceholderColor,
             disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = errorPlaceholderColor,
             focusedSupportingTextColor = focusedSupportingTextColor,
             unfocusedSupportingTextColor = unfocusedSupportingTextColor,
             disabledSupportingTextColor = disabledSupportingTextColor,
@@ -384,12 +401,16 @@
 
     /**
      * Creates a [TextFieldColors] that represents the default input text, container, and content
-     * (including label, placeholder, leading and trailing icons) colors used in an
-     * [OutlinedTextField].
+     * colors (including label, placeholder, icons, etc.) used in an [OutlinedTextField].
      *
-     * @param textColor the color used for the input text of this text field
+     * @param focusedTextColor the color used for the input text of this text field when focused
+     * @param unfocusedTextColor the color used for the input text of this text field when not
+     * focused
      * @param disabledTextColor the color used for the input text of this text field when disabled
+     * @param errorTextColor the color used for the input text of this text field when in error
+     * state
      * @param containerColor the container color for this text field
+     * @param errorContainerColor the container color for this text field when in error state
      * @param cursorColor the cursor color for this text field
      * @param errorCursorColor the cursor color for this text field when in error state
      * @param selectionColors the colors used when the input text of this text field is selected
@@ -409,8 +430,10 @@
      * @param unfocusedLabelColor the label color for this text field when not focused
      * @param disabledLabelColor the label color for this text field when disabled
      * @param errorLabelColor the label color for this text field when in error state
-     * @param placeholderColor the placeholder color for this text field
+     * @param focusedPlaceholderColor the placeholder color for this text field when focused
+     * @param unfocusedPlaceholderColor the placeholder color for this text field when not focused
      * @param disabledPlaceholderColor the placeholder color for this text field when disabled
+     * @param errorPlaceholderColor the placeholder color for this text field when in error state
      * @param focusedSupportingTextColor the supporting text color for this text field when focused
      * @param unfocusedSupportingTextColor the supporting text color for this text field when not
      * focused
@@ -430,10 +453,13 @@
     @ExperimentalMaterial3Api
     @Composable
     fun outlinedTextFieldColors(
-        textColor: Color = OutlinedTextFieldTokens.InputColor.toColor(),
+        focusedTextColor: Color = OutlinedTextFieldTokens.FocusInputColor.toColor(),
+        unfocusedTextColor: Color = OutlinedTextFieldTokens.InputColor.toColor(),
         disabledTextColor: Color = OutlinedTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        errorTextColor: Color = OutlinedTextFieldTokens.ErrorInputColor.toColor(),
         containerColor: Color = Color.Transparent,
+        errorContainerColor: Color = Color.Transparent,
         cursorColor: Color = OutlinedTextFieldTokens.CaretColor.toColor(),
         errorCursorColor: Color = OutlinedTextFieldTokens.ErrorFocusCaretColor.toColor(),
         selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
@@ -457,9 +483,11 @@
         disabledLabelColor: Color = OutlinedTextFieldTokens.DisabledLabelColor.toColor()
             .copy(alpha = OutlinedTextFieldTokens.DisabledLabelOpacity),
         errorLabelColor: Color = OutlinedTextFieldTokens.ErrorLabelColor.toColor(),
-        placeholderColor: Color = OutlinedTextFieldTokens.InputPlaceholderColor.toColor(),
+        focusedPlaceholderColor: Color = OutlinedTextFieldTokens.InputPlaceholderColor.toColor(),
+        unfocusedPlaceholderColor: Color = OutlinedTextFieldTokens.InputPlaceholderColor.toColor(),
         disabledPlaceholderColor: Color = OutlinedTextFieldTokens.DisabledInputColor.toColor()
             .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        errorPlaceholderColor: Color = OutlinedTextFieldTokens.InputPlaceholderColor.toColor(),
         focusedSupportingTextColor: Color = OutlinedTextFieldTokens.FocusSupportingColor.toColor(),
         unfocusedSupportingTextColor: Color = OutlinedTextFieldTokens.SupportingColor.toColor(),
         disabledSupportingTextColor: Color = OutlinedTextFieldTokens.DisabledSupportingColor
@@ -477,15 +505,19 @@
         errorSuffixColor: Color = OutlinedTextFieldTokens.InputSuffixColor.toColor(),
     ): TextFieldColors =
         TextFieldColors(
-            textColor = textColor,
+            focusedTextColor = focusedTextColor,
+            unfocusedTextColor = unfocusedTextColor,
             disabledTextColor = disabledTextColor,
+            errorTextColor = errorTextColor,
+            containerColor = containerColor,
+            errorContainerColor = errorContainerColor,
             cursorColor = cursorColor,
             errorCursorColor = errorCursorColor,
             textSelectionColors = selectionColors,
             focusedIndicatorColor = focusedBorderColor,
             unfocusedIndicatorColor = unfocusedBorderColor,
-            errorIndicatorColor = errorBorderColor,
             disabledIndicatorColor = disabledBorderColor,
+            errorIndicatorColor = errorBorderColor,
             focusedLeadingIconColor = focusedLeadingIconColor,
             unfocusedLeadingIconColor = unfocusedLeadingIconColor,
             disabledLeadingIconColor = disabledLeadingIconColor,
@@ -494,13 +526,14 @@
             unfocusedTrailingIconColor = unfocusedTrailingIconColor,
             disabledTrailingIconColor = disabledTrailingIconColor,
             errorTrailingIconColor = errorTrailingIconColor,
-            containerColor = containerColor,
             focusedLabelColor = focusedLabelColor,
             unfocusedLabelColor = unfocusedLabelColor,
             disabledLabelColor = disabledLabelColor,
             errorLabelColor = errorLabelColor,
-            placeholderColor = placeholderColor,
+            focusedPlaceholderColor = focusedPlaceholderColor,
+            unfocusedPlaceholderColor = unfocusedPlaceholderColor,
             disabledPlaceholderColor = disabledPlaceholderColor,
+            errorPlaceholderColor = errorPlaceholderColor,
             focusedSupportingTextColor = focusedSupportingTextColor,
             unfocusedSupportingTextColor = unfocusedSupportingTextColor,
             disabledSupportingTextColor = disabledSupportingTextColor,
@@ -730,6 +763,192 @@
         )
     }
 
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
+    @ExperimentalMaterial3Api
+    @Composable
+    fun textFieldColors(
+        textColor: Color = FilledTextFieldTokens.InputColor.toColor(),
+        disabledTextColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        containerColor: Color = FilledTextFieldTokens.ContainerColor.toColor(),
+        cursorColor: Color = FilledTextFieldTokens.CaretColor.toColor(),
+        errorCursorColor: Color = FilledTextFieldTokens.ErrorFocusCaretColor.toColor(),
+        selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
+        focusedIndicatorColor: Color = FilledTextFieldTokens.FocusActiveIndicatorColor.toColor(),
+        unfocusedIndicatorColor: Color = FilledTextFieldTokens.ActiveIndicatorColor.toColor(),
+        disabledIndicatorColor: Color = FilledTextFieldTokens.DisabledActiveIndicatorColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledActiveIndicatorOpacity),
+        errorIndicatorColor: Color = FilledTextFieldTokens.ErrorActiveIndicatorColor.toColor(),
+        focusedLeadingIconColor: Color = FilledTextFieldTokens.FocusLeadingIconColor.toColor(),
+        unfocusedLeadingIconColor: Color = FilledTextFieldTokens.LeadingIconColor.toColor(),
+        disabledLeadingIconColor: Color = FilledTextFieldTokens.DisabledLeadingIconColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledLeadingIconOpacity),
+        errorLeadingIconColor: Color = FilledTextFieldTokens.ErrorLeadingIconColor.toColor(),
+        focusedTrailingIconColor: Color = FilledTextFieldTokens.FocusTrailingIconColor.toColor(),
+        unfocusedTrailingIconColor: Color = FilledTextFieldTokens.TrailingIconColor.toColor(),
+        disabledTrailingIconColor: Color = FilledTextFieldTokens.DisabledTrailingIconColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledTrailingIconOpacity),
+        errorTrailingIconColor: Color = FilledTextFieldTokens.ErrorTrailingIconColor.toColor(),
+        focusedLabelColor: Color = FilledTextFieldTokens.FocusLabelColor.toColor(),
+        unfocusedLabelColor: Color = FilledTextFieldTokens.LabelColor.toColor(),
+        disabledLabelColor: Color = FilledTextFieldTokens.DisabledLabelColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledLabelOpacity),
+        errorLabelColor: Color = FilledTextFieldTokens.ErrorLabelColor.toColor(),
+        placeholderColor: Color = FilledTextFieldTokens.InputPlaceholderColor.toColor(),
+        disabledPlaceholderColor: Color = FilledTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        focusedSupportingTextColor: Color = FilledTextFieldTokens.FocusSupportingColor.toColor(),
+        unfocusedSupportingTextColor: Color = FilledTextFieldTokens.SupportingColor.toColor(),
+        disabledSupportingTextColor: Color = FilledTextFieldTokens.DisabledSupportingColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledSupportingOpacity),
+        errorSupportingTextColor: Color = FilledTextFieldTokens.ErrorSupportingColor.toColor(),
+        focusedPrefixColor: Color = FilledTextFieldTokens.InputPrefixColor.toColor(),
+        unfocusedPrefixColor: Color = FilledTextFieldTokens.InputPrefixColor.toColor(),
+        disabledPrefixColor: Color = FilledTextFieldTokens.InputPrefixColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        errorPrefixColor: Color = FilledTextFieldTokens.InputPrefixColor.toColor(),
+        focusedSuffixColor: Color = FilledTextFieldTokens.InputSuffixColor.toColor(),
+        unfocusedSuffixColor: Color = FilledTextFieldTokens.InputSuffixColor.toColor(),
+        disabledSuffixColor: Color = FilledTextFieldTokens.InputSuffixColor.toColor()
+            .copy(alpha = FilledTextFieldTokens.DisabledInputOpacity),
+        errorSuffixColor: Color = FilledTextFieldTokens.InputSuffixColor.toColor(),
+    ): TextFieldColors = textFieldColors(
+        focusedTextColor = textColor,
+        unfocusedTextColor = textColor,
+        disabledTextColor = disabledTextColor,
+        errorTextColor = textColor,
+        containerColor = containerColor,
+        errorContainerColor = containerColor,
+        cursorColor = cursorColor,
+        errorCursorColor = errorCursorColor,
+        selectionColors = selectionColors,
+        focusedIndicatorColor = focusedIndicatorColor,
+        unfocusedIndicatorColor = unfocusedIndicatorColor,
+        disabledIndicatorColor = disabledIndicatorColor,
+        errorIndicatorColor = errorIndicatorColor,
+        focusedLeadingIconColor = focusedLeadingIconColor,
+        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        errorLeadingIconColor = errorLeadingIconColor,
+        focusedTrailingIconColor = focusedTrailingIconColor,
+        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+        errorTrailingIconColor = errorTrailingIconColor,
+        focusedLabelColor = focusedLabelColor,
+        unfocusedLabelColor = unfocusedLabelColor,
+        disabledLabelColor = disabledLabelColor,
+        errorLabelColor = errorLabelColor,
+        focusedPlaceholderColor = placeholderColor,
+        unfocusedPlaceholderColor = placeholderColor,
+        disabledPlaceholderColor = disabledPlaceholderColor,
+        errorPlaceholderColor = placeholderColor,
+        focusedSupportingTextColor = focusedSupportingTextColor,
+        unfocusedSupportingTextColor = unfocusedSupportingTextColor,
+        disabledSupportingTextColor = disabledSupportingTextColor,
+        errorSupportingTextColor = errorSupportingTextColor,
+        focusedPrefixColor = focusedPrefixColor,
+        unfocusedPrefixColor = unfocusedPrefixColor,
+        disabledPrefixColor = disabledPrefixColor,
+        errorPrefixColor = errorPrefixColor,
+        focusedSuffixColor = focusedSuffixColor,
+        unfocusedSuffixColor = unfocusedSuffixColor,
+        disabledSuffixColor = disabledSuffixColor,
+        errorSuffixColor = errorSuffixColor,
+    )
+
+    @Deprecated("Maintained for binary compatibility", level = DeprecationLevel.HIDDEN)
+    @ExperimentalMaterial3Api
+    @Composable
+    fun outlinedTextFieldColors(
+        textColor: Color = OutlinedTextFieldTokens.InputColor.toColor(),
+        disabledTextColor: Color = OutlinedTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        containerColor: Color = Color.Transparent,
+        cursorColor: Color = OutlinedTextFieldTokens.CaretColor.toColor(),
+        errorCursorColor: Color = OutlinedTextFieldTokens.ErrorFocusCaretColor.toColor(),
+        selectionColors: TextSelectionColors = LocalTextSelectionColors.current,
+        focusedBorderColor: Color = OutlinedTextFieldTokens.FocusOutlineColor.toColor(),
+        unfocusedBorderColor: Color = OutlinedTextFieldTokens.OutlineColor.toColor(),
+        disabledBorderColor: Color = OutlinedTextFieldTokens.DisabledOutlineColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledOutlineOpacity),
+        errorBorderColor: Color = OutlinedTextFieldTokens.ErrorOutlineColor.toColor(),
+        focusedLeadingIconColor: Color = OutlinedTextFieldTokens.FocusLeadingIconColor.toColor(),
+        unfocusedLeadingIconColor: Color = OutlinedTextFieldTokens.LeadingIconColor.toColor(),
+        disabledLeadingIconColor: Color = OutlinedTextFieldTokens.DisabledLeadingIconColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledLeadingIconOpacity),
+        errorLeadingIconColor: Color = OutlinedTextFieldTokens.ErrorLeadingIconColor.toColor(),
+        focusedTrailingIconColor: Color = OutlinedTextFieldTokens.FocusTrailingIconColor.toColor(),
+        unfocusedTrailingIconColor: Color = OutlinedTextFieldTokens.TrailingIconColor.toColor(),
+        disabledTrailingIconColor: Color = OutlinedTextFieldTokens.DisabledTrailingIconColor
+            .toColor().copy(alpha = OutlinedTextFieldTokens.DisabledTrailingIconOpacity),
+        errorTrailingIconColor: Color = OutlinedTextFieldTokens.ErrorTrailingIconColor.toColor(),
+        focusedLabelColor: Color = OutlinedTextFieldTokens.FocusLabelColor.toColor(),
+        unfocusedLabelColor: Color = OutlinedTextFieldTokens.LabelColor.toColor(),
+        disabledLabelColor: Color = OutlinedTextFieldTokens.DisabledLabelColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledLabelOpacity),
+        errorLabelColor: Color = OutlinedTextFieldTokens.ErrorLabelColor.toColor(),
+        placeholderColor: Color = OutlinedTextFieldTokens.InputPlaceholderColor.toColor(),
+        disabledPlaceholderColor: Color = OutlinedTextFieldTokens.DisabledInputColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        focusedSupportingTextColor: Color = OutlinedTextFieldTokens.FocusSupportingColor.toColor(),
+        unfocusedSupportingTextColor: Color = OutlinedTextFieldTokens.SupportingColor.toColor(),
+        disabledSupportingTextColor: Color = OutlinedTextFieldTokens.DisabledSupportingColor
+            .toColor().copy(alpha = OutlinedTextFieldTokens.DisabledSupportingOpacity),
+        errorSupportingTextColor: Color = OutlinedTextFieldTokens.ErrorSupportingColor.toColor(),
+        focusedPrefixColor: Color = OutlinedTextFieldTokens.InputPrefixColor.toColor(),
+        unfocusedPrefixColor: Color = OutlinedTextFieldTokens.InputPrefixColor.toColor(),
+        disabledPrefixColor: Color = OutlinedTextFieldTokens.InputPrefixColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        errorPrefixColor: Color = OutlinedTextFieldTokens.InputPrefixColor.toColor(),
+        focusedSuffixColor: Color = OutlinedTextFieldTokens.InputSuffixColor.toColor(),
+        unfocusedSuffixColor: Color = OutlinedTextFieldTokens.InputSuffixColor.toColor(),
+        disabledSuffixColor: Color = OutlinedTextFieldTokens.InputSuffixColor.toColor()
+            .copy(alpha = OutlinedTextFieldTokens.DisabledInputOpacity),
+        errorSuffixColor: Color = OutlinedTextFieldTokens.InputSuffixColor.toColor(),
+    ): TextFieldColors = outlinedTextFieldColors(
+        focusedTextColor = textColor,
+        unfocusedTextColor = textColor,
+        disabledTextColor = disabledTextColor,
+        errorTextColor = textColor,
+        containerColor = containerColor,
+        errorContainerColor = containerColor,
+        cursorColor = cursorColor,
+        errorCursorColor = errorCursorColor,
+        selectionColors = selectionColors,
+        focusedBorderColor = focusedBorderColor,
+        unfocusedBorderColor = unfocusedBorderColor,
+        disabledBorderColor = disabledBorderColor,
+        errorBorderColor = errorBorderColor,
+        focusedLeadingIconColor = focusedLeadingIconColor,
+        unfocusedLeadingIconColor = unfocusedLeadingIconColor,
+        disabledLeadingIconColor = disabledLeadingIconColor,
+        errorLeadingIconColor = errorLeadingIconColor,
+        focusedTrailingIconColor = focusedTrailingIconColor,
+        unfocusedTrailingIconColor = unfocusedTrailingIconColor,
+        disabledTrailingIconColor = disabledTrailingIconColor,
+        errorTrailingIconColor = errorTrailingIconColor,
+        focusedLabelColor = focusedLabelColor,
+        unfocusedLabelColor = unfocusedLabelColor,
+        disabledLabelColor = disabledLabelColor,
+        errorLabelColor = errorLabelColor,
+        focusedPlaceholderColor = placeholderColor,
+        unfocusedPlaceholderColor = placeholderColor,
+        disabledPlaceholderColor = disabledPlaceholderColor,
+        errorPlaceholderColor = placeholderColor,
+        focusedSupportingTextColor = focusedSupportingTextColor,
+        unfocusedSupportingTextColor = unfocusedSupportingTextColor,
+        disabledSupportingTextColor = disabledSupportingTextColor,
+        errorSupportingTextColor = errorSupportingTextColor,
+        focusedPrefixColor = focusedPrefixColor,
+        unfocusedPrefixColor = unfocusedPrefixColor,
+        disabledPrefixColor = disabledPrefixColor,
+        errorPrefixColor = errorPrefixColor,
+        focusedSuffixColor = focusedSuffixColor,
+        unfocusedSuffixColor = unfocusedSuffixColor,
+        disabledSuffixColor = disabledSuffixColor,
+        errorSuffixColor = errorSuffixColor,
+    )
+
     @Deprecated("Use overload with prefix and suffix parameters", level = DeprecationLevel.HIDDEN)
     @Composable
     @ExperimentalMaterial3Api
@@ -835,9 +1054,12 @@
 @OptIn(ExperimentalMaterial3Api::class)
 @Immutable
 class TextFieldColors internal constructor(
-    private val textColor: Color,
+    private val focusedTextColor: Color,
+    private val unfocusedTextColor: Color,
     private val disabledTextColor: Color,
+    private val errorTextColor: Color,
     private val containerColor: Color,
+    private val errorContainerColor: Color,
     private val cursorColor: Color,
     private val errorCursorColor: Color,
     private val textSelectionColors: TextSelectionColors,
@@ -857,8 +1079,10 @@
     private val unfocusedLabelColor: Color,
     private val disabledLabelColor: Color,
     private val errorLabelColor: Color,
-    private val placeholderColor: Color,
+    private val focusedPlaceholderColor: Color,
+    private val unfocusedPlaceholderColor: Color,
     private val disabledPlaceholderColor: Color,
+    private val errorPlaceholderColor: Color,
     private val focusedSupportingTextColor: Color,
     private val unfocusedSupportingTextColor: Color,
     private val disabledSupportingTextColor: Color,
@@ -871,7 +1095,7 @@
     private val unfocusedSuffixColor: Color,
     private val disabledSuffixColor: Color,
     private val errorSuffixColor: Color,
-    ) {
+) {
     /**
      * Represents the color used for the leading icon of this text field.
      *
@@ -955,20 +1179,37 @@
 
     /**
      * Represents the container color for this text field.
+     *
+     * @param isError whether the text field's current value is in error
      */
     @Composable
-    internal fun containerColor(): State<Color> {
-        return rememberUpdatedState(containerColor)
+    internal fun containerColor(isError: Boolean): State<Color> {
+        return rememberUpdatedState(if (isError) errorContainerColor else containerColor)
     }
 
     /**
      * Represents the color used for the placeholder of this text field.
      *
      * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
      */
     @Composable
-    internal fun placeholderColor(enabled: Boolean): State<Color> {
-        return rememberUpdatedState(if (enabled) placeholderColor else disabledPlaceholderColor)
+    internal fun placeholderColor(
+        enabled: Boolean,
+        isError: Boolean,
+        interactionSource: InteractionSource
+    ): State<Color> {
+        val focused by interactionSource.collectIsFocusedAsState()
+
+        val targetValue = when {
+            !enabled -> disabledPlaceholderColor
+            isError -> errorPlaceholderColor
+            focused -> focusedPlaceholderColor
+            else -> unfocusedPlaceholderColor
+        }
+        return rememberUpdatedState(targetValue)
     }
 
     /**
@@ -996,9 +1237,29 @@
         return rememberUpdatedState(targetValue)
     }
 
+    /**
+     * Represents the color used for the input field of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
     @Composable
-    internal fun textColor(enabled: Boolean): State<Color> {
-        return rememberUpdatedState(if (enabled) textColor else disabledTextColor)
+    internal fun textColor(
+        enabled: Boolean,
+        isError: Boolean,
+        interactionSource: InteractionSource
+    ): State<Color> {
+        val focused by interactionSource.collectIsFocusedAsState()
+
+        val targetValue = when {
+            !enabled -> disabledTextColor
+            isError -> errorTextColor
+            focused -> focusedTextColor
+            else -> unfocusedTextColor
+        }
+        return rememberUpdatedState(targetValue)
     }
 
     @Composable
@@ -1089,8 +1350,12 @@
         if (this === other) return true
         if (other == null || other !is TextFieldColors) return false
 
-        if (textColor != other.textColor) return false
+        if (focusedTextColor != other.focusedTextColor) return false
+        if (unfocusedTextColor != other.unfocusedTextColor) return false
         if (disabledTextColor != other.disabledTextColor) return false
+        if (errorTextColor != other.errorTextColor) return false
+        if (containerColor != other.containerColor) return false
+        if (errorContainerColor != other.errorContainerColor) return false
         if (cursorColor != other.cursorColor) return false
         if (errorCursorColor != other.errorCursorColor) return false
         if (textSelectionColors != other.textSelectionColors) return false
@@ -1106,13 +1371,14 @@
         if (unfocusedTrailingIconColor != other.unfocusedTrailingIconColor) return false
         if (disabledTrailingIconColor != other.disabledTrailingIconColor) return false
         if (errorTrailingIconColor != other.errorTrailingIconColor) return false
-        if (containerColor != other.containerColor) return false
         if (focusedLabelColor != other.focusedLabelColor) return false
         if (unfocusedLabelColor != other.unfocusedLabelColor) return false
         if (disabledLabelColor != other.disabledLabelColor) return false
         if (errorLabelColor != other.errorLabelColor) return false
-        if (placeholderColor != other.placeholderColor) return false
+        if (focusedPlaceholderColor != other.focusedPlaceholderColor) return false
+        if (unfocusedPlaceholderColor != other.unfocusedPlaceholderColor) return false
         if (disabledPlaceholderColor != other.disabledPlaceholderColor) return false
+        if (errorPlaceholderColor != other.errorPlaceholderColor) return false
         if (focusedSupportingTextColor != other.focusedSupportingTextColor) return false
         if (unfocusedSupportingTextColor != other.unfocusedSupportingTextColor) return false
         if (disabledSupportingTextColor != other.disabledSupportingTextColor) return false
@@ -1130,8 +1396,12 @@
     }
 
     override fun hashCode(): Int {
-        var result = textColor.hashCode()
+        var result = focusedTextColor.hashCode()
+        result = 31 * result + unfocusedTextColor.hashCode()
         result = 31 * result + disabledTextColor.hashCode()
+        result = 31 * result + errorTextColor.hashCode()
+        result = 31 * result + containerColor.hashCode()
+        result = 31 * result + errorContainerColor.hashCode()
         result = 31 * result + cursorColor.hashCode()
         result = 31 * result + errorCursorColor.hashCode()
         result = 31 * result + textSelectionColors.hashCode()
@@ -1147,13 +1417,14 @@
         result = 31 * result + unfocusedTrailingIconColor.hashCode()
         result = 31 * result + disabledTrailingIconColor.hashCode()
         result = 31 * result + errorTrailingIconColor.hashCode()
-        result = 31 * result + containerColor.hashCode()
         result = 31 * result + focusedLabelColor.hashCode()
         result = 31 * result + unfocusedLabelColor.hashCode()
         result = 31 * result + disabledLabelColor.hashCode()
         result = 31 * result + errorLabelColor.hashCode()
-        result = 31 * result + placeholderColor.hashCode()
+        result = 31 * result + focusedPlaceholderColor.hashCode()
+        result = 31 * result + unfocusedPlaceholderColor.hashCode()
         result = 31 * result + disabledPlaceholderColor.hashCode()
+        result = 31 * result + errorPlaceholderColor.hashCode()
         result = 31 * result + focusedSupportingTextColor.hashCode()
         result = 31 * result + unfocusedSupportingTextColor.hashCode()
         result = 31 * result + disabledSupportingTextColor.hashCode()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldImpl.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldImpl.kt
index 51f7f04..469469c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldImpl.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextFieldImpl.kt
@@ -133,7 +133,8 @@
                 @Composable { modifier ->
                     Box(modifier.alpha(placeholderAlphaProgress)) {
                         Decoration(
-                            contentColor = colors.placeholderColor(enabled).value,
+                            contentColor =
+                                colors.placeholderColor(enabled, isError, interactionSource).value,
                             typography = MaterialTheme.typography.bodyLarge,
                             content = placeholder
                         )
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
index 89aa6d8..f4c7f87 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
@@ -337,7 +337,7 @@
  * Ranges from 0 to 23
  * @param initialMinute starting minute for this state, will be displayed in the time picker when
  * launched. Ranges from 0 to 59
- * @param is24Hour The format for this time picker `false` for 12 hour format with an AM/PM toggle
+ * @param is24Hour The format for this time picker. `false` for 12 hour format with an AM/PM toggle
  * or `true` for 24 hour format without toggle. Defaults to follow system setting.
  */
 @Composable
@@ -874,7 +874,7 @@
             .minimumInteractiveComponentSize()
             .size(MinimumInteractiveSize)
             .focusable()
-            .semantics(mergeDescendants = true) {
+            .semantics {
                 this.selected = selected
                 this.contentDescription = contentDescription
             }
diff --git a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
index 0421c3b..6a51fad 100644
--- a/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
@@ -59,6 +59,10 @@
         Strings.DateInputInvalidYearRange -> "Date out of expected year range %1$ - %2$"
         Strings.DatePickerSwitchToCalendarMode -> "Switch to calendar input mode"
         Strings.DatePickerSwitchToInputMode -> "Switch to text input mode"
+        Strings.DateRangePickerTitle -> "Select dates"
+        Strings.DateRangePickerStartHeadline -> "Start date"
+        Strings.DateRangePickerEndHeadline -> "End date"
+        Strings.DateRangeInputTitle -> "Enter dates"
         Strings.TooltipLongPressLabel -> "Show tooltip"
         Strings.TimePickerAM -> "AM"
         Strings.TimePickerPM -> "PM"
diff --git a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
index bd97ea2..edc16ae 100644
--- a/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
+++ b/compose/runtime/runtime-lint/src/main/java/androidx/compose/runtime/lint/RuntimeIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class RuntimeIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ComposableCoroutineCreationDetector.CoroutineCreationDuringComposition,
diff --git a/compose/runtime/runtime-livedata/api/1.4.0-beta01.txt b/compose/runtime/runtime-livedata/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-livedata/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/res-1.4.0-beta01.txt
diff --git a/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta01.txt b/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/1.4.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/res-1.4.0-beta01.txt
diff --git a/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.4.0-beta01.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.4.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/res-1.4.0-beta01.txt
diff --git a/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.4.0-beta01.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-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
index ce3e102..60bbfa0 100644
--- a/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
+++ b/compose/runtime/runtime-saveable-lint/src/main/java/androidx/compose/runtime/saveable/lint/RuntimeSaveableIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class RuntimeSaveableIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         RememberSaveableDetector.RememberSaveableSaverParameter
diff --git a/compose/runtime/runtime-saveable/api/1.4.0-beta01.txt b/compose/runtime/runtime-saveable/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.4.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta01.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/res-1.4.0-beta01.txt b/compose/runtime/runtime-saveable/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/res-1.4.0-beta01.txt
diff --git a/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta01.txt b/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/1.4.0-beta01.txt b/compose/runtime/runtime/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..1cb90ed
--- /dev/null
+++ b/compose/runtime/runtime/api/1.4.0-beta01.txt
@@ -0,0 +1,930 @@
+// 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!);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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>);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Composable {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableOpenTarget {
+    method public abstract int index();
+    property public abstract int index;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableTarget {
+    method public abstract String applier();
+    property public abstract String applier;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface ComposableTargetMarker {
+    method public abstract String description() default "";
+    property public abstract String description;
+  }
+
+  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.ExplicitGroupsComposable public static inline void ReusableContentHost(boolean active, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.TYPEALIAS}) public @interface ComposeCompilerApi {
+  }
+
+  public interface ComposeNodeLifecycleCallback {
+    method public void onDeactivate();
+    method public void onRelease();
+    method public void onReuse();
+  }
+
+  public sealed 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 default boolean changedInstance(Object? value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void deactivateToEndGroup(boolean changed);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @org.jetbrains.annotations.TestOnly public void disableSourceInformation();
+    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 @androidx.compose.runtime.ComposeCompilerApi public void endToMarker(int marker);
+    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 int getCurrentMarker();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public Object? getRecomposeScopeIdentity();
+    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 androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract int currentMarker;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract Object? recomposeScopeIdentity;
+    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 boolean isTraceInProgress();
+    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);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventEnd();
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, int dirty1, int dirty2, String info);
+    method @Deprecated @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, String info);
+  }
+
+  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 CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  public sealed interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void applyLateChanges();
+    method public void changesApplied();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public <R> R! delegateInvalidations(androidx.compose.runtime.ControlledComposition? to, int groupIndex, kotlin.jvm.functions.Function0<? extends R> block);
+    method public boolean getHasPendingChanges();
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.TYPE) 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);
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    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>);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class MovableContentKt {
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <P> kotlin.jvm.functions.Function1<P,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function1<? super P,kotlin.Unit> content);
+    method public static <P1, P2> kotlin.jvm.functions.Function2<P1,P2,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function2<? super P1,? super P2,kotlin.Unit> content);
+    method public static <P1, P2, P3> kotlin.jvm.functions.Function3<P1,P2,P3,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function3<? super P1,? super P2,? super P3,kotlin.Unit> content);
+    method public static <P1, P2, P3, P4> kotlin.jvm.functions.Function4<P1,P2,P3,P4,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function4<? super P1,? super P2,? super P3,? super P4,kotlin.Unit> content);
+    method public static <R> kotlin.jvm.functions.Function1<R,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function1<? super R,kotlin.Unit> content);
+    method public static <R, P> kotlin.jvm.functions.Function2<R,P,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function2<? super R,? super P,kotlin.Unit> content);
+    method public static <R, P1, P2> kotlin.jvm.functions.Function3<R,P1,P2,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function3<? super R,? super P1,? super P2,kotlin.Unit> content);
+    method public static <R, P1, P2, P3> kotlin.jvm.functions.Function4<R,P1,P2,P3,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function4<? super R,? super P1,? super P2,? super P3,kotlin.Unit> content);
+  }
+
+  @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!);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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>);
+    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<?>);
+  }
+
+  @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.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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>);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    method public static androidx.compose.runtime.Recomposer.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.runtime.Recomposer.State[] values();
+    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>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmInline public final value class SkippableUpdater<T> {
+    ctor public SkippableUpdater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Updater<T> {
+    ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public void reconcile(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void update(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.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMeta {
+    method public abstract int endOffset();
+    method public abstract int key();
+    method public abstract int startOffset();
+    property public abstract int endOffset;
+    property public abstract int key;
+    property public abstract int startOffset;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface FunctionKeyMeta.Container {
+    method public abstract androidx.compose.runtime.internal.FunctionKeyMeta[] value();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMetaClass {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    method public Class<?>![] getParameterTypes();
+    method public java.lang.reflect.Parameter![] getParameters();
+    method public operator Object? invoke(androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
+    property public final int parameterCount;
+    property public final Class<?>![] parameterTypes;
+    property public final java.lang.reflect.Parameter![] parameters;
+  }
+
+  public final class ComposableMethodKt {
+    method public static androidx.compose.runtime.reflect.ComposableMethod? asComposableMethod(java.lang.reflect.Method);
+    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static androidx.compose.runtime.reflect.ComposableMethod getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method public androidx.compose.runtime.snapshots.Snapshot getCurrent();
+    method public inline <T> T! global(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void notifyObjectsInitialized();
+    method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public void sendApplyNotifications();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method public inline <R> R! withMutableSnapshot(kotlin.jvm.functions.Function0<? extends R> block);
+    method public inline <T> T! withoutReadObservation(kotlin.jvm.functions.Function0<? extends T> 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 SnapshotKt {
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    method public java.util.List<T> toList();
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    method public java.util.Map<K,V> toMap();
+    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 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 @Deprecated public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 default androidx.compose.runtime.tooling.CompositionGroup? find(Object identityToFind);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public default int getGroupSize();
+    method public default Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public default int getSlotsSize();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default int groupSize;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public default int slotsSize;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/current.ignore b/compose/runtime/runtime/api/current.ignore
index b2e1b75..22c8270 100644
--- a/compose/runtime/runtime/api/current.ignore
+++ b/compose/runtime/runtime/api/current.ignore
@@ -7,5 +7,49 @@
     Added method androidx.compose.runtime.Composer.getCurrentMarker()
 
 
+RemovedClass: androidx.compose.runtime.ActualJvm_jvmKt:
+    Removed class androidx.compose.runtime.ActualJvm_jvmKt
+RemovedClass: androidx.compose.runtime.BitwiseOperatorsKt:
+    Removed class androidx.compose.runtime.BitwiseOperatorsKt
+RemovedClass: androidx.compose.runtime.CompositionContextKt:
+    Removed class androidx.compose.runtime.CompositionContextKt
+RemovedClass: androidx.compose.runtime.ExpectKt:
+    Removed class androidx.compose.runtime.ExpectKt
+RemovedClass: androidx.compose.runtime.RecomposeScopeImplKt:
+    Removed class androidx.compose.runtime.RecomposeScopeImplKt
+RemovedClass: androidx.compose.runtime.SlotTableKt:
+    Removed class androidx.compose.runtime.SlotTableKt
+RemovedClass: androidx.compose.runtime.TraceKt:
+    Removed class androidx.compose.runtime.TraceKt
+RemovedClass: androidx.compose.runtime.internal.JvmDefaultWithCompatibility_jvmKt:
+    Removed class androidx.compose.runtime.internal.JvmDefaultWithCompatibility_jvmKt
+RemovedClass: androidx.compose.runtime.internal.ThreadMapKt:
+    Removed class androidx.compose.runtime.internal.ThreadMapKt
+RemovedClass: androidx.compose.runtime.snapshots.ListUtilsKt:
+    Removed class androidx.compose.runtime.snapshots.ListUtilsKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotContextElementKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotContextElementKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotDoubleIndexHeapKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotDoubleIndexHeapKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotIdSetKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotIdSetKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotStateListKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotStateListKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotStateMapKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotStateMapKt
+
+
 RemovedMethod: androidx.compose.runtime.collection.MutableVectorKt#mutableVectorOf(T):
     Removed method androidx.compose.runtime.collection.MutableVectorKt.mutableVectorOf(T)
+
+
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.internal:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 71912fe..1cb90ed 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -21,9 +21,6 @@
     property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
   }
 
-  public final class ActualJvm_jvmKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface Applier<N> {
     method public void clear();
     method public void down(N? node);
@@ -38,9 +35,6 @@
     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);
@@ -196,9 +190,6 @@
   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);
@@ -265,9 +256,6 @@
     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.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExplicitGroupsComposable {
   }
 
@@ -350,9 +338,6 @@
     method public void invalidate();
   }
 
-  public final class RecomposeScopeImplKt {
-  }
-
   public final class Recomposer extends androidx.compose.runtime.CompositionContext {
     ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
     method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
@@ -416,9 +401,6 @@
     method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
   }
 
-  public final class SlotTableKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface SnapshotMutationPolicy<T> {
     method public boolean equivalent(T? a, T? b);
     method public default T? merge(T? previous, T? current, T? applied);
@@ -565,9 +547,6 @@
     property public abstract T! value;
   }
 
-  public final class TraceKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class Updater<T> {
     ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
     method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
@@ -582,9 +561,6 @@
 
 package androidx.compose.runtime.collection {
 
-  public final class ActualIntMap_androidKt {
-  }
-
   public final class MutableVector<T> implements java.util.RandomAccess {
     method public boolean add(T? element);
     method public void add(int index, T? element);
@@ -661,47 +637,6 @@
 
 }
 
-package androidx.compose.runtime.external.kotlinx.collections.immutable {
-
-  public final class ExtensionsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
-
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
-
-  public final class PersistentHashMapContentIteratorsKt {
-  }
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
-
-  public final class CommonFunctionsKt {
-  }
-
-  public final class ForEachOneBitKt {
-  }
-
-}
-
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
@@ -742,9 +677,6 @@
     property public abstract String file;
   }
 
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
     method public abstract String file();
     property public abstract String file;
@@ -767,9 +699,6 @@
     property public abstract int parameters;
   }
 
-  public final class ThreadMapKt {
-  }
-
 }
 
 package androidx.compose.runtime.reflect {
@@ -794,9 +723,6 @@
 
 package androidx.compose.runtime.snapshots {
 
-  public final class ListUtilsKt {
-  }
-
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
@@ -873,15 +799,6 @@
     field public static final androidx.compose.runtime.snapshots.SnapshotApplyResult.Success INSTANCE;
   }
 
-  public final class SnapshotContextElementKt {
-  }
-
-  public final class SnapshotDoubleIndexHeapKt {
-  }
-
-  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);
@@ -926,9 +843,6 @@
     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();
@@ -953,9 +867,6 @@
     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);
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.4.0-beta01.txt b/compose/runtime/runtime/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..ef1101e
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1010 @@
+// 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!);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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>);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Composable {
+  }
+
+  @androidx.compose.runtime.InternalComposeApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ComposableInferredTarget {
+    method public abstract String scheme();
+    property public abstract String scheme;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableOpenTarget {
+    method public abstract int index();
+    property public abstract int index;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableTarget {
+    method public abstract String applier();
+    property public abstract String applier;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface ComposableTargetMarker {
+    method public abstract String description() default "";
+    property public abstract String description;
+  }
+
+  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.ExplicitGroupsComposable public static inline void ReusableContentHost(boolean active, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.TYPEALIAS}) public @interface ComposeCompilerApi {
+  }
+
+  public interface ComposeNodeLifecycleCallback {
+    method public void onDeactivate();
+    method public void onRelease();
+    method public void onReuse();
+  }
+
+  public sealed 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.ComposeCompilerApi public default boolean changedInstance(Object? value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.CompositionLocal<T> key);
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void deactivateToEndGroup(boolean changed);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @org.jetbrains.annotations.TestOnly public void disableSourceInformation();
+    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 @androidx.compose.runtime.ComposeCompilerApi public void endToMarker(int marker);
+    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 int getCurrentMarker();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public Object? getRecomposeScopeIdentity();
+    method public boolean getSkipping();
+    method @androidx.compose.runtime.InternalComposeApi public void insertMovableContent(androidx.compose.runtime.MovableContent<?> value, Object? parameter);
+    method @androidx.compose.runtime.InternalComposeApi public void insertMovableContentReferences(java.util.List<kotlin.Pair<androidx.compose.runtime.MovableContentStateReference,androidx.compose.runtime.MovableContentStateReference>> references);
+    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 @androidx.compose.runtime.InternalComposeApi @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 int currentMarker;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract Object? recomposeScopeIdentity;
+    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();
+    method @androidx.compose.runtime.InternalComposeTracingApi public void setTracer(androidx.compose.runtime.CompositionTracer tracer);
+    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 boolean isTraceInProgress();
+    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);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventEnd();
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, int dirty1, int dirty2, String info);
+    method @Deprecated @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, String info);
+  }
+
+  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 CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static kotlin.coroutines.CoroutineContext getRecomposeCoroutineContext(androidx.compose.runtime.ControlledComposition);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.InternalComposeTracingApi public interface CompositionTracer {
+    method public boolean isTraceInProgress();
+    method public void traceEventEnd();
+    method public void traceEventStart(int key, int dirty1, int dirty2, String info);
+  }
+
+  public sealed interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void applyLateChanges();
+    method public void changesApplied();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public <R> R! delegateInvalidations(androidx.compose.runtime.ControlledComposition? to, int groupIndex, kotlin.jvm.functions.Function0<? extends R> block);
+    method @androidx.compose.runtime.InternalComposeApi public void disposeUnusedMovableContent(androidx.compose.runtime.MovableContentState state);
+    method public boolean getHasPendingChanges();
+    method @androidx.compose.runtime.InternalComposeApi public void insertMovableContent(java.util.List<kotlin.Pair<androidx.compose.runtime.MovableContentStateReference,androidx.compose.runtime.MovableContentStateReference>> references);
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    method @androidx.compose.runtime.InternalComposeApi public void verifyConsistent();
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.TYPE) 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);
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is an experimental API for Compose and is likely to change before becoming " + "stable.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExperimentalComposeApi {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is internal API for Compose modules that may change frequently " + "and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface InternalComposeApi {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface InternalComposeTracingApi {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    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>);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  @androidx.compose.runtime.InternalComposeApi public final class MovableContent<P> {
+    ctor public MovableContent(kotlin.jvm.functions.Function1<? super P,kotlin.Unit> content);
+    method public kotlin.jvm.functions.Function1<P,kotlin.Unit> getContent();
+    property public final kotlin.jvm.functions.Function1<P,kotlin.Unit> content;
+  }
+
+  public final class MovableContentKt {
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <P> kotlin.jvm.functions.Function1<P,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function1<? super P,kotlin.Unit> content);
+    method public static <P1, P2> kotlin.jvm.functions.Function2<P1,P2,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function2<? super P1,? super P2,kotlin.Unit> content);
+    method public static <P1, P2, P3> kotlin.jvm.functions.Function3<P1,P2,P3,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function3<? super P1,? super P2,? super P3,kotlin.Unit> content);
+    method public static <P1, P2, P3, P4> kotlin.jvm.functions.Function4<P1,P2,P3,P4,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function4<? super P1,? super P2,? super P3,? super P4,kotlin.Unit> content);
+    method public static <R> kotlin.jvm.functions.Function1<R,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function1<? super R,kotlin.Unit> content);
+    method public static <R, P> kotlin.jvm.functions.Function2<R,P,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function2<? super R,? super P,kotlin.Unit> content);
+    method public static <R, P1, P2> kotlin.jvm.functions.Function3<R,P1,P2,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function3<? super R,? super P1,? super P2,kotlin.Unit> content);
+    method public static <R, P1, P2, P3> kotlin.jvm.functions.Function4<R,P1,P2,P3,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function4<? super R,? super P1,? super P2,? super P3,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.InternalComposeApi public final class MovableContentState {
+  }
+
+  @androidx.compose.runtime.InternalComposeApi public final class MovableContentStateReference {
+  }
+
+  @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!);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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>);
+    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<?>);
+  }
+
+  @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.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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>);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method @androidx.compose.runtime.ExperimentalComposeApi public suspend Object? runRecomposeConcurrentlyAndApplyChanges(kotlin.coroutines.CoroutineContext recomposeCoroutineContext, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    method public static androidx.compose.runtime.Recomposer.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.runtime.Recomposer.State[] values();
+    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>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmInline public final value class SkippableUpdater<T> {
+    ctor public SkippableUpdater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Updater<T> {
+    ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public void reconcile(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void update(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.FUNCTION, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) 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.FUNCTION, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) 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.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMeta {
+    method public abstract int endOffset();
+    method public abstract int key();
+    method public abstract int startOffset();
+    property public abstract int endOffset;
+    property public abstract int key;
+    property public abstract int startOffset;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface FunctionKeyMeta.Container {
+    method public abstract androidx.compose.runtime.internal.FunctionKeyMeta[] value();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMetaClass {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method @androidx.compose.runtime.InternalComposeApi public static void enableLiveLiterals();
+    method public static boolean isLiveLiteralsEnabled();
+    method @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.InternalComposeApi public static <T> androidx.compose.runtime.State<T> liveLiteral(String key, T? value);
+    method @androidx.compose.runtime.InternalComposeApi public static void updateLiveLiteralValue(String key, Object? value);
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    method public Class<?>![] getParameterTypes();
+    method public java.lang.reflect.Parameter![] getParameters();
+    method public operator Object? invoke(androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
+    property public final int parameterCount;
+    property public final Class<?>![] parameterTypes;
+    property public final java.lang.reflect.Parameter![] parameters;
+  }
+
+  public final class ComposableMethodKt {
+    method public static androidx.compose.runtime.reflect.ComposableMethod? asComposableMethod(java.lang.reflect.Method);
+    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static androidx.compose.runtime.reflect.ComposableMethod getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method @androidx.compose.runtime.ExperimentalComposeApi public final androidx.compose.runtime.snapshots.Snapshot? unsafeEnter();
+    method @androidx.compose.runtime.ExperimentalComposeApi public final void unsafeLeave(androidx.compose.runtime.snapshots.Snapshot? oldSnapshot);
+    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);
+    method public inline <T> T! withoutReadObservation(kotlin.jvm.functions.Function0<? extends T> 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;
+  }
+
+  @androidx.compose.runtime.ExperimentalComposeApi public interface SnapshotContextElement extends kotlin.coroutines.CoroutineContext.Element {
+    field public static final androidx.compose.runtime.snapshots.SnapshotContextElement.Key Key;
+  }
+
+  public static final class SnapshotContextElement.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.runtime.snapshots.SnapshotContextElement> {
+  }
+
+  public final class SnapshotContextElementKt {
+    method @androidx.compose.runtime.ExperimentalComposeApi public static androidx.compose.runtime.snapshots.SnapshotContextElement asContextElement(androidx.compose.runtime.snapshots.Snapshot);
+  }
+
+  public final class SnapshotKt {
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    method public java.util.List<T> toList();
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    method public java.util.Map<K,V> toMap();
+    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 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 @Deprecated public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 default androidx.compose.runtime.tooling.CompositionGroup? find(Object identityToFind);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public default int getGroupSize();
+    method public default Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public default int getSlotsSize();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default int groupSize;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public default int slotsSize;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 291f5f9..ef1101e 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -21,9 +21,6 @@
     property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
   }
 
-  public final class ActualJvm_jvmKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface Applier<N> {
     method public void clear();
     method public void down(N? node);
@@ -38,9 +35,6 @@
     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);
@@ -211,9 +205,6 @@
   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);
@@ -292,9 +283,6 @@
     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.ERROR, message="This is an experimental API for Compose and is likely to change before becoming " + "stable.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExperimentalComposeApi {
   }
 
@@ -398,9 +386,6 @@
     method public void invalidate();
   }
 
-  public final class RecomposeScopeImplKt {
-  }
-
   public final class Recomposer extends androidx.compose.runtime.CompositionContext {
     ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
     method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
@@ -465,9 +450,6 @@
     method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
   }
 
-  public final class SlotTableKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface SnapshotMutationPolicy<T> {
     method public boolean equivalent(T? a, T? b);
     method public default T? merge(T? previous, T? current, T? applied);
@@ -614,9 +596,6 @@
     property public abstract T! value;
   }
 
-  public final class TraceKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class Updater<T> {
     ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
     method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
@@ -631,9 +610,6 @@
 
 package androidx.compose.runtime.collection {
 
-  public final class ActualIntMap_androidKt {
-  }
-
   public final class MutableVector<T> implements java.util.RandomAccess {
     method public boolean add(T? element);
     method public void add(int index, T? element);
@@ -710,47 +686,6 @@
 
 }
 
-package androidx.compose.runtime.external.kotlinx.collections.immutable {
-
-  public final class ExtensionsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
-
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
-
-  public final class PersistentHashMapContentIteratorsKt {
-  }
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
-
-  public final class CommonFunctionsKt {
-  }
-
-  public final class ForEachOneBitKt {
-  }
-
-}
-
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
@@ -805,9 +740,6 @@
     property public abstract String file;
   }
 
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
     method public abstract String file();
     property public abstract String file;
@@ -833,9 +765,6 @@
     property public abstract int parameters;
   }
 
-  public final class ThreadMapKt {
-  }
-
 }
 
 package androidx.compose.runtime.reflect {
@@ -860,9 +789,6 @@
 
 package androidx.compose.runtime.snapshots {
 
-  public final class ListUtilsKt {
-  }
-
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
@@ -953,12 +879,6 @@
     method @androidx.compose.runtime.ExperimentalComposeApi public static androidx.compose.runtime.snapshots.SnapshotContextElement asContextElement(androidx.compose.runtime.snapshots.Snapshot);
   }
 
-  public final class SnapshotDoubleIndexHeapKt {
-  }
-
-  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);
@@ -1003,9 +923,6 @@
     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();
@@ -1030,9 +947,6 @@
     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);
diff --git a/compose/runtime/runtime/api/res-1.4.0-beta01.txt b/compose/runtime/runtime/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime/api/res-1.4.0-beta01.txt
diff --git a/compose/runtime/runtime/api/restricted_1.4.0-beta01.txt b/compose/runtime/runtime/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..5006380
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,980 @@
+// 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!);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  public final class ActualJvm_jvmKt {
+    method @kotlin.PublishedApi internal static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 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>);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Composable {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableOpenTarget {
+    method public abstract int index();
+    property public abstract int index;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface ComposableTarget {
+    method public abstract String applier();
+    property public abstract String applier;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface ComposableTargetMarker {
+    method public abstract String description() default "";
+    property public abstract String description;
+  }
+
+  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.ExplicitGroupsComposable public static inline void ReusableContentHost(boolean active, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @kotlin.PublishedApi internal static void invalidApplier();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.TYPEALIAS}) public @interface ComposeCompilerApi {
+  }
+
+  public interface ComposeNodeLifecycleCallback {
+    method public void onDeactivate();
+    method public void onRelease();
+    method public void onReuse();
+  }
+
+  public sealed 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 default boolean changedInstance(Object? value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void deactivateToEndGroup(boolean changed);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @org.jetbrains.annotations.TestOnly public void disableSourceInformation();
+    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 @androidx.compose.runtime.ComposeCompilerApi public void endToMarker(int marker);
+    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 int getCurrentMarker();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public Object? getRecomposeScopeIdentity();
+    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 androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract int currentMarker;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract Object? recomposeScopeIdentity;
+    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 boolean isTraceInProgress();
+    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);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventEnd();
+    method @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, int dirty1, int dirty2, String info);
+    method @Deprecated @androidx.compose.runtime.ComposeCompilerApi public static void traceEventStart(int key, String info);
+    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 CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @kotlin.PublishedApi internal final class CompositionScopedCoroutineScopeCanceller implements androidx.compose.runtime.RememberObserver {
+    ctor public CompositionScopedCoroutineScopeCanceller(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public sealed interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void applyLateChanges();
+    method public void changesApplied();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public <R> R! delegateInvalidations(androidx.compose.runtime.ControlledComposition? to, int groupIndex, kotlin.jvm.functions.Function0<? extends R> block);
+    method public boolean getHasPendingChanges();
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.TYPE) 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.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    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>);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class MovableContentKt {
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <P> kotlin.jvm.functions.Function1<P,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function1<? super P,kotlin.Unit> content);
+    method public static <P1, P2> kotlin.jvm.functions.Function2<P1,P2,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function2<? super P1,? super P2,kotlin.Unit> content);
+    method public static <P1, P2, P3> kotlin.jvm.functions.Function3<P1,P2,P3,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function3<? super P1,? super P2,? super P3,kotlin.Unit> content);
+    method public static <P1, P2, P3, P4> kotlin.jvm.functions.Function4<P1,P2,P3,P4,kotlin.Unit> movableContentOf(kotlin.jvm.functions.Function4<? super P1,? super P2,? super P3,? super P4,kotlin.Unit> content);
+    method public static <R> kotlin.jvm.functions.Function1<R,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function1<? super R,kotlin.Unit> content);
+    method public static <R, P> kotlin.jvm.functions.Function2<R,P,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function2<? super R,? super P,kotlin.Unit> content);
+    method public static <R, P1, P2> kotlin.jvm.functions.Function3<R,P1,P2,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function3<? super R,? super P1,? super P2,kotlin.Unit> content);
+    method public static <R, P1, P2, P3> kotlin.jvm.functions.Function4<R,P1,P2,P3,kotlin.Unit> movableContentWithReceiverOf(kotlin.jvm.functions.Function4<? super R,? super P1,? super P2,? super P3,kotlin.Unit> content);
+  }
+
+  @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!);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FILE}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) 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>);
+    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<?>);
+  }
+
+  @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.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface ReadOnlyComposable {
+  }
+
+  public interface RecomposeScope {
+    method public void invalidate();
+  }
+
+  public final class RecomposeScopeImplKt {
+    method @kotlin.PublishedApi internal static int updateChangedFlags(int flags);
+  }
+
+  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>);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    method public static androidx.compose.runtime.Recomposer.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.runtime.Recomposer.State[] values();
+    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>);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmInline public final value class SkippableUpdater<T> {
+    ctor public SkippableUpdater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Updater<T> {
+    ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
+    method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public void reconcile(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public <V> void update(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.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMeta {
+    method public abstract int endOffset();
+    method public abstract int key();
+    method public abstract int startOffset();
+    property public abstract int endOffset;
+    property public abstract int key;
+    property public abstract int startOffset;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface FunctionKeyMeta.Container {
+    method public abstract androidx.compose.runtime.internal.FunctionKeyMeta[] value();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface FunctionKeyMetaClass {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+}
+
+package androidx.compose.runtime.reflect {
+
+  public final class ComposableMethod {
+    method public java.lang.reflect.Method asMethod();
+    method public int getParameterCount();
+    method public Class<?>![] getParameterTypes();
+    method public java.lang.reflect.Parameter![] getParameters();
+    method public operator Object? invoke(androidx.compose.runtime.Composer composer, Object? instance, java.lang.Object?... args);
+    property public final int parameterCount;
+    property public final Class<?>![] parameterTypes;
+    property public final java.lang.reflect.Parameter![] parameters;
+  }
+
+  public final class ComposableMethodKt {
+    method public static androidx.compose.runtime.reflect.ComposableMethod? asComposableMethod(java.lang.reflect.Method);
+    method @kotlin.jvm.Throws(exceptionClasses=NoSuchMethodException::class) public static androidx.compose.runtime.reflect.ComposableMethod getDeclaredComposableMethod(Class<?>, String methodName, Class<?>... args) throws java.lang.NoSuchMethodException;
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
+    method public boolean hasPendingChanges();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? makeCurrent();
+    method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? snapshot);
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot createNonObservableSnapshot();
+    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);
+    method public inline <T> T! withoutReadObservation(kotlin.jvm.functions.Function0<? extends T> 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 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 <T extends androidx.compose.runtime.snapshots.StateRecord> T current(T r);
+    method @kotlin.PublishedApi internal static void notifyWrite(androidx.compose.runtime.snapshots.Snapshot snapshot, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method @kotlin.PublishedApi internal static inline <T> T! sync(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method @kotlin.PublishedApi internal static <T extends androidx.compose.runtime.snapshots.StateRecord> T writableRecord(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    field @kotlin.PublishedApi internal static final Object lock;
+    field @kotlin.PublishedApi internal static final androidx.compose.runtime.snapshots.Snapshot snapshotInitializer;
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    method public java.util.List<T> toList();
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    method public java.util.Map<K,V> toMap();
+    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 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 @Deprecated public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 default androidx.compose.runtime.tooling.CompositionGroup? find(Object identityToFind);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public default int getGroupSize();
+    method public default Object? getIdentity();
+    method public Object getKey();
+    method public Object? getNode();
+    method public default int getSlotsSize();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public default int groupSize;
+    property public default Object? identity;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public default int slotsSize;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/restricted_current.ignore b/compose/runtime/runtime/api/restricted_current.ignore
index b2e1b75..7c5ea36 100644
--- a/compose/runtime/runtime/api/restricted_current.ignore
+++ b/compose/runtime/runtime/api/restricted_current.ignore
@@ -7,5 +7,43 @@
     Added method androidx.compose.runtime.Composer.getCurrentMarker()
 
 
+RemovedClass: androidx.compose.runtime.BitwiseOperatorsKt:
+    Removed class androidx.compose.runtime.BitwiseOperatorsKt
+RemovedClass: androidx.compose.runtime.CompositionContextKt:
+    Removed class androidx.compose.runtime.CompositionContextKt
+RemovedClass: androidx.compose.runtime.SlotTableKt:
+    Removed class androidx.compose.runtime.SlotTableKt
+RemovedClass: androidx.compose.runtime.TraceKt:
+    Removed class androidx.compose.runtime.TraceKt
+RemovedClass: androidx.compose.runtime.internal.JvmDefaultWithCompatibility_jvmKt:
+    Removed class androidx.compose.runtime.internal.JvmDefaultWithCompatibility_jvmKt
+RemovedClass: androidx.compose.runtime.internal.ThreadMapKt:
+    Removed class androidx.compose.runtime.internal.ThreadMapKt
+RemovedClass: androidx.compose.runtime.snapshots.ListUtilsKt:
+    Removed class androidx.compose.runtime.snapshots.ListUtilsKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotContextElementKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotContextElementKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotDoubleIndexHeapKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotDoubleIndexHeapKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotIdSetKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotIdSetKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotStateListKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotStateListKt
+RemovedClass: androidx.compose.runtime.snapshots.SnapshotStateMapKt:
+    Removed class androidx.compose.runtime.snapshots.SnapshotStateMapKt
+
+
 RemovedMethod: androidx.compose.runtime.collection.MutableVectorKt#mutableVectorOf(T):
     Removed method androidx.compose.runtime.collection.MutableVectorKt.mutableVectorOf(T)
+
+
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+RemovedPackage: androidx.compose.runtime.external.kotlinx.collections.immutable.internal:
+    Removed package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index f0329cb..5006380 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -39,9 +39,6 @@
     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);
@@ -211,9 +208,6 @@
   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);
@@ -443,9 +437,6 @@
     method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,kotlin.Unit> block);
   }
 
-  public final class SlotTableKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface SnapshotMutationPolicy<T> {
     method public boolean equivalent(T? a, T? b);
     method public default T? merge(T? previous, T? current, T? applied);
@@ -592,9 +583,6 @@
     property public abstract T! value;
   }
 
-  public final class TraceKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class Updater<T> {
     ctor public Updater(@kotlin.PublishedApi androidx.compose.runtime.Composer composer);
     method public void init(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
@@ -609,9 +597,6 @@
 
 package androidx.compose.runtime.collection {
 
-  public final class ActualIntMap_androidKt {
-  }
-
   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);
@@ -690,47 +675,6 @@
 
 }
 
-package androidx.compose.runtime.external.kotlinx.collections.immutable {
-
-  public final class ExtensionsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
-
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
-
-  public final class PersistentHashMapContentIteratorsKt {
-  }
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
-
-  public final class TrieNodeKt {
-  }
-
-}
-
-package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
-
-  public final class CommonFunctionsKt {
-  }
-
-  public final class ForEachOneBitKt {
-  }
-
-}
-
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
@@ -771,9 +715,6 @@
     property public abstract String file;
   }
 
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface LiveLiteralFileInfo {
     method public abstract String file();
     property public abstract String file;
@@ -796,9 +737,6 @@
     property public abstract int parameters;
   }
 
-  public final class ThreadMapKt {
-  }
-
 }
 
 package androidx.compose.runtime.reflect {
@@ -823,9 +761,6 @@
 
 package androidx.compose.runtime.snapshots {
 
-  public final class ListUtilsKt {
-  }
-
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
@@ -907,15 +842,6 @@
     field public static final androidx.compose.runtime.snapshots.SnapshotApplyResult.Success INSTANCE;
   }
 
-  public final class SnapshotContextElementKt {
-  }
-
-  public final class SnapshotDoubleIndexHeapKt {
-  }
-
-  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 <T extends androidx.compose.runtime.snapshots.StateRecord> T current(T r);
@@ -967,9 +893,6 @@
     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();
@@ -994,9 +917,6 @@
     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);
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 8e676fb..7cb70ca 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 = 9400
+    const val version: Int = 9500
 }
diff --git a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
index 9c76b09..79176a9 100644
--- a/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/commonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -3313,8 +3313,57 @@
 
         revalidate()
     }
+
+    @Test // regression test for 267586102
+    fun test_remember_in_a_loop() = compositionTest {
+        var i1 = 0
+        var i2 = 0
+        var i3 = 0
+        var recomposeCounter = 0
+        var scope: RecomposeScope? = null
+
+        val content: @Composable SomeUnstableClass.() -> Unit = {
+            for (index in 0 until recomposeCounter) {
+                remember(this) { index }
+            }
+            scope = currentRecomposeScope
+            // these remembered values are not expected to change, BUT they change on recompositions
+            i1 = remember(this) { 1 }
+            i2 = remember(this) { 2 }
+            i3 = remember(this) { 3 }
+            recomposeCounter++
+        }
+
+        compose {
+            content(SomeUnstableClass())
+        }
+        advance()
+
+        assertEquals(1, i1)
+        assertEquals(2, i2)
+        assertEquals(3, i3)
+        assertEquals(1, recomposeCounter)
+
+        scope!!.invalidate()
+        advance()
+
+        assertEquals(2, recomposeCounter)
+        assertEquals(1, i1)
+        assertEquals(2, i2)
+        assertEquals(3, i3)
+
+        scope!!.invalidate()
+        advance()
+
+        assertEquals(3, recomposeCounter)
+        assertEquals(1, i1)
+        assertEquals(2, i2)
+        assertEquals(3, i3)
+    }
 }
 
+class SomeUnstableClass(val a: Any = "abc")
+
 @Composable
 fun test_CM1_RetFun(condition: Boolean) {
     Text("Root - before")
diff --git a/compose/test-utils/OWNERS b/compose/test-utils/OWNERS
index b2c0d56..90ad461 100644
--- a/compose/test-utils/OWNERS
+++ b/compose/test-utils/OWNERS
@@ -1 +1,2 @@
+# Bug component: 741702
 jellefresen@google.com
diff --git a/compose/ui/ui-android-stubs/api/1.4.0-beta01.txt b/compose/ui/ui-android-stubs/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.4.0-beta01.txt
@@ -0,0 +1,78 @@
+// 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 destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    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 int getSpotShadowColor();
+    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 setAmbientShadowColor(int);
+    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 setSpotShadowColor(int);
+    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.4.0-beta01.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,78 @@
+// 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 destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    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 int getSpotShadowColor();
+    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 setAmbientShadowColor(int);
+    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 setSpotShadowColor(int);
+    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.4.0-beta01.txt b/compose/ui/ui-android-stubs/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..8e22228
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,78 @@
+// 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 destroyDisplayListData();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public int getAmbientShadowColor();
+    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 int getSpotShadowColor();
+    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 setAmbientShadowColor(int);
+    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 setSpotShadowColor(int);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/1.4.0-beta01.txt b/compose/ui/ui-geometry/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.4.0-beta01.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CornerRadius {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public operator boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float);
+    method public void setLeft(float);
+    method public void setRight(float);
+    method public void setTop(float);
+    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 @kotlin.jvm.JvmInline public final value class Offset {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public operator boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final boolean isEmpty;
+    property @androidx.compose.runtime.Stable public final boolean isFinite;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public operator boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Size {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getHeight();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float maxDimension;
+    property @androidx.compose.runtime.Stable public final float minDimension;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/current.ignore b/compose/ui/ui-geometry/api/current.ignore
new file mode 100644
index 0000000..c27b9c61
--- /dev/null
+++ b/compose/ui/ui-geometry/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.geometry.GeometryUtilsKt:
+    Removed class androidx.compose.ui.geometry.GeometryUtilsKt
diff --git a/compose/ui/ui-geometry/api/current.txt b/compose/ui/ui-geometry/api/current.txt
index 0be492c..50b3067 100644
--- a/compose/ui/ui-geometry/api/current.txt
+++ b/compose/ui/ui-geometry/api/current.txt
@@ -27,9 +27,6 @@
     method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
   }
 
-  public final class GeometryUtilsKt {
-  }
-
   public final class MutableRect {
     ctor public MutableRect(float left, float top, float right, float bottom);
     method public operator boolean contains(long offset);
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CornerRadius {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public operator boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float);
+    method public void setLeft(float);
+    method public void setRight(float);
+    method public void setTop(float);
+    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 @kotlin.jvm.JvmInline public final value class Offset {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public operator boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final boolean isEmpty;
+    property @androidx.compose.runtime.Stable public final boolean isFinite;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public operator boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Size {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getHeight();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float maxDimension;
+    property @androidx.compose.runtime.Stable public final float minDimension;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
index 0be492c..50b3067 100644
--- a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
@@ -27,9 +27,6 @@
     method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
   }
 
-  public final class GeometryUtilsKt {
-  }
-
   public final class MutableRect {
     ctor public MutableRect(float left, float top, float right, float bottom);
     method public operator boolean contains(long offset);
diff --git a/compose/ui/ui-geometry/api/res-1.4.0-beta01.txt b/compose/ui/ui-geometry/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-geometry/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-geometry/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-geometry/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..50b3067
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CornerRadius {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public operator boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float);
+    method public void setLeft(float);
+    method public void setRight(float);
+    method public void setTop(float);
+    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 @kotlin.jvm.JvmInline public final value class Offset {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public operator boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final boolean isEmpty;
+    property @androidx.compose.runtime.Stable public final boolean isFinite;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public operator boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Size {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getHeight();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float maxDimension;
+    property @androidx.compose.runtime.Stable public final float minDimension;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/restricted_current.ignore b/compose/ui/ui-geometry/api/restricted_current.ignore
new file mode 100644
index 0000000..c27b9c61
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.geometry.GeometryUtilsKt:
+    Removed class androidx.compose.ui.geometry.GeometryUtilsKt
diff --git a/compose/ui/ui-geometry/api/restricted_current.txt b/compose/ui/ui-geometry/api/restricted_current.txt
index 0be492c..50b3067 100644
--- a/compose/ui/ui-geometry/api/restricted_current.txt
+++ b/compose/ui/ui-geometry/api/restricted_current.txt
@@ -27,9 +27,6 @@
     method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
   }
 
-  public final class GeometryUtilsKt {
-  }
-
   public final class MutableRect {
     ctor public MutableRect(float left, float top, float right, float bottom);
     method public operator boolean contains(long offset);
diff --git a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
index bff18de..065492c4 100644
--- a/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
+++ b/compose/ui/ui-graphics-lint/src/main/java/androidx/compose/ui/graphics/lint/UiGraphicsIssueRegistry.kt
@@ -25,7 +25,7 @@
  */
 class UiGraphicsIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ColorDetector.MissingColorAlphaChannel,
diff --git a/compose/ui/ui-graphics/api/1.4.0-beta01.txt b/compose/ui/ui-graphics/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..d818cd8
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.4.0-beta01.txt
@@ -0,0 +1,1614 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint(android.graphics.Paint internalPaint);
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    method public static androidx.compose.ui.graphics.Paint toComposePaint(android.graphics.Paint);
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlendMode {
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ClipOp {
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Color {
+    ctor public Color(long value);
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace component5();
+    method public long convert(androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public float getAlpha();
+    method public float getBlue();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public float getGreen();
+    method public float getRed();
+    method public long getValue();
+    property @androidx.compose.runtime.Stable public final float alpha;
+    property @androidx.compose.runtime.Stable public final float blue;
+    property @androidx.compose.runtime.Stable public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property @androidx.compose.runtime.Stable public final float green;
+    property @androidx.compose.runtime.Stable public final float red;
+    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();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    method public long hsl(float hue, float saturation, float lightness, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    method public long hsv(float hue, float saturation, float value, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ColorMatrix {
+    ctor public ColorMatrix(optional float[] values);
+    method public void convertRgbToYuv();
+    method public void convertYuvToRgb();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void reset();
+    method public inline operator void set(int row, int column, float v);
+    method public void set(float[] src);
+    method public void setToRotateBlue(float degrees);
+    method public void setToRotateGreen(float degrees);
+    method public void setToRotateRed(float degrees);
+    method public void setToSaturation(float sat);
+    method public void setToScale(float redScale, float greenScale, float blueScale, float alphaScale);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class FilterQuality {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ImageBitmapConfig {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Matrix {
+    ctor public Matrix(optional float[] values);
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void invert();
+    method public long map(long point);
+    method public androidx.compose.ui.geometry.Rect map(androidx.compose.ui.geometry.Rect rect);
+    method public void map(androidx.compose.ui.geometry.MutableRect rect);
+    method public void reset();
+    method public void rotateX(float degrees);
+    method public void rotateY(float degrees);
+    method public void rotateZ(float degrees);
+    method public void scale(optional float x, optional float y, optional float z);
+    method public inline operator void set(int row, int column, float v);
+    method public void setFrom(float[] matrix);
+    method public operator void timesAssign(float[] m);
+    method public void translate(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(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PaintingStyle {
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathFillType {
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathOperation {
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PointMode {
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method @Deprecated public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.unit.IntRect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.unit.IntRect toComposeIntRect(android.graphics.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StampedPathEffectStyle {
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeCap {
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeJoin {
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TileMode {
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class VertexMode {
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ColorModel {
+    method public int getComponentCount();
+    property @androidx.compose.runtime.Stable public final int componentCount;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getOklab();
+    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.ColorSpace Oklab;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class RenderIntent {
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long);
+    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 @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class 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/current.ignore b/compose/ui/ui-graphics/api/current.ignore
index ac8aa37..cded3ab 100644
--- a/compose/ui/ui-graphics/api/current.ignore
+++ b/compose/ui/ui-graphics/api/current.ignore
@@ -3,3 +3,19 @@
     Added method androidx.compose.ui.graphics.PathMeasure.getPosition(float)
 AddedAbstractMethod: androidx.compose.ui.graphics.PathMeasure#getTangent(float):
     Added method androidx.compose.ui.graphics.PathMeasure.getTangent(float)
+
+
+RemovedClass: androidx.compose.ui.graphics.AndroidShader_androidKt:
+    Removed class androidx.compose.ui.graphics.AndroidShader_androidKt
+RemovedClass: androidx.compose.ui.graphics.DegreesKt:
+    Removed class androidx.compose.ui.graphics.DegreesKt
+RemovedClass: androidx.compose.ui.graphics.Float16Kt:
+    Removed class androidx.compose.ui.graphics.Float16Kt
+RemovedClass: androidx.compose.ui.graphics.drawscope.CanvasDrawScopeKt:
+    Removed class androidx.compose.ui.graphics.drawscope.CanvasDrawScopeKt
+RemovedClass: androidx.compose.ui.graphics.vector.PathNodeKt:
+    Removed class androidx.compose.ui.graphics.vector.PathNodeKt
+
+
+RemovedPackage: androidx.compose.ui.graphics.internal:
+    Removed package androidx.compose.ui.graphics.internal
diff --git a/compose/ui/ui-graphics/api/current.txt b/compose/ui/ui-graphics/api/current.txt
index 358b6e6..d818cd8 100644
--- a/compose/ui/ui-graphics/api/current.txt
+++ b/compose/ui/ui-graphics/api/current.txt
@@ -136,9 +136,6 @@
     method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
   }
 
-  public final class AndroidShader_androidKt {
-  }
-
   public final class AndroidTileMode_androidKt {
     method public static boolean isSupported(int);
     method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
@@ -398,9 +395,6 @@
     property public final float[] values;
   }
 
-  public final class DegreesKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class FilterQuality {
     method public int getValue();
     property public final int value;
@@ -418,9 +412,6 @@
     property public final int None;
   }
 
-  public final class Float16Kt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
     method public int getConfig();
@@ -1141,9 +1132,6 @@
     property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
   }
 
-  public final class CanvasDrawScopeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
     method public void drawContent();
   }
@@ -1268,13 +1256,6 @@
 
 }
 
-package androidx.compose.ui.graphics.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.graphics.painter {
 
   public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
@@ -1620,9 +1601,6 @@
     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);
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b8961c4
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1617 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint(android.graphics.Paint internalPaint);
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    method public static androidx.compose.ui.graphics.Paint toComposePaint(android.graphics.Paint);
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlendMode {
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ClipOp {
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Color {
+    ctor public Color(long value);
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace component5();
+    method public long convert(androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public float getAlpha();
+    method public float getBlue();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public float getGreen();
+    method public float getRed();
+    method public long getValue();
+    property @androidx.compose.runtime.Stable public final float alpha;
+    property @androidx.compose.runtime.Stable public final float blue;
+    property @androidx.compose.runtime.Stable public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property @androidx.compose.runtime.Stable public final float green;
+    property @androidx.compose.runtime.Stable public final float red;
+    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();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    method public long hsl(float hue, float saturation, float lightness, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    method public long hsv(float hue, float saturation, float value, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ColorMatrix {
+    ctor public ColorMatrix(optional float[] values);
+    method public void convertRgbToYuv();
+    method public void convertYuvToRgb();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void reset();
+    method public inline operator void set(int row, int column, float v);
+    method public void set(float[] src);
+    method public void setToRotateBlue(float degrees);
+    method public void setToRotateGreen(float degrees);
+    method public void setToRotateRed(float degrees);
+    method public void setToSaturation(float sat);
+    method public void setToScale(float redScale, float greenScale, float blueScale, float alphaScale);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalGraphicsApi {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class FilterQuality {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ImageBitmapConfig {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Matrix {
+    ctor public Matrix(optional float[] values);
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void invert();
+    method public long map(long point);
+    method public androidx.compose.ui.geometry.Rect map(androidx.compose.ui.geometry.Rect rect);
+    method public void map(androidx.compose.ui.geometry.MutableRect rect);
+    method public void reset();
+    method public void rotateX(float degrees);
+    method public void rotateY(float degrees);
+    method public void rotateZ(float degrees);
+    method public void scale(optional float x, optional float y, optional float z);
+    method public inline operator void set(int row, int column, float v);
+    method public void setFrom(float[] matrix);
+    method public operator void timesAssign(float[] m);
+    method public void translate(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(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PaintingStyle {
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathFillType {
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathOperation {
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PointMode {
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method @Deprecated public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.unit.IntRect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.unit.IntRect toComposeIntRect(android.graphics.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StampedPathEffectStyle {
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeCap {
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeJoin {
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TileMode {
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class VertexMode {
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ColorModel {
+    method public int getComponentCount();
+    property @androidx.compose.runtime.Stable public final int componentCount;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getOklab();
+    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.ColorSpace Oklab;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class RenderIntent {
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long);
+    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 @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
index 39ec0533..b8961c4 100644
--- a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -136,9 +136,6 @@
     method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
   }
 
-  public final class AndroidShader_androidKt {
-  }
-
   public final class AndroidTileMode_androidKt {
     method public static boolean isSupported(int);
     method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
@@ -398,9 +395,6 @@
     property public final float[] values;
   }
 
-  public final class DegreesKt {
-  }
-
   @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalGraphicsApi {
   }
 
@@ -421,9 +415,6 @@
     property public final int None;
   }
 
-  public final class Float16Kt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
     method public int getConfig();
@@ -1144,9 +1135,6 @@
     property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
   }
 
-  public final class CanvasDrawScopeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
     method public void drawContent();
   }
@@ -1271,13 +1259,6 @@
 
 }
 
-package androidx.compose.ui.graphics.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.graphics.painter {
 
   public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
@@ -1623,9 +1604,6 @@
     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);
diff --git a/compose/ui/ui-graphics/api/res-1.4.0-beta01.txt b/compose/ui/ui-graphics/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-graphics/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-graphics/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-graphics/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..63742f0
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,1673 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  @kotlin.PublishedApi internal final class AndroidCanvas implements androidx.compose.ui.graphics.Canvas {
+    ctor public AndroidCanvas();
+    method public void clipPath(androidx.compose.ui.graphics.Path path, int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, float sy);
+    method public void skew(float sx, float sy);
+    method public android.graphics.Region.Op toRegionOp(int);
+    method public void translate(float dx, float dy);
+    field @kotlin.PublishedApi internal android.graphics.Canvas internalCanvas;
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint(android.graphics.Paint internalPaint);
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    method public static androidx.compose.ui.graphics.Paint toComposePaint(android.graphics.Paint);
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlendMode {
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    field @kotlin.PublishedApi internal final androidx.compose.ui.graphics.AndroidCanvas androidCanvas;
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ClipOp {
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Color {
+    ctor public Color(long value);
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace component5();
+    method public long convert(androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public float getAlpha();
+    method public float getBlue();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public float getGreen();
+    method public float getRed();
+    method public long getValue();
+    property @androidx.compose.runtime.Stable public final float alpha;
+    property @androidx.compose.runtime.Stable public final float blue;
+    property @androidx.compose.runtime.Stable public final androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property @androidx.compose.runtime.Stable public final float green;
+    property @androidx.compose.runtime.Stable public final float red;
+    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();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    method public long hsl(float hue, float saturation, float lightness, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    method public long hsv(float hue, float saturation, float value, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ColorMatrix {
+    ctor public ColorMatrix(optional float[] values);
+    method public void convertRgbToYuv();
+    method public void convertYuvToRgb();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void reset();
+    method public inline operator void set(int row, int column, float v);
+    method public void set(float[] src);
+    method public void setToRotateBlue(float degrees);
+    method public void setToRotateGreen(float degrees);
+    method public void setToRotateRed(float degrees);
+    method public void setToSaturation(float sat);
+    method public void setToScale(float redScale, float greenScale, float blueScale, float alphaScale);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+    method @kotlin.PublishedApi internal static float degrees(float radians);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class FilterQuality {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ImageBitmapConfig {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  @kotlin.jvm.JvmInline public final value class Matrix {
+    ctor public Matrix(optional float[] values);
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public void invert();
+    method public long map(long point);
+    method public androidx.compose.ui.geometry.Rect map(androidx.compose.ui.geometry.Rect rect);
+    method public void map(androidx.compose.ui.geometry.MutableRect rect);
+    method public void reset();
+    method public void rotateX(float degrees);
+    method public void rotateY(float degrees);
+    method public void rotateZ(float degrees);
+    method public void scale(optional float x, optional float y, optional float z);
+    method public inline operator void set(int row, int column, float v);
+    method public void setFrom(float[] matrix);
+    method public operator void timesAssign(float[] m);
+    method public void translate(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(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float);
+    method public void setAntiAlias(boolean);
+    method public void setBlendMode(int);
+    method public void setColor(long);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter?);
+    method public void setFilterQuality(int);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect?);
+    method public void setShader(android.graphics.Shader?);
+    method public void setStrokeCap(int);
+    method public void setStrokeJoin(int);
+    method public void setStrokeMiterLimit(float);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PaintingStyle {
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathFillType {
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface PathMeasure {
+    method public float getLength();
+    method public long getPosition(float distance);
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public long getTangent(float distance);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PathOperation {
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class PointMode {
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method @Deprecated public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.unit.IntRect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.unit.IntRect toComposeIntRect(android.graphics.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StampedPathEffectStyle {
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeCap {
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class StrokeJoin {
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TileMode {
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class VertexMode {
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ColorModel {
+    method public int getComponentCount();
+    property @androidx.compose.runtime.Stable public final int componentCount;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getOklab();
+    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.ColorSpace Oklab;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class RenderIntent {
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    field @kotlin.PublishedApi internal final androidx.compose.ui.graphics.drawscope.CanvasDrawScope.DrawParams drawParams;
+  }
+
+  @kotlin.PublishedApi internal static final class CanvasDrawScope.DrawParams {
+    ctor public CanvasDrawScope.DrawParams(optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.graphics.Canvas canvas, optional long size);
+    method public androidx.compose.ui.unit.Density component1();
+    method public androidx.compose.ui.unit.LayoutDirection component2();
+    method public androidx.compose.ui.graphics.Canvas component3();
+    method public long component4-NH-jbRc();
+    method internal boolean equals(Object? other);
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method internal int hashCode();
+    method public void setCanvas(androidx.compose.ui.graphics.Canvas);
+    method public void setDensity(androidx.compose.ui.unit.Density);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection);
+    method public void setSize(long);
+    method internal String toString();
+    property public final androidx.compose.ui.graphics.Canvas canvas;
+    property public final androidx.compose.ui.unit.Density density;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long);
+    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 @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/restricted_current.ignore b/compose/ui/ui-graphics/api/restricted_current.ignore
index ac8aa37..8f7bb6b 100644
--- a/compose/ui/ui-graphics/api/restricted_current.ignore
+++ b/compose/ui/ui-graphics/api/restricted_current.ignore
@@ -3,3 +3,17 @@
     Added method androidx.compose.ui.graphics.PathMeasure.getPosition(float)
 AddedAbstractMethod: androidx.compose.ui.graphics.PathMeasure#getTangent(float):
     Added method androidx.compose.ui.graphics.PathMeasure.getTangent(float)
+
+
+RemovedClass: androidx.compose.ui.graphics.AndroidShader_androidKt:
+    Removed class androidx.compose.ui.graphics.AndroidShader_androidKt
+RemovedClass: androidx.compose.ui.graphics.Float16Kt:
+    Removed class androidx.compose.ui.graphics.Float16Kt
+RemovedClass: androidx.compose.ui.graphics.drawscope.CanvasDrawScopeKt:
+    Removed class androidx.compose.ui.graphics.drawscope.CanvasDrawScopeKt
+RemovedClass: androidx.compose.ui.graphics.vector.PathNodeKt:
+    Removed class androidx.compose.ui.graphics.vector.PathNodeKt
+
+
+RemovedPackage: androidx.compose.ui.graphics.internal:
+    Removed package androidx.compose.ui.graphics.internal
diff --git a/compose/ui/ui-graphics/api/restricted_current.txt b/compose/ui/ui-graphics/api/restricted_current.txt
index 5dbda20..63742f0 100644
--- a/compose/ui/ui-graphics/api/restricted_current.txt
+++ b/compose/ui/ui-graphics/api/restricted_current.txt
@@ -166,9 +166,6 @@
     method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
   }
 
-  public final class AndroidShader_androidKt {
-  }
-
   public final class AndroidTileMode_androidKt {
     method public static boolean isSupported(int);
     method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
@@ -450,9 +447,6 @@
     property public final int None;
   }
 
-  public final class Float16Kt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
     method public int getConfig();
@@ -1197,9 +1191,6 @@
     property public final long size;
   }
 
-  public final class CanvasDrawScopeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
     method public void drawContent();
   }
@@ -1324,13 +1315,6 @@
 
 }
 
-package androidx.compose.ui.graphics.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.graphics.painter {
 
   public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
@@ -1676,9 +1660,6 @@
     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);
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
index 3c33786..109f8b0 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/UiIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class UiIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ComposedModifierDetector.UnnecessaryComposedModifier,
diff --git a/compose/ui/ui-test-junit4/api/1.4.0-beta01.txt b/compose/ui/ui-test-junit4/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..94a0fe4
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.4.0-beta01.txt
@@ -0,0 +1,72 @@
+// 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>);
+    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;
+  }
+
+  @Deprecated public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor @Deprecated public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method @Deprecated 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();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 ComposeNotIdleException extends java.lang.Exception {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+}
+
diff --git a/compose/ui/ui-test-junit4/api/current.ignore b/compose/ui/ui-test-junit4/api/current.ignore
new file mode 100644
index 0000000..06d8a27
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.test.junit4.AndroidSynchronization_androidKt:
+    Removed class androidx.compose.ui.test.junit4.AndroidSynchronization_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.ComposeIdlingResource_androidKt:
+    Removed class androidx.compose.ui.test.junit4.ComposeIdlingResource_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.ComposeRootRegistry_androidKt:
+    Removed class androidx.compose.ui.test.junit4.ComposeRootRegistry_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.EspressoLink_androidKt:
+    Removed class androidx.compose.ui.test.junit4.EspressoLink_androidKt
+
+
+RemovedPackage: androidx.compose.ui.test:
+    Removed package androidx.compose.ui.test
diff --git a/compose/ui/ui-test-junit4/api/current.txt b/compose/ui/ui-test-junit4/api/current.txt
index fa23fb8eb..94a0fe4 100644
--- a/compose/ui/ui-test-junit4/api/current.txt
+++ b/compose/ui/ui-test-junit4/api/current.txt
@@ -1,14 +1,4 @@
 // Signature format: 4.0
-package androidx.compose.ui.test {
-
-  public final class ComposeUiTestKt {
-  }
-
-  public final class ComposeUiTest_androidKt {
-  }
-
-}
-
 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 {
@@ -46,19 +36,10 @@
     method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
   }
 
-  public final class AndroidSynchronization_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
   }
 
-  public final class ComposeIdlingResource_androidKt {
-  }
-
-  public final class ComposeRootRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public androidx.compose.ui.unit.Density getDensity();
@@ -73,9 +54,6 @@
     property public abstract androidx.compose.ui.test.MainTestClock mainClock;
   }
 
-  public final class EspressoLink_androidKt {
-  }
-
   public final class StateRestorationTester {
     ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
     method public void emulateSavedInstanceStateRestore();
diff --git a/compose/ui/ui-test-junit4/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..53f3965
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,140 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  @androidx.compose.ui.test.ExperimentalTestApi public sealed interface AndroidComposeUiTest<A extends androidx.activity.ComponentActivity> extends androidx.compose.ui.test.ComposeUiTest {
+    method public A? getActivity();
+    property public abstract A? activity;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public abstract class AndroidComposeUiTestEnvironment<A extends androidx.activity.ComponentActivity> {
+    ctor public AndroidComposeUiTestEnvironment(optional kotlin.coroutines.CoroutineContext effectContext);
+    method protected abstract A? getActivity();
+    method public final androidx.compose.ui.test.AndroidComposeUiTest<A> getTest();
+    method public final <R> R! runTest(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.AndroidComposeUiTest<A>,? extends R> block);
+    property protected abstract A? activity;
+    property public final androidx.compose.ui.test.AndroidComposeUiTest<A> test;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public sealed interface ComposeUiTest extends androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 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 abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class ComposeUiTestKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void runComposeUiTest(optional kotlin.coroutines.CoroutineContext effectContext, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.ComposeUiTest,? extends kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void waitUntilAtLeastOneExists(androidx.compose.ui.test.ComposeUiTest, androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void waitUntilDoesNotExist(androidx.compose.ui.test.ComposeUiTest, androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void waitUntilExactlyOneExists(androidx.compose.ui.test.ComposeUiTest, androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void waitUntilNodeCount(androidx.compose.ui.test.ComposeUiTest, androidx.compose.ui.test.SemanticsMatcher matcher, int count, optional long timeoutMillis);
+  }
+
+  public final class ComposeUiTest_androidKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static inline <A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.AndroidComposeUiTestEnvironment<A> AndroidComposeUiTestEnvironment(optional kotlin.coroutines.CoroutineContext effectContext, kotlin.jvm.functions.Function0<? extends A> activityProvider);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static <A extends androidx.activity.ComponentActivity> void runAndroidComposeUiTest(Class<A> activityClass, optional kotlin.coroutines.CoroutineContext effectContext, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.AndroidComposeUiTest<A>,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static inline <reified A extends androidx.activity.ComponentActivity> void runAndroidComposeUiTest(optional kotlin.coroutines.CoroutineContext effectContext, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.AndroidComposeUiTest<A>,? extends kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void runComposeUiTest(kotlin.coroutines.CoroutineContext effectContext, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.ComposeUiTest,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void runEmptyComposeUiTest(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.ComposeUiTest,kotlin.Unit> block);
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public final class StateRestorationTester {
+    ctor public StateRestorationTester(androidx.compose.ui.test.ComposeUiTest composeTest);
+    method public void emulateSaveAndRestore();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+}
+
+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);
+    ctor @androidx.compose.ui.test.ExperimentalTestApi public AndroidComposeTestRule(R activityRule, optional kotlin.coroutines.CoroutineContext effectContext, 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>);
+    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);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilAtLeastOneExists(androidx.compose.ui.test.SemanticsMatcher matcher, long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilDoesNotExist(androidx.compose.ui.test.SemanticsMatcher matcher, long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilExactlyOneExists(androidx.compose.ui.test.SemanticsMatcher matcher, long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilNodeCount(androidx.compose.ui.test.SemanticsMatcher matcher, int count, long timeoutMillis);
+    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;
+  }
+
+  @Deprecated public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor @Deprecated public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method @Deprecated 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 @androidx.compose.ui.test.ExperimentalTestApi 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, optional kotlin.coroutines.CoroutineContext effectContext);
+    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 @androidx.compose.ui.test.ExperimentalTestApi public static inline <reified A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A> createAndroidComposeRule(optional kotlin.coroutines.CoroutineContext effectContext);
+    method public static androidx.compose.ui.test.junit4.ComposeContentTestRule createComposeRule();
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.junit4.ComposeContentTestRule createComposeRule(kotlin.coroutines.CoroutineContext effectContext);
+    method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule(optional kotlin.coroutines.CoroutineContext effectContext);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilAtLeastOneExists(androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilDoesNotExist(androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilExactlyOneExists(androidx.compose.ui.test.SemanticsMatcher matcher, optional long timeoutMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void waitUntilNodeCount(androidx.compose.ui.test.SemanticsMatcher matcher, int count, optional long timeoutMillis);
+    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 ComposeNotIdleException extends java.lang.Exception {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+}
+
diff --git a/compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt
index 850087e..53f3965 100644
--- a/compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt
@@ -100,19 +100,10 @@
     method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule(optional kotlin.coroutines.CoroutineContext effectContext);
   }
 
-  public final class AndroidSynchronization_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
   }
 
-  public final class ComposeIdlingResource_androidKt {
-  }
-
-  public final class ComposeRootRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public androidx.compose.ui.unit.Density getDensity();
@@ -131,9 +122,6 @@
     property public abstract androidx.compose.ui.test.MainTestClock mainClock;
   }
 
-  public final class EspressoLink_androidKt {
-  }
-
   public final class StateRestorationTester {
     ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
     method public void emulateSavedInstanceStateRestore();
diff --git a/compose/ui/ui-test-junit4/api/res-1.4.0-beta01.txt b/compose/ui/ui-test-junit4/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-test-junit4/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-test-junit4/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..94a0fe4
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,72 @@
+// 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>);
+    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;
+  }
+
+  @Deprecated public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor @Deprecated public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method @Deprecated 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();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    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 ComposeNotIdleException extends java.lang.Exception {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+}
+
diff --git a/compose/ui/ui-test-junit4/api/restricted_current.ignore b/compose/ui/ui-test-junit4/api/restricted_current.ignore
new file mode 100644
index 0000000..06d8a27
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.test.junit4.AndroidSynchronization_androidKt:
+    Removed class androidx.compose.ui.test.junit4.AndroidSynchronization_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.ComposeIdlingResource_androidKt:
+    Removed class androidx.compose.ui.test.junit4.ComposeIdlingResource_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.ComposeRootRegistry_androidKt:
+    Removed class androidx.compose.ui.test.junit4.ComposeRootRegistry_androidKt
+RemovedClass: androidx.compose.ui.test.junit4.EspressoLink_androidKt:
+    Removed class androidx.compose.ui.test.junit4.EspressoLink_androidKt
+
+
+RemovedPackage: androidx.compose.ui.test:
+    Removed package androidx.compose.ui.test
diff --git a/compose/ui/ui-test-junit4/api/restricted_current.txt b/compose/ui/ui-test-junit4/api/restricted_current.txt
index fa23fb8eb..94a0fe4 100644
--- a/compose/ui/ui-test-junit4/api/restricted_current.txt
+++ b/compose/ui/ui-test-junit4/api/restricted_current.txt
@@ -1,14 +1,4 @@
 // Signature format: 4.0
-package androidx.compose.ui.test {
-
-  public final class ComposeUiTestKt {
-  }
-
-  public final class ComposeUiTest_androidKt {
-  }
-
-}
-
 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 {
@@ -46,19 +36,10 @@
     method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
   }
 
-  public final class AndroidSynchronization_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
     method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
   }
 
-  public final class ComposeIdlingResource_androidKt {
-  }
-
-  public final class ComposeRootRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public androidx.compose.ui.unit.Density getDensity();
@@ -73,9 +54,6 @@
     property public abstract androidx.compose.ui.test.MainTestClock mainClock;
   }
 
-  public final class EspressoLink_androidKt {
-  }
-
   public final class StateRestorationTester {
     ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
     method public void emulateSavedInstanceStateRestore();
diff --git a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
index 5879da0b..a0b10da 100644
--- a/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
+++ b/compose/ui/ui-test-manifest-lint/src/main/java/androidx/compose/ui/test/manifest/lint/TestManifestIssueRegistry.kt
@@ -21,7 +21,7 @@
 import com.android.tools.lint.detector.api.CURRENT_API
 
 class TestManifestIssueRegistry : IssueRegistry() {
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(GradleDebugConfigurationDetector.ISSUE)
     override val vendor = Vendor(
diff --git a/compose/ui/ui-test-manifest/api/1.4.0-beta01.txt b/compose/ui/ui-test-manifest/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/res-1.4.0-beta01.txt b/compose/ui/ui-test-manifest/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/integration-tests/testapp/OWNERS b/compose/ui/ui-test-manifest/integration-tests/testapp/OWNERS
index b2c0d56..3ac1d26 100644
--- a/compose/ui/ui-test-manifest/integration-tests/testapp/OWNERS
+++ b/compose/ui/ui-test-manifest/integration-tests/testapp/OWNERS
@@ -1 +1,2 @@
+# Bug component: 1070768
 jellefresen@google.com
diff --git a/compose/ui/ui-test/api/1.4.0-beta01.txt b/compose/ui/ui-test/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..ae53863
--- /dev/null
+++ b/compose/ui/ui-test/api/1.4.0-beta01.txt
@@ -0,0 +1,352 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class 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 AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void touch(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 TestContext {
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public default void moveTo(int pointerId, long position, optional long delayMillis);
+    method public default void moveTo(long position, optional long delayMillis);
+    method public void up(optional int pointerId);
+    method public default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/current.ignore b/compose/ui/ui-test/api/current.ignore
new file mode 100644
index 0000000..eb44141
--- /dev/null
+++ b/compose/ui/ui-test/api/current.ignore
@@ -0,0 +1,31 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.test.Actions_androidKt:
+    Removed class androidx.compose.ui.test.Actions_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidAssertions_androidKt:
+    Removed class androidx.compose.ui.test.AndroidAssertions_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidInputDispatcher_androidKt:
+    Removed class androidx.compose.ui.test.AndroidInputDispatcher_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidOutput_androidKt:
+    Removed class androidx.compose.ui.test.AndroidOutput_androidKt
+RemovedClass: androidx.compose.ui.test.ErrorMessagesKt:
+    Removed class androidx.compose.ui.test.ErrorMessagesKt
+RemovedClass: androidx.compose.ui.test.Expect_jvmKt:
+    Removed class androidx.compose.ui.test.Expect_jvmKt
+RemovedClass: androidx.compose.ui.test.KeyInjectionScopeKt:
+    Removed class androidx.compose.ui.test.KeyInjectionScopeKt
+RemovedClass: androidx.compose.ui.test.MouseInjectionScopeKt:
+    Removed class androidx.compose.ui.test.MouseInjectionScopeKt
+RemovedClass: androidx.compose.ui.test.SemanticsSelectorKt:
+    Removed class androidx.compose.ui.test.SemanticsSelectorKt
+RemovedClass: androidx.compose.ui.test.TestMonotonicFrameClock_jvmKt:
+    Removed class androidx.compose.ui.test.TestMonotonicFrameClock_jvmKt
+RemovedClass: androidx.compose.ui.test.TestOwnerKt:
+    Removed class androidx.compose.ui.test.TestOwnerKt
+RemovedClass: androidx.compose.ui.test.UtilsKt:
+    Removed class androidx.compose.ui.test.UtilsKt
+
+
+RemovedPackage: androidx.compose.ui.test.android:
+    Removed package androidx.compose.ui.test.android
+RemovedPackage: androidx.compose.ui.test.internal:
+    Removed package androidx.compose.ui.test.internal
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index bd6bf9d..ae53863 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -16,22 +16,10 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
-  public final class Actions_androidKt {
-  }
-
-  public final class AndroidAssertions_androidKt {
-  }
-
   public final class AndroidImageHelpers_androidKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
   }
 
-  public final class AndroidInputDispatcher_androidKt {
-  }
-
-  public final class AndroidOutput_androidKt {
-  }
-
   public final class AssertionsKt {
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
@@ -79,12 +67,6 @@
     ctor public ComposeTimeoutException(String? message);
   }
 
-  public final class ErrorMessagesKt {
-  }
-
-  public final class Expect_jvmKt {
-  }
-
   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);
@@ -234,9 +216,6 @@
     property public default int width;
   }
 
-  public final class KeyInjectionScopeKt {
-  }
-
   public final class KeyInputHelpersKt {
     method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
   }
@@ -252,9 +231,6 @@
     property public abstract long currentTime;
   }
 
-  public final class MouseInjectionScopeKt {
-  }
-
   public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
     method public void touch(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
@@ -333,18 +309,9 @@
     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);
@@ -381,22 +348,5 @@
     method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
   }
 
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.ui.test.android {
-
-  public final class WindowCapture_androidKt {
-  }
-
-}
-
-package androidx.compose.ui.test.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-test/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-test/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..625ea2f
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,496 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performKeyInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performMouseInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MouseInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performRotaryScrollInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.RotaryInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class 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 AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  @kotlin.RequiresOptIn(message="This testing API is experimental and is likely to be changed or removed entirely") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalTestApi {
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void advanceEventTime(androidx.compose.ui.test.GestureScope, long durationMillis);
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeDown(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeLeft(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeRight(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeUp(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  @kotlin.RequiresOptIn(message="This is internal API for Compose modules that may change frequently and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface InternalTestApi {
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi @kotlin.jvm.JvmDefaultWithCompatibility public interface KeyInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public boolean isCapsLockOn();
+    method public boolean isKeyDown(long key);
+    method public boolean isNumLockOn();
+    method public boolean isScrollLockOn();
+    method public void keyDown(long key);
+    method public void keyUp(long key);
+    property public abstract boolean isCapsLockOn;
+    property public abstract boolean isNumLockOn;
+    property public abstract boolean isScrollLockOn;
+  }
+
+  public final class KeyInjectionScopeKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static boolean isAltDown(androidx.compose.ui.test.KeyInjectionScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static boolean isCtrlDown(androidx.compose.ui.test.KeyInjectionScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static boolean isFnDown(androidx.compose.ui.test.KeyInjectionScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static boolean isMetaDown(androidx.compose.ui.test.KeyInjectionScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static boolean isShiftDown(androidx.compose.ui.test.KeyInjectionScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void pressKey(androidx.compose.ui.test.KeyInjectionScope, long key, optional long pressDurationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void withKeyDown(androidx.compose.ui.test.KeyInjectionScope, long key, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void withKeyToggled(androidx.compose.ui.test.KeyInjectionScope, long key, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void withKeysDown(androidx.compose.ui.test.KeyInjectionScope, java.util.List<androidx.compose.ui.input.key.Key> keys, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void withKeysToggled(androidx.compose.ui.test.KeyInjectionScope, java.util.List<androidx.compose.ui.input.key.Key> keys, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi @kotlin.jvm.JvmInline public final value class MouseButton {
+    ctor public MouseButton(int buttonId);
+    method public int getButtonId();
+    property public final int buttonId;
+    field public static final androidx.compose.ui.test.MouseButton.Companion Companion;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public static final class MouseButton.Companion {
+    method public int getPrimary();
+    method public int getSecondary();
+    method public int getTertiary();
+    property public final int Primary;
+    property public final int Secondary;
+    property public final int Tertiary;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public interface MouseInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public void enter(optional long position, optional long delayMillis);
+    method public void exit(optional long position, optional long delayMillis);
+    method public long getCurrentPosition();
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public void moveTo(long position, optional long delayMillis);
+    method public void press(optional int button);
+    method public void release(optional int button);
+    method public void scroll(float delta, optional int scrollWheel);
+    method public default void updatePointerBy(long delta);
+    method public void updatePointerTo(long position);
+    property public abstract long currentPosition;
+  }
+
+  public final class MouseInjectionScopeKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateAlong(androidx.compose.ui.test.MouseInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateBy(androidx.compose.ui.test.MouseInjectionScope, long delta, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateTo(androidx.compose.ui.test.MouseInjectionScope, long position, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void click(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void doubleClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void dragAndDrop(androidx.compose.ui.test.MouseInjectionScope, long start, long end, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void longClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void rightClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void smoothScroll(androidx.compose.ui.test.MouseInjectionScope, float scrollAmount, optional long durationMillis, optional int scrollWheel);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void tripleClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method @androidx.compose.ui.test.ExperimentalTestApi public void key(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.KeyInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void mouse(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MouseInjectionScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void rotary(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.RotaryInjectionScope,kotlin.Unit> block);
+    method public void touch(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class OutputKt {
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteraction, String tag, optional int maxDepth);
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteractionCollection, String tag, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteraction, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteractionCollection, optional int maxDepth);
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public interface RotaryInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void rotateToScrollHorizontally(float horizontalScrollPixels);
+    method public void rotateToScrollVertically(float verticalScrollPixels);
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi @kotlin.jvm.JvmInline public final value class ScrollWheel {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.test.ScrollWheel.Companion Companion;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public static final class ScrollWheel.Companion {
+    method public int getHorizontal();
+    method public int getVertical();
+    property public final int Horizontal;
+    property public final int Vertical;
+  }
+
+  public final class SelectionResult {
+    ctor public SelectionResult(java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes, optional String? customErrorOnNoMatch);
+    method public String? getCustomErrorOnNoMatch();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getSelectedNodes();
+    property public final String? customErrorOnNoMatch;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes;
+  }
+
+  public final class SelectorsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection filter(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction filterToOne(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAncestors(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChild(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChildAt(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onChildren(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onFirst(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onLast(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onParent(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onSibling(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onSiblings(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class SemanticsMatcher {
+    ctor public SemanticsMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsNode,java.lang.Boolean> matcher);
+    method public infix androidx.compose.ui.test.SemanticsMatcher and(androidx.compose.ui.test.SemanticsMatcher other);
+    method public String getDescription();
+    method public boolean matches(androidx.compose.ui.semantics.SemanticsNode node);
+    method public boolean matchesAny(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes);
+    method public operator androidx.compose.ui.test.SemanticsMatcher not();
+    method public infix androidx.compose.ui.test.SemanticsMatcher or(androidx.compose.ui.test.SemanticsMatcher other);
+    property public final String description;
+    field public static final androidx.compose.ui.test.SemanticsMatcher.Companion Companion;
+  }
+
+  public static final class SemanticsMatcher.Companion {
+    method public <T> androidx.compose.ui.test.SemanticsMatcher expectValue(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? expectedValue);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyIsDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyNotDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public final class SemanticsNodeInteraction {
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public void assertDoesNotExist();
+    method public androidx.compose.ui.test.SemanticsNodeInteraction assertExists(optional String? errorMessageOnFail);
+    method public androidx.compose.ui.semantics.SemanticsNode fetchSemanticsNode(optional String? errorMessageOnFail);
+  }
+
+  public final class SemanticsNodeInteractionCollection {
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> fetchSemanticsNodes(optional boolean atLeastOneRootRequired, optional String? errorMessageOnFail);
+    method public operator androidx.compose.ui.test.SemanticsNodeInteraction get(int index);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 TestContext {
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi @kotlinx.coroutines.ExperimentalCoroutinesApi public final class TestMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public TestMonotonicFrameClock(kotlinx.coroutines.CoroutineScope coroutineScope, optional long frameDelayNanos, optional kotlin.jvm.functions.Function1<? super java.lang.Long,kotlin.Unit> onPerformTraversals);
+    method @androidx.compose.ui.test.ExperimentalTestApi public kotlin.coroutines.ContinuationInterceptor getContinuationInterceptor();
+    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>);
+    property @androidx.compose.ui.test.ExperimentalTestApi public final kotlin.coroutines.ContinuationInterceptor continuationInterceptor;
+    property public final long frameDelayNanos;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static long getFrameDelayMillis(androidx.compose.ui.test.TestMonotonicFrameClock);
+  }
+
+  @androidx.compose.ui.test.InternalTestApi public interface TestOwner {
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public java.util.Set<androidx.compose.ui.node.RootForTest> getRoots(boolean atLeastOneRootExpected);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void sendImeAction(androidx.compose.ui.semantics.SemanticsNode node, int actionSpecified);
+    method public void sendTextInputCommand(androidx.compose.ui.semantics.SemanticsNode node, java.util.List<? extends androidx.compose.ui.text.input.EditCommand> command);
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class TestOwnerKt {
+    method @androidx.compose.ui.test.InternalTestApi public static androidx.compose.ui.test.TestContext createTestContext(androidx.compose.ui.test.TestOwner owner);
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void performTextInputSelection(androidx.compose.ui.test.SemanticsNodeInteraction, long selection);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public default void moveTo(int pointerId, long position, optional long delayMillis);
+    method public default void moveTo(long position, optional long delayMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public default void moveWithHistory(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<androidx.compose.ui.geometry.Offset> historicalCoordinates, optional long delayMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void moveWithHistoryMultiPointer(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<? extends java.util.List<androidx.compose.ui.geometry.Offset>> historicalCoordinates, optional long delayMillis);
+    method public void up(optional int pointerId);
+    method public default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void multiTouchSwipe(androidx.compose.ui.test.TouchInjectionScope, java.util.List<? extends kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset>> curves, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+}
+
+package androidx.compose.ui.test.internal {
+
+  @androidx.compose.ui.test.InternalTestApi public abstract class DelayPropagatingContinuationInterceptorWrapper extends kotlin.coroutines.AbstractCoroutineContextElement implements kotlin.coroutines.ContinuationInterceptor kotlinx.coroutines.Delay {
+    ctor public DelayPropagatingContinuationInterceptorWrapper(kotlin.coroutines.ContinuationInterceptor? wrappedInterceptor);
+  }
+
+}
+
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 b8e19f7..625ea2f 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -19,22 +19,10 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
-  public final class Actions_androidKt {
-  }
-
-  public final class AndroidAssertions_androidKt {
-  }
-
   public final class AndroidImageHelpers_androidKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
   }
 
-  public final class AndroidInputDispatcher_androidKt {
-  }
-
-  public final class AndroidOutput_androidKt {
-  }
-
   public final class AssertionsKt {
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
@@ -82,12 +70,6 @@
     ctor public ComposeTimeoutException(String? message);
   }
 
-  public final class ErrorMessagesKt {
-  }
-
-  public final class Expect_jvmKt {
-  }
-
   @kotlin.RequiresOptIn(message="This testing API is experimental and is likely to be changed or removed entirely") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalTestApi {
   }
 
@@ -431,9 +413,6 @@
     property public final String description;
   }
 
-  public final class SemanticsSelectorKt {
-  }
-
   public final class TestContext {
   }
 
@@ -505,16 +484,6 @@
     method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
   }
 
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.ui.test.android {
-
-  public final class WindowCapture_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.test.internal {
@@ -523,8 +492,5 @@
     ctor public DelayPropagatingContinuationInterceptorWrapper(kotlin.coroutines.ContinuationInterceptor? wrappedInterceptor);
   }
 
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-test/api/res-1.4.0-beta01.txt b/compose/ui/ui-test/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-test/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-test/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..8264e10
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,353 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class 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 AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+    field @Deprecated @kotlin.PublishedApi internal final androidx.compose.ui.test.MultiModalInjectionScope delegateScope;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void touch(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 TestContext {
+  }
+
+  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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public default void moveTo(int pointerId, long position, optional long delayMillis);
+    method public default void moveTo(long position, optional long delayMillis);
+    method public void up(optional int pointerId);
+    method public default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/restricted_current.ignore b/compose/ui/ui-test/api/restricted_current.ignore
new file mode 100644
index 0000000..eb44141
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_current.ignore
@@ -0,0 +1,31 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.test.Actions_androidKt:
+    Removed class androidx.compose.ui.test.Actions_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidAssertions_androidKt:
+    Removed class androidx.compose.ui.test.AndroidAssertions_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidInputDispatcher_androidKt:
+    Removed class androidx.compose.ui.test.AndroidInputDispatcher_androidKt
+RemovedClass: androidx.compose.ui.test.AndroidOutput_androidKt:
+    Removed class androidx.compose.ui.test.AndroidOutput_androidKt
+RemovedClass: androidx.compose.ui.test.ErrorMessagesKt:
+    Removed class androidx.compose.ui.test.ErrorMessagesKt
+RemovedClass: androidx.compose.ui.test.Expect_jvmKt:
+    Removed class androidx.compose.ui.test.Expect_jvmKt
+RemovedClass: androidx.compose.ui.test.KeyInjectionScopeKt:
+    Removed class androidx.compose.ui.test.KeyInjectionScopeKt
+RemovedClass: androidx.compose.ui.test.MouseInjectionScopeKt:
+    Removed class androidx.compose.ui.test.MouseInjectionScopeKt
+RemovedClass: androidx.compose.ui.test.SemanticsSelectorKt:
+    Removed class androidx.compose.ui.test.SemanticsSelectorKt
+RemovedClass: androidx.compose.ui.test.TestMonotonicFrameClock_jvmKt:
+    Removed class androidx.compose.ui.test.TestMonotonicFrameClock_jvmKt
+RemovedClass: androidx.compose.ui.test.TestOwnerKt:
+    Removed class androidx.compose.ui.test.TestOwnerKt
+RemovedClass: androidx.compose.ui.test.UtilsKt:
+    Removed class androidx.compose.ui.test.UtilsKt
+
+
+RemovedPackage: androidx.compose.ui.test.android:
+    Removed package androidx.compose.ui.test.android
+RemovedPackage: androidx.compose.ui.test.internal:
+    Removed package androidx.compose.ui.test.internal
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index 1cb6dfa..8264e10 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -16,22 +16,10 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
-  public final class Actions_androidKt {
-  }
-
-  public final class AndroidAssertions_androidKt {
-  }
-
   public final class AndroidImageHelpers_androidKt {
     method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
   }
 
-  public final class AndroidInputDispatcher_androidKt {
-  }
-
-  public final class AndroidOutput_androidKt {
-  }
-
   public final class AssertionsKt {
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
@@ -79,12 +67,6 @@
     ctor public ComposeTimeoutException(String? message);
   }
 
-  public final class ErrorMessagesKt {
-  }
-
-  public final class Expect_jvmKt {
-  }
-
   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);
@@ -235,9 +217,6 @@
     property public default int width;
   }
 
-  public final class KeyInjectionScopeKt {
-  }
-
   public final class KeyInputHelpersKt {
     method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
   }
@@ -253,9 +232,6 @@
     property public abstract long currentTime;
   }
 
-  public final class MouseInjectionScopeKt {
-  }
-
   public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
     method public void touch(kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
@@ -334,18 +310,9 @@
     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);
@@ -382,22 +349,5 @@
     method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
   }
 
-  public final class UtilsKt {
-  }
-
-}
-
-package androidx.compose.ui.test.android {
-
-  public final class WindowCapture_androidKt {
-  }
-
-}
-
-package androidx.compose.ui.test.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-text-google-fonts/api/1.4.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/1.4.0-beta01.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class GoogleFont {
+    ctor public GoogleFont(String name, optional boolean bestEffort);
+    method public boolean getBestEffort();
+    method public String getName();
+    property public final boolean bestEffort;
+    property public final String name;
+  }
+
+  public static final class GoogleFont.Provider {
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, java.util.List<? extends java.util.List<byte[]>> certificates);
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, @ArrayRes int certificates);
+  }
+
+  public final class GoogleFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(androidx.compose.ui.text.googlefonts.GoogleFont googleFont, androidx.compose.ui.text.googlefonts.GoogleFont.Provider fontProvider, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @WorkerThread public static boolean isAvailableOnDevice(androidx.compose.ui.text.googlefonts.GoogleFont.Provider, android.content.Context context);
+  }
+
+}
+
diff --git a/compose/ui/ui-text-google-fonts/api/current.ignore b/compose/ui/ui-text-google-fonts/api/current.ignore
new file mode 100644
index 0000000..9c78ac5
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.text.googlefonts.FontProviderHelperKt:
+    Removed class androidx.compose.ui.text.googlefonts.FontProviderHelperKt
diff --git a/compose/ui/ui-text-google-fonts/api/current.txt b/compose/ui/ui-text-google-fonts/api/current.txt
index 5bcabac..b93d5c2 100644
--- a/compose/ui/ui-text-google-fonts/api/current.txt
+++ b/compose/ui/ui-text-google-fonts/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text.googlefonts {
 
-  public final class FontProviderHelperKt {
-  }
-
   public final class GoogleFont {
     ctor public GoogleFont(String name, optional boolean bestEffort);
     method public boolean getBestEffort();
diff --git a/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class GoogleFont {
+    ctor public GoogleFont(String name, optional boolean bestEffort);
+    method public boolean getBestEffort();
+    method public String getName();
+    property public final boolean bestEffort;
+    property public final String name;
+  }
+
+  public static final class GoogleFont.Provider {
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, java.util.List<? extends java.util.List<byte[]>> certificates);
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, @ArrayRes int certificates);
+  }
+
+  public final class GoogleFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(androidx.compose.ui.text.googlefonts.GoogleFont googleFont, androidx.compose.ui.text.googlefonts.GoogleFont.Provider fontProvider, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @WorkerThread public static boolean isAvailableOnDevice(androidx.compose.ui.text.googlefonts.GoogleFont.Provider, android.content.Context context);
+  }
+
+}
+
diff --git a/compose/ui/ui-text-google-fonts/api/public_plus_experimental_current.txt b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_current.txt
index 5bcabac..b93d5c2 100644
--- a/compose/ui/ui-text-google-fonts/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text-google-fonts/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text.googlefonts {
 
-  public final class FontProviderHelperKt {
-  }
-
   public final class GoogleFont {
     ctor public GoogleFont(String name, optional boolean bestEffort);
     method public boolean getBestEffort();
diff --git a/compose/ui/ui-text-google-fonts/api/res-1.4.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-text-google-fonts/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-text-google-fonts/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..b93d5c2
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.compose.ui.text.googlefonts {
+
+  public final class GoogleFont {
+    ctor public GoogleFont(String name, optional boolean bestEffort);
+    method public boolean getBestEffort();
+    method public String getName();
+    property public final boolean bestEffort;
+    property public final String name;
+  }
+
+  public static final class GoogleFont.Provider {
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, java.util.List<? extends java.util.List<byte[]>> certificates);
+    ctor public GoogleFont.Provider(String providerAuthority, String providerPackage, @ArrayRes int certificates);
+  }
+
+  public final class GoogleFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(androidx.compose.ui.text.googlefonts.GoogleFont googleFont, androidx.compose.ui.text.googlefonts.GoogleFont.Provider fontProvider, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @WorkerThread public static boolean isAvailableOnDevice(androidx.compose.ui.text.googlefonts.GoogleFont.Provider, android.content.Context context);
+  }
+
+}
+
diff --git a/compose/ui/ui-text-google-fonts/api/restricted_current.ignore b/compose/ui/ui-text-google-fonts/api/restricted_current.ignore
new file mode 100644
index 0000000..9c78ac5
--- /dev/null
+++ b/compose/ui/ui-text-google-fonts/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.text.googlefonts.FontProviderHelperKt:
+    Removed class androidx.compose.ui.text.googlefonts.FontProviderHelperKt
diff --git a/compose/ui/ui-text-google-fonts/api/restricted_current.txt b/compose/ui/ui-text-google-fonts/api/restricted_current.txt
index 5bcabac..b93d5c2 100644
--- a/compose/ui/ui-text-google-fonts/api/restricted_current.txt
+++ b/compose/ui/ui-text-google-fonts/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text.googlefonts {
 
-  public final class FontProviderHelperKt {
-  }
-
   public final class GoogleFont {
     ctor public GoogleFont(String name, optional boolean bestEffort);
     method public boolean getBestEffort();
diff --git a/compose/ui/ui-text/api/1.4.0-beta01.txt b/compose/ui/ui-text/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..1d00051
--- /dev/null
+++ b/compose/ui/ui-text/api/1.4.0-beta01.txt
@@ -0,0 +1,1414 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class AndroidTextStyle_androidKt {
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
+  }
+
+  @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 public boolean hasStringAnnotations(String tag, int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder implements java.lang.Appendable {
+    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 androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text, int start, int end);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public void append(androidx.compose.ui.text.AnnotatedString text, int start, int end);
+    method @Deprecated public void deprecated_append_returning_void(char char);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  @kotlin.jvm.JvmInline public final value class EmojiSupportMatch {
+    field public static final androidx.compose.ui.text.EmojiSupportMatch.Companion Companion;
+  }
+
+  public static final class EmojiSupportMatch.Companion {
+    method public int getDefault();
+    method public int getNone();
+    property public final int Default;
+    property public final int None;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor @Deprecated 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);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final int maxLines;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.compose.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver);
+    ctor @Deprecated 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 boolean hasStaleResolvedFonts;
+    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 sealed 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, boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, 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 default boolean getHasStaleResolvedFonts();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public default boolean hasStaleResolvedFonts;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method @Deprecated 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);
+    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.FontFamily.Resolver fontFamilyResolver);
+  }
+
+  public final class ParagraphKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PlaceholderVerticalAlign {
+    field public static final androidx.compose.ui.text.PlaceholderVerticalAlign.Companion Companion;
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class PlatformParagraphStyle {
+    ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
+    ctor @Deprecated public PlatformParagraphStyle(optional int emojiSupportMatch, optional boolean includeFontPadding);
+    ctor public PlatformParagraphStyle(optional int emojiSupportMatch);
+    method public int getEmojiSupportMatch();
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    property public final int emojiSupportMatch;
+    property @Deprecated public final boolean includeFontPadding;
+    field public static final androidx.compose.ui.text.PlatformParagraphStyle.Companion Companion;
+  }
+
+  public static final class PlatformParagraphStyle.Companion {
+    method public androidx.compose.ui.text.PlatformParagraphStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
+  }
+
+  public final class PlatformSpanStyle {
+    ctor public PlatformSpanStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
+    field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
+  }
+
+  public static final class PlatformSpanStyle.Companion {
+    method public androidx.compose.ui.text.PlatformSpanStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformSpanStyle Default;
+  }
+
+  public final class PlatformTextStyle {
+    ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
+    ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
+    ctor public PlatformTextStyle(int emojiSupportMatch);
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getSpanStyle();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
+    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.text.PlatformSpanStyle? platformStyle;
+    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 TextLayoutInput {
+    ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
+    method @Deprecated public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method @Deprecated 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.text.font.FontFamily.Resolver fontFamilyResolver;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property @Deprecated public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  public final class 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 @kotlin.jvm.JvmInline public final value class TextRange {
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public boolean getReversed();
+    method public int getStart();
+    method public boolean intersects(long other);
+    property public final boolean collapsed;
+    property public final int end;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+    property public final boolean reversed;
+    property public final int start;
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
+    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 public boolean hasSameLayoutAffectingAttributes(androidx.compose.ui.text.TextStyle other);
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
+    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.font {
+
+  public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
+    ctor public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader, androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    ctor @Deprecated public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader);
+    method public final int getLoadingStrategy();
+    method public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader getTypefaceLoader();
+    method public final androidx.compose.ui.text.font.FontVariation.Settings getVariationSettings();
+    property public final int loadingStrategy;
+    property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+    property public final androidx.compose.ui.text.font.FontVariation.Settings variationSettings;
+  }
+
+  public static interface AndroidFont.TypefaceLoader {
+    method public suspend Object? awaitLoad(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font, kotlin.coroutines.Continuation<? super android.graphics.Typeface>);
+    method public android.graphics.Typeface? loadBlocking(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font);
+  }
+
+  public final class AndroidFontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(String path, android.content.res.AssetManager assetManager, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public final class DelegatingFontLoaderForDeprecatedUsage_androidKt {
+    method @Deprecated public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(androidx.compose.ui.text.font.Font.ResourceLoader fontResourceLoader, android.content.Context context);
+  }
+
+  @kotlin.jvm.JvmInline public final value class DeviceFontFamilyName {
+    ctor public DeviceFontFamilyName(String name);
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class DeviceFontFamilyNameFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(String familyName, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public default int getLoadingStrategy();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public default int loadingStrategy;
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  public static final class Font.Companion {
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  @Deprecated public static interface Font.ResourceLoader {
+    method @Deprecated public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method @Deprecated public final boolean getCanLoadSynchronously();
+    property @Deprecated 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 static sealed interface FontFamily.Resolver {
+    method public suspend Object? preload(androidx.compose.ui.text.font.FontFamily fontFamily, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.runtime.State<java.lang.Object> resolve(optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  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 FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
+    method public static androidx.compose.runtime.State<android.graphics.Typeface> resolveAsTypeface(androidx.compose.ui.text.font.FontFamily.Resolver, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontLoadingStrategy.Companion Companion;
+  }
+
+  public static final class FontLoadingStrategy.Companion {
+    method public int getAsync();
+    method public int getBlocking();
+    method public int getOptionalLocal();
+    property public final int Async;
+    property public final int Blocking;
+    property public final int OptionalLocal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontStyle {
+    ctor public FontStyle(int value);
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontSynthesis {
+    field public static final androidx.compose.ui.text.font.FontSynthesis.Companion Companion;
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  public final class FontVariation {
+    method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
+    method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public androidx.compose.ui.text.font.FontVariation.Setting grade(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting italic(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting opticalSizing(long textSize);
+    method public androidx.compose.ui.text.font.FontVariation.Setting slant(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting weight(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting width(float value);
+    field public static final androidx.compose.ui.text.font.FontVariation INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static sealed interface FontVariation.Setting {
+    method public String getAxisName();
+    method public boolean getNeedsDensity();
+    method public float toVariationValue(androidx.compose.ui.unit.Density? density);
+    property public abstract String axisName;
+    property public abstract boolean needsDensity;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class FontVariation.Settings {
+    ctor public FontVariation.Settings(androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> getSettings();
+    property public final java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> settings;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method public int getResId();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ImeAction {
+    field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardCapitalization {
+    field public static final androidx.compose.ui.text.input.KeyboardCapitalization.Companion Companion;
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardType {
+    field public static final androidx.compose.ui.text.input.KeyboardType.Companion Companion;
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getDecimal();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Decimal;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method @Deprecated public final void hideSoftwareKeyboard();
+    method @Deprecated 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 {
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  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 @kotlin.jvm.JvmInline public final value class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float getMultiplier();
+    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();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class Hyphens {
+    field public static final androidx.compose.ui.text.style.Hyphens.Companion Companion;
+  }
+
+  public static final class Hyphens.Companion {
+    method public int getAuto();
+    method public int getNone();
+    property public final int Auto;
+    property public final int None;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LineBreak {
+    ctor public LineBreak(int strategy, int strictness, int wordBreak);
+    method public int copy(optional int strategy, optional int strictness, optional int wordBreak);
+    method public int getStrategy();
+    method public int getStrictness();
+    method public int getWordBreak();
+    property public final int strategy;
+    property public final int strictness;
+    property public final int wordBreak;
+    field public static final androidx.compose.ui.text.style.LineBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.Companion {
+    method public int getHeading();
+    method public int getParagraph();
+    method public int getSimple();
+    property public final int Heading;
+    property public final int Paragraph;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strategy {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strategy.Companion Companion;
+  }
+
+  public static final class LineBreak.Strategy.Companion {
+    method public int getBalanced();
+    method public int getHighQuality();
+    method public int getSimple();
+    property public final int Balanced;
+    property public final int HighQuality;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strictness {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strictness.Companion Companion;
+  }
+
+  public static final class LineBreak.Strictness.Companion {
+    method public int getDefault();
+    method public int getLoose();
+    method public int getNormal();
+    method public int getStrict();
+    property public final int Default;
+    property public final int Loose;
+    property public final int Normal;
+    property public final int Strict;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.WordBreak {
+    field public static final androidx.compose.ui.text.style.LineBreak.WordBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.WordBreak.Companion {
+    method public int getDefault();
+    method public int getPhrase();
+    property public final int Default;
+    property public final int Phrase;
+  }
+
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
+    method public int getTrim();
+    property public final float alignment;
+    property public final int trim;
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Alignment.Companion {
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
+  }
+
+  public static final class LineHeightStyle.Companion {
+    method public androidx.compose.ui.text.style.LineHeightStyle getDefault();
+    property public final androidx.compose.ui.text.style.LineHeightStyle Default;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Trim.Companion {
+    method public int getBoth();
+    method public int getFirstLineTop();
+    method public int getLastLineBottom();
+    method public int getNone();
+    property public final int Both;
+    property public final int FirstLineTop;
+    property public final int LastLineBottom;
+    property public final int None;
+  }
+
+  public enum ResolvedTextDirection {
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection[] values();
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextAlign {
+    field public static final androidx.compose.ui.text.style.TextAlign.Companion Companion;
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public 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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextDirection {
+    field public static final androidx.compose.ui.text.style.TextDirection.Companion Companion;
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextOverflow {
+    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/current.ignore b/compose/ui/ui-text/api/current.ignore
index 24501fb..8b45dbb 100644
--- a/compose/ui/ui-text/api/current.ignore
+++ b/compose/ui/ui-text/api/current.ignore
@@ -1,3 +1,75 @@
 // Baseline format: 1.0
 ChangedType: androidx.compose.ui.text.AnnotatedString.Builder#append(char):
     Method androidx.compose.ui.text.AnnotatedString.Builder.append has changed return type from void to androidx.compose.ui.text.AnnotatedString.Builder
+
+
+RemovedClass: androidx.compose.ui.text.ActualAtomicReferenceJvmKt:
+    Removed class androidx.compose.ui.text.ActualAtomicReferenceJvmKt
+RemovedClass: androidx.compose.ui.text.AndroidParagraph_androidKt:
+    Removed class androidx.compose.ui.text.AndroidParagraph_androidKt
+RemovedClass: androidx.compose.ui.text.JvmAnnotatedString_jvmKt:
+    Removed class androidx.compose.ui.text.JvmAnnotatedString_jvmKt
+RemovedClass: androidx.compose.ui.text.JvmCharHelpers_androidKt:
+    Removed class androidx.compose.ui.text.JvmCharHelpers_androidKt
+RemovedClass: androidx.compose.ui.text.MultiParagraphIntrinsicsKt:
+    Removed class androidx.compose.ui.text.MultiParagraphIntrinsicsKt
+RemovedClass: androidx.compose.ui.text.MultiParagraphKt:
+    Removed class androidx.compose.ui.text.MultiParagraphKt
+RemovedClass: androidx.compose.ui.text.SaversKt:
+    Removed class androidx.compose.ui.text.SaversKt
+RemovedClass: androidx.compose.ui.text.TempListUtilsKt:
+    Removed class androidx.compose.ui.text.TempListUtilsKt
+RemovedClass: androidx.compose.ui.text.TextMeasurerKt:
+    Removed class androidx.compose.ui.text.TextMeasurerKt
+RemovedClass: androidx.compose.ui.text.TextPainterKt:
+    Removed class androidx.compose.ui.text.TextPainterKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontLoader_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontLoader_androidKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontResolveInterceptor_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontResolveInterceptor_androidKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontUtils_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontUtils_androidKt
+RemovedClass: androidx.compose.ui.text.font.FontFamilyResolverKt:
+    Removed class androidx.compose.ui.text.font.FontFamilyResolverKt
+RemovedClass: androidx.compose.ui.text.font.FontListFontFamilyTypefaceAdapterKt:
+    Removed class androidx.compose.ui.text.font.FontListFontFamilyTypefaceAdapterKt
+RemovedClass: androidx.compose.ui.text.font.FontSynthesis_androidKt:
+    Removed class androidx.compose.ui.text.font.FontSynthesis_androidKt
+RemovedClass: androidx.compose.ui.text.font.PlatformTypefacesKt:
+    Removed class androidx.compose.ui.text.font.PlatformTypefacesKt
+RemovedClass: androidx.compose.ui.text.input.EditCommandKt:
+    Removed class androidx.compose.ui.text.input.EditCommandKt
+RemovedClass: androidx.compose.ui.text.input.EditingBufferKt:
+    Removed class androidx.compose.ui.text.input.EditingBufferKt
+RemovedClass: androidx.compose.ui.text.input.GapBufferKt:
+    Removed class androidx.compose.ui.text.input.GapBufferKt
+RemovedClass: androidx.compose.ui.text.input.GapBuffer_jvmKt:
+    Removed class androidx.compose.ui.text.input.GapBuffer_jvmKt
+RemovedClass: androidx.compose.ui.text.intl.AndroidPlatformLocale_androidKt:
+    Removed class androidx.compose.ui.text.intl.AndroidPlatformLocale_androidKt
+RemovedClass: androidx.compose.ui.text.intl.PlatformLocaleKt:
+    Removed class androidx.compose.ui.text.intl.PlatformLocaleKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.LocaleExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.LocaleExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.PlaceholderExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.PlaceholderExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.SpannableExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.SpannableExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.TextPaintExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.TextPaintExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.UrlAnnotationExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.UrlAnnotationExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.style.TextDrawStyleKt:
+    Removed class androidx.compose.ui.text.style.TextDrawStyleKt
+
+
+RemovedPackage: androidx.compose.ui.text.android:
+    Removed package androidx.compose.ui.text.android
+RemovedPackage: androidx.compose.ui.text.android.style:
+    Removed package androidx.compose.ui.text.android.style
+RemovedPackage: androidx.compose.ui.text.caches:
+    Removed package androidx.compose.ui.text.caches
+RemovedPackage: androidx.compose.ui.text.internal:
+    Removed package androidx.compose.ui.text.internal
+RemovedPackage: androidx.compose.ui.text.platform:
+    Removed package androidx.compose.ui.text.platform
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index 8fc4fc2..1d00051 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text {
 
-  public final class ActualAtomicReferenceJvmKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
   public final class AndroidTextStyle_androidKt {
     method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
     method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
@@ -98,12 +92,6 @@
     property public final int None;
   }
 
-  public final class JvmAnnotatedString_jvmKt {
-  }
-
-  public final class JvmCharHelpers_androidKt {
-  }
-
   public final class MultiParagraph {
     ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
     ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
@@ -168,12 +156,6 @@
     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 sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
@@ -338,9 +320,6 @@
     property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
   }
 
-  public final class SaversKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
@@ -395,9 +374,6 @@
     method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
   }
 
-  public final class TempListUtilsKt {
-  }
-
   public final class TextLayoutInput {
     ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
     ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
@@ -468,17 +444,11 @@
     property public final long size;
   }
 
-  public final class TextMeasurerKt {
-  }
-
   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;
   }
 
-  public final class TextPainterKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TextRange {
     method public operator boolean contains(long other);
     method public operator boolean contains(int offset);
@@ -595,57 +565,6 @@
 
 }
 
-package androidx.compose.ui.text.android {
-
-  public final class LayoutCompatKt {
-  }
-
-  public final class LayoutHelperKt {
-  }
-
-  public final class LayoutIntrinsicsKt {
-  }
-
-  public final class PaintExtensionsKt {
-  }
-
-  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 IndentationFixSpanKt {
-  }
-
-  public final class LineHeightStyleSpanKt {
-  }
-
-  public final class PlaceholderSpanKt {
-  }
-
-}
-
-package androidx.compose.ui.text.caches {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class SimpleArrayMapKt {
-  }
-
-}
-
 package androidx.compose.ui.text.font {
 
   public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
@@ -670,15 +589,6 @@
     method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
   }
 
-  public final class AndroidFontLoader_androidKt {
-  }
-
-  public final class AndroidFontResolveInterceptor_androidKt {
-  }
-
-  public final class AndroidFontUtils_androidKt {
-  }
-
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -751,9 +661,6 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
   }
 
-  public final class FontFamilyResolverKt {
-  }
-
   public final class FontFamilyResolver_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
@@ -771,9 +678,6 @@
     property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
   }
 
-  public final class FontListFontFamilyTypefaceAdapterKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
     method public int getValue();
     property public final int value;
@@ -819,9 +723,6 @@
     property public final int Weight;
   }
 
-  public final class FontSynthesis_androidKt {
-  }
-
   public final class FontVariation {
     method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
     method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
@@ -909,9 +810,6 @@
     property public final androidx.compose.ui.text.font.Typeface typeface;
   }
 
-  public final class PlatformTypefacesKt {
-  }
-
   public final class ResourceFont implements androidx.compose.ui.text.font.Font {
     method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
     method public int getResId();
@@ -978,9 +876,6 @@
     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);
@@ -992,20 +887,11 @@
     ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
   }
 
-  public final class EditingBufferKt {
-  }
-
   public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
     ctor public FinishComposingTextCommand();
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
   }
 
-  public final class GapBufferKt {
-  }
-
-  public final class GapBuffer_jvmKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class ImeAction {
     field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
   }
@@ -1225,18 +1111,8 @@
 
 }
 
-package androidx.compose.ui.text.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 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();
@@ -1275,64 +1151,15 @@
     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 AndroidMultiParagraphDrawKt {
-  }
-
-  public final class AndroidParagraphHelper_androidKt {
-  }
-
-  public final class AndroidParagraphIntrinsics_androidKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
-  public final class AndroidStringDelegate_androidKt {
-  }
-
-  public final class AndroidTextPaint_androidKt {
-  }
-
-  public final class EmojiCompatStatusKt {
-  }
-
-  public final class Synchronization_jvmKt {
-  }
-
 }
 
 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);
   }
 
-  public final class UrlAnnotationExtensions_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.text.style {
@@ -1428,9 +1255,6 @@
     property public final int Phrase;
   }
 
-  public final class LineBreak_androidKt {
-  }
-
   public final class LineHeightStyle {
     ctor public LineHeightStyle(float alignment, int trim);
     method public float getAlignment();
@@ -1537,9 +1361,6 @@
     property public final int Rtl;
   }
 
-  public final class TextDrawStyleKt {
-  }
-
   @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);
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-text/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..9e33150
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1507 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class AndroidTextStyle_androidKt {
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
+  }
+
+  @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.ui.text.ExperimentalTextApi public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.UrlAnnotation>> getUrlAnnotations(int start, int end);
+    method public boolean hasStringAnnotations(String tag, int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder implements java.lang.Appendable {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void addUrlAnnotation(androidx.compose.ui.text.UrlAnnotation urlAnnotation, int start, int end);
+    method public void append(String text);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text, int start, int end);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public void append(androidx.compose.ui.text.AnnotatedString text, int start, int end);
+    method @Deprecated public void deprecated_append_returning_void(char char);
+    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 @androidx.compose.ui.text.ExperimentalTextApi public int pushUrlAnnotation(androidx.compose.ui.text.UrlAnnotation urlAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static inline <R> R withAnnotation(androidx.compose.ui.text.AnnotatedString.Builder, String tag, String annotation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static inline <R> R withAnnotation(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.TtsAnnotation ttsAnnotation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static inline <R> R withAnnotation(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.UrlAnnotation urlAnnotation, 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.jvm.JvmInline public final value class EmojiSupportMatch {
+    field public static final androidx.compose.ui.text.EmojiSupportMatch.Companion Companion;
+  }
+
+  public static final class EmojiSupportMatch.Companion {
+    method public int getDefault();
+    method public int getNone();
+    property public final int Default;
+    property public final int None;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalTextApi {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface InternalTextApi {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor @Deprecated 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);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+    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.FontFamily.Resolver fontFamilyResolver);
+    ctor @Deprecated 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 boolean hasStaleResolvedFonts;
+    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 sealed 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, boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, int blendMode);
+    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 default boolean getHasStaleResolvedFonts();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public default boolean hasStaleResolvedFonts;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method @Deprecated 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);
+    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.FontFamily.Resolver fontFamilyResolver);
+  }
+
+  public final class ParagraphKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
+    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.ui.text.ExperimentalTextApi public androidx.compose.ui.text.style.TextMotion? getTextMotion();
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
+    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;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.style.TextMotion? textMotion;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PlaceholderVerticalAlign {
+    field public static final androidx.compose.ui.text.PlaceholderVerticalAlign.Companion Companion;
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class PlatformParagraphStyle {
+    ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
+    ctor @Deprecated public PlatformParagraphStyle(optional int emojiSupportMatch, optional boolean includeFontPadding);
+    ctor public PlatformParagraphStyle(optional int emojiSupportMatch);
+    method public int getEmojiSupportMatch();
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    property public final int emojiSupportMatch;
+    property @Deprecated public final boolean includeFontPadding;
+    field public static final androidx.compose.ui.text.PlatformParagraphStyle.Companion Companion;
+  }
+
+  public static final class PlatformParagraphStyle.Companion {
+    method public androidx.compose.ui.text.PlatformParagraphStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
+  }
+
+  public final class PlatformSpanStyle {
+    ctor public PlatformSpanStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
+    field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
+  }
+
+  public static final class PlatformSpanStyle.Companion {
+    method public androidx.compose.ui.text.PlatformSpanStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformSpanStyle Default;
+  }
+
+  public final class PlatformTextStyle {
+    ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
+    ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
+    ctor public PlatformTextStyle(int emojiSupportMatch);
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getSpanStyle();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public SpanStyle(androidx.compose.ui.graphics.Brush? brush, optional float alpha, 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.PlatformSpanStyle? platformStyle, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.SpanStyle copy(androidx.compose.ui.graphics.Brush? brush, optional float alpha, 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.PlatformSpanStyle? platformStyle, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public float getAlpha();
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.graphics.Brush? getBrush();
+    method public long getColor();
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.graphics.drawscope.DrawStyle? getDrawStyle();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
+    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 @androidx.compose.ui.text.ExperimentalTextApi public final float alpha;
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.graphics.Brush? brush;
+    property public final long color;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle;
+    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.text.PlatformSpanStyle? platformStyle;
+    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 TextLayoutInput {
+    ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
+    method @Deprecated public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method @Deprecated 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.text.font.FontFamily.Resolver fontFamilyResolver;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property @Deprecated public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  @androidx.compose.runtime.Immutable @androidx.compose.ui.text.ExperimentalTextApi public final class TextMeasurer {
+    ctor public TextMeasurer(androidx.compose.ui.text.font.FontFamily.Resolver fallbackFontFamilyResolver, androidx.compose.ui.unit.Density fallbackDensity, androidx.compose.ui.unit.LayoutDirection fallbackLayoutDirection, optional int cacheSize);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long constraints, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(String text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long constraints, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
+  }
+
+  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;
+  }
+
+  public final class TextPainterKt {
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TextRange {
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public boolean getReversed();
+    method public int getStart();
+    method public boolean intersects(long other);
+    property public final boolean collapsed;
+    property public final int end;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+    property public final boolean reversed;
+    property public final int start;
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, 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, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public TextStyle(androidx.compose.ui.graphics.Brush? brush, optional float alpha, 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.graphics.drawscope.DrawStyle? drawStyle, 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, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, 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, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.TextStyle copy(androidx.compose.ui.graphics.Brush? brush, optional float alpha, 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.graphics.drawscope.DrawStyle? drawStyle, 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, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens, optional androidx.compose.ui.text.style.TextMotion? textMotion);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public float getAlpha();
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.graphics.Brush? getBrush();
+    method public long getColor();
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.graphics.drawscope.DrawStyle? getDrawStyle();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
+    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.ui.text.ExperimentalTextApi public androidx.compose.ui.text.style.TextMotion? getTextMotion();
+    method public boolean hasSameLayoutAffectingAttributes(androidx.compose.ui.text.TextStyle other);
+    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 @androidx.compose.ui.text.ExperimentalTextApi public final float alpha;
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.graphics.Brush? brush;
+    property public final long color;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle;
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
+    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;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.style.TextMotion? textMotion;
+    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 {
+  }
+
+  @androidx.compose.ui.text.ExperimentalTextApi public final class UrlAnnotation {
+    ctor public UrlAnnotation(String url);
+    method public String getUrl();
+    property public final String url;
+  }
+
+  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.ERROR, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface InternalPlatformTextApi {
+  }
+
+  public final class LayoutCompatKt {
+  }
+
+}
+
+package androidx.compose.ui.text.font {
+
+  public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
+    ctor public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader, androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    ctor @Deprecated public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader);
+    method public final int getLoadingStrategy();
+    method public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader getTypefaceLoader();
+    method public final androidx.compose.ui.text.font.FontVariation.Settings getVariationSettings();
+    property public final int loadingStrategy;
+    property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+    property public final androidx.compose.ui.text.font.FontVariation.Settings variationSettings;
+  }
+
+  public static interface AndroidFont.TypefaceLoader {
+    method public suspend Object? awaitLoad(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font, kotlin.coroutines.Continuation<? super android.graphics.Typeface>);
+    method public android.graphics.Typeface? loadBlocking(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font);
+  }
+
+  public final class AndroidFontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(String path, android.content.res.AssetManager assetManager, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public final class DelegatingFontLoaderForDeprecatedUsage_androidKt {
+    method @Deprecated public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(androidx.compose.ui.text.font.Font.ResourceLoader fontResourceLoader, android.content.Context context);
+  }
+
+  @kotlin.jvm.JvmInline public final value class DeviceFontFamilyName {
+    ctor public DeviceFontFamilyName(String name);
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class DeviceFontFamilyNameFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(String familyName, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public default int getLoadingStrategy();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public default int loadingStrategy;
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  public static final class Font.Companion {
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  @Deprecated public static interface Font.ResourceLoader {
+    method @Deprecated public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method @Deprecated public final boolean getCanLoadSynchronously();
+    property @Deprecated 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 static sealed interface FontFamily.Resolver {
+    method public suspend Object? preload(androidx.compose.ui.text.font.FontFamily fontFamily, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.runtime.State<java.lang.Object> resolve(optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  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 FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
+    method public static androidx.compose.runtime.State<android.graphics.Typeface> resolveAsTypeface(androidx.compose.ui.text.font.FontFamily.Resolver, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontLoadingStrategy.Companion Companion;
+  }
+
+  public static final class FontLoadingStrategy.Companion {
+    method public int getAsync();
+    method public int getBlocking();
+    method public int getOptionalLocal();
+    property public final int Async;
+    property public final int Blocking;
+    property public final int OptionalLocal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontStyle {
+    ctor public FontStyle(int value);
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontSynthesis {
+    field public static final androidx.compose.ui.text.font.FontSynthesis.Companion Companion;
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  public final class FontVariation {
+    method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
+    method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public androidx.compose.ui.text.font.FontVariation.Setting grade(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting italic(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting opticalSizing(long textSize);
+    method public androidx.compose.ui.text.font.FontVariation.Setting slant(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting weight(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting width(float value);
+    field public static final androidx.compose.ui.text.font.FontVariation INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static sealed interface FontVariation.Setting {
+    method public String getAxisName();
+    method public boolean getNeedsDensity();
+    method public float toVariationValue(androidx.compose.ui.unit.Density? density);
+    property public abstract String axisName;
+    property public abstract boolean needsDensity;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class FontVariation.Settings {
+    ctor public FontVariation.Settings(androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> getSettings();
+    property public final java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> settings;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method public int getResId();
+    method public int getStyle();
+    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.font.FontVariation.Settings getVariationSettings();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property @androidx.compose.ui.text.ExperimentalTextApi public int loadingStrategy;
+    property public final int resId;
+    property public int style;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.font.FontVariation.Settings variationSettings;
+    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 EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ImeAction {
+    field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardCapitalization {
+    field public static final androidx.compose.ui.text.input.KeyboardCapitalization.Companion Companion;
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardType {
+    field public static final androidx.compose.ui.text.input.KeyboardType.Companion Companion;
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getDecimal();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Decimal;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method @Deprecated public final void hideSoftwareKeyboard();
+    method @Deprecated 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 {
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  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);
+  }
+
+  public final class UrlAnnotationExtensions_androidKt {
+    method @androidx.compose.ui.text.ExperimentalTextApi public static android.text.style.URLSpan toSpan(androidx.compose.ui.text.UrlAnnotation);
+  }
+
+}
+
+package androidx.compose.ui.text.style {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float getMultiplier();
+    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();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class Hyphens {
+    field public static final androidx.compose.ui.text.style.Hyphens.Companion Companion;
+  }
+
+  public static final class Hyphens.Companion {
+    method public int getAuto();
+    method public int getNone();
+    property public final int Auto;
+    property public final int None;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LineBreak {
+    ctor public LineBreak(int strategy, int strictness, int wordBreak);
+    method public int copy(optional int strategy, optional int strictness, optional int wordBreak);
+    method public int getStrategy();
+    method public int getStrictness();
+    method public int getWordBreak();
+    property public final int strategy;
+    property public final int strictness;
+    property public final int wordBreak;
+    field public static final androidx.compose.ui.text.style.LineBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.Companion {
+    method public int getHeading();
+    method public int getParagraph();
+    method public int getSimple();
+    property public final int Heading;
+    property public final int Paragraph;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strategy {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strategy.Companion Companion;
+  }
+
+  public static final class LineBreak.Strategy.Companion {
+    method public int getBalanced();
+    method public int getHighQuality();
+    method public int getSimple();
+    property public final int Balanced;
+    property public final int HighQuality;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strictness {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strictness.Companion Companion;
+  }
+
+  public static final class LineBreak.Strictness.Companion {
+    method public int getDefault();
+    method public int getLoose();
+    method public int getNormal();
+    method public int getStrict();
+    property public final int Default;
+    property public final int Loose;
+    property public final int Normal;
+    property public final int Strict;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.WordBreak {
+    field public static final androidx.compose.ui.text.style.LineBreak.WordBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.WordBreak.Companion {
+    method public int getDefault();
+    method public int getPhrase();
+    property public final int Default;
+    property public final int Phrase;
+  }
+
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
+    method public int getTrim();
+    property public final float alignment;
+    property public final int trim;
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public LineHeightStyle.Alignment(float topRatio);
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Alignment.Companion {
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
+  }
+
+  public static final class LineHeightStyle.Companion {
+    method public androidx.compose.ui.text.style.LineHeightStyle getDefault();
+    property public final androidx.compose.ui.text.style.LineHeightStyle Default;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Trim.Companion {
+    method public int getBoth();
+    method public int getFirstLineTop();
+    method public int getLastLineBottom();
+    method public int getNone();
+    property public final int Both;
+    property public final int FirstLineTop;
+    property public final int LastLineBottom;
+    property public final int None;
+  }
+
+  public enum ResolvedTextDirection {
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection[] values();
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextAlign {
+    field public static final androidx.compose.ui.text.style.TextAlign.Companion Companion;
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public 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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextDirection {
+    field public static final androidx.compose.ui.text.style.TextDirection.Companion Companion;
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable @androidx.compose.ui.text.ExperimentalTextApi public final class TextMotion {
+    field public static final androidx.compose.ui.text.style.TextMotion.Companion Companion;
+  }
+
+  public static final class TextMotion.Companion {
+    method public androidx.compose.ui.text.style.TextMotion getAnimated();
+    method public androidx.compose.ui.text.style.TextMotion getStatic();
+    property public final androidx.compose.ui.text.style.TextMotion Animated;
+    property public final androidx.compose.ui.text.style.TextMotion Static;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextOverflow {
+    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index a2274b7..9e33150 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text {
 
-  public final class ActualAtomicReferenceJvmKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
   public final class AndroidTextStyle_androidKt {
     method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
     method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
@@ -111,12 +105,6 @@
   @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.ERROR, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY}) public @interface InternalTextApi {
   }
 
-  public final class JvmAnnotatedString_jvmKt {
-  }
-
-  public final class JvmCharHelpers_androidKt {
-  }
-
   public final class MultiParagraph {
     ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
     ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
@@ -154,8 +142,8 @@
     method public long getWordBoundary(int offset);
     method public boolean isLineEllipsized(int lineIndex);
     method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
-    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
-    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
     property public final boolean didExceedMaxLines;
     property public final float firstBaseline;
     property public final float height;
@@ -183,12 +171,6 @@
     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 sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
@@ -219,8 +201,8 @@
     method public long getWordBoundary(int offset);
     method public boolean isLineEllipsized(int lineIndex);
     method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
-    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
-    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration, androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, int blendMode);
     property public abstract boolean didExceedMaxLines;
     property public abstract float firstBaseline;
     property public abstract float height;
@@ -359,9 +341,6 @@
     property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
   }
 
-  public final class SaversKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
@@ -426,9 +405,6 @@
     method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
   }
 
-  public final class TempListUtilsKt {
-  }
-
   public final class TextLayoutInput {
     ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
     ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
@@ -505,19 +481,16 @@
     method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextLayoutResult measure(String text, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long constraints, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional boolean skipCache);
   }
 
-  public final class TextMeasurerKt {
-  }
-
   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;
   }
 
   public final class TextPainterKt {
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, androidx.compose.ui.text.AnnotatedString text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional long size, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextMeasurer textMeasurer, String text, optional long topLeft, optional androidx.compose.ui.text.TextStyle style, optional int overflow, optional boolean softWrap, optional int maxLines, optional long size, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, optional long color, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static void drawText(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.text.TextLayoutResult textLayoutResult, androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.drawscope.DrawStyle? drawStyle, optional int blendMode);
   }
 
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TextRange {
@@ -662,50 +635,6 @@
   public final class LayoutCompatKt {
   }
 
-  public final class LayoutHelperKt {
-  }
-
-  public final class LayoutIntrinsicsKt {
-  }
-
-  public final class PaintExtensionsKt {
-  }
-
-  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 IndentationFixSpanKt {
-  }
-
-  public final class LineHeightStyleSpanKt {
-  }
-
-  public final class PlaceholderSpanKt {
-  }
-
-}
-
-package androidx.compose.ui.text.caches {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class SimpleArrayMapKt {
-  }
-
 }
 
 package androidx.compose.ui.text.font {
@@ -732,15 +661,6 @@
     method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
   }
 
-  public final class AndroidFontLoader_androidKt {
-  }
-
-  public final class AndroidFontResolveInterceptor_androidKt {
-  }
-
-  public final class AndroidFontUtils_androidKt {
-  }
-
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -813,9 +733,6 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
   }
 
-  public final class FontFamilyResolverKt {
-  }
-
   public final class FontFamilyResolver_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
@@ -834,9 +751,6 @@
     property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
   }
 
-  public final class FontListFontFamilyTypefaceAdapterKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
     method public int getValue();
     property public final int value;
@@ -882,9 +796,6 @@
     property public final int Weight;
   }
 
-  public final class FontSynthesis_androidKt {
-  }
-
   public final class FontVariation {
     method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
     method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
@@ -972,9 +883,6 @@
     property public final androidx.compose.ui.text.font.Typeface typeface;
   }
 
-  public final class PlatformTypefacesKt {
-  }
-
   public final class ResourceFont implements androidx.compose.ui.text.font.Font {
     method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
     method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
@@ -1045,9 +953,6 @@
     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);
@@ -1059,20 +964,11 @@
     ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
   }
 
-  public final class EditingBufferKt {
-  }
-
   public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
     ctor public FinishComposingTextCommand();
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
   }
 
-  public final class GapBufferKt {
-  }
-
-  public final class GapBuffer_jvmKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class ImeAction {
     field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
   }
@@ -1292,18 +1188,8 @@
 
 }
 
-package androidx.compose.ui.text.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 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();
@@ -1342,56 +1228,10 @@
     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 AndroidMultiParagraphDrawKt {
-  }
-
-  public final class AndroidParagraphHelper_androidKt {
-  }
-
-  public final class AndroidParagraphIntrinsics_androidKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
-  public final class AndroidStringDelegate_androidKt {
-  }
-
-  public final class AndroidTextPaint_androidKt {
-  }
-
-  public final class EmojiCompatStatusKt {
-  }
-
-  public final class Synchronization_jvmKt {
-  }
-
 }
 
 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);
@@ -1496,9 +1336,6 @@
     property public final int Phrase;
   }
 
-  public final class LineBreak_androidKt {
-  }
-
   public final class LineHeightStyle {
     ctor public LineHeightStyle(float alignment, int trim);
     method public float getAlignment();
@@ -1606,9 +1443,6 @@
     property public final int Rtl;
   }
 
-  public final class TextDrawStyleKt {
-  }
-
   @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);
diff --git a/compose/ui/ui-text/api/res-1.4.0-beta01.txt b/compose/ui/ui-text/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-text/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-text/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..1d00051
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,1414 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class AndroidTextStyle_androidKt {
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
+  }
+
+  @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 public boolean hasStringAnnotations(String tag, int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder implements java.lang.Appendable {
+    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 androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(CharSequence? text, int start, int end);
+    method public androidx.compose.ui.text.AnnotatedString.Builder append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public void append(androidx.compose.ui.text.AnnotatedString text, int start, int end);
+    method @Deprecated public void deprecated_append_returning_void(char char);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  @kotlin.jvm.JvmInline public final value class EmojiSupportMatch {
+    field public static final androidx.compose.ui.text.EmojiSupportMatch.Companion Companion;
+  }
+
+  public static final class EmojiSupportMatch.Companion {
+    method public int getDefault();
+    method public int getNone();
+    property public final int Default;
+    property public final int None;
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor @Deprecated 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);
+    ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final int maxLines;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.compose.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver);
+    ctor @Deprecated 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 boolean hasStaleResolvedFonts;
+    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 sealed 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, boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, 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 default boolean getHasStaleResolvedFonts();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public default boolean hasStaleResolvedFonts;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method @Deprecated 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);
+    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.FontFamily.Resolver fontFamilyResolver);
+  }
+
+  public final class ParagraphKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, long constraints, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, 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);
+    method @Deprecated public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PlaceholderVerticalAlign {
+    field public static final androidx.compose.ui.text.PlaceholderVerticalAlign.Companion Companion;
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class PlatformParagraphStyle {
+    ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
+    ctor @Deprecated public PlatformParagraphStyle(optional int emojiSupportMatch, optional boolean includeFontPadding);
+    ctor public PlatformParagraphStyle(optional int emojiSupportMatch);
+    method public int getEmojiSupportMatch();
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    property public final int emojiSupportMatch;
+    property @Deprecated public final boolean includeFontPadding;
+    field public static final androidx.compose.ui.text.PlatformParagraphStyle.Companion Companion;
+  }
+
+  public static final class PlatformParagraphStyle.Companion {
+    method public androidx.compose.ui.text.PlatformParagraphStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
+  }
+
+  public final class PlatformSpanStyle {
+    ctor public PlatformSpanStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
+    field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
+  }
+
+  public static final class PlatformSpanStyle.Companion {
+    method public androidx.compose.ui.text.PlatformSpanStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformSpanStyle Default;
+  }
+
+  public final class PlatformTextStyle {
+    ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
+    ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
+    ctor public PlatformTextStyle(int emojiSupportMatch);
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getSpanStyle();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
+    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.text.PlatformSpanStyle? platformStyle;
+    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 TextLayoutInput {
+    ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
+    method @Deprecated public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.text.font.FontFamily.Resolver getFontFamilyResolver();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method @Deprecated 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.text.font.FontFamily.Resolver fontFamilyResolver;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property @Deprecated public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  public final class 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 @kotlin.jvm.JvmInline public final value class TextRange {
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+    method public boolean getCollapsed();
+    method public int getEnd();
+    method public int getLength();
+    method public int getMax();
+    method public int getMin();
+    method public boolean getReversed();
+    method public int getStart();
+    method public boolean intersects(long other);
+    property public final boolean collapsed;
+    property public final int end;
+    property public final int length;
+    property public final int max;
+    property public final int min;
+    property public final boolean reversed;
+    property public final int start;
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor @Deprecated public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle, optional androidx.compose.ui.text.style.LineBreak? lineBreak, optional androidx.compose.ui.text.style.Hyphens? hyphens);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method @Deprecated public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public androidx.compose.ui.text.style.Hyphens? getHyphens();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.style.LineBreak? getLineBreak();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
+    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 public boolean hasSameLayoutAffectingAttributes(androidx.compose.ui.text.TextStyle other);
+    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 androidx.compose.ui.text.style.Hyphens? hyphens;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.style.LineBreak? lineBreak;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
+    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.font {
+
+  public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
+    ctor public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader, androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    ctor @Deprecated public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader);
+    method public final int getLoadingStrategy();
+    method public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader getTypefaceLoader();
+    method public final androidx.compose.ui.text.font.FontVariation.Settings getVariationSettings();
+    property public final int loadingStrategy;
+    property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+    property public final androidx.compose.ui.text.font.FontVariation.Settings variationSettings;
+  }
+
+  public static interface AndroidFont.TypefaceLoader {
+    method public suspend Object? awaitLoad(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font, kotlin.coroutines.Continuation<? super android.graphics.Typeface>);
+    method public android.graphics.Typeface? loadBlocking(android.content.Context context, androidx.compose.ui.text.font.AndroidFont font);
+  }
+
+  public final class AndroidFontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(String path, android.content.res.AssetManager assetManager, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public final class DelegatingFontLoaderForDeprecatedUsage_androidKt {
+    method @Deprecated public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(androidx.compose.ui.text.font.Font.ResourceLoader fontResourceLoader, android.content.Context context);
+  }
+
+  @kotlin.jvm.JvmInline public final value class DeviceFontFamilyName {
+    ctor public DeviceFontFamilyName(String name);
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class DeviceFontFamilyNameFontKt {
+    method public static androidx.compose.ui.text.font.Font Font(String familyName, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public default int getLoadingStrategy();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public default int loadingStrategy;
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+    field public static final androidx.compose.ui.text.font.Font.Companion Companion;
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  public static final class Font.Companion {
+    field public static final long MaximumAsyncTimeoutMillis = 15000L; // 0x3a98L
+  }
+
+  @Deprecated public static interface Font.ResourceLoader {
+    method @Deprecated public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method @Deprecated public final boolean getCanLoadSynchronously();
+    property @Deprecated 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 static sealed interface FontFamily.Resolver {
+    method public suspend Object? preload(androidx.compose.ui.text.font.FontFamily fontFamily, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public androidx.compose.runtime.State<java.lang.Object> resolve(optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  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 FontFamilyResolver_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
+    method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
+    method public static androidx.compose.runtime.State<android.graphics.Typeface> resolveAsTypeface(androidx.compose.ui.text.font.FontFamily.Resolver, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional androidx.compose.ui.text.font.FontWeight fontWeight, optional int fontStyle, optional int fontSynthesis);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional int loadingStrategy);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontLoadingStrategy.Companion Companion;
+  }
+
+  public static final class FontLoadingStrategy.Companion {
+    method public int getAsync();
+    method public int getBlocking();
+    method public int getOptionalLocal();
+    property public final int Async;
+    property public final int Blocking;
+    property public final int OptionalLocal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontStyle {
+    ctor public FontStyle(int value);
+    method public int getValue();
+    property public final int value;
+    field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  @kotlin.jvm.JvmInline public final value class FontSynthesis {
+    field public static final androidx.compose.ui.text.font.FontSynthesis.Companion Companion;
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  public final class FontVariation {
+    method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
+    method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public androidx.compose.ui.text.font.FontVariation.Setting grade(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting italic(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting opticalSizing(long textSize);
+    method public androidx.compose.ui.text.font.FontVariation.Setting slant(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting weight(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting width(float value);
+    field public static final androidx.compose.ui.text.font.FontVariation INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static sealed interface FontVariation.Setting {
+    method public String getAxisName();
+    method public boolean getNeedsDensity();
+    method public float toVariationValue(androidx.compose.ui.unit.Density? density);
+    property public abstract String axisName;
+    property public abstract boolean needsDensity;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class FontVariation.Settings {
+    ctor public FontVariation.Settings(androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> getSettings();
+    property public final java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> settings;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method public int getResId();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  @kotlin.jvm.JvmInline public final value class ImeAction {
+    field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardCapitalization {
+    field public static final androidx.compose.ui.text.input.KeyboardCapitalization.Companion Companion;
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyboardType {
+    field public static final androidx.compose.ui.text.input.KeyboardType.Companion Companion;
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getDecimal();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Decimal;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method @Deprecated public final void hideSoftwareKeyboard();
+    method @Deprecated 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 {
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  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 @kotlin.jvm.JvmInline public final value class BaselineShift {
+    ctor public BaselineShift(float multiplier);
+    method public float getMultiplier();
+    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();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class Hyphens {
+    field public static final androidx.compose.ui.text.style.Hyphens.Companion Companion;
+  }
+
+  public static final class Hyphens.Companion {
+    method public int getAuto();
+    method public int getNone();
+    property public final int Auto;
+    property public final int None;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LineBreak {
+    ctor public LineBreak(int strategy, int strictness, int wordBreak);
+    method public int copy(optional int strategy, optional int strictness, optional int wordBreak);
+    method public int getStrategy();
+    method public int getStrictness();
+    method public int getWordBreak();
+    property public final int strategy;
+    property public final int strictness;
+    property public final int wordBreak;
+    field public static final androidx.compose.ui.text.style.LineBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.Companion {
+    method public int getHeading();
+    method public int getParagraph();
+    method public int getSimple();
+    property public final int Heading;
+    property public final int Paragraph;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strategy {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strategy.Companion Companion;
+  }
+
+  public static final class LineBreak.Strategy.Companion {
+    method public int getBalanced();
+    method public int getHighQuality();
+    method public int getSimple();
+    property public final int Balanced;
+    property public final int HighQuality;
+    property public final int Simple;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.Strictness {
+    field public static final androidx.compose.ui.text.style.LineBreak.Strictness.Companion Companion;
+  }
+
+  public static final class LineBreak.Strictness.Companion {
+    method public int getDefault();
+    method public int getLoose();
+    method public int getNormal();
+    method public int getStrict();
+    property public final int Default;
+    property public final int Loose;
+    property public final int Normal;
+    property public final int Strict;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineBreak.WordBreak {
+    field public static final androidx.compose.ui.text.style.LineBreak.WordBreak.Companion Companion;
+  }
+
+  public static final class LineBreak.WordBreak.Companion {
+    method public int getDefault();
+    method public int getPhrase();
+    property public final int Default;
+    property public final int Phrase;
+  }
+
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
+    method public int getTrim();
+    property public final float alignment;
+    property public final int trim;
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Alignment.Companion {
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
+  }
+
+  public static final class LineHeightStyle.Companion {
+    method public androidx.compose.ui.text.style.LineHeightStyle getDefault();
+    property public final androidx.compose.ui.text.style.LineHeightStyle Default;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Trim.Companion {
+    method public int getBoth();
+    method public int getFirstLineTop();
+    method public int getLastLineBottom();
+    method public int getNone();
+    property public final int Both;
+    property public final int FirstLineTop;
+    property public final int LastLineBottom;
+    property public final int None;
+  }
+
+  public enum ResolvedTextDirection {
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.text.style.ResolvedTextDirection[] values();
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextAlign {
+    field public static final androidx.compose.ui.text.style.TextAlign.Companion Companion;
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public 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;
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextDirection {
+    field public static final androidx.compose.ui.text.style.TextDirection.Companion Companion;
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextOverflow {
+    field public static final androidx.compose.ui.text.style.TextOverflow.Companion Companion;
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/restricted_current.ignore b/compose/ui/ui-text/api/restricted_current.ignore
index 24501fb..8b45dbb 100644
--- a/compose/ui/ui-text/api/restricted_current.ignore
+++ b/compose/ui/ui-text/api/restricted_current.ignore
@@ -1,3 +1,75 @@
 // Baseline format: 1.0
 ChangedType: androidx.compose.ui.text.AnnotatedString.Builder#append(char):
     Method androidx.compose.ui.text.AnnotatedString.Builder.append has changed return type from void to androidx.compose.ui.text.AnnotatedString.Builder
+
+
+RemovedClass: androidx.compose.ui.text.ActualAtomicReferenceJvmKt:
+    Removed class androidx.compose.ui.text.ActualAtomicReferenceJvmKt
+RemovedClass: androidx.compose.ui.text.AndroidParagraph_androidKt:
+    Removed class androidx.compose.ui.text.AndroidParagraph_androidKt
+RemovedClass: androidx.compose.ui.text.JvmAnnotatedString_jvmKt:
+    Removed class androidx.compose.ui.text.JvmAnnotatedString_jvmKt
+RemovedClass: androidx.compose.ui.text.JvmCharHelpers_androidKt:
+    Removed class androidx.compose.ui.text.JvmCharHelpers_androidKt
+RemovedClass: androidx.compose.ui.text.MultiParagraphIntrinsicsKt:
+    Removed class androidx.compose.ui.text.MultiParagraphIntrinsicsKt
+RemovedClass: androidx.compose.ui.text.MultiParagraphKt:
+    Removed class androidx.compose.ui.text.MultiParagraphKt
+RemovedClass: androidx.compose.ui.text.SaversKt:
+    Removed class androidx.compose.ui.text.SaversKt
+RemovedClass: androidx.compose.ui.text.TempListUtilsKt:
+    Removed class androidx.compose.ui.text.TempListUtilsKt
+RemovedClass: androidx.compose.ui.text.TextMeasurerKt:
+    Removed class androidx.compose.ui.text.TextMeasurerKt
+RemovedClass: androidx.compose.ui.text.TextPainterKt:
+    Removed class androidx.compose.ui.text.TextPainterKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontLoader_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontLoader_androidKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontResolveInterceptor_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontResolveInterceptor_androidKt
+RemovedClass: androidx.compose.ui.text.font.AndroidFontUtils_androidKt:
+    Removed class androidx.compose.ui.text.font.AndroidFontUtils_androidKt
+RemovedClass: androidx.compose.ui.text.font.FontFamilyResolverKt:
+    Removed class androidx.compose.ui.text.font.FontFamilyResolverKt
+RemovedClass: androidx.compose.ui.text.font.FontListFontFamilyTypefaceAdapterKt:
+    Removed class androidx.compose.ui.text.font.FontListFontFamilyTypefaceAdapterKt
+RemovedClass: androidx.compose.ui.text.font.FontSynthesis_androidKt:
+    Removed class androidx.compose.ui.text.font.FontSynthesis_androidKt
+RemovedClass: androidx.compose.ui.text.font.PlatformTypefacesKt:
+    Removed class androidx.compose.ui.text.font.PlatformTypefacesKt
+RemovedClass: androidx.compose.ui.text.input.EditCommandKt:
+    Removed class androidx.compose.ui.text.input.EditCommandKt
+RemovedClass: androidx.compose.ui.text.input.EditingBufferKt:
+    Removed class androidx.compose.ui.text.input.EditingBufferKt
+RemovedClass: androidx.compose.ui.text.input.GapBufferKt:
+    Removed class androidx.compose.ui.text.input.GapBufferKt
+RemovedClass: androidx.compose.ui.text.input.GapBuffer_jvmKt:
+    Removed class androidx.compose.ui.text.input.GapBuffer_jvmKt
+RemovedClass: androidx.compose.ui.text.intl.AndroidPlatformLocale_androidKt:
+    Removed class androidx.compose.ui.text.intl.AndroidPlatformLocale_androidKt
+RemovedClass: androidx.compose.ui.text.intl.PlatformLocaleKt:
+    Removed class androidx.compose.ui.text.intl.PlatformLocaleKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.LocaleExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.LocaleExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.PlaceholderExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.PlaceholderExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.SpannableExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.SpannableExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.TextPaintExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.TextPaintExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.platform.extensions.UrlAnnotationExtensions_androidKt:
+    Removed class androidx.compose.ui.text.platform.extensions.UrlAnnotationExtensions_androidKt
+RemovedClass: androidx.compose.ui.text.style.TextDrawStyleKt:
+    Removed class androidx.compose.ui.text.style.TextDrawStyleKt
+
+
+RemovedPackage: androidx.compose.ui.text.android:
+    Removed package androidx.compose.ui.text.android
+RemovedPackage: androidx.compose.ui.text.android.style:
+    Removed package androidx.compose.ui.text.android.style
+RemovedPackage: androidx.compose.ui.text.caches:
+    Removed package androidx.compose.ui.text.caches
+RemovedPackage: androidx.compose.ui.text.internal:
+    Removed package androidx.compose.ui.text.internal
+RemovedPackage: androidx.compose.ui.text.platform:
+    Removed package androidx.compose.ui.text.platform
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index 8fc4fc2..1d00051 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.ui.text {
 
-  public final class ActualAtomicReferenceJvmKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
   public final class AndroidTextStyle_androidKt {
     method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
     method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
@@ -98,12 +92,6 @@
     property public final int None;
   }
 
-  public final class JvmAnnotatedString_jvmKt {
-  }
-
-  public final class JvmCharHelpers_androidKt {
-  }
-
   public final class MultiParagraph {
     ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, long constraints, optional int maxLines, optional boolean ellipsis);
     ctor @Deprecated public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
@@ -168,12 +156,6 @@
     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 sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
@@ -338,9 +320,6 @@
     property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
   }
 
-  public final class SaversKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
@@ -395,9 +374,6 @@
     method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
   }
 
-  public final class TempListUtilsKt {
-  }
-
   public final class TextLayoutInput {
     ctor @Deprecated public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
     ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.FontFamily.Resolver fontFamilyResolver, long constraints);
@@ -468,17 +444,11 @@
     property public final long size;
   }
 
-  public final class TextMeasurerKt {
-  }
-
   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;
   }
 
-  public final class TextPainterKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TextRange {
     method public operator boolean contains(long other);
     method public operator boolean contains(int offset);
@@ -595,57 +565,6 @@
 
 }
 
-package androidx.compose.ui.text.android {
-
-  public final class LayoutCompatKt {
-  }
-
-  public final class LayoutHelperKt {
-  }
-
-  public final class LayoutIntrinsicsKt {
-  }
-
-  public final class PaintExtensionsKt {
-  }
-
-  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 IndentationFixSpanKt {
-  }
-
-  public final class LineHeightStyleSpanKt {
-  }
-
-  public final class PlaceholderSpanKt {
-  }
-
-}
-
-package androidx.compose.ui.text.caches {
-
-  public final class ContainerHelpersKt {
-  }
-
-  public final class SimpleArrayMapKt {
-  }
-
-}
-
 package androidx.compose.ui.text.font {
 
   public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
@@ -670,15 +589,6 @@
     method @RequiresApi(26) @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
   }
 
-  public final class AndroidFontLoader_androidKt {
-  }
-
-  public final class AndroidFontResolveInterceptor_androidKt {
-  }
-
-  public final class AndroidFontUtils_androidKt {
-  }
-
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -751,9 +661,6 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
   }
 
-  public final class FontFamilyResolverKt {
-  }
-
   public final class FontFamilyResolver_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context);
     method public static androidx.compose.ui.text.font.FontFamily.Resolver createFontFamilyResolver(android.content.Context context, kotlin.coroutines.CoroutineContext coroutineContext);
@@ -771,9 +678,6 @@
     property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
   }
 
-  public final class FontListFontFamilyTypefaceAdapterKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class FontLoadingStrategy {
     method public int getValue();
     property public final int value;
@@ -819,9 +723,6 @@
     property public final int Weight;
   }
 
-  public final class FontSynthesis_androidKt {
-  }
-
   public final class FontVariation {
     method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
     method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
@@ -909,9 +810,6 @@
     property public final androidx.compose.ui.text.font.Typeface typeface;
   }
 
-  public final class PlatformTypefacesKt {
-  }
-
   public final class ResourceFont implements androidx.compose.ui.text.font.Font {
     method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
     method public int getResId();
@@ -978,9 +876,6 @@
     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);
@@ -992,20 +887,11 @@
     ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
   }
 
-  public final class EditingBufferKt {
-  }
-
   public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
     ctor public FinishComposingTextCommand();
     method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
   }
 
-  public final class GapBufferKt {
-  }
-
-  public final class GapBuffer_jvmKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class ImeAction {
     field public static final androidx.compose.ui.text.input.ImeAction.Companion Companion;
   }
@@ -1225,18 +1111,8 @@
 
 }
 
-package androidx.compose.ui.text.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 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();
@@ -1275,64 +1151,15 @@
     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 AndroidMultiParagraphDrawKt {
-  }
-
-  public final class AndroidParagraphHelper_androidKt {
-  }
-
-  public final class AndroidParagraphIntrinsics_androidKt {
-  }
-
-  public final class AndroidParagraph_androidKt {
-  }
-
-  public final class AndroidStringDelegate_androidKt {
-  }
-
-  public final class AndroidTextPaint_androidKt {
-  }
-
-  public final class EmojiCompatStatusKt {
-  }
-
-  public final class Synchronization_jvmKt {
-  }
-
 }
 
 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);
   }
 
-  public final class UrlAnnotationExtensions_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.text.style {
@@ -1428,9 +1255,6 @@
     property public final int Phrase;
   }
 
-  public final class LineBreak_androidKt {
-  }
-
   public final class LineHeightStyle {
     ctor public LineHeightStyle(float alignment, int trim);
     method public float getAlignment();
@@ -1537,9 +1361,6 @@
     property public final int Rtl;
   }
 
-  public final class TextDrawStyleKt {
-  }
-
   @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);
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
index 7e76c38..afd1452 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
@@ -29,6 +29,7 @@
 import android.text.style.ScaleXSpan
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -1640,6 +1641,19 @@
         assertThat(paragraph.textPaint.strokeWidth).isEqualTo(8f)
     }
 
+    @Test
+    fun testPaint_cannot_change_blendMode_permanently() {
+        val paragraph = simpleParagraph(
+            text = "",
+            width = 0.0f
+        )
+        assertThat(paragraph.textPaint.blendMode).isEqualTo(BlendMode.SrcOver)
+
+        val canvas = Canvas(android.graphics.Canvas())
+        paragraph.paint(canvas, blendMode = BlendMode.Multiply)
+        assertThat(paragraph.textPaint.blendMode).isEqualTo(BlendMode.SrcOver)
+    }
+
     @SdkSuppress(minSdkVersion = 29)
     @Test
     fun testPaint_can_change_Shadow() {
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 95c77fe..1dba872 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
@@ -17,11 +17,14 @@
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.ImageBitmapConfig
+import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.PathOperation
 import androidx.compose.ui.graphics.Shadow
@@ -4445,6 +4448,78 @@
         }
     }
 
+    @OptIn(ExperimentalTextApi::class)
+    @Test
+    fun paint_withBlendMode_changesVisual() {
+        with(defaultDensity) {
+            val text = "aaa"
+            // FontSize doesn't matter here, but it should be big enough for bitmap comparison.
+            val fontSize = 100.sp
+            val fontSizeInPx = fontSize.toPx()
+            val paragraphWidth = fontSizeInPx * text.length
+
+            val baseParagraph = simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize, color = Color.Green),
+                width = paragraphWidth
+            )
+
+            val bitmapDefault = baseParagraph.onCanvas { canvas ->
+                // first draw a Red background
+                val paint = Paint().apply { color = Color.Red }
+                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                // draw the paragraph as usual
+                baseParagraph.paint(canvas)
+            }
+
+            val bitmapPlus = baseParagraph.onCanvas { canvas ->
+                // first draw a Red background
+                val paint = Paint().apply { color = Color.Red }
+                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                // draw the paragraph as usual
+                this.paint(canvas, blendMode = BlendMode.Plus)
+            }
+
+            assertThat(bitmapDefault).isNotEqualToBitmap(bitmapPlus)
+        }
+    }
+
+    @OptIn(ExperimentalTextApi::class)
+    @Test
+    fun paint_withBlendMode_sameResult() {
+        with(defaultDensity) {
+            val text = "aaa"
+            // FontSize doesn't matter here, but it should be big enough for bitmap comparison.
+            val fontSize = 100.sp
+            val fontSizeInPx = fontSize.toPx()
+            val paragraphWidth = fontSizeInPx * text.length
+
+            val baseParagraph = simpleParagraph(
+                text = text,
+                style = TextStyle(fontSize = fontSize),
+                width = paragraphWidth
+            )
+
+            val bitmapSrc = baseParagraph.onCanvas { canvas ->
+                // first draw a Red background
+                val paint = Paint().apply { color = Color.Red }
+                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                // draw the paragraph as usual
+                baseParagraph.paint(canvas, blendMode = BlendMode.Src)
+            }
+
+            val bitmapSrcOver = baseParagraph.onCanvas { canvas ->
+                // first draw a Red background
+                val paint = Paint().apply { color = Color.Red }
+                canvas.drawRect(Rect(Offset.Zero, Size(width, height)), paint)
+                // draw the paragraph as usual
+                this.paint(canvas, blendMode = BlendMode.SrcOver)
+            }
+
+            assertThat(bitmapSrc).isEqualToBitmap(bitmapSrcOver)
+        }
+    }
+
     private fun simpleParagraph(
         text: String = "",
         style: TextStyle? = null,
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
index 80922f2..0a6ca15 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextTestExtensions.kt
@@ -19,9 +19,11 @@
 import android.graphics.Bitmap
 import android.graphics.Canvas
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.graphics.drawscope.DrawStyle
 import androidx.compose.ui.text.font.AndroidFontLoader
 import androidx.compose.ui.text.font.AndroidFontResolveInterceptor
 import androidx.compose.ui.text.font.AsyncTypefaceCache
@@ -32,55 +34,85 @@
 import androidx.compose.ui.text.font.PlatformFontLoader
 import androidx.compose.ui.text.font.PlatformResolveInterceptor
 import androidx.compose.ui.text.font.TypefaceRequestCache
-import androidx.compose.ui.graphics.drawscope.DrawStyle
 import androidx.compose.ui.text.style.TextDecoration
 import kotlin.math.ceil
 import kotlin.math.roundToInt
 
-@OptIn(ExperimentalTextApi::class)
-fun Paragraph.bitmap(
-    color: Color = Color.Unspecified,
-    shadow: Shadow? = null,
-    textDecoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+/**
+ * Creates a special canvas using this paragraph's size. Draw operations can be called through
+ * [block] lambda. Returns the final bitmap representation of the canvas after drawing is completed.
+ */
+fun Paragraph.onCanvas(
+    block: Paragraph.(androidx.compose.ui.graphics.Canvas) -> Unit = {}
 ): Bitmap {
     val bitmap = Bitmap.createBitmap(
         width.toIntPx(),
         height.toIntPx(),
         Bitmap.Config.ARGB_8888
     )
-    this.paint(
-        canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
-        color = color,
-        shadow = shadow,
-        textDecoration = textDecoration,
-        drawStyle = drawStyle
-    )
+    val canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap))
+    block(canvas)
     return bitmap
 }
 
+/**
+ * Creates a special canvas using this MultiParagraph's size. Draw operations can be called through
+ * [block] lambda. Returns the final bitmap representation of the canvas after drawing is completed.
+ */
+fun MultiParagraph.onCanvas(
+    block: MultiParagraph.(androidx.compose.ui.graphics.Canvas) -> Unit = {}
+): Bitmap {
+    val width = paragraphInfoList.maxByOrNull { it.paragraph.width }?.paragraph?.width ?: 0f
+    val bitmap = Bitmap.createBitmap(
+        width.toIntPx(),
+        height.toIntPx(),
+        Bitmap.Config.ARGB_8888
+    )
+    val canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap))
+    block(canvas)
+    return bitmap
+}
+
+@OptIn(ExperimentalTextApi::class)
+fun Paragraph.bitmap(
+    color: Color = Color.Unspecified,
+    shadow: Shadow? = null,
+    textDecoration: TextDecoration? = null,
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = BlendMode.SrcOver
+): Bitmap {
+    return onCanvas { canvas ->
+        this.paint(
+            canvas = canvas,
+            color = color,
+            shadow = shadow,
+            textDecoration = textDecoration,
+            drawStyle = drawStyle,
+            blendMode = blendMode
+        )
+    }
+}
+
 @OptIn(ExperimentalTextApi::class)
 fun Paragraph.bitmap(
     brush: Brush,
     alpha: Float,
     shadow: Shadow? = null,
     textDecoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = BlendMode.SrcOver
 ): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        width.toIntPx(),
-        height.toIntPx(),
-        Bitmap.Config.ARGB_8888
-    )
-    this.paint(
-        canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
-        brush = brush,
-        alpha = alpha,
-        shadow = shadow,
-        textDecoration = textDecoration,
-        drawStyle = drawStyle
-    )
-    return bitmap
+    return onCanvas { canvas ->
+        this.paint(
+            canvas = canvas,
+            brush = brush,
+            alpha = alpha,
+            shadow = shadow,
+            textDecoration = textDecoration,
+            drawStyle = drawStyle,
+            blendMode = blendMode
+        )
+    }
 }
 
 /**
@@ -96,30 +128,28 @@
     brush: Brush? = null,
     alpha: Float = Float.NaN,
     textDecoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = BlendMode.SrcOver
 ): Bitmap {
-    val width = paragraphInfoList.maxByOrNull { it.paragraph.width }?.paragraph?.width ?: 0f
-    val bitmap = Bitmap.createBitmap(
-        width.toIntPx(),
-        height.toIntPx(),
-        Bitmap.Config.ARGB_8888
-    )
-    if (brush != null) {
-        this.paint(
-            androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
-            brush,
-            alpha,
-            decoration = textDecoration,
-            drawStyle = drawStyle
-        )
-    } else {
-        this.paint(
-            canvas = androidx.compose.ui.graphics.Canvas(Canvas(bitmap)),
-            decoration = textDecoration,
-            drawStyle = drawStyle
-        )
+    return onCanvas { canvas ->
+        if (brush != null) {
+            this.paint(
+                canvas,
+                brush,
+                alpha,
+                decoration = textDecoration,
+                drawStyle = drawStyle,
+                blendMode = blendMode
+            )
+        } else {
+            this.paint(
+                canvas = canvas,
+                decoration = textDecoration,
+                drawStyle = drawStyle,
+                blendMode = blendMode
+            )
+        }
     }
-    return bitmap
 }
 
 @OptIn(ExperimentalTextApi::class)
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 bf45dc8..bccb32e 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
@@ -19,6 +19,7 @@
 import android.graphics.Paint
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.PathEffect
@@ -497,5 +498,18 @@
         assertThat(textPaint.style).isEqualTo(Paint.Style.STROKE)
     }
 
+    @Test
+    fun blendMode_defaultValue() {
+        val textPaint = defaultTextPaint
+        assertThat(textPaint.blendMode).isEqualTo(BlendMode.SrcOver)
+    }
+
+    @Test
+    fun setBlendMode_toDstOver() {
+        val textPaint = defaultTextPaint
+        textPaint.blendMode = BlendMode.DstOver
+        assertThat(textPaint.blendMode).isEqualTo(BlendMode.DstOver)
+    }
+
     private val defaultTextPaint get() = AndroidTextPaint(flags = 0, density = 1.0f)
 }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
index 298347f..49abe46 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
@@ -26,6 +26,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -464,16 +465,21 @@
         color: Color,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     ) {
+        val currBlendMode = textPaint.blendMode
         with(textPaint) {
             setColor(color)
             setShadow(shadow)
             setTextDecoration(textDecoration)
             setDrawStyle(drawStyle)
+            this.blendMode = blendMode
         }
 
         paint(canvas)
+
+        textPaint.blendMode = currBlendMode
     }
 
     @OptIn(ExperimentalTextApi::class)
@@ -483,16 +489,21 @@
         alpha: Float,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     ) {
+        val currBlendMode = textPaint.blendMode
         with(textPaint) {
             setBrush(brush, Size(width, height), alpha)
             setShadow(shadow)
             setTextDecoration(textDecoration)
             setDrawStyle(drawStyle)
+            this.blendMode = blendMode
         }
 
         paint(canvas)
+
+        textPaint.blendMode = currBlendMode
     }
 
     private fun paint(canvas: Canvas) {
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
index 330e76a..7bbfe8d 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -63,7 +64,8 @@
         color: Color,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     )
     @ExperimentalTextApi
     actual fun paint(
@@ -72,6 +74,7 @@
         alpha: Float,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     )
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidMultiParagraphDraw.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidMultiParagraphDraw.kt
index 80fb14c..e88267d 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidMultiParagraphDraw.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidMultiParagraphDraw.kt
@@ -18,6 +18,7 @@
 
 import android.graphics.Matrix
 import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.ShaderBrush
@@ -36,15 +37,18 @@
     alpha: Float,
     shadow: Shadow?,
     decoration: TextDecoration?,
-    drawStyle: DrawStyle?
+    drawStyle: DrawStyle?,
+    blendMode: BlendMode
 ) {
     canvas.save()
 
     if (paragraphInfoList.size <= 1) {
-        drawParagraphs(canvas, brush, alpha, shadow, decoration, drawStyle)
+        drawParagraphs(canvas, brush, alpha, shadow, decoration, drawStyle, blendMode)
     } else {
         when (brush) {
-            is SolidColor -> drawParagraphs(canvas, brush, alpha, shadow, decoration, drawStyle)
+            is SolidColor -> {
+                drawParagraphs(canvas, brush, alpha, shadow, decoration, drawStyle, blendMode)
+            }
             is ShaderBrush -> {
                 var height = 0f
                 var width = 0f
@@ -62,7 +66,8 @@
                         alpha = alpha,
                         shadow = shadow,
                         textDecoration = decoration,
-                        drawStyle = drawStyle
+                        drawStyle = drawStyle,
+                        blendMode = blendMode
                     )
                     canvas.translate(0f, it.paragraph.height)
                     matrix.setTranslate(0f, -it.paragraph.height)
@@ -82,10 +87,11 @@
     alpha: Float,
     shadow: Shadow?,
     decoration: TextDecoration?,
-    drawStyle: DrawStyle?
+    drawStyle: DrawStyle?,
+    blendMode: BlendMode
 ) {
     paragraphInfoList.fastForEach {
-        it.paragraph.paint(canvas, brush, alpha, shadow, decoration, drawStyle)
+        it.paragraph.paint(canvas, brush, alpha, shadow, decoration, drawStyle, blendMode)
         canvas.translate(0f, it.paragraph.height)
     }
 }
\ No newline at end of file
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 4059653..8fd09a9 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
@@ -20,6 +20,7 @@
 import androidx.annotation.VisibleForTesting
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.geometry.isSpecified
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Paint
@@ -125,6 +126,10 @@
             }
         }
     }
+
+    // BlendMode is only available to DrawScope.drawText.
+    // not intended to be used by TextStyle/SpanStyle.
+    var blendMode: BlendMode by composePaint::blendMode
 }
 
 /**
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
index 00de43db..7d52137 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
@@ -18,11 +18,13 @@
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.DrawStyle
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -404,11 +406,12 @@
         color: Color = Color.Unspecified,
         shadow: Shadow? = null,
         decoration: TextDecoration? = null,
-        drawStyle: DrawStyle? = null
+        drawStyle: DrawStyle? = null,
+        blendMode: BlendMode = DrawScope.DefaultBlendMode
     ) {
         canvas.save()
         paragraphInfoList.fastForEach {
-            it.paragraph.paint(canvas, color, shadow, decoration, drawStyle)
+            it.paragraph.paint(canvas, color, shadow, decoration, drawStyle, blendMode)
             canvas.translate(0f, it.paragraph.height)
         }
         canvas.restore()
@@ -422,9 +425,10 @@
         alpha: Float = Float.NaN,
         shadow: Shadow? = null,
         decoration: TextDecoration? = null,
-        drawStyle: DrawStyle? = null
+        drawStyle: DrawStyle? = null,
+        blendMode: BlendMode = DrawScope.DefaultBlendMode
     ) {
-        drawMultiParagraph(canvas, brush, alpha, shadow, decoration, drawStyle)
+        drawMultiParagraph(canvas, brush, alpha, shadow, decoration, drawStyle, blendMode)
     }
 
     /** Returns path that enclose the given text range. */
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
index 4a9f10c..9b24ca1 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
@@ -17,6 +17,7 @@
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -24,6 +25,7 @@
 import androidx.compose.ui.graphics.ShaderBrush
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.DrawStyle
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -277,6 +279,7 @@
      * @param drawStyle Applies to the default text paint style that's used by this paragraph. Spans
      * that specify a DrawStyle are not affected. Passing this value as `null` does not change the
      * currently set DrawStyle.
+     * @param blendMode Blending algorithm to be applied to the Paragraph while painting.
      */
     @ExperimentalTextApi
     fun paint(
@@ -284,7 +287,8 @@
         color: Color = Color.Unspecified,
         shadow: Shadow? = null,
         textDecoration: TextDecoration? = null,
-        drawStyle: DrawStyle? = null
+        drawStyle: DrawStyle? = null,
+        blendMode: BlendMode = DrawScope.DefaultBlendMode
     )
 
     /**
@@ -310,6 +314,7 @@
      * @param drawStyle Applies to the default text paint style that's used by this paragraph. Spans
      * that specify a DrawStyle are not affected. Passing this value as `null` does not change the
      * currently set DrawStyle.
+     * @param blendMode Blending algorithm to be applied to the Paragraph while painting.
      */
     @ExperimentalTextApi
     fun paint(
@@ -318,7 +323,8 @@
         alpha: Float = Float.NaN,
         shadow: Shadow? = null,
         textDecoration: TextDecoration? = null,
-        drawStyle: DrawStyle? = null
+        drawStyle: DrawStyle? = null,
+        blendMode: BlendMode = DrawScope.DefaultBlendMode
     )
 }
 
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
index fbcae0a..44c34a2 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
@@ -20,6 +20,7 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.geometry.isUnspecified
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -39,6 +40,8 @@
 import kotlin.math.ceil
 import kotlin.math.roundToInt
 
+internal val DefaultTextBlendMode = BlendMode.SrcOver
+
 object TextPainter {
 
     // TODO(b/236964276): Deprecate when TextMeasurer and drawText are no longer Experimental
@@ -136,6 +139,7 @@
  * defining the number of lines that fit if [softWrap] is enabled and [overflow] is
  * [TextOverflow.Ellipsis]. Otherwise, [Size.height] either defines where the text is clipped
  * ([TextOverflow.Clip]) or becomes no-op.
+ * @param blendMode Blending algorithm to be applied to the text
  *
  * @see TextMeasurer
  */
@@ -149,7 +153,8 @@
     softWrap: Boolean = true,
     maxLines: Int = Int.MAX_VALUE,
     placeholders: List<AnnotatedString.Range<Placeholder>> = emptyList(),
-    size: Size = Size.Unspecified
+    size: Size = Size.Unspecified,
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
     val textLayoutResult = textMeasurer.measure(
         text = text,
@@ -167,7 +172,10 @@
         translate(topLeft.x, topLeft.y)
         clip(textLayoutResult)
     }) {
-        textLayoutResult.multiParagraph.paint(drawContext.canvas)
+        textLayoutResult.multiParagraph.paint(
+            canvas = drawContext.canvas,
+            blendMode = blendMode
+        )
     }
 }
 
@@ -199,6 +207,7 @@
  * defining the number of lines that fit if [softWrap] is enabled and [overflow] is
  * [TextOverflow.Ellipsis]. Otherwise, [Size.height] either defines where the text is clipped
  * ([TextOverflow.Clip]) or becomes no-op.
+ * @param blendMode Blending algorithm to be applied to the text
  *
  * @see TextMeasurer
  */
@@ -211,7 +220,8 @@
     overflow: TextOverflow = TextOverflow.Clip,
     softWrap: Boolean = true,
     maxLines: Int = Int.MAX_VALUE,
-    size: Size = Size.Unspecified
+    size: Size = Size.Unspecified,
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
     val textLayoutResult = textMeasurer.measure(
         text = AnnotatedString(text),
@@ -228,7 +238,10 @@
         translate(topLeft.x, topLeft.y)
         clip(textLayoutResult)
     }) {
-        textLayoutResult.multiParagraph.paint(drawContext.canvas)
+        textLayoutResult.multiParagraph.paint(
+            canvas = drawContext.canvas,
+            blendMode = blendMode
+        )
     }
 }
 
@@ -246,6 +259,7 @@
  * @param shadow The shadow effect applied on the text.
  * @param textDecoration The decorations to paint on the text (e.g., an underline).
  * @param drawStyle Whether or not the text is stroked or filled in.
+ * @param blendMode Blending algorithm to be applied to the text
  *
  * @sample androidx.compose.ui.text.samples.DrawTextLayoutResultSample
  */
@@ -257,7 +271,8 @@
     alpha: Float = Float.NaN,
     shadow: Shadow? = null,
     textDecoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
     val newShadow = shadow ?: textLayoutResult.layoutInput.style.shadow
     val newTextDecoration = textDecoration ?: textLayoutResult.layoutInput.style.textDecoration
@@ -277,7 +292,8 @@
                 if (!alpha.isNaN()) alpha else textLayoutResult.layoutInput.style.alpha,
                 newShadow,
                 newTextDecoration,
-                newDrawStyle
+                newDrawStyle,
+                blendMode
             )
         } else {
             textLayoutResult.multiParagraph.paint(
@@ -285,7 +301,8 @@
                 color.takeOrElse { textLayoutResult.layoutInput.style.color }.modulate(alpha),
                 newShadow,
                 newTextDecoration,
-                newDrawStyle
+                newDrawStyle,
+                blendMode
             )
         }
     }
@@ -305,6 +322,7 @@
  * @param shadow The shadow effect applied on the text.
  * @param textDecoration The decorations to paint on the text (e.g., an underline).
  * @param drawStyle Whether or not the text is stroked or filled in.
+ * @param blendMode Blending algorithm to be applied to the text
  *
  * @sample androidx.compose.ui.text.samples.DrawTextLayoutResultSample
  */
@@ -316,7 +334,8 @@
     alpha: Float = Float.NaN,
     shadow: Shadow? = null,
     textDecoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) {
     val newShadow = shadow ?: textLayoutResult.layoutInput.style.shadow
     val newTextDecoration = textDecoration ?: textLayoutResult.layoutInput.style.textDecoration
@@ -332,7 +351,8 @@
             if (!alpha.isNaN()) alpha else textLayoutResult.layoutInput.style.alpha,
             newShadow,
             newTextDecoration,
-            newDrawStyle
+            newDrawStyle,
+            blendMode
         )
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformMultiParagraphDraw.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformMultiParagraphDraw.kt
index 6024d19..79208ff 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformMultiParagraphDraw.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/platform/PlatformMultiParagraphDraw.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.text.platform
 
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Shadow
@@ -38,5 +39,6 @@
     alpha: Float = Float.NaN,
     shadow: Shadow? = null,
     decoration: TextDecoration? = null,
-    drawStyle: DrawStyle? = null
+    drawStyle: DrawStyle? = null,
+    blendMode: BlendMode = BlendMode.SrcOver
 )
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
index 330e76a..7bbfe8d 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -63,7 +64,8 @@
         color: Color,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     )
     @ExperimentalTextApi
     actual fun paint(
@@ -72,6 +74,7 @@
         alpha: Float,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     )
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
index e838890..5ecc8b4 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
@@ -17,9 +17,10 @@
 package androidx.compose.ui.text
 
 import org.jetbrains.skia.Rect as SkRect
-import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.BlendMode
+import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Path
@@ -315,7 +316,8 @@
         color: Color,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     ) {
         para = layouter.layoutParagraph(
             width = width,
@@ -337,7 +339,8 @@
         alpha: Float,
         shadow: Shadow?,
         textDecoration: TextDecoration?,
-        drawStyle: DrawStyle?
+        drawStyle: DrawStyle?,
+        blendMode: BlendMode
     ) {
         throw UnsupportedOperationException(
             "Using brush for painting the paragraph is a separate functionality that " +
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaMultiParagraphDraw.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaMultiParagraphDraw.skiko.kt
index 6bdd632..923d798 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaMultiParagraphDraw.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaMultiParagraphDraw.skiko.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.text.platform
 
+import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Shadow
@@ -32,11 +33,12 @@
     alpha: Float,
     shadow: Shadow?,
     decoration: TextDecoration?,
-    drawStyle: DrawStyle?
+    drawStyle: DrawStyle?,
+    blendMode: BlendMode
 ) {
     canvas.save()
     paragraphInfoList.fastForEach {
-        it.paragraph.paint(canvas, brush, alpha, shadow, decoration, drawStyle)
+        it.paragraph.paint(canvas, brush, alpha, shadow, decoration, drawStyle, blendMode)
         canvas.translate(0f, it.paragraph.height)
     }
     canvas.restore()
diff --git a/compose/ui/ui-tooling-data/api/1.4.0-beta01.txt b/compose/ui/ui-tooling-data/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-tooling-data/api/current.ignore b/compose/ui/ui-tooling-data/api/current.ignore
new file mode 100644
index 0000000..4f21a78
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.ui.tooling.data:
+    Removed package androidx.compose.ui.tooling.data
diff --git a/compose/ui/ui-tooling-data/api/current.txt b/compose/ui/ui-tooling-data/api/current.txt
index ab1e1a2..e6f50d0 100644
--- a/compose/ui/ui-tooling-data/api/current.txt
+++ b/compose/ui/ui-tooling-data/api/current.txt
@@ -1,8 +1 @@
 // 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.4.0-beta01.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..899fa9f
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,127 @@
+// 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, Object? identity, 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, boolean isInline);
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ContextCache {
+    ctor public ContextCache();
+    method public void clear();
+  }
+
+  @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? getIdentity();
+    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();
+    method public final boolean isInline();
+    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? identity;
+    property public final boolean isInline;
+    property public final Object? key;
+    property public final androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final String? name;
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class JoinedKey {
+    ctor public JoinedKey(Object? left, Object? right);
+    method public Object? component1();
+    method public Object? component2();
+    method public androidx.compose.ui.tooling.data.JoinedKey copy(Object? left, Object? right);
+    method public Object? getLeft();
+    method public Object? getRight();
+    property public final Object? left;
+    property public final Object? right;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class NodeGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntRect box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    method public Object getNode();
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final Object node;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ParameterInformation {
+    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean static, boolean compared, String? inlineClass, boolean stable);
+    method public String component1();
+    method public Object? component2();
+    method public boolean component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public String? component6();
+    method public boolean component7();
+    method public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean static, boolean compared, String? inlineClass, boolean stable);
+    method public boolean getCompared();
+    method public boolean getFromDefault();
+    method public String? getInlineClass();
+    method public String getName();
+    method public boolean getStable();
+    method public boolean getStatic();
+    method public Object? getValue();
+    property public final boolean compared;
+    property public final boolean fromDefault;
+    property public final String? inlineClass;
+    property public final String name;
+    property public final boolean stable;
+    property public final boolean static;
+    property public final Object? value;
+  }
+
+  public final class SlotTreeKt {
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static androidx.compose.ui.tooling.data.Group asTree(androidx.compose.runtime.tooling.CompositionData);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> findParameters(androidx.compose.runtime.tooling.CompositionGroup, optional androidx.compose.ui.tooling.data.ContextCache? cache);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static String? getPosition(androidx.compose.ui.tooling.data.Group);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static <T> T? mapTree(androidx.compose.runtime.tooling.CompositionData, kotlin.jvm.functions.Function3<? super androidx.compose.runtime.tooling.CompositionGroup,? super androidx.compose.ui.tooling.data.SourceContext,? super java.util.List<? extends T>,? extends T> factory, optional androidx.compose.ui.tooling.data.ContextCache cache);
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public interface SourceContext {
+    method public androidx.compose.ui.unit.IntRect getBounds();
+    method public int getDepth();
+    method public androidx.compose.ui.tooling.data.SourceLocation? getLocation();
+    method public String? getName();
+    method public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> getParameters();
+    method public default boolean isInline();
+    property public abstract androidx.compose.ui.unit.IntRect bounds;
+    property public abstract int depth;
+    property public default boolean isInline;
+    property public abstract androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public abstract String? name;
+    property public abstract java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class SourceLocation {
+    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public String? component4();
+    method public int component5();
+    method public androidx.compose.ui.tooling.data.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int getLength();
+    method public int getLineNumber();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public String? getSourceFile();
+    property public final int length;
+    property public final int lineNumber;
+    property public final int offset;
+    property public final int packageHash;
+    property public final String? sourceFile;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is for tooling only and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/res-1.4.0-beta01.txt b/compose/ui/ui-tooling-data/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-tooling-data/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-tooling-data/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-tooling-data/api/restricted_current.ignore b/compose/ui/ui-tooling-data/api/restricted_current.ignore
new file mode 100644
index 0000000..4f21a78
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.ui.tooling.data:
+    Removed package androidx.compose.ui.tooling.data
diff --git a/compose/ui/ui-tooling-data/api/restricted_current.txt b/compose/ui/ui-tooling-data/api/restricted_current.txt
index ab1e1a2..e6f50d0 100644
--- a/compose/ui/ui-tooling-data/api/restricted_current.txt
+++ b/compose/ui/ui-tooling-data/api/restricted_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.compose.ui.tooling.data {
-
-  public final class SlotTreeKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-tooling-preview/api/1.4.0-beta01.txt b/compose/ui/ui-tooling-preview/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/1.4.0-beta01.txt
@@ -0,0 +1,113 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final String DESKTOP = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String FOLDABLE = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480";
+    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 PHONE = "spec:id=reference_phone,shape=Normal,width=411,height=891,unit=dp,dpi=420";
+    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";
+    field public static final String TABLET = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=420";
+    field public static final String TV_1080p = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String TV_720p = "spec:shape=Normal,width=1280,height=720,unit=dp,dpi=420";
+    field public static final String WEAR_OS_LARGE_ROUND = "id:wearos_large_round";
+    field public static final String WEAR_OS_RECT = "id:wearos_rect";
+    field public static final String WEAR_OS_SMALL_ROUND = "id:wearos_small_round";
+    field public static final String WEAR_OS_SQUARE = "id:wearos_square";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int wallpaper() default androidx.compose.ui.tooling.preview.Wallpapers.NONE;
+    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 wallpaper;
+    property public abstract int widthDp;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public static @interface Preview.Container {
+    method public abstract androidx.compose.ui.tooling.preview.Preview[] value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 Wallpapers {
+    field public static final int BLUE_DOMINATED_EXAMPLE = 2; // 0x2
+    field public static final int GREEN_DOMINATED_EXAMPLE = 1; // 0x1
+    field public static final androidx.compose.ui.tooling.preview.Wallpapers INSTANCE;
+    field public static final int NONE = -1; // 0xffffffff
+    field public static final int RED_DOMINATED_EXAMPLE = 0; // 0x0
+    field public static final int YELLOW_DOMINATED_EXAMPLE = 3; // 0x3
+  }
+
+}
+
+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;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/current.ignore b/compose/ui/ui-tooling-preview/api/current.ignore
new file mode 100644
index 0000000..b7d9b38
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.tooling.preview.datasource.LoremIpsumKt:
+    Removed class androidx.compose.ui.tooling.preview.datasource.LoremIpsumKt
diff --git a/compose/ui/ui-tooling-preview/api/current.txt b/compose/ui/ui-tooling-preview/api/current.txt
index 01e7297..a5363d9 100644
--- a/compose/ui/ui-tooling-preview/api/current.txt
+++ b/compose/ui/ui-tooling-preview/api/current.txt
@@ -109,8 +109,5 @@
     property public kotlin.sequences.Sequence<java.lang.String> values;
   }
 
-  public final class LoremIpsumKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,113 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final String DESKTOP = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String FOLDABLE = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480";
+    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 PHONE = "spec:id=reference_phone,shape=Normal,width=411,height=891,unit=dp,dpi=420";
+    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";
+    field public static final String TABLET = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=420";
+    field public static final String TV_1080p = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String TV_720p = "spec:shape=Normal,width=1280,height=720,unit=dp,dpi=420";
+    field public static final String WEAR_OS_LARGE_ROUND = "id:wearos_large_round";
+    field public static final String WEAR_OS_RECT = "id:wearos_rect";
+    field public static final String WEAR_OS_SMALL_ROUND = "id:wearos_small_round";
+    field public static final String WEAR_OS_SQUARE = "id:wearos_square";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int wallpaper() default androidx.compose.ui.tooling.preview.Wallpapers.NONE;
+    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 wallpaper;
+    property public abstract int widthDp;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public static @interface Preview.Container {
+    method public abstract androidx.compose.ui.tooling.preview.Preview[] value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 Wallpapers {
+    field public static final int BLUE_DOMINATED_EXAMPLE = 2; // 0x2
+    field public static final int GREEN_DOMINATED_EXAMPLE = 1; // 0x1
+    field public static final androidx.compose.ui.tooling.preview.Wallpapers INSTANCE;
+    field public static final int NONE = -1; // 0xffffffff
+    field public static final int RED_DOMINATED_EXAMPLE = 0; // 0x0
+    field public static final int YELLOW_DOMINATED_EXAMPLE = 3; // 0x3
+  }
+
+}
+
+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;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/public_plus_experimental_current.txt b/compose/ui/ui-tooling-preview/api/public_plus_experimental_current.txt
index 01e7297..a5363d9 100644
--- a/compose/ui/ui-tooling-preview/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-tooling-preview/api/public_plus_experimental_current.txt
@@ -109,8 +109,5 @@
     property public kotlin.sequences.Sequence<java.lang.String> values;
   }
 
-  public final class LoremIpsumKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling-preview/api/res-1.4.0-beta01.txt b/compose/ui/ui-tooling-preview/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-tooling-preview/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-tooling-preview/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..a5363d9
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,113 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final String DESKTOP = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String FOLDABLE = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480";
+    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 PHONE = "spec:id=reference_phone,shape=Normal,width=411,height=891,unit=dp,dpi=420";
+    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";
+    field public static final String TABLET = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=420";
+    field public static final String TV_1080p = "spec:shape=Normal,width=1920,height=1080,unit=dp,dpi=420";
+    field public static final String TV_720p = "spec:shape=Normal,width=1280,height=720,unit=dp,dpi=420";
+    field public static final String WEAR_OS_LARGE_ROUND = "id:wearos_large_round";
+    field public static final String WEAR_OS_RECT = "id:wearos_rect";
+    field public static final String WEAR_OS_SMALL_ROUND = "id:wearos_small_round";
+    field public static final String WEAR_OS_SQUARE = "id:wearos_square";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int wallpaper() default androidx.compose.ui.tooling.preview.Wallpapers.NONE;
+    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 wallpaper;
+    property public abstract int widthDp;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public static @interface Preview.Container {
+    method public abstract androidx.compose.ui.tooling.preview.Preview[] value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 Wallpapers {
+    field public static final int BLUE_DOMINATED_EXAMPLE = 2; // 0x2
+    field public static final int GREEN_DOMINATED_EXAMPLE = 1; // 0x1
+    field public static final androidx.compose.ui.tooling.preview.Wallpapers INSTANCE;
+    field public static final int NONE = -1; // 0xffffffff
+    field public static final int RED_DOMINATED_EXAMPLE = 0; // 0x0
+    field public static final int YELLOW_DOMINATED_EXAMPLE = 3; // 0x3
+  }
+
+}
+
+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;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/restricted_current.ignore b/compose/ui/ui-tooling-preview/api/restricted_current.ignore
new file mode 100644
index 0000000..b7d9b38
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.ui.tooling.preview.datasource.LoremIpsumKt:
+    Removed class androidx.compose.ui.tooling.preview.datasource.LoremIpsumKt
diff --git a/compose/ui/ui-tooling-preview/api/restricted_current.txt b/compose/ui/ui-tooling-preview/api/restricted_current.txt
index 01e7297..a5363d9 100644
--- a/compose/ui/ui-tooling-preview/api/restricted_current.txt
+++ b/compose/ui/ui-tooling-preview/api/restricted_current.txt
@@ -109,8 +109,5 @@
     property public kotlin.sequences.Sequence<java.lang.String> values;
   }
 
-  public final class LoremIpsumKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling/api/1.4.0-beta01.txt b/compose/ui/ui-tooling/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..94b79be
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.4.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
+    ctor public ToolingState(T? default);
+    method public T! getValue();
+    method public void setValue(T!);
+    property public T! value;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/current.ignore b/compose/ui/ui-tooling/api/current.ignore
index fd7c564..5c14f2e 100644
--- a/compose/ui/ui-tooling/api/current.ignore
+++ b/compose/ui/ui-tooling/api/current.ignore
@@ -1,3 +1,7 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.ui.tooling.ComposeViewAdapterKt:
+    Removed class androidx.compose.ui.tooling.ComposeViewAdapterKt
+RemovedClass: androidx.compose.ui.tooling.PreviewUtilsKt:
+    Removed class androidx.compose.ui.tooling.PreviewUtilsKt
 RemovedClass: androidx.compose.ui.tooling.animation.ComposeAnimationParserKt:
     Removed class androidx.compose.ui.tooling.animation.ComposeAnimationParserKt
diff --git a/compose/ui/ui-tooling/api/current.txt b/compose/ui/ui-tooling/api/current.txt
index d19be8b..94b79be 100644
--- a/compose/ui/ui-tooling/api/current.txt
+++ b/compose/ui/ui-tooling/api/current.txt
@@ -1,35 +1,14 @@
 // Signature format: 4.0
 package androidx.compose.ui.tooling {
 
-  public final class ComposeViewAdapterKt {
-  }
-
   public final class InspectableKt {
     method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class PreviewLogger_androidKt {
-  }
-
-  public final class PreviewUtilsKt {
-  }
-
-  public final class ShadowViewInfoKt {
-  }
-
-  public final class ViewInfoUtilKt {
-  }
-
 }
 
 package androidx.compose.ui.tooling.animation {
 
-  public final class AnimatedVisibilityComposeAnimationKt {
-  }
-
-  public final class AnimationSearchKt {
-  }
-
   public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
     ctor public ToolingState(T? default);
     method public T! getValue();
@@ -37,15 +16,5 @@
     property public T! value;
   }
 
-  public final class TransitionComposeAnimationKt {
-  }
-
-}
-
-package androidx.compose.ui.tooling.animation.clock {
-
-  public final class UtilsKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..e9656ce
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final class ComposableInvoker {
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public void invokeComposable(String className, String methodName, androidx.compose.runtime.Composer composer, java.lang.Object?... args);
+    field @Deprecated public static final androidx.compose.ui.tooling.ComposableInvoker INSTANCE;
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
+    ctor public ToolingState(T? default);
+    method public T! getValue();
+    method public void setValue(T!);
+    property public T! value;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/public_plus_experimental_current.txt b/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
index d26bb08..e9656ce 100644
--- a/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_current.txt
@@ -6,35 +6,14 @@
     field @Deprecated public static final androidx.compose.ui.tooling.ComposableInvoker INSTANCE;
   }
 
-  public final class ComposeViewAdapterKt {
-  }
-
   public final class InspectableKt {
     method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class PreviewLogger_androidKt {
-  }
-
-  public final class PreviewUtilsKt {
-  }
-
-  public final class ShadowViewInfoKt {
-  }
-
-  public final class ViewInfoUtilKt {
-  }
-
 }
 
 package androidx.compose.ui.tooling.animation {
 
-  public final class AnimatedVisibilityComposeAnimationKt {
-  }
-
-  public final class AnimationSearchKt {
-  }
-
   public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
     ctor public ToolingState(T? default);
     method public T! getValue();
@@ -42,15 +21,5 @@
     property public T! value;
   }
 
-  public final class TransitionComposeAnimationKt {
-  }
-
-}
-
-package androidx.compose.ui.tooling.animation.clock {
-
-  public final class UtilsKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling/api/res-1.4.0-beta01.txt b/compose/ui/ui-tooling/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-tooling/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-tooling/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..94b79be
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
+    ctor public ToolingState(T? default);
+    method public T! getValue();
+    method public void setValue(T!);
+    property public T! value;
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/restricted_current.ignore b/compose/ui/ui-tooling/api/restricted_current.ignore
index fd7c564..5c14f2e 100644
--- a/compose/ui/ui-tooling/api/restricted_current.ignore
+++ b/compose/ui/ui-tooling/api/restricted_current.ignore
@@ -1,3 +1,7 @@
 // Baseline format: 1.0
+RemovedClass: androidx.compose.ui.tooling.ComposeViewAdapterKt:
+    Removed class androidx.compose.ui.tooling.ComposeViewAdapterKt
+RemovedClass: androidx.compose.ui.tooling.PreviewUtilsKt:
+    Removed class androidx.compose.ui.tooling.PreviewUtilsKt
 RemovedClass: androidx.compose.ui.tooling.animation.ComposeAnimationParserKt:
     Removed class androidx.compose.ui.tooling.animation.ComposeAnimationParserKt
diff --git a/compose/ui/ui-tooling/api/restricted_current.txt b/compose/ui/ui-tooling/api/restricted_current.txt
index d19be8b..94b79be 100644
--- a/compose/ui/ui-tooling/api/restricted_current.txt
+++ b/compose/ui/ui-tooling/api/restricted_current.txt
@@ -1,35 +1,14 @@
 // Signature format: 4.0
 package androidx.compose.ui.tooling {
 
-  public final class ComposeViewAdapterKt {
-  }
-
   public final class InspectableKt {
     method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  public final class PreviewLogger_androidKt {
-  }
-
-  public final class PreviewUtilsKt {
-  }
-
-  public final class ShadowViewInfoKt {
-  }
-
-  public final class ViewInfoUtilKt {
-  }
-
 }
 
 package androidx.compose.ui.tooling.animation {
 
-  public final class AnimatedVisibilityComposeAnimationKt {
-  }
-
-  public final class AnimationSearchKt {
-  }
-
   public final class ToolingState<T> implements androidx.compose.runtime.State<T> {
     ctor public ToolingState(T? default);
     method public T! getValue();
@@ -37,15 +16,5 @@
     property public T! value;
   }
 
-  public final class TransitionComposeAnimationKt {
-  }
-
-}
-
-package androidx.compose.ui.tooling.animation.clock {
-
-  public final class UtilsKt {
-  }
-
 }
 
diff --git a/compose/ui/ui-tooling/build.gradle b/compose/ui/ui-tooling/build.gradle
index 80af0795..c5faa2d 100644
--- a/compose/ui/ui-tooling/build.gradle
+++ b/compose/ui/ui-tooling/build.gradle
@@ -41,7 +41,7 @@
         implementation(project(":lifecycle:lifecycle-viewmodel"))
         implementation("androidx.savedstate:savedstate-ktx:1.2.0")
         implementation("androidx.compose.material:material:1.0.0")
-        implementation(project(":activity:activity-compose"))
+        implementation("androidx.activity:activity-compose:1.7.0-beta01")
         implementation(project(":lifecycle:lifecycle-common"))
 
         // kotlin-reflect and animation-tooling-internal are provided by Studio at runtime
@@ -89,7 +89,7 @@
                 implementation("androidx.savedstate:savedstate-ktx:1.2.0")
 
                 implementation(project(":compose:material:material"))
-                implementation(project(":activity:activity-compose"))
+                implementation("androidx.activity:activity-compose:1.7.0-beta01")
                 implementation(project(":lifecycle:lifecycle-common"))
 
                 // kotlin-reflect and tooling-animation-internal are provided by Studio at runtime
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
index 27dc911..39af8c6 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
@@ -244,27 +244,13 @@
             assertEquals(310, clock.getMaxDuration(), 30)
             assertEquals(310, clock.getMaxDurationPerIteration(), 30)
             val transitions = clock.getTransitions(100L)
-            assertEquals(3, transitions.size)
-            transitions[0].let {
-                assertEquals("DeferredAnimation", it.label)
-                assertEquals(0, it.startTimeMillis)
-                assertEquals(190, it.endTimeMillis, 30)
-                assertEquals("androidx.compose.animation.core.SpringSpec", it.specType)
-                assertGreaterThanOrEqualTo(3, it.values.size)
-            }
-            transitions[1].let {
-                assertEquals("Built-in alpha", it.label)
-                assertEquals(90, it.startTimeMillis, 30)
-                assertEquals(310, it.endTimeMillis, 30)
-                assertEquals("androidx.compose.animation.core.TweenSpec", it.specType)
-                assertGreaterThanOrEqualTo(3, it.values.size)
-            }
-            transitions[2].let {
-                assertEquals("Built-in scale", it.label)
-                assertEquals(90, it.startTimeMillis, 30)
-                assertEquals(310, it.endTimeMillis, 30)
-                assertEquals("androidx.compose.animation.core.TweenSpec", it.specType)
-                assertGreaterThanOrEqualTo(3, it.values.size)
+            assertTrue(transitions.isNotEmpty())
+            transitions.forEach { info ->
+                assertTrue(info.startTimeMillis >= 0)
+                assertTrue(info.endTimeMillis >= 0)
+                assertTrue(info.values.isNotEmpty())
+                assertNotNull(info.specType)
+                assertNotNull(info.label)
             }
         }
     }
@@ -617,7 +603,7 @@
             clock.setStateParameters(20.dp, 40.dp)
         }
         rule.runOnIdle {
-            assertEquals(3, clock.getAnimatedProperties().size)
+            assertTrue(clock.getAnimatedProperties().isNotEmpty())
         }
     }
 
@@ -654,27 +640,13 @@
         rule.waitForIdle()
         rule.runOnIdle {
             clock.getTransitions(100).let {
-                assertEquals(3, it.size)
-                it[0].let { info ->
+                assertTrue(it.isNotEmpty())
+                it.forEach { info ->
                     assertTrue(info.startTimeMillis >= 0)
                     assertTrue(info.endTimeMillis >= 0)
                     assertTrue(info.values.isNotEmpty())
-                    assertTrue(info.values.isNotEmpty())
                     assertNotNull(info.specType)
-                }
-                it[1].let { info ->
-                    assertTrue(info.startTimeMillis >= 0)
-                    assertTrue(info.endTimeMillis >= 0)
-                    assertTrue(info.values.isNotEmpty())
-                    assertTrue(info.values.isNotEmpty())
-                    assertNotNull(info.specType)
-                }
-                it[2].let { info ->
-                    assertTrue(info.startTimeMillis >= 0)
-                    assertTrue(info.endTimeMillis >= 0)
-                    assertTrue(info.values.isNotEmpty())
-                    assertTrue(info.values.isNotEmpty())
-                    assertNotNull(info.specType)
+                    assertNotNull(info.label)
                 }
             }
         }
diff --git a/compose/ui/ui-unit/api/1.4.0-beta01.txt b/compose/ui/ui-unit/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..3826e65
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.4.0-beta01.txt
@@ -0,0 +1,414 @@
+// 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 @kotlin.jvm.JvmInline public final value class Constraints {
+    ctor public Constraints(@kotlin.PublishedApi long value);
+    method public long copy(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public boolean getHasBoundedHeight();
+    method public boolean getHasBoundedWidth();
+    method public boolean getHasFixedHeight();
+    method public boolean getHasFixedWidth();
+    method public int getMaxHeight();
+    method public int getMaxWidth();
+    method public int getMinHeight();
+    method public int getMinWidth();
+    method public boolean isZero();
+    property public final boolean hasBoundedHeight;
+    property public final boolean hasBoundedWidth;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedHeight;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedWidth;
+    property @androidx.compose.runtime.Stable public final boolean isZero;
+    property public final int maxHeight;
+    property public final int maxWidth;
+    property public final int minHeight;
+    property public final int minWidth;
+    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(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp(float value);
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpOffset {
+    method public long copy(optional float x, optional float y);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpSize {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method public float getHeight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.unit.DpSize.Companion Companion;
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntOffset {
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method public long copy(optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public int getX();
+    method public int getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final int x;
+    property @androidx.compose.runtime.Stable public final int y;
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect roundToIntRect(androidx.compose.ui.geometry.Rect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntRect);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntSize {
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method public int getHeight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    method public static androidx.compose.ui.unit.LayoutDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.unit.LayoutDirection[] values();
+    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 @kotlin.jvm.JvmInline public final value class TextUnit {
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public long getType();
+    method public float getValue();
+    method public boolean isEm();
+    method public boolean isSp();
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+    property public final boolean isEm;
+    property public final boolean isSp;
+    property public final long type;
+    property public final float value;
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method public static long TextUnit(float value, long type);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextUnitType {
+    ctor public TextUnitType(long type);
+    field public static final androidx.compose.ui.unit.TextUnitType.Companion Companion;
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Velocity {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/current.ignore b/compose/ui/ui-unit/api/current.ignore
new file mode 100644
index 0000000..9db0c14
--- /dev/null
+++ b/compose/ui/ui-unit/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.ui.unit.internal:
+    Removed package androidx.compose.ui.unit.internal
diff --git a/compose/ui/ui-unit/api/current.txt b/compose/ui/ui-unit/api/current.txt
index 8c0257c..3826e65 100644
--- a/compose/ui/ui-unit/api/current.txt
+++ b/compose/ui/ui-unit/api/current.txt
@@ -412,10 +412,3 @@
 
 }
 
-package androidx.compose.ui.unit.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_1.4.0-beta01.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b5b90002
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,417 @@
+// 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 @kotlin.jvm.JvmInline public final value class Constraints {
+    ctor public Constraints(@kotlin.PublishedApi long value);
+    method public long copy(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public boolean getHasBoundedHeight();
+    method public boolean getHasBoundedWidth();
+    method public boolean getHasFixedHeight();
+    method public boolean getHasFixedWidth();
+    method public int getMaxHeight();
+    method public int getMaxWidth();
+    method public int getMinHeight();
+    method public int getMinWidth();
+    method public boolean isZero();
+    property public final boolean hasBoundedHeight;
+    property public final boolean hasBoundedWidth;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedHeight;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedWidth;
+    property @androidx.compose.runtime.Stable public final boolean isZero;
+    property public final int maxHeight;
+    property public final int maxWidth;
+    property public final int minHeight;
+    property public final int minWidth;
+    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(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp(float value);
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpOffset {
+    method public long copy(optional float x, optional float y);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpSize {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method public float getHeight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.unit.DpSize.Companion Companion;
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalUnitApi {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntOffset {
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method public long copy(optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public int getX();
+    method public int getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final int x;
+    property @androidx.compose.runtime.Stable public final int y;
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect roundToIntRect(androidx.compose.ui.geometry.Rect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntRect);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntSize {
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method public int getHeight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    method public static androidx.compose.ui.unit.LayoutDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.unit.LayoutDirection[] values();
+    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 @kotlin.jvm.JvmInline public final value class TextUnit {
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public long getType();
+    method public float getValue();
+    method public boolean isEm();
+    method public boolean isSp();
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+    property public final boolean isEm;
+    property public final boolean isSp;
+    property public final long type;
+    property public final float value;
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method public static long TextUnit(float value, long type);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextUnitType {
+    ctor public TextUnitType(long type);
+    field public static final androidx.compose.ui.unit.TextUnitType.Companion Companion;
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Velocity {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_current.txt b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
index cdfac57..b5b90002 100644
--- a/compose/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -415,10 +415,3 @@
 
 }
 
-package androidx.compose.ui.unit.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-unit/api/res-1.4.0-beta01.txt b/compose/ui/ui-unit/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-unit/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-unit/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-unit/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..4572e24
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,419 @@
+// 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 @kotlin.jvm.JvmInline public final value class Constraints {
+    ctor public Constraints(@kotlin.PublishedApi long value);
+    method public long copy(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public boolean getHasBoundedHeight();
+    method public boolean getHasBoundedWidth();
+    method public boolean getHasFixedHeight();
+    method public boolean getHasFixedWidth();
+    method public int getMaxHeight();
+    method public int getMaxWidth();
+    method public int getMinHeight();
+    method public int getMinWidth();
+    method public boolean isZero();
+    property public final boolean hasBoundedHeight;
+    property public final boolean hasBoundedWidth;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedHeight;
+    property @androidx.compose.runtime.Stable public final boolean hasFixedWidth;
+    property @androidx.compose.runtime.Stable public final boolean isZero;
+    property public final int maxHeight;
+    property public final int maxWidth;
+    property public final int minHeight;
+    property public final int minWidth;
+    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(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp(float value);
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpOffset {
+    method public long copy(optional float x, optional float y);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class DpSize {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method public float getHeight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+    property @androidx.compose.runtime.Stable public final float height;
+    property @androidx.compose.runtime.Stable public final float width;
+    field public static final androidx.compose.ui.unit.DpSize.Companion Companion;
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntOffset {
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method public long copy(optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public int getX();
+    method public int getY();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final int x;
+    property @androidx.compose.runtime.Stable public final int y;
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable 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 @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect roundToIntRect(androidx.compose.ui.geometry.Rect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.IntRect);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class IntSize {
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method public int getHeight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    property @androidx.compose.runtime.Stable public final int height;
+    property @androidx.compose.runtime.Stable public final int width;
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    method public static androidx.compose.ui.unit.LayoutDirection valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.unit.LayoutDirection[] values();
+    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 @kotlin.jvm.JvmInline public final value class TextUnit {
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public long getType();
+    method public float getValue();
+    method public boolean isEm();
+    method public boolean isSp();
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+    property public final boolean isEm;
+    property public final boolean isSp;
+    property @kotlin.PublishedApi internal final long rawType;
+    property public final long type;
+    property public final float value;
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method public static long TextUnit(float value, long type);
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a);
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a, long b);
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a, long b, long c);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @kotlin.PublishedApi internal static long pack(long unitType, float v);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  @kotlin.jvm.JvmInline public final value class TextUnitType {
+    ctor public TextUnitType(long type);
+    field public static final androidx.compose.ui.unit.TextUnitType.Companion Companion;
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Velocity {
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method public long copy(optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getX();
+    method public float getY();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+    property @androidx.compose.runtime.Stable public final float x;
+    property @androidx.compose.runtime.Stable public final float y;
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/restricted_current.ignore b/compose/ui/ui-unit/api/restricted_current.ignore
new file mode 100644
index 0000000..9db0c14
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.compose.ui.unit.internal:
+    Removed package androidx.compose.ui.unit.internal
diff --git a/compose/ui/ui-unit/api/restricted_current.txt b/compose/ui/ui-unit/api/restricted_current.txt
index c5ff9fa..4572e24 100644
--- a/compose/ui/ui-unit/api/restricted_current.txt
+++ b/compose/ui/ui-unit/api/restricted_current.txt
@@ -417,10 +417,3 @@
 
 }
 
-package androidx.compose.ui.unit.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
diff --git a/compose/ui/ui-util/api/1.4.0-beta01.txt b/compose/ui/ui-util/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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> void fastForEachReversed(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? 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.4.0-beta01.txt b/compose/ui/ui-util/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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> void fastForEachReversed(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? 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.4.0-beta01.txt b/compose/ui/ui-util/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-util/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-util/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-util/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..e80820a
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,37 @@
+// 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> void fastForEachReversed(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? 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.4.0-beta01.txt b/compose/ui/ui-viewbinding/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.4.0-beta01.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.4.0-beta01.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.4.0-beta01.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.4.0-beta01.txt b/compose/ui/ui-viewbinding/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta01.txt b/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.4.0-beta01.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.4.0-beta01.txt b/compose/ui/ui/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..d27c2ed
--- /dev/null
+++ b/compose/ui/ui/api/1.4.0-beta01.txt
@@ -0,0 +1,2996 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public float getScaleFactor();
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    property public abstract float scaleFactor;
+    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
+  }
+
+  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
+  }
+
+  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.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  @kotlin.jvm.JvmInline public final value class FocusDirection {
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method public int getLeft();
+    method public int getNext();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int Left;
+    property public final int Next;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated 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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @Deprecated public final class FocusOrder {
+    ctor @Deprecated public FocusOrder();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
+    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
+    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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public default androidx.compose.ui.focus.FocusRequester getDown();
+    method public default androidx.compose.ui.focus.FocusRequester getEnd();
+    method public default androidx.compose.ui.focus.FocusRequester getLeft();
+    method public default androidx.compose.ui.focus.FocusRequester getNext();
+    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public default androidx.compose.ui.focus.FocusRequester getRight();
+    method public default androidx.compose.ui.focus.FocusRequester getStart();
+    method public default androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setCanFocus(boolean);
+    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
+    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
+    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
+    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
+    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
+    property public abstract boolean canFocus;
+    property public default androidx.compose.ui.focus.FocusRequester down;
+    property public default androidx.compose.ui.focus.FocusRequester end;
+    property public default androidx.compose.ui.focus.FocusRequester left;
+    property public default androidx.compose.ui.focus.FocusRequester next;
+    property public default androidx.compose.ui.focus.FocusRequester previous;
+    property public default androidx.compose.ui.focus.FocusRequester right;
+    property public default androidx.compose.ui.focus.FocusRequester start;
+    property public default androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  @androidx.compose.runtime.Stable 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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CompositingStrategy {
+    field public static final androidx.compose.ui.graphics.CompositingStrategy.Companion Companion;
+  }
+
+  public static final class CompositingStrategy.Companion {
+    method public int getAuto();
+    method public int getModulateAlpha();
+    method public int getOffscreen();
+    property public final int Auto;
+    property public final int ModulateAlpha;
+    property public final int Offscreen;
+  }
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor, optional int compositingStrategy);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public default long getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default int getCompositingStrategy();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public default long getSize();
+    method public default long getSpotShadowColor();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float);
+    method public default void setAmbientShadowColor(long);
+    method public void setCameraDistance(float);
+    method public void setClip(boolean);
+    method public default void setCompositingStrategy(int);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
+    method public void setRotationX(float);
+    method public void setRotationY(float);
+    method public void setRotationZ(float);
+    method public void setScaleX(float);
+    method public void setScaleY(float);
+    method public void setShadowElevation(float);
+    method public void setShape(androidx.compose.ui.graphics.Shape);
+    method public default void setSpotShadowColor(long);
+    method public void setTransformOrigin(long);
+    method public void setTranslationX(float);
+    method public void setTranslationY(float);
+    property public abstract float alpha;
+    property public default long ambientShadowColor;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default int compositingStrategy;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public default long size;
+    property public default long spotShadowColor;
+    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();
+    method public static long getDefaultShadowColor();
+    property public static final long DefaultShadowColor;
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
+    method public float getPivotFractionX();
+    method public float getPivotFractionY();
+    property public final float pivotFractionX;
+    property public final float pivotFractionY;
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public boolean getAutoMirror();
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final boolean autoMirror;
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
+    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable 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 @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
+    ctor public HapticFeedbackType(int value);
+    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  @kotlin.jvm.JvmInline public final value class InputMode {
+    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  @kotlin.jvm.JvmInline public final value class Key {
+    ctor public Key(long keyCode);
+    method public long getKeyCode();
+    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();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEvent {
+    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEventType {
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
+    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  @Deprecated public final class ConsumedData {
+    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
+    method @Deprecated public boolean getDownChange();
+    method @Deprecated public boolean getPositionChange();
+    method @Deprecated public void setDownChange(boolean);
+    method @Deprecated public void setPositionChange(boolean);
+    property @Deprecated public final boolean downChange;
+    property @Deprecated public final boolean positionChange;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerButtons {
+    ctor public PointerButtons(int packedValue);
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method @Deprecated 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 @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated 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 {
+    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerEventType {
+    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getScroll();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Scroll;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  @androidx.compose.runtime.Stable public interface PointerIcon {
+    field public static final androidx.compose.ui.input.pointer.PointerIcon.Companion Companion;
+  }
+
+  public static final class PointerIcon.Companion {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+  }
+
+  public final class PointerIconKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerId {
+    ctor public PointerId(long value);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
+    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public void consume();
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public long getScrollDelta();
+    method public int getType();
+    method public long getUptimeMillis();
+    method public boolean isConsumed();
+    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property public final long id;
+    property public final boolean isConsumed;
+    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 long scrollDelta;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers(int packedValue);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerType {
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTracker1D {
+    ctor public VelocityTracker1D(boolean isDataDifferential);
+    method public void addDataPoint(long timeMillis, float dataPoint);
+    method public float calculateVelocity();
+    method public boolean isDataDifferential();
+    method public void resetTracking();
+    property public final boolean isDataDifferential;
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.input.rotary {
+
+  public final class RotaryInputModifierKt {
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+  }
+
+  public final class RotaryScrollEvent {
+    method public float getHorizontalScrollPixels();
+    method public long getUptimeMillis();
+    method public float getVerticalScrollPixels();
+    property public final float horizontalScrollPixels;
+    property public final long uptimeMillis;
+    property public final float verticalScrollPixels;
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  public interface BeyondBoundsLayout {
+    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
+  }
+
+  public static interface BeyondBoundsLayout.BeyondBoundsScope {
+    method public boolean getHasMoreContent();
+    property public abstract boolean hasMoreContent;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
+    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
+  }
+
+  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
+    method public int getAbove();
+    method public int getAfter();
+    method public int getBefore();
+    method public int getBelow();
+    method public int getLeft();
+    method public int getRight();
+    property public final int Above;
+    property public final int After;
+    property public final int Before;
+    property public final int Below;
+    property public final int Left;
+    property public final int Right;
+  }
+
+  public final class BeyondBoundsLayoutKt {
+    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
+    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getSemanticsId();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract int semanticsId;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    method public default Object? getParentData();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+    property public default Object? parentData;
+  }
+
+  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;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MultiContentMeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends 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 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnPlacedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  @androidx.compose.runtime.Stable public interface PinnableContainer {
+    method public androidx.compose.ui.layout.PinnableContainer.PinnedHandle pin();
+  }
+
+  public static fun interface PinnableContainer.PinnedHandle {
+    method public void release();
+  }
+
+  public final class PinnableContainerKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> getLocalPinnableContainer();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> LocalPinnableContainer;
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long);
+    method protected final void setMeasurementConstraints(long);
+    property protected final long apparentToRealOffset;
+    property public final int height;
+    property public int measuredHeight;
+    property protected final long measuredSize;
+    property public int measuredWidth;
+    property protected final long measurementConstraints;
+    property public final int width;
+  }
+
+  public abstract static class Placeable.PlacementScope {
+    ctor public Placeable.PlacementScope();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getScaleX();
+    method public float getScaleY();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float scaleX;
+    property @androidx.compose.runtime.Stable public final float scaleY;
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
+    ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    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();
+    method public default int getPlaceablesCount();
+    method public default void premeasure(int index, long constraints);
+    property public default int placeablesCount;
+  }
+
+  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 interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
+  }
+
+  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
+    method public void clear();
+    method public java.util.Iterator<java.lang.Object> iterator();
+    method public boolean remove(Object? slotId);
+    method public boolean removeAll(java.util.Collection<?> slotIds);
+    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method public boolean retainAll(java.util.Collection<?> slotIds);
+    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T?);
+    property public final T? value;
+  }
+
+  public interface RootForTest {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
+    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+}
+
+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 @androidx.compose.ui.UiComposable 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);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class 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>);
+    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 default boolean hasText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String?);
+    method public void setValue(Object?);
+    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 NestedScrollInteropConnectionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 enum TextToolbarStatus {
+    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
+    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 {
+    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
+    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
+  }
+
+  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.DisposeOnDetachedFromWindowOrReleasedFromPool 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.DisposeOnDetachedFromWindowOrReleasedFromPool 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
+    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 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?);
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @Deprecated @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 pluralStringResource(@PluralsRes int id, int count);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
+    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
+    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getDropdownList();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int DropdownList;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageDown();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageLeft();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageRight();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageUp();
+    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.Function0<java.lang.Boolean>>> getRequestFocus();
+    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>>> PageDown;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageLeft;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageRight;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageUp;
+    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.Function0<java.lang.Boolean>>> RequestFocus;
+    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);
+    method public void setMergingSemanticsOfDescendants(boolean);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public default int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property @Deprecated public default int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsContainer();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsContainer;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static boolean isContainer(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 pageDown(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageLeft(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageRight(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageUp(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 requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    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);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
+    method public static void setContainer(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    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);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    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);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+  }
+
+  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);
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    method public static androidx.compose.ui.state.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.state.ToggleableState[] values();
+    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.viewinterop {
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth, optional boolean decorFitsSystemWindows);
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDecorFitsSystemWindows();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean decorFitsSystemWindows;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public enum SecureFlagPolicy {
+    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
+    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;
+  }
+
+}
+
diff --git a/compose/ui/ui/api/current.ignore b/compose/ui/ui/api/current.ignore
index b9629b2..c3a979a 100644
--- a/compose/ui/ui/api/current.ignore
+++ b/compose/ui/ui/api/current.ignore
@@ -3,5 +3,137 @@
     Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean,androidx.compose.ui.graphics.RenderEffect,long,long)
 
 
+RemovedClass: androidx.compose.ui.ActualKt:
+    Removed class androidx.compose.ui.ActualKt
+RemovedClass: androidx.compose.ui.TempListUtilsKt:
+    Removed class androidx.compose.ui.TempListUtilsKt
+RemovedClass: androidx.compose.ui.focus.BeyondBoundsLayoutKt:
+    Removed class androidx.compose.ui.focus.BeyondBoundsLayoutKt
 RemovedClass: androidx.compose.ui.focus.FocusManagerKt:
     Removed class androidx.compose.ui.focus.FocusManagerKt
+RemovedClass: androidx.compose.ui.focus.FocusRequesterKt:
+    Removed class androidx.compose.ui.focus.FocusRequesterKt
+RemovedClass: androidx.compose.ui.focus.FocusTransactionsKt:
+    Removed class androidx.compose.ui.focus.FocusTransactionsKt
+RemovedClass: androidx.compose.ui.focus.FocusTraversalKt:
+    Removed class androidx.compose.ui.focus.FocusTraversalKt
+RemovedClass: androidx.compose.ui.focus.OneDimensionalFocusSearchKt:
+    Removed class androidx.compose.ui.focus.OneDimensionalFocusSearchKt
+RemovedClass: androidx.compose.ui.focus.TwoDimensionalFocusSearchKt:
+    Removed class androidx.compose.ui.focus.TwoDimensionalFocusSearchKt
+RemovedClass: androidx.compose.ui.input.nestedscroll.NestedScrollModifierLocalKt:
+    Removed class androidx.compose.ui.input.nestedscroll.NestedScrollModifierLocalKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInputEventProcessorKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInputEventProcessorKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInputTestUtilKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInputTestUtilKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInteropFilter_androidKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInteropFilter_androidKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInteropUtils_androidKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInteropUtils_androidKt
+RemovedClass: androidx.compose.ui.layout.ContentScaleKt:
+    Removed class androidx.compose.ui.layout.ContentScaleKt
+RemovedClass: androidx.compose.ui.layout.LookaheadLayoutCoordinatesKt:
+    Removed class androidx.compose.ui.layout.LookaheadLayoutCoordinatesKt
+RemovedClass: androidx.compose.ui.layout.LookaheadLayoutKt:
+    Removed class androidx.compose.ui.layout.LookaheadLayoutKt
+RemovedClass: androidx.compose.ui.layout.MultiContentMeasurePolicyKt:
+    Removed class androidx.compose.ui.layout.MultiContentMeasurePolicyKt
+RemovedClass: androidx.compose.ui.layout.PlaceableKt:
+    Removed class androidx.compose.ui.layout.PlaceableKt
+RemovedClass: androidx.compose.ui.layout.RelocationModifierKt:
+    Removed class androidx.compose.ui.layout.RelocationModifierKt
+RemovedClass: androidx.compose.ui.layout.RelocationRequesterModifierKt:
+    Removed class androidx.compose.ui.layout.RelocationRequesterModifierKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalConsumerKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalConsumerKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalNodeKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalNodeKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalProviderKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalProviderKt
+RemovedClass: androidx.compose.ui.node.BackwardsCompatNodeKt:
+    Removed class androidx.compose.ui.node.BackwardsCompatNodeKt
+RemovedClass: androidx.compose.ui.node.DelegatableNodeKt:
+    Removed class androidx.compose.ui.node.DelegatableNodeKt
+RemovedClass: androidx.compose.ui.node.DrawModifierNodeKt:
+    Removed class androidx.compose.ui.node.DrawModifierNodeKt
+RemovedClass: androidx.compose.ui.node.HitTestResultKt:
+    Removed class androidx.compose.ui.node.HitTestResultKt
+RemovedClass: androidx.compose.ui.node.LayoutModifierNodeCoordinatorKt:
+    Removed class androidx.compose.ui.node.LayoutModifierNodeCoordinatorKt
+RemovedClass: androidx.compose.ui.node.LayoutModifierNodeKt:
+    Removed class androidx.compose.ui.node.LayoutModifierNodeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeDrawScopeKt:
+    Removed class androidx.compose.ui.node.LayoutNodeDrawScopeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeKt:
+    Removed class androidx.compose.ui.node.LayoutNodeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeLayoutDelegateKt:
+    Removed class androidx.compose.ui.node.LayoutNodeLayoutDelegateKt
+RemovedClass: androidx.compose.ui.node.MeasureScopeWithLayoutNodeKt:
+    Removed class androidx.compose.ui.node.MeasureScopeWithLayoutNodeKt
+RemovedClass: androidx.compose.ui.node.ModifierNodeElementKt:
+    Removed class androidx.compose.ui.node.ModifierNodeElementKt
+RemovedClass: androidx.compose.ui.node.MyersDiffKt:
+    Removed class androidx.compose.ui.node.MyersDiffKt
+RemovedClass: androidx.compose.ui.node.NodeChainKt:
+    Removed class androidx.compose.ui.node.NodeChainKt
+RemovedClass: androidx.compose.ui.node.NodeCoordinatorKt:
+    Removed class androidx.compose.ui.node.NodeCoordinatorKt
+RemovedClass: androidx.compose.ui.node.NodeKindKt:
+    Removed class androidx.compose.ui.node.NodeKindKt
+RemovedClass: androidx.compose.ui.node.PointerInputModifierNodeKt:
+    Removed class androidx.compose.ui.node.PointerInputModifierNodeKt
+RemovedClass: androidx.compose.ui.node.SemanticsModifierNodeKt:
+    Removed class androidx.compose.ui.node.SemanticsModifierNodeKt
+RemovedClass: androidx.compose.ui.node.ViewInterop_androidKt:
+    Removed class androidx.compose.ui.node.ViewInterop_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidClipboardManager_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidClipboardManager_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidUiDispatcher_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidUiDispatcher_androidKt
+RemovedClass: androidx.compose.ui.platform.DebugUtilsKt:
+    Removed class androidx.compose.ui.platform.DebugUtilsKt
+RemovedClass: androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt:
+    Removed class androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt
+RemovedClass: androidx.compose.ui.platform.InfiniteAnimationPolicyKt:
+    Removed class androidx.compose.ui.platform.InfiniteAnimationPolicyKt
+RemovedClass: androidx.compose.ui.platform.InvertMatrixKt:
+    Removed class androidx.compose.ui.platform.InvertMatrixKt
+RemovedClass: androidx.compose.ui.platform.JvmActuals_jvmKt:
+    Removed class androidx.compose.ui.platform.JvmActuals_jvmKt
+RemovedClass: androidx.compose.ui.platform.ShapeContainingUtilKt:
+    Removed class androidx.compose.ui.platform.ShapeContainingUtilKt
+RemovedClass: androidx.compose.ui.platform.ViewCompositionStrategy_androidKt:
+    Removed class androidx.compose.ui.platform.ViewCompositionStrategy_androidKt
+RemovedClass: androidx.compose.ui.platform.WindowInfoKt:
+    Removed class androidx.compose.ui.platform.WindowInfoKt
+RemovedClass: androidx.compose.ui.platform.Wrapper_androidKt:
+    Removed class androidx.compose.ui.platform.Wrapper_androidKt
+RemovedClass: androidx.compose.ui.res.Resources_androidKt:
+    Removed class androidx.compose.ui.res.Resources_androidKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsNodeKt:
+    Removed class androidx.compose.ui.semantics.SemanticsNodeKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsProperties_androidKt:
+    Removed class androidx.compose.ui.semantics.SemanticsProperties_androidKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsSortKt:
+    Removed class androidx.compose.ui.semantics.SemanticsSortKt
+RemovedClass: androidx.compose.ui.viewinterop.AndroidViewHolder_androidKt:
+    Removed class androidx.compose.ui.viewinterop.AndroidViewHolder_androidKt
+RemovedClass: androidx.compose.ui.window.SecureFlagPolicy_androidKt:
+    Removed class androidx.compose.ui.window.SecureFlagPolicy_androidKt
+
+
+RemovedPackage: androidx.compose.ui.autofill:
+    Removed package androidx.compose.ui.autofill
+RemovedPackage: androidx.compose.ui.graphics.vector.compat:
+    Removed package androidx.compose.ui.graphics.vector.compat
+RemovedPackage: androidx.compose.ui.internal:
+    Removed package androidx.compose.ui.internal
+RemovedPackage: androidx.compose.ui.platform.accessibility:
+    Removed package androidx.compose.ui.platform.accessibility
+RemovedPackage: androidx.compose.ui.text:
+    Removed package androidx.compose.ui.text
+RemovedPackage: androidx.compose.ui.text.input:
+    Removed package androidx.compose.ui.text.input
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 4eea595..d27c2ed 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -21,9 +21,6 @@
     field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
   }
 
-  public final class ActualKt {
-  }
-
   @androidx.compose.runtime.Stable public fun interface Alignment {
     method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
     field public static final androidx.compose.ui.Alignment.Companion Companion;
@@ -153,9 +150,6 @@
   public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
   }
 
-  public final class TempListUtilsKt {
-  }
-
   @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
   }
 
@@ -165,16 +159,6 @@
 
 }
 
-package androidx.compose.ui.autofill {
-
-  public final class AndroidAutofillType_androidKt {
-  }
-
-  public final class AndroidAutofill_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.draw {
 
   public final class AlphaKt {
@@ -266,9 +250,6 @@
 
 package androidx.compose.ui.focus {
 
-  public final class BeyondBoundsLayoutKt {
-  }
-
   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);
   }
@@ -300,9 +281,6 @@
     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 final class FocusEventModifierNodeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
     method public void clearFocus(optional boolean force);
     method public boolean moveFocus(int focusDirection);
@@ -398,9 +376,6 @@
     property public final androidx.compose.ui.focus.FocusRequester Default;
   }
 
-  public final class FocusRequesterKt {
-  }
-
   @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
     method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
     property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
@@ -410,9 +385,6 @@
     method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
   }
 
-  public final class FocusRequesterModifierNodeKt {
-  }
-
   public interface FocusState {
     method public boolean getHasFocus();
     method public boolean isCaptured();
@@ -422,18 +394,6 @@
     property public abstract boolean isFocused;
   }
 
-  public final class FocusTransactionsKt {
-  }
-
-  public final class FocusTraversalKt {
-  }
-
-  public final class OneDimensionalFocusSearchKt {
-  }
-
-  public final class TwoDimensionalFocusSearchKt {
-  }
-
 }
 
 package androidx.compose.ui.graphics {
@@ -785,13 +745,6 @@
 
 }
 
-package androidx.compose.ui.graphics.vector.compat {
-
-  public final class XmlVectorParser_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.hapticfeedback {
 
   public interface HapticFeedback {
@@ -1483,9 +1436,6 @@
     method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
   }
 
-  public final class NestedScrollModifierLocalKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class NestedScrollSource {
     field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
   }
@@ -1682,9 +1632,6 @@
     property public final long uptimeMillis;
   }
 
-  public final class PointerInputEventProcessorKt {
-  }
-
   public abstract class PointerInputFilter {
     ctor public PointerInputFilter();
     method public boolean getInterceptOutOfBoundsChildEvents();
@@ -1713,15 +1660,6 @@
     property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
   }
 
-  public final class PointerInputTestUtilKt {
-  }
-
-  public final class PointerInteropFilter_androidKt {
-  }
-
-  public final class PointerInteropUtils_androidKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
     ctor public PointerKeyboardModifiers(int packedValue);
   }
@@ -1794,13 +1732,6 @@
 
 }
 
-package androidx.compose.ui.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.layout {
 
   @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
@@ -1873,9 +1804,6 @@
     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();
@@ -1993,12 +1921,6 @@
     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 final class LookaheadLayoutCoordinatesKt {
-  }
-
-  public final class LookaheadLayoutKt {
-  }
-
   public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
     method public androidx.compose.ui.layout.Placeable measure(long constraints);
   }
@@ -2053,9 +1975,6 @@
     method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
   }
 
-  public final class MultiContentMeasurePolicyKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2134,15 +2053,6 @@
     property protected abstract int parentWidth;
   }
 
-  public final class PlaceableKt {
-  }
-
-  public final class RelocationModifierKt {
-  }
-
-  public final class RelocationRequesterModifierKt {
-  }
-
   public interface Remeasurement {
     method public void forceRemeasure();
   }
@@ -2237,16 +2147,10 @@
     method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
   }
 
-  public final class ModifierLocalConsumerKt {
-  }
-
   public final class ModifierLocalKt {
     method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
   }
 
-  public final class ModifierLocalNodeKt {
-  }
-
   @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
     method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
     method public T! getValue();
@@ -2254,9 +2158,6 @@
     property public abstract T! value;
   }
 
-  public final class ModifierLocalProviderKt {
-  }
-
   public interface ModifierLocalReadScope {
     method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
   }
@@ -2269,60 +2170,6 @@
 
 package androidx.compose.ui.node {
 
-  public final class BackwardsCompatNodeKt {
-  }
-
-  public final class DelegatableNodeKt {
-  }
-
-  public final class DrawModifierNodeKt {
-  }
-
-  public final class HitTestResultKt {
-  }
-
-  public final class LayoutModifierNodeCoordinatorKt {
-  }
-
-  public final class LayoutModifierNodeKt {
-  }
-
-  public final class LayoutNodeDrawScopeKt {
-  }
-
-  public final class LayoutNodeKt {
-  }
-
-  public final class LayoutNodeLayoutDelegateKt {
-  }
-
-  public final class MeasureScopeWithLayoutNodeKt {
-  }
-
-  public final class ModifierNodeElementKt {
-  }
-
-  public final class MyersDiffKt {
-  }
-
-  public final class NodeChainKt {
-  }
-
-  public final class NodeCoordinatorKt {
-  }
-
-  public final class NodeKindKt {
-  }
-
-  public final class ObserverNodeKt {
-  }
-
-  public final class ParentDataModifierNodeKt {
-  }
-
-  public final class PointerInputModifierNodeKt {
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2340,12 +2187,6 @@
     property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
   }
 
-  public final class SemanticsModifierNodeKt {
-  }
-
-  public final class ViewInterop_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.platform {
@@ -2374,12 +2215,6 @@
     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 {
   }
 
@@ -2412,9 +2247,6 @@
     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();
@@ -2483,12 +2315,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
-  public final class DebugUtilsKt {
-  }
-
-  public final class DisposableSaveableStateRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility 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>);
@@ -2499,9 +2325,6 @@
   public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
   }
 
-  public final class InfiniteAnimationPolicyKt {
-  }
-
   public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
     ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
     method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
@@ -2555,19 +2378,10 @@
     property public Object? valueOverride;
   }
 
-  public final class InvertMatrixKt {
-  }
-
-  public final class JvmActuals_jvmKt {
-  }
-
   public final class NestedScrollInteropConnectionKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
   }
 
-  public final class ShapeContainingUtilKt {
-  }
-
   public final class TestTagKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
   }
@@ -2638,9 +2452,6 @@
     field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
   }
 
-  public final class ViewCompositionStrategy_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
     method public long getDoubleTapMinTimeMillis();
     method public long getDoubleTapTimeoutMillis();
@@ -2683,25 +2494,12 @@
     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?);
   }
 
-  public final class Wrapper_androidKt {
-  }
-
-}
-
-package androidx.compose.ui.platform.accessibility {
-
-  public final class CollectionInfoKt {
-  }
-
 }
 
 package androidx.compose.ui.res {
@@ -2730,9 +2528,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
   }
 
-  public final class Resources_androidKt {
-  }
-
   public final class StringResources_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
@@ -2953,9 +2748,6 @@
     property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
   }
 
-  public final class SemanticsNodeKt {
-  }
-
   public final class SemanticsOwner {
     method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
     method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
@@ -3097,9 +2889,6 @@
     method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
   }
 
-  public final class SemanticsProperties_androidKt {
-  }
-
   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();
@@ -3113,9 +2902,6 @@
     method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
   }
 
-  public final class SemanticsSortKt {
-  }
-
 }
 
 package androidx.compose.ui.state {
@@ -3134,34 +2920,8 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextMeasurerHelperKt {
-  }
-
-}
-
-package androidx.compose.ui.text.input {
-
-  public final class CursorAnchorInfoBuilderKt {
-  }
-
-  public final class InputState_androidKt {
-  }
-
-  public final class RecordingInputConnection_androidKt {
-  }
-
-  public final class TextInputServiceAndroid_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.viewinterop {
 
-  public final class AndroidViewHolder_androidKt {
-  }
-
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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();
@@ -3232,8 +2992,5 @@
     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.4.0-beta01.txt b/compose/ui/ui/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..37b8dc1
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,3407 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, 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 @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, Object? key2, 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 @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object? key1, Object? key2, Object? key3, 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 @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, String fullyQualifiedName, Object![]? keys, 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.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) 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.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface InternalComposeUiApi {
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract static class Modifier.Node implements androidx.compose.ui.node.DelegatableNode {
+    ctor public Modifier.Node();
+    method public final androidx.compose.ui.Modifier.Node getNode();
+    method public final boolean isAttached();
+    method public void onAttach();
+    method public void onDetach();
+    method public void onReset();
+    method public final void sideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
+    property public final boolean isAttached;
+    property public final androidx.compose.ui.Modifier.Node node;
+  }
+
+  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public float getScaleFactor();
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    property public abstract float scaleFactor;
+    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
+  }
+
+  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
+  }
+
+  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 {
+
+  @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?);
+    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 {
+    method public static androidx.compose.ui.autofill.AutofillType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.autofill.AutofillType[] values();
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressAuxiliaryDetails;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressCountry;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressLocality;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressRegion;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressStreet;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateDay;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateFull;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateMonth;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateYear;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDate;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDay;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationMonth;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationYear;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardNumber;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardSecurityCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType EmailAddress;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Gender;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewPassword;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewUsername;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Password;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFirstName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFullName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonLastName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleInitial;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNamePrefix;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNameSuffix;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneCountryCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumber;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberDevice;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberNational;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalAddress;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCodeExtended;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType SmsOtpCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Username;
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  @kotlin.jvm.JvmInline public final value class FocusDirection {
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public int getEnter();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public int getExit();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public int getIn();
+    method public int getLeft();
+    method public int getNext();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final int Enter;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final int Exit;
+    property @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final int In;
+    property public final int Left;
+    property public final int Next;
+    property @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated 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);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface FocusEventModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @Deprecated public final class FocusOrder {
+    ctor @Deprecated public FocusOrder();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
+    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
+    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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public default androidx.compose.ui.focus.FocusRequester getDown();
+    method public default androidx.compose.ui.focus.FocusRequester getEnd();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getEnter();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> getExit();
+    method public default androidx.compose.ui.focus.FocusRequester getLeft();
+    method public default androidx.compose.ui.focus.FocusRequester getNext();
+    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public default androidx.compose.ui.focus.FocusRequester getRight();
+    method public default androidx.compose.ui.focus.FocusRequester getStart();
+    method public default androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setCanFocus(boolean);
+    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
+    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setEnter(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default void setExit(kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester>);
+    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
+    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
+    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
+    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
+    property public abstract boolean canFocus;
+    property public default androidx.compose.ui.focus.FocusRequester down;
+    property public default androidx.compose.ui.focus.FocusRequester end;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> enter;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default kotlin.jvm.functions.Function1<androidx.compose.ui.focus.FocusDirection,androidx.compose.ui.focus.FocusRequester> exit;
+    property public default androidx.compose.ui.focus.FocusRequester left;
+    property public default androidx.compose.ui.focus.FocusRequester next;
+    property public default androidx.compose.ui.focus.FocusRequester previous;
+    property public default androidx.compose.ui.focus.FocusRequester right;
+    property public default androidx.compose.ui.focus.FocusRequester start;
+    property public default androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface FocusPropertiesModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public void modifyFocusProperties(androidx.compose.ui.focus.FocusProperties focusProperties);
+  }
+
+  @androidx.compose.runtime.Stable 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 @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.focus.FocusRequester getCancel();
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.focus.FocusRequester Cancel;
+    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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated 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);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface FocusRequesterModifierNode extends androidx.compose.ui.node.DelegatableNode {
+  }
+
+  public final class FocusRequesterModifierNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static boolean captureFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static boolean freeFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static boolean requestFocus(androidx.compose.ui.focus.FocusRequesterModifierNode);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class FocusTargetModifierNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.modifier.ModifierLocalNode androidx.compose.ui.node.ObserverNode {
+    ctor public FocusTargetModifierNode();
+    method public androidx.compose.ui.focus.FocusState getFocusState();
+    method public void onObservedReadsChanged();
+    property public final androidx.compose.ui.focus.FocusState focusState;
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CompositingStrategy {
+    field public static final androidx.compose.ui.graphics.CompositingStrategy.Companion Companion;
+  }
+
+  public static final class CompositingStrategy.Companion {
+    method public int getAuto();
+    method public int getModulateAlpha();
+    method public int getOffscreen();
+    property public final int Auto;
+    property public final int ModulateAlpha;
+    property public final int Offscreen;
+  }
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor, optional int compositingStrategy);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public default long getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default int getCompositingStrategy();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public default long getSize();
+    method public default long getSpotShadowColor();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float);
+    method public default void setAmbientShadowColor(long);
+    method public void setCameraDistance(float);
+    method public void setClip(boolean);
+    method public default void setCompositingStrategy(int);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
+    method public void setRotationX(float);
+    method public void setRotationY(float);
+    method public void setRotationZ(float);
+    method public void setScaleX(float);
+    method public void setScaleY(float);
+    method public void setShadowElevation(float);
+    method public void setShape(androidx.compose.ui.graphics.Shape);
+    method public default void setSpotShadowColor(long);
+    method public void setTransformOrigin(long);
+    method public void setTranslationX(float);
+    method public void setTranslationY(float);
+    property public abstract float alpha;
+    property public default long ambientShadowColor;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default int compositingStrategy;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public default long size;
+    property public default long spotShadowColor;
+    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();
+    method public static long getDefaultShadowColor();
+    property public static final long DefaultShadowColor;
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
+    method public float getPivotFractionX();
+    method public float getPivotFractionY();
+    property public final float pivotFractionX;
+    property public final float pivotFractionY;
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public boolean getAutoMirror();
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final boolean autoMirror;
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
+    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable 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 @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
+    ctor public HapticFeedbackType(int value);
+    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  @kotlin.jvm.JvmInline public final value class InputMode {
+    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean requestInputMode(int inputMode);
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  @kotlin.jvm.JvmInline public final value class Key {
+    ctor public Key(long keyCode);
+    method public long getKeyCode();
+    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();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEvent {
+    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEventType {
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface KeyInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public boolean onKeyEvent(android.view.KeyEvent event);
+    method public boolean onPreKeyEvent(android.view.KeyEvent event);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
+    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  @Deprecated public final class ConsumedData {
+    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
+    method @Deprecated public boolean getDownChange();
+    method @Deprecated public boolean getPositionChange();
+    method @Deprecated public void setDownChange(boolean);
+    method @Deprecated public void setPositionChange(boolean);
+    property @Deprecated public final boolean downChange;
+    property @Deprecated public final boolean positionChange;
+  }
+
+  @androidx.compose.runtime.Immutable @androidx.compose.ui.ExperimentalComposeUiApi public final class HistoricalChange {
+    ctor public HistoricalChange(long uptimeMillis, long position);
+    method public long getPosition();
+    method public long getUptimeMillis();
+    property public final long position;
+    property public final long uptimeMillis;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerButtons {
+    ctor public PointerButtons(int packedValue);
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method @Deprecated 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 @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated 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 {
+    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerEventType {
+    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getScroll();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Scroll;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  @androidx.compose.runtime.Stable public interface PointerIcon {
+    field public static final androidx.compose.ui.input.pointer.PointerIcon.Companion Companion;
+  }
+
+  public static final class PointerIcon.Companion {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+  }
+
+  public final class PointerIconKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerId {
+    ctor public PointerId(long value);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, float pressure, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
+    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public void consume();
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical, optional long scrollDelta);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional float pressure, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> getHistorical();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public float getPressure();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public long getScrollDelta();
+    method public int getType();
+    method public long getUptimeMillis();
+    method public boolean isConsumed();
+    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical;
+    property public final long id;
+    property public final boolean isConsumed;
+    property public final long position;
+    property public final boolean pressed;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final float pressure;
+    property public final long previousPosition;
+    property public final boolean previousPressed;
+    property public final long previousUptimeMillis;
+    property public final long scrollDelta;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getShareWithSiblings();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public boolean shareWithSiblings;
+    property public final long size;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier motionEventSpy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,kotlin.Unit> watcher);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier pointerInteropFilter(androidx.compose.ui.Modifier, optional androidx.compose.ui.input.pointer.RequestDisallowInterceptTouchEvent? requestDisallowInterceptTouchEvent, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,java.lang.Boolean> onTouchEvent);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers(int packedValue);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerType {
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
+    ctor public RequestDisallowInterceptTouchEvent();
+    method public void invoke(boolean disallowIntercept);
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTracker1D {
+    ctor public VelocityTracker1D(boolean isDataDifferential);
+    method public void addDataPoint(long timeMillis, float dataPoint);
+    method public float calculateVelocity();
+    method public boolean isDataDifferential();
+    method public void resetTracking();
+    property public final boolean isDataDifferential;
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.input.rotary {
+
+  public final class RotaryInputModifierKt {
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface RotaryInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public boolean onPreRotaryScrollEvent(androidx.compose.ui.input.rotary.RotaryScrollEvent event);
+    method public boolean onRotaryScrollEvent(androidx.compose.ui.input.rotary.RotaryScrollEvent event);
+  }
+
+  public final class RotaryScrollEvent {
+    method public float getHorizontalScrollPixels();
+    method public long getUptimeMillis();
+    method public float getVerticalScrollPixels();
+    property public final float horizontalScrollPixels;
+    property public final long uptimeMillis;
+    property public final float verticalScrollPixels;
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  public interface BeyondBoundsLayout {
+    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
+  }
+
+  public static interface BeyondBoundsLayout.BeyondBoundsScope {
+    method public boolean getHasMoreContent();
+    property public abstract boolean hasMoreContent;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
+    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
+  }
+
+  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
+    method public int getAbove();
+    method public int getAfter();
+    method public int getBefore();
+    method public int getBelow();
+    method public int getLeft();
+    method public int getRight();
+    property public final int Above;
+    property public final int After;
+    property public final int Before;
+    property public final int Below;
+    property public final int Left;
+    property public final int Right;
+  }
+
+  public final class BeyondBoundsLayoutKt {
+    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
+    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getSemanticsId();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract int semanticsId;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public sealed interface LookaheadLayoutCoordinates extends androidx.compose.ui.layout.LayoutCoordinates {
+    method public long localLookaheadPositionOf(androidx.compose.ui.layout.LookaheadLayoutCoordinates sourceCoordinates, optional long relativeToSource);
+  }
+
+  public final class LookaheadLayoutKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static void LookaheadLayout(kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LookaheadLayoutScope,kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface LookaheadLayoutScope {
+    method public androidx.compose.ui.Modifier intermediateLayout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function4<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? super androidx.compose.ui.unit.IntSize,? extends androidx.compose.ui.layout.MeasureResult> measure);
+    method public androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,? super androidx.compose.ui.layout.LookaheadLayoutCoordinates,kotlin.Unit> onPlaced);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    method public default Object? getParentData();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+    property public default Object? parentData;
+  }
+
+  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;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MultiContentMeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends 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 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnPlacedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  @androidx.compose.runtime.Stable public interface PinnableContainer {
+    method public androidx.compose.ui.layout.PinnableContainer.PinnedHandle pin();
+  }
+
+  public static fun interface PinnableContainer.PinnedHandle {
+    method public void release();
+  }
+
+  public final class PinnableContainerKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> getLocalPinnableContainer();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> LocalPinnableContainer;
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long);
+    method protected final void setMeasurementConstraints(long);
+    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 @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.layout.LayoutCoordinates? getCoordinates();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.layout.LayoutCoordinates? coordinates;
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi @kotlin.jvm.JvmDefaultWithCompatibility public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
+    method @Deprecated public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class RelocationModifierKt {
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRelocationRequest(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> onProvideDestination, kotlin.jvm.functions.Function3<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.geometry.Rect,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPerformRelocation);
+  }
+
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final class RelocationRequester {
+    ctor @Deprecated public RelocationRequester();
+    method @Deprecated public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class RelocationRequesterModifierKt {
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier relocationRequester(androidx.compose.ui.Modifier, Object relocationRequester);
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getScaleX();
+    method public float getScaleY();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float scaleX;
+    property @androidx.compose.runtime.Stable public final float scaleY;
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
+    ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    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();
+    method public default int getPlaceablesCount();
+    method public default void premeasure(int index, long constraints);
+    property public default int placeablesCount;
+  }
+
+  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 interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
+  }
+
+  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
+    method public void clear();
+    method public java.util.Iterator<java.lang.Object> iterator();
+    method public boolean remove(Object? slotId);
+    method public boolean removeAll(java.util.Collection<?> slotIds);
+    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method public boolean retainAll(java.util.Collection<?> slotIds);
+    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalConsumerKt {
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier modifierLocalConsumer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.modifier.ModifierLocalReadScope,kotlin.Unit> consumer);
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract sealed class ModifierLocalMap {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface ModifierLocalNode extends androidx.compose.ui.modifier.ModifierLocalReadScope androidx.compose.ui.node.DelegatableNode {
+    method public default <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+    method public default androidx.compose.ui.modifier.ModifierLocalMap getProvidedValues();
+    method public default <T> void provide(androidx.compose.ui.modifier.ModifierLocal<T> key, T? value);
+    property public default androidx.compose.ui.modifier.ModifierLocalMap providedValues;
+  }
+
+  public final class ModifierLocalNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(androidx.compose.ui.modifier.ModifierLocal<T> key);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(kotlin.Pair<? extends androidx.compose.ui.modifier.ModifierLocal<T>,? extends T> entry);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(androidx.compose.ui.modifier.ModifierLocal<?>... keys);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.modifier.ModifierLocalMap modifierLocalMapOf(kotlin.Pair<? extends androidx.compose.ui.modifier.ModifierLocal<?>,?>... entries);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.Modifier modifierLocalProvider(androidx.compose.ui.Modifier, androidx.compose.ui.modifier.ProvidableModifierLocal<T> key, kotlin.jvm.functions.Function0<? extends T> value);
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface DelegatableNode {
+    method public androidx.compose.ui.Modifier.Node getNode();
+    property public abstract androidx.compose.ui.Modifier.Node node;
+  }
+
+  public final class DelegatableNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateSubtree(androidx.compose.ui.node.DelegatableNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract class DelegatingNode extends androidx.compose.ui.Modifier.Node {
+    ctor public DelegatingNode();
+    method public final <T extends androidx.compose.ui.Modifier.Node> T delegated(kotlin.jvm.functions.Function0<? extends T> fn);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface DrawModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+    method public default void onMeasureResultChanged();
+  }
+
+  public final class DrawModifierNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateDraw(androidx.compose.ui.node.DrawModifierNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface GlobalPositionAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface IntermediateLayoutModifierNode extends androidx.compose.ui.node.LayoutModifierNode {
+    method public long getTargetSize();
+    method public void setTargetSize(long);
+    property public abstract long targetSize;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER}) public @interface InternalCoreApi {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface LayoutAwareModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public default void onLookaheadPlaced(androidx.compose.ui.layout.LookaheadLayoutCoordinates coordinates);
+    method public default void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+    method public default void onRemeasured(long size);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface LayoutModifierNode extends androidx.compose.ui.layout.Remeasurement androidx.compose.ui.node.DelegatableNode {
+    method public default void forceRemeasure();
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateLayer(androidx.compose.ui.node.LayoutModifierNode);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateLayout(androidx.compose.ui.node.LayoutModifierNode);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateMeasurements(androidx.compose.ui.node.LayoutModifierNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public ModifierNodeElement(optional Object? params, optional boolean autoInvalidate, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public abstract N create();
+    method public abstract N update(N node);
+  }
+
+  public final class ModifierNodeElementKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static inline <reified T extends androidx.compose.ui.Modifier.Node> androidx.compose.ui.Modifier modifierElementOf(Object? key, kotlin.jvm.functions.Function0<? extends T> create, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,? extends kotlin.Unit> definitions);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static inline <reified T extends androidx.compose.ui.Modifier.Node> androidx.compose.ui.Modifier modifierElementOf(kotlin.jvm.functions.Function0<? extends T> create, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,? extends kotlin.Unit> definitions);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface ObserverNode extends androidx.compose.ui.node.DelegatableNode {
+    method public void onObservedReadsChanged();
+  }
+
+  public final class ObserverNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T extends androidx.compose.ui.Modifier.Node & androidx.compose.ui.node.ObserverNode> void observeReads(T, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface ParentDataModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  public final class ParentDataModifierNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateParentData(androidx.compose.ui.node.ParentDataModifierNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface PointerInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public default boolean interceptOutOfBoundsChildEvents();
+    method public void onCancelPointerInput();
+    method public void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    method public default boolean sharePointerInputWithSiblings();
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T?);
+    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 @androidx.compose.ui.ExperimentalComposeUiApi public default void measureAndLayoutForTest();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface SemanticsModifierNode extends androidx.compose.ui.node.DelegatableNode {
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierNodeKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.semantics.SemanticsConfiguration collapsedSemanticsConfiguration(androidx.compose.ui.node.SemanticsModifierNode);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateSemantics(androidx.compose.ui.node.SemanticsModifierNode);
+  }
+
+}
+
+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 @androidx.compose.ui.UiComposable 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);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class 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>);
+    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 default boolean hasText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> LocalAutofill;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> LocalAutofillTree;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String?);
+    method public void setValue(Object?);
+    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;
+  }
+
+  @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 @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.platform.SoftwareKeyboardController? current;
+    field public static final androidx.compose.ui.platform.LocalSoftwareKeyboardController INSTANCE;
+  }
+
+  public final class NestedScrollInteropConnectionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
+  }
+
+  @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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 enum TextToolbarStatus {
+    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
+    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 {
+    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
+    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
+  }
+
+  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.DisposeOnDetachedFromWindowOrReleasedFromPool 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.DisposeOnDetachedFromWindowOrReleasedFromPool 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
+    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInfo {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default int getKeyboardModifiers();
+    method public boolean isWindowFocused();
+    property public abstract boolean isWindowFocused;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default int keyboardModifiers;
+  }
+
+  @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 @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.Recomposer createLifecycleAwareWindowRecomposer(android.view.View, optional kotlin.coroutines.CoroutineContext coroutineContext, optional androidx.lifecycle.Lifecycle? lifecycle);
+    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?);
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @Deprecated @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 pluralStringResource(@PluralsRes int id, int count);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
+    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
+    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getDropdownList();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int DropdownList;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageDown();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageLeft();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageRight();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageUp();
+    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.Function0<java.lang.Boolean>>> getRequestFocus();
+    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>>> PageDown;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageLeft;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageRight;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageUp;
+    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.Function0<java.lang.Boolean>>> RequestFocus;
+    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);
+    method public void setMergingSemanticsOfDescendants(boolean);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public default int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property @Deprecated public default int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsContainer();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsContainer;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class SemanticsPropertiesAndroid {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getTestTagsAsResourceId();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> TestTagsAsResourceId;
+    field public static final androidx.compose.ui.semantics.SemanticsPropertiesAndroid INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invisibleToUser(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean isContainer(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 pageDown(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageLeft(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageRight(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageUp(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 requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    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);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
+    method public static void setContainer(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    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);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    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);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+  }
+
+  public final class SemanticsProperties_androidKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static boolean getTestTagsAsResourceId(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void setTestTagsAsResourceId(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+  }
+
+  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);
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    method public static androidx.compose.ui.state.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.state.ToggleableState[] values();
+    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 {
+
+  public final class TextMeasurerHelperKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.TextMeasurer rememberTextMeasurer(optional int cacheSize);
+  }
+
+}
+
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth, optional boolean decorFitsSystemWindows);
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDecorFitsSystemWindows();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean decorFitsSystemWindows;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled, optional boolean usePlatformDefaultWidth);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public enum SecureFlagPolicy {
+    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
+    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;
+  }
+
+}
+
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index d167cda..37b8dc1 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -21,9 +21,6 @@
     field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
   }
 
-  public final class ActualKt {
-  }
-
   @androidx.compose.runtime.Stable public fun interface Alignment {
     method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
     field public static final androidx.compose.ui.Alignment.Companion Companion;
@@ -158,6 +155,7 @@
     method public final boolean isAttached();
     method public void onAttach();
     method public void onDetach();
+    method public void onReset();
     method public final void sideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
     property public final boolean isAttached;
     property public final androidx.compose.ui.Modifier.Node node;
@@ -174,9 +172,6 @@
   public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
   }
 
-  public final class TempListUtilsKt {
-  }
-
   @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
   }
 
@@ -188,12 +183,6 @@
 
 package androidx.compose.ui.autofill {
 
-  public final class AndroidAutofillType_androidKt {
-  }
-
-  public final class AndroidAutofill_androidKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public interface Autofill {
     method public void cancelAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
     method public void requestAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
@@ -354,9 +343,6 @@
 
 package androidx.compose.ui.focus {
 
-  public final class BeyondBoundsLayoutKt {
-  }
-
   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);
   }
@@ -400,9 +386,6 @@
     method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
   }
 
-  public final class FocusEventModifierNodeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
     method public void clearFocus(optional boolean force);
     method public boolean moveFocus(int focusDirection);
@@ -531,9 +514,6 @@
     field public static final androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory INSTANCE;
   }
 
-  public final class FocusRequesterKt {
-  }
-
   @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
     method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
     property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
@@ -568,18 +548,6 @@
     property public final androidx.compose.ui.focus.FocusState focusState;
   }
 
-  public final class FocusTransactionsKt {
-  }
-
-  public final class FocusTraversalKt {
-  }
-
-  public final class OneDimensionalFocusSearchKt {
-  }
-
-  public final class TwoDimensionalFocusSearchKt {
-  }
-
 }
 
 package androidx.compose.ui.graphics {
@@ -931,13 +899,6 @@
 
 }
 
-package androidx.compose.ui.graphics.vector.compat {
-
-  public final class XmlVectorParser_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.hapticfeedback {
 
   public interface HapticFeedback {
@@ -1635,9 +1596,6 @@
     method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
   }
 
-  public final class NestedScrollModifierLocalKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class NestedScrollSource {
     field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
   }
@@ -1849,9 +1807,6 @@
     property public final long uptimeMillis;
   }
 
-  public final class PointerInputEventProcessorKt {
-  }
-
   public abstract class PointerInputFilter {
     ctor public PointerInputFilter();
     method public boolean getInterceptOutOfBoundsChildEvents();
@@ -1882,17 +1837,11 @@
     property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
   }
 
-  public final class PointerInputTestUtilKt {
-  }
-
   public final class PointerInteropFilter_androidKt {
     method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier motionEventSpy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,kotlin.Unit> watcher);
     method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier pointerInteropFilter(androidx.compose.ui.Modifier, optional androidx.compose.ui.input.pointer.RequestDisallowInterceptTouchEvent? requestDisallowInterceptTouchEvent, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,java.lang.Boolean> onTouchEvent);
   }
 
-  public final class PointerInteropUtils_androidKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
     ctor public PointerKeyboardModifiers(int packedValue);
   }
@@ -1975,13 +1924,6 @@
 
 }
 
-package androidx.compose.ui.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.layout {
 
   @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
@@ -2054,9 +1996,6 @@
     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();
@@ -2178,9 +2117,6 @@
     method public long localLookaheadPositionOf(androidx.compose.ui.layout.LookaheadLayoutCoordinates sourceCoordinates, optional long relativeToSource);
   }
 
-  public final class LookaheadLayoutCoordinatesKt {
-  }
-
   public final class LookaheadLayoutKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi @androidx.compose.ui.UiComposable public static void LookaheadLayout(kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LookaheadLayoutScope,kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
   }
@@ -2244,9 +2180,6 @@
     method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
   }
 
-  public final class MultiContentMeasurePolicyKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
@@ -2327,9 +2260,6 @@
     property protected abstract int parentWidth;
   }
 
-  public final class PlaceableKt {
-  }
-
   @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi @kotlin.jvm.JvmDefaultWithCompatibility public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
     method @Deprecated public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
     method @Deprecated public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit>);
@@ -2491,9 +2421,6 @@
 
 package androidx.compose.ui.node {
 
-  public final class BackwardsCompatNodeKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public interface DelegatableNode {
     method public androidx.compose.ui.Modifier.Node getNode();
     property public abstract androidx.compose.ui.Modifier.Node node;
@@ -2521,9 +2448,6 @@
     method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
   }
 
-  public final class HitTestResultKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public interface IntermediateLayoutModifierNode extends androidx.compose.ui.node.LayoutModifierNode {
     method public long getTargetSize();
     method public void setTargetSize(long);
@@ -2548,27 +2472,12 @@
     method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
   }
 
-  public final class LayoutModifierNodeCoordinatorKt {
-  }
-
   public final class LayoutModifierNodeKt {
     method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateLayer(androidx.compose.ui.node.LayoutModifierNode);
     method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateLayout(androidx.compose.ui.node.LayoutModifierNode);
     method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateMeasurements(androidx.compose.ui.node.LayoutModifierNode);
   }
 
-  public final class LayoutNodeDrawScopeKt {
-  }
-
-  public final class LayoutNodeKt {
-  }
-
-  public final class LayoutNodeLayoutDelegateKt {
-  }
-
-  public final class MeasureScopeWithLayoutNodeKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public abstract class ModifierNodeElement<N extends androidx.compose.ui.Modifier.Node> extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
     ctor public ModifierNodeElement(optional Object? params, optional boolean autoInvalidate, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
     method public abstract N create();
@@ -2580,18 +2489,6 @@
     method @androidx.compose.ui.ExperimentalComposeUiApi public static inline <reified T extends androidx.compose.ui.Modifier.Node> androidx.compose.ui.Modifier modifierElementOf(kotlin.jvm.functions.Function0<? extends T> create, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,? extends kotlin.Unit> definitions);
   }
 
-  public final class MyersDiffKt {
-  }
-
-  public final class NodeChainKt {
-  }
-
-  public final class NodeCoordinatorKt {
-  }
-
-  public final class NodeKindKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public interface ObserverNode extends androidx.compose.ui.node.DelegatableNode {
     method public void onObservedReadsChanged();
   }
@@ -2615,9 +2512,6 @@
     method public default boolean sharePointerInputWithSiblings();
   }
 
-  public final class PointerInputModifierNodeKt {
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2646,9 +2540,6 @@
     method @androidx.compose.ui.ExperimentalComposeUiApi public static void invalidateSemantics(androidx.compose.ui.node.SemanticsModifierNode);
   }
 
-  public final class ViewInterop_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.platform {
@@ -2677,12 +2568,6 @@
     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 {
   }
 
@@ -2715,9 +2600,6 @@
     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();
@@ -2790,12 +2672,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
-  public final class DebugUtilsKt {
-  }
-
-  public final class DisposableSaveableStateRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility 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>);
@@ -2806,9 +2682,6 @@
   public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
   }
 
-  public final class InfiniteAnimationPolicyKt {
-  }
-
   public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
     ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
     method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
@@ -2862,12 +2735,6 @@
     property public Object? valueOverride;
   }
 
-  public final class InvertMatrixKt {
-  }
-
-  public final class JvmActuals_jvmKt {
-  }
-
   @androidx.compose.ui.ExperimentalComposeUiApi public final class LocalSoftwareKeyboardController {
     method @androidx.compose.runtime.Composable public androidx.compose.ui.platform.SoftwareKeyboardController? getCurrent();
     method public infix androidx.compose.runtime.ProvidedValue<androidx.compose.ui.platform.SoftwareKeyboardController> provides(androidx.compose.ui.platform.SoftwareKeyboardController softwareKeyboardController);
@@ -2879,9 +2746,6 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
   }
 
-  public final class ShapeContainingUtilKt {
-  }
-
   @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public interface SoftwareKeyboardController {
     method public void hide();
     method @Deprecated public default void hideSoftwareKeyboard();
@@ -2959,9 +2823,6 @@
     field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
   }
 
-  public final class ViewCompositionStrategy_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
     method public long getDoubleTapMinTimeMillis();
     method public long getDoubleTapTimeoutMillis();
@@ -3006,9 +2867,6 @@
     property @androidx.compose.ui.ExperimentalComposeUiApi public default int keyboardModifiers;
   }
 
-  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;
@@ -3032,16 +2890,6 @@
     method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext?);
   }
 
-  public final class Wrapper_androidKt {
-  }
-
-}
-
-package androidx.compose.ui.platform.accessibility {
-
-  public final class CollectionInfoKt {
-  }
-
 }
 
 package androidx.compose.ui.res {
@@ -3070,9 +2918,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
   }
 
-  public final class Resources_androidKt {
-  }
-
   public final class StringResources_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
@@ -3293,9 +3138,6 @@
     property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
   }
 
-  public final class SemanticsNodeKt {
-  }
-
   public final class SemanticsOwner {
     method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
     method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
@@ -3462,9 +3304,6 @@
     method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
   }
 
-  public final class SemanticsSortKt {
-  }
-
 }
 
 package androidx.compose.ui.state {
@@ -3491,27 +3330,8 @@
 
 }
 
-package androidx.compose.ui.text.input {
-
-  public final class CursorAnchorInfoBuilderKt {
-  }
-
-  public final class InputState_androidKt {
-  }
-
-  public final class RecordingInputConnection_androidKt {
-  }
-
-  public final class TextInputServiceAndroid_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.viewinterop {
 
-  public final class AndroidViewHolder_androidKt {
-  }
-
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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();
@@ -3583,8 +3403,5 @@
     enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
   }
 
-  public final class SecureFlagPolicy_androidKt {
-  }
-
 }
 
diff --git a/compose/ui/ui/api/res-1.4.0-beta01.txt b/compose/ui/ui/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui/api/res-1.4.0-beta01.txt
diff --git a/compose/ui/ui/api/restricted_1.4.0-beta01.txt b/compose/ui/ui/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..2973b2b
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,3039 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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);
+  }
+
+  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public float getScaleFactor();
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    property public abstract float scaleFactor;
+    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
+  }
+
+  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
+  }
+
+  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.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  @kotlin.jvm.JvmInline public final value class FocusDirection {
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method public int getLeft();
+    method public int getNext();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int Left;
+    property public final int Next;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated 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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  @Deprecated public final class FocusOrder {
+    ctor @Deprecated public FocusOrder();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
+    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
+    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
+    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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method @Deprecated 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 @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public default androidx.compose.ui.focus.FocusRequester getDown();
+    method public default androidx.compose.ui.focus.FocusRequester getEnd();
+    method public default androidx.compose.ui.focus.FocusRequester getLeft();
+    method public default androidx.compose.ui.focus.FocusRequester getNext();
+    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public default androidx.compose.ui.focus.FocusRequester getRight();
+    method public default androidx.compose.ui.focus.FocusRequester getStart();
+    method public default androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setCanFocus(boolean);
+    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
+    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
+    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
+    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
+    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
+    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
+    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
+    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
+    property public abstract boolean canFocus;
+    property public default androidx.compose.ui.focus.FocusRequester down;
+    property public default androidx.compose.ui.focus.FocusRequester end;
+    property public default androidx.compose.ui.focus.FocusRequester left;
+    property public default androidx.compose.ui.focus.FocusRequester next;
+    property public default androidx.compose.ui.focus.FocusRequester previous;
+    property public default androidx.compose.ui.focus.FocusRequester right;
+    property public default androidx.compose.ui.focus.FocusRequester start;
+    property public default androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  @androidx.compose.runtime.Stable 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;
+  }
+
+  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class CompositingStrategy {
+    field public static final androidx.compose.ui.graphics.CompositingStrategy.Companion Companion;
+  }
+
+  public static final class CompositingStrategy.Companion {
+    method public int getAuto();
+    method public int getModulateAlpha();
+    method public int getOffscreen();
+    property public final int Auto;
+    property public final int ModulateAlpha;
+    property public final int Offscreen;
+  }
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor, optional int compositingStrategy);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public default long getAmbientShadowColor();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default int getCompositingStrategy();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public default long getSize();
+    method public default long getSpotShadowColor();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float);
+    method public default void setAmbientShadowColor(long);
+    method public void setCameraDistance(float);
+    method public void setClip(boolean);
+    method public default void setCompositingStrategy(int);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
+    method public void setRotationX(float);
+    method public void setRotationY(float);
+    method public void setRotationZ(float);
+    method public void setScaleX(float);
+    method public void setScaleY(float);
+    method public void setShadowElevation(float);
+    method public void setShape(androidx.compose.ui.graphics.Shape);
+    method public default void setSpotShadowColor(long);
+    method public void setTransformOrigin(long);
+    method public void setTranslationX(float);
+    method public void setTranslationY(float);
+    property public abstract float alpha;
+    property public default long ambientShadowColor;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default int compositingStrategy;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public default long size;
+    property public default long spotShadowColor;
+    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();
+    method public static long getDefaultShadowColor();
+    property public static final long DefaultShadowColor;
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
+    method public float getPivotFractionX();
+    method public float getPivotFractionY();
+    property public final float pivotFractionX;
+    property public final float pivotFractionY;
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public boolean getAutoMirror();
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final boolean autoMirror;
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
+    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable 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 @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
+    ctor public HapticFeedbackType(int value);
+    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  @kotlin.jvm.JvmInline public final value class InputMode {
+    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  @kotlin.jvm.JvmInline public final value class Key {
+    ctor public Key(long keyCode);
+    method public long getKeyCode();
+    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();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEvent {
+    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  @kotlin.jvm.JvmInline public final value class KeyEventType {
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
+    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  @Deprecated public final class ConsumedData {
+    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
+    method @Deprecated public boolean getDownChange();
+    method @Deprecated public boolean getPositionChange();
+    method @Deprecated public void setDownChange(boolean);
+    method @Deprecated public void setPositionChange(boolean);
+    property @Deprecated public final boolean downChange;
+    property @Deprecated public final boolean positionChange;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerButtons {
+    ctor public PointerButtons(int packedValue);
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method @Deprecated 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 @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method @Deprecated 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 {
+    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerEventType {
+    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getScroll();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Scroll;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  @androidx.compose.runtime.Stable public interface PointerIcon {
+    field public static final androidx.compose.ui.input.pointer.PointerIcon.Companion Companion;
+  }
+
+  public static final class PointerIcon.Companion {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+  }
+
+  public final class PointerIconKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerId {
+    ctor public PointerId(long value);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
+    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public void consume();
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
+    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public long getScrollDelta();
+    method public int getType();
+    method public long getUptimeMillis();
+    method public boolean isConsumed();
+    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property public final long id;
+    property public final boolean isConsumed;
+    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 long scrollDelta;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers(int packedValue);
+  }
+
+  @kotlin.jvm.JvmInline public final value class PointerType {
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTracker1D {
+    ctor public VelocityTracker1D(boolean isDataDifferential);
+    method public void addDataPoint(long timeMillis, float dataPoint);
+    method public float calculateVelocity();
+    method public boolean isDataDifferential();
+    method public void resetTracking();
+    property public final boolean isDataDifferential;
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.input.rotary {
+
+  public final class RotaryInputModifierKt {
+    method public static androidx.compose.ui.Modifier onPreRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onPreRotaryScrollEvent);
+    method public static androidx.compose.ui.Modifier onRotaryScrollEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.rotary.RotaryScrollEvent,java.lang.Boolean> onRotaryScrollEvent);
+  }
+
+  public final class RotaryScrollEvent {
+    method public float getHorizontalScrollPixels();
+    method public long getUptimeMillis();
+    method public float getVerticalScrollPixels();
+    property public final float horizontalScrollPixels;
+    property public final long uptimeMillis;
+    property public final float verticalScrollPixels;
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  public interface BeyondBoundsLayout {
+    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
+  }
+
+  public static interface BeyondBoundsLayout.BeyondBoundsScope {
+    method public boolean getHasMoreContent();
+    property public abstract boolean hasMoreContent;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
+    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
+  }
+
+  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
+    method public int getAbove();
+    method public int getAfter();
+    method public int getBefore();
+    method public int getBelow();
+    method public int getLeft();
+    method public int getRight();
+    property public final int Above;
+    property public final int After;
+    property public final int Before;
+    property public final int Below;
+    property public final int Left;
+    property public final int Right;
+  }
+
+  public final class BeyondBoundsLayoutKt {
+    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
+    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getSemanticsId();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract int semanticsId;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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.Function0<kotlin.Unit> combineAsVirtualLayouts(java.util.List<? extends kotlin.jvm.functions.Function0<kotlin.Unit>> contents);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    method public default Object? getParentData();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+    property public default Object? parentData;
+  }
+
+  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;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MultiContentMeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends 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 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 java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable>> measurables, int height);
+  }
+
+  public final class MultiContentMeasurePolicyKt {
+    method @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy createMeasurePolicy(androidx.compose.ui.layout.MultiContentMeasurePolicy measurePolicy);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnPlacedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  @androidx.compose.runtime.Stable public interface PinnableContainer {
+    method public androidx.compose.ui.layout.PinnableContainer.PinnedHandle pin();
+  }
+
+  public static fun interface PinnableContainer.PinnedHandle {
+    method public void release();
+  }
+
+  public final class PinnableContainerKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> getLocalPinnableContainer();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.layout.PinnableContainer> LocalPinnableContainer;
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long);
+    method protected final void setMeasurementConstraints(long);
+    property protected final long apparentToRealOffset;
+    property public final int height;
+    property public int measuredHeight;
+    property protected final long measuredSize;
+    property public int measuredWidth;
+    property protected final long measurementConstraints;
+    property public final int width;
+  }
+
+  public abstract static class Placeable.PlacementScope {
+    ctor public Placeable.PlacementScope();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method public long copy(optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method public float getScaleX();
+    method public float getScaleY();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    property @androidx.compose.runtime.Stable public final float scaleX;
+    property @androidx.compose.runtime.Stable public final float scaleY;
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
+    ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    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();
+    method public default int getPlaceablesCount();
+    method public default void premeasure(int index, long constraints);
+    property public default int placeablesCount;
+  }
+
+  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 interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
+  }
+
+  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
+    method public void clear();
+    method public java.util.Iterator<java.lang.Object> iterator();
+    method public boolean remove(Object? slotId);
+    method public boolean removeAll(java.util.Collection<?> slotIds);
+    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method public boolean retainAll(java.util.Collection<?> slotIds);
+    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  @kotlin.PublishedApi internal interface ComposeUiNode {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public androidx.compose.ui.layout.MeasurePolicy getMeasurePolicy();
+    method public androidx.compose.ui.Modifier getModifier();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public void setDensity(androidx.compose.ui.unit.Density);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection);
+    method public void setMeasurePolicy(androidx.compose.ui.layout.MeasurePolicy);
+    method public void setModifier(androidx.compose.ui.Modifier);
+    method public void setViewConfiguration(androidx.compose.ui.platform.ViewConfiguration);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.MeasurePolicy measurePolicy;
+    property public abstract androidx.compose.ui.Modifier modifier;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    field public static final androidx.compose.ui.node.ComposeUiNode.Companion Companion;
+  }
+
+  public static final class ComposeUiNode.Companion {
+    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getConstructor();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> getSetDensity();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> getSetLayoutDirection();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> getSetModifier();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> getSetViewConfiguration();
+    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getVirtualConstructor();
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> VirtualConstructor;
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T?);
+    property public final T? value;
+  }
+
+  public interface RootForTest {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
+    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+}
+
+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 @androidx.compose.ui.UiComposable 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);
+    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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class 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>);
+    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 default boolean hasText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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>);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method @kotlin.PublishedApi internal static androidx.compose.ui.Modifier inspectableWrapper(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, androidx.compose.ui.Modifier wrapped);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String?);
+    method public void setValue(Object?);
+    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 NestedScrollInteropConnectionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility 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 enum TextToolbarStatus {
+    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
+    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 {
+    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
+    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
+  }
+
+  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.DisposeOnDetachedFromWindowOrReleasedFromPool 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.DisposeOnDetachedFromWindowOrReleasedFromPool 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;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
+    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 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?);
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @Deprecated @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 pluralStringResource(@PluralsRes int id, int count);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
+    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
+    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getDropdownList();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int DropdownList;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageDown();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageLeft();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageRight();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPageUp();
+    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.Function0<java.lang.Boolean>>> getRequestFocus();
+    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>>> PageDown;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageLeft;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageRight;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PageUp;
+    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.Function0<java.lang.Boolean>>> RequestFocus;
+    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);
+    method public void setMergingSemanticsOfDescendants(boolean);
+    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);
+  }
+
+  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public default int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property @Deprecated public default int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getIsContainer();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> IsContainer;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static boolean isContainer(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 pageDown(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageLeft(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageRight(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void pageUp(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 requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    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);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
+    method public static void setContainer(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    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);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
+    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);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
+  }
+
+  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);
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    method public static androidx.compose.ui.state.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.state.ToggleableState[] values();
+    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.viewinterop {
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth, optional boolean decorFitsSystemWindows);
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDecorFitsSystemWindows();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean decorFitsSystemWindows;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method public boolean getUsePlatformDefaultWidth();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property public final boolean usePlatformDefaultWidth;
+  }
+
+  public enum SecureFlagPolicy {
+    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
+    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;
+  }
+
+}
+
diff --git a/compose/ui/ui/api/restricted_current.ignore b/compose/ui/ui/api/restricted_current.ignore
index b9629b2..4ab8136 100644
--- a/compose/ui/ui/api/restricted_current.ignore
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -3,5 +3,135 @@
     Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean,androidx.compose.ui.graphics.RenderEffect,long,long)
 
 
+RemovedClass: androidx.compose.ui.ActualKt:
+    Removed class androidx.compose.ui.ActualKt
+RemovedClass: androidx.compose.ui.TempListUtilsKt:
+    Removed class androidx.compose.ui.TempListUtilsKt
+RemovedClass: androidx.compose.ui.focus.BeyondBoundsLayoutKt:
+    Removed class androidx.compose.ui.focus.BeyondBoundsLayoutKt
 RemovedClass: androidx.compose.ui.focus.FocusManagerKt:
     Removed class androidx.compose.ui.focus.FocusManagerKt
+RemovedClass: androidx.compose.ui.focus.FocusRequesterKt:
+    Removed class androidx.compose.ui.focus.FocusRequesterKt
+RemovedClass: androidx.compose.ui.focus.FocusTransactionsKt:
+    Removed class androidx.compose.ui.focus.FocusTransactionsKt
+RemovedClass: androidx.compose.ui.focus.FocusTraversalKt:
+    Removed class androidx.compose.ui.focus.FocusTraversalKt
+RemovedClass: androidx.compose.ui.focus.OneDimensionalFocusSearchKt:
+    Removed class androidx.compose.ui.focus.OneDimensionalFocusSearchKt
+RemovedClass: androidx.compose.ui.focus.TwoDimensionalFocusSearchKt:
+    Removed class androidx.compose.ui.focus.TwoDimensionalFocusSearchKt
+RemovedClass: androidx.compose.ui.input.nestedscroll.NestedScrollModifierLocalKt:
+    Removed class androidx.compose.ui.input.nestedscroll.NestedScrollModifierLocalKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInputEventProcessorKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInputEventProcessorKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInputTestUtilKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInputTestUtilKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInteropFilter_androidKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInteropFilter_androidKt
+RemovedClass: androidx.compose.ui.input.pointer.PointerInteropUtils_androidKt:
+    Removed class androidx.compose.ui.input.pointer.PointerInteropUtils_androidKt
+RemovedClass: androidx.compose.ui.layout.ContentScaleKt:
+    Removed class androidx.compose.ui.layout.ContentScaleKt
+RemovedClass: androidx.compose.ui.layout.LookaheadLayoutCoordinatesKt:
+    Removed class androidx.compose.ui.layout.LookaheadLayoutCoordinatesKt
+RemovedClass: androidx.compose.ui.layout.LookaheadLayoutKt:
+    Removed class androidx.compose.ui.layout.LookaheadLayoutKt
+RemovedClass: androidx.compose.ui.layout.PlaceableKt:
+    Removed class androidx.compose.ui.layout.PlaceableKt
+RemovedClass: androidx.compose.ui.layout.RelocationModifierKt:
+    Removed class androidx.compose.ui.layout.RelocationModifierKt
+RemovedClass: androidx.compose.ui.layout.RelocationRequesterModifierKt:
+    Removed class androidx.compose.ui.layout.RelocationRequesterModifierKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalConsumerKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalConsumerKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalNodeKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalNodeKt
+RemovedClass: androidx.compose.ui.modifier.ModifierLocalProviderKt:
+    Removed class androidx.compose.ui.modifier.ModifierLocalProviderKt
+RemovedClass: androidx.compose.ui.node.BackwardsCompatNodeKt:
+    Removed class androidx.compose.ui.node.BackwardsCompatNodeKt
+RemovedClass: androidx.compose.ui.node.DelegatableNodeKt:
+    Removed class androidx.compose.ui.node.DelegatableNodeKt
+RemovedClass: androidx.compose.ui.node.DrawModifierNodeKt:
+    Removed class androidx.compose.ui.node.DrawModifierNodeKt
+RemovedClass: androidx.compose.ui.node.HitTestResultKt:
+    Removed class androidx.compose.ui.node.HitTestResultKt
+RemovedClass: androidx.compose.ui.node.LayoutModifierNodeCoordinatorKt:
+    Removed class androidx.compose.ui.node.LayoutModifierNodeCoordinatorKt
+RemovedClass: androidx.compose.ui.node.LayoutModifierNodeKt:
+    Removed class androidx.compose.ui.node.LayoutModifierNodeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeDrawScopeKt:
+    Removed class androidx.compose.ui.node.LayoutNodeDrawScopeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeKt:
+    Removed class androidx.compose.ui.node.LayoutNodeKt
+RemovedClass: androidx.compose.ui.node.LayoutNodeLayoutDelegateKt:
+    Removed class androidx.compose.ui.node.LayoutNodeLayoutDelegateKt
+RemovedClass: androidx.compose.ui.node.MeasureScopeWithLayoutNodeKt:
+    Removed class androidx.compose.ui.node.MeasureScopeWithLayoutNodeKt
+RemovedClass: androidx.compose.ui.node.ModifierNodeElementKt:
+    Removed class androidx.compose.ui.node.ModifierNodeElementKt
+RemovedClass: androidx.compose.ui.node.MyersDiffKt:
+    Removed class androidx.compose.ui.node.MyersDiffKt
+RemovedClass: androidx.compose.ui.node.NodeChainKt:
+    Removed class androidx.compose.ui.node.NodeChainKt
+RemovedClass: androidx.compose.ui.node.NodeCoordinatorKt:
+    Removed class androidx.compose.ui.node.NodeCoordinatorKt
+RemovedClass: androidx.compose.ui.node.NodeKindKt:
+    Removed class androidx.compose.ui.node.NodeKindKt
+RemovedClass: androidx.compose.ui.node.PointerInputModifierNodeKt:
+    Removed class androidx.compose.ui.node.PointerInputModifierNodeKt
+RemovedClass: androidx.compose.ui.node.SemanticsModifierNodeKt:
+    Removed class androidx.compose.ui.node.SemanticsModifierNodeKt
+RemovedClass: androidx.compose.ui.node.ViewInterop_androidKt:
+    Removed class androidx.compose.ui.node.ViewInterop_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidClipboardManager_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidClipboardManager_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat_androidKt
+RemovedClass: androidx.compose.ui.platform.AndroidUiDispatcher_androidKt:
+    Removed class androidx.compose.ui.platform.AndroidUiDispatcher_androidKt
+RemovedClass: androidx.compose.ui.platform.DebugUtilsKt:
+    Removed class androidx.compose.ui.platform.DebugUtilsKt
+RemovedClass: androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt:
+    Removed class androidx.compose.ui.platform.DisposableSaveableStateRegistry_androidKt
+RemovedClass: androidx.compose.ui.platform.InfiniteAnimationPolicyKt:
+    Removed class androidx.compose.ui.platform.InfiniteAnimationPolicyKt
+RemovedClass: androidx.compose.ui.platform.InvertMatrixKt:
+    Removed class androidx.compose.ui.platform.InvertMatrixKt
+RemovedClass: androidx.compose.ui.platform.JvmActuals_jvmKt:
+    Removed class androidx.compose.ui.platform.JvmActuals_jvmKt
+RemovedClass: androidx.compose.ui.platform.ShapeContainingUtilKt:
+    Removed class androidx.compose.ui.platform.ShapeContainingUtilKt
+RemovedClass: androidx.compose.ui.platform.ViewCompositionStrategy_androidKt:
+    Removed class androidx.compose.ui.platform.ViewCompositionStrategy_androidKt
+RemovedClass: androidx.compose.ui.platform.WindowInfoKt:
+    Removed class androidx.compose.ui.platform.WindowInfoKt
+RemovedClass: androidx.compose.ui.platform.Wrapper_androidKt:
+    Removed class androidx.compose.ui.platform.Wrapper_androidKt
+RemovedClass: androidx.compose.ui.res.Resources_androidKt:
+    Removed class androidx.compose.ui.res.Resources_androidKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsNodeKt:
+    Removed class androidx.compose.ui.semantics.SemanticsNodeKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsProperties_androidKt:
+    Removed class androidx.compose.ui.semantics.SemanticsProperties_androidKt
+RemovedClass: androidx.compose.ui.semantics.SemanticsSortKt:
+    Removed class androidx.compose.ui.semantics.SemanticsSortKt
+RemovedClass: androidx.compose.ui.viewinterop.AndroidViewHolder_androidKt:
+    Removed class androidx.compose.ui.viewinterop.AndroidViewHolder_androidKt
+RemovedClass: androidx.compose.ui.window.SecureFlagPolicy_androidKt:
+    Removed class androidx.compose.ui.window.SecureFlagPolicy_androidKt
+
+
+RemovedPackage: androidx.compose.ui.autofill:
+    Removed package androidx.compose.ui.autofill
+RemovedPackage: androidx.compose.ui.graphics.vector.compat:
+    Removed package androidx.compose.ui.graphics.vector.compat
+RemovedPackage: androidx.compose.ui.internal:
+    Removed package androidx.compose.ui.internal
+RemovedPackage: androidx.compose.ui.platform.accessibility:
+    Removed package androidx.compose.ui.platform.accessibility
+RemovedPackage: androidx.compose.ui.text:
+    Removed package androidx.compose.ui.text
+RemovedPackage: androidx.compose.ui.text.input:
+    Removed package androidx.compose.ui.text.input
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 6165576..2973b2b 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -21,9 +21,6 @@
     field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
   }
 
-  public final class ActualKt {
-  }
-
   @androidx.compose.runtime.Stable public fun interface Alignment {
     method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
     field public static final androidx.compose.ui.Alignment.Companion Companion;
@@ -153,9 +150,6 @@
   public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
   }
 
-  public final class TempListUtilsKt {
-  }
-
   @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
   }
 
@@ -165,16 +159,6 @@
 
 }
 
-package androidx.compose.ui.autofill {
-
-  public final class AndroidAutofillType_androidKt {
-  }
-
-  public final class AndroidAutofill_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.draw {
 
   public final class AlphaKt {
@@ -266,9 +250,6 @@
 
 package androidx.compose.ui.focus {
 
-  public final class BeyondBoundsLayoutKt {
-  }
-
   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);
   }
@@ -300,9 +281,6 @@
     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 final class FocusEventModifierNodeKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
     method public void clearFocus(optional boolean force);
     method public boolean moveFocus(int focusDirection);
@@ -398,9 +376,6 @@
     property public final androidx.compose.ui.focus.FocusRequester Default;
   }
 
-  public final class FocusRequesterKt {
-  }
-
   @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
     method @Deprecated public androidx.compose.ui.focus.FocusRequester getFocusRequester();
     property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
@@ -410,9 +385,6 @@
     method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
   }
 
-  public final class FocusRequesterModifierNodeKt {
-  }
-
   public interface FocusState {
     method public boolean getHasFocus();
     method public boolean isCaptured();
@@ -422,18 +394,6 @@
     property public abstract boolean isFocused;
   }
 
-  public final class FocusTransactionsKt {
-  }
-
-  public final class FocusTraversalKt {
-  }
-
-  public final class OneDimensionalFocusSearchKt {
-  }
-
-  public final class TwoDimensionalFocusSearchKt {
-  }
-
 }
 
 package androidx.compose.ui.graphics {
@@ -785,13 +745,6 @@
 
 }
 
-package androidx.compose.ui.graphics.vector.compat {
-
-  public final class XmlVectorParser_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.hapticfeedback {
 
   public interface HapticFeedback {
@@ -1483,9 +1436,6 @@
     method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
   }
 
-  public final class NestedScrollModifierLocalKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class NestedScrollSource {
     field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
   }
@@ -1682,9 +1632,6 @@
     property public final long uptimeMillis;
   }
 
-  public final class PointerInputEventProcessorKt {
-  }
-
   public abstract class PointerInputFilter {
     ctor public PointerInputFilter();
     method public boolean getInterceptOutOfBoundsChildEvents();
@@ -1713,15 +1660,6 @@
     property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
   }
 
-  public final class PointerInputTestUtilKt {
-  }
-
-  public final class PointerInteropFilter_androidKt {
-  }
-
-  public final class PointerInteropUtils_androidKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
     ctor public PointerKeyboardModifiers(int packedValue);
   }
@@ -1794,13 +1732,6 @@
 
 }
 
-package androidx.compose.ui.internal {
-
-  public final class JvmDefaultWithCompatibility_jvmKt {
-  }
-
-}
-
 package androidx.compose.ui.layout {
 
   @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
@@ -1873,9 +1804,6 @@
     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();
@@ -1995,12 +1923,6 @@
     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 final class LookaheadLayoutCoordinatesKt {
-  }
-
-  public final class LookaheadLayoutKt {
-  }
-
   public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
     method public androidx.compose.ui.layout.Placeable measure(long constraints);
   }
@@ -2137,15 +2059,6 @@
     property protected abstract int parentWidth;
   }
 
-  public final class PlaceableKt {
-  }
-
-  public final class RelocationModifierKt {
-  }
-
-  public final class RelocationRequesterModifierKt {
-  }
-
   public interface Remeasurement {
     method public void forceRemeasure();
   }
@@ -2240,16 +2153,10 @@
     method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
   }
 
-  public final class ModifierLocalConsumerKt {
-  }
-
   public final class ModifierLocalKt {
     method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
   }
 
-  public final class ModifierLocalNodeKt {
-  }
-
   @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
     method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
     method public T! getValue();
@@ -2257,9 +2164,6 @@
     property public abstract T! value;
   }
 
-  public final class ModifierLocalProviderKt {
-  }
-
   public interface ModifierLocalReadScope {
     method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
   }
@@ -2272,9 +2176,6 @@
 
 package androidx.compose.ui.node {
 
-  public final class BackwardsCompatNodeKt {
-  }
-
   @kotlin.PublishedApi internal interface ComposeUiNode {
     method public androidx.compose.ui.unit.Density getDensity();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -2311,57 +2212,6 @@
     property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> VirtualConstructor;
   }
 
-  public final class DelegatableNodeKt {
-  }
-
-  public final class DrawModifierNodeKt {
-  }
-
-  public final class HitTestResultKt {
-  }
-
-  public final class LayoutModifierNodeCoordinatorKt {
-  }
-
-  public final class LayoutModifierNodeKt {
-  }
-
-  public final class LayoutNodeDrawScopeKt {
-  }
-
-  public final class LayoutNodeKt {
-  }
-
-  public final class LayoutNodeLayoutDelegateKt {
-  }
-
-  public final class MeasureScopeWithLayoutNodeKt {
-  }
-
-  public final class ModifierNodeElementKt {
-  }
-
-  public final class MyersDiffKt {
-  }
-
-  public final class NodeChainKt {
-  }
-
-  public final class NodeCoordinatorKt {
-  }
-
-  public final class NodeKindKt {
-  }
-
-  public final class ObserverNodeKt {
-  }
-
-  public final class ParentDataModifierNodeKt {
-  }
-
-  public final class PointerInputModifierNodeKt {
-  }
-
   public final class Ref<T> {
     ctor public Ref();
     method public T? getValue();
@@ -2379,12 +2229,6 @@
     property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
   }
 
-  public final class SemanticsModifierNodeKt {
-  }
-
-  public final class ViewInterop_androidKt {
-  }
-
 }
 
 package androidx.compose.ui.platform {
@@ -2413,12 +2257,6 @@
     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 {
   }
 
@@ -2451,9 +2289,6 @@
     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();
@@ -2522,12 +2357,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
-  public final class DebugUtilsKt {
-  }
-
-  public final class DisposableSaveableStateRegistry_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility 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>);
@@ -2538,9 +2367,6 @@
   public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
   }
 
-  public final class InfiniteAnimationPolicyKt {
-  }
-
   public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
     ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
     method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
@@ -2595,19 +2421,10 @@
     property public Object? valueOverride;
   }
 
-  public final class InvertMatrixKt {
-  }
-
-  public final class JvmActuals_jvmKt {
-  }
-
   public final class NestedScrollInteropConnectionKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
   }
 
-  public final class ShapeContainingUtilKt {
-  }
-
   public final class TestTagKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
   }
@@ -2678,9 +2495,6 @@
     field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
   }
 
-  public final class ViewCompositionStrategy_androidKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
     method public long getDoubleTapMinTimeMillis();
     method public long getDoubleTapTimeoutMillis();
@@ -2723,25 +2537,12 @@
     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?);
   }
 
-  public final class Wrapper_androidKt {
-  }
-
-}
-
-package androidx.compose.ui.platform.accessibility {
-
-  public final class CollectionInfoKt {
-  }
-
 }
 
 package androidx.compose.ui.res {
@@ -2770,9 +2571,6 @@
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
   }
 
-  public final class Resources_androidKt {
-  }
-
   public final class StringResources_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String pluralStringResource(@PluralsRes int id, int count, java.lang.Object... formatArgs);
@@ -2993,9 +2791,6 @@
     property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
   }
 
-  public final class SemanticsNodeKt {
-  }
-
   public final class SemanticsOwner {
     method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
     method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
@@ -3137,9 +2932,6 @@
     method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
   }
 
-  public final class SemanticsProperties_androidKt {
-  }
-
   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();
@@ -3153,9 +2945,6 @@
     method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
   }
 
-  public final class SemanticsSortKt {
-  }
-
 }
 
 package androidx.compose.ui.state {
@@ -3174,34 +2963,8 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextMeasurerHelperKt {
-  }
-
-}
-
-package androidx.compose.ui.text.input {
-
-  public final class CursorAnchorInfoBuilderKt {
-  }
-
-  public final class InputState_androidKt {
-  }
-
-  public final class RecordingInputConnection_androidKt {
-  }
-
-  public final class TextInputServiceAndroid_androidKt {
-  }
-
-}
-
 package androidx.compose.ui.viewinterop {
 
-  public final class AndroidViewHolder_androidKt {
-  }
-
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable 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();
@@ -3272,8 +3035,5 @@
     enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
   }
 
-  public final class SecureFlagPolicy_androidKt {
-  }
-
 }
 
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index d7dd5c0..d67f31c 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -71,7 +71,7 @@
         implementation("androidx.autofill:autofill:1.0.0")
         implementation(libs.kotlinCoroutinesAndroid)
 
-        implementation(project(":activity:activity"))
+        implementation("androidx.activity:activity:1.7.0-beta01")
         implementation("androidx.activity:activity-ktx:1.5.1")
         implementation("androidx.core:core:1.9.0")
         implementation('androidx.collection:collection:1.0.0')
@@ -169,8 +169,7 @@
                 implementation("androidx.autofill:autofill:1.0.0")
                 implementation(libs.kotlinCoroutinesAndroid)
 
-                implementation(project(":activity:activity"))
-                implementation("androidx.activity:activity-ktx:1.5.1")
+                implementation("androidx.activity:activity:1.7.0-beta01")
                 implementation("androidx.core:core:1.9.0")
                 implementation('androidx.collection:collection:1.0.0')
                 implementation("androidx.customview:customview-poolingcontainer:1.0.0")
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
index a77b01b..db30658 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
@@ -233,10 +233,14 @@
     )
 )
 
-private val AccessibilityDemos = DemoCategory(
+val AccessibilityDemos = DemoCategory(
     "Accessibility",
     listOf(
-        ComposableDemo("Overlaid Nodes") { OverlaidNodeLayoutDemo() }
+        ComposableDemo("Scaffold Top Bar") { ScaffoldSample() },
+        ComposableDemo("Scaffold with Scrolling") { ScaffoldSampleScroll() },
+        ComposableDemo("Simple Top Bar with Scrolling") { ScrollingColumnDemo() },
+        ComposableDemo("Nested Containers—True") { NestedContainersTrueDemo() },
+        ComposableDemo("Nested Containers—False") { NestedContainersFalseDemo() }
     )
 )
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt
index 6e36aee..9d4725fe 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt
@@ -16,13 +16,33 @@
 
 package androidx.compose.ui.demos
 
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.BottomAppBar
+import androidx.compose.material.DrawerValue
+import androidx.compose.material.FabPosition
+import androidx.compose.material.FloatingActionButton
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Scaffold
 import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
+import androidx.compose.material.rememberDrawerState
+import androidx.compose.material.rememberScaffoldState
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.isContainer
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 
@@ -58,7 +78,7 @@
 fun OverlaidNodeLayoutDemo() {
     LastElementOverLaidColumn(modifier = Modifier.padding(8.dp)) {
         Row {
-            Column {
+            Column(modifier = Modifier.testTag("Text1")) {
                 Row { Text("text1\n") }
                 Row { Text("text2\n") }
                 Row { Text("text3\n") }
@@ -69,3 +89,151 @@
         }
     }
 }
+
+@Composable
+fun CardRow(
+    modifier: Modifier,
+    columnNumber: Int,
+    topSampleText: String,
+    bottomSampleText: String
+) {
+    Row(
+        modifier,
+        verticalAlignment = Alignment.CenterVertically,
+        horizontalArrangement = Arrangement.End
+    ) {
+        Column {
+            Text(topSampleText + columnNumber)
+            Text(bottomSampleText + columnNumber)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun NestedContainersFalseDemo() {
+    var topSampleText = "Top text in column "
+    var bottomSampleText = "Bottom text in column "
+    Column(
+        Modifier
+            .testTag("Test Tag")
+            .semantics { isContainer = true }
+    ) {
+        Row() { Modifier.semantics { isContainer = true }
+            CardRow(
+                Modifier.semantics { isContainer = false },
+                1,
+                topSampleText,
+                bottomSampleText)
+            CardRow(
+                Modifier.semantics { isContainer = false },
+                2,
+                topSampleText,
+                bottomSampleText)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun NestedContainersTrueDemo() {
+    var topSampleText = "Top text in column "
+    var bottomSampleText = "Bottom text in column "
+    Column(
+        Modifier
+            .testTag("Test Tag")
+            .semantics { isContainer = true }
+    ) {
+        Row() { Modifier.semantics { isContainer = true }
+            CardRow(
+                Modifier.semantics { isContainer = true },
+                1,
+                topSampleText,
+                bottomSampleText)
+            CardRow(
+                Modifier.semantics { isContainer = true },
+                2,
+                topSampleText,
+                bottomSampleText)
+        }
+    }
+}
+
+@Composable
+fun TopAppBar() {
+    val topAppBar = "Top App Bar"
+    TopAppBar(
+        title = {
+            Text(text = topAppBar)
+        }
+    )
+}
+
+@Composable
+fun ScrollColumn(padding: PaddingValues) {
+    var counter = 0
+    var sampleText = "Sample text in column"
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .padding(padding)
+            .testTag("Test Tag")
+    ) {
+        repeat(100) {
+            Text(sampleText + counter++)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun ScaffoldSample() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        drawerContent = { Text(text = "Drawer Menu 1") },
+        content = { padding -> Text("Content", modifier = Modifier.padding(padding)) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun ScaffoldSampleScroll() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        content = { padding -> ScrollColumn(padding) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun ScrollingColumnDemo() {
+    var sampleText = "Sample text in column"
+    var counter = 0
+
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .testTag("Test Tag")
+    ) {
+        TopAppBar()
+        repeat(100) {
+            Text(sampleText + counter++)
+        }
+    }
+}
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
index 56d110a..01ad27a 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
@@ -26,6 +26,9 @@
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -313,3 +316,20 @@
         }
     )
 }
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun ModifierNodeResetSample() {
+    class SelectableNode : Modifier.Node() {
+        var selected by mutableStateOf(false)
+
+        override fun onReset() {
+            // reset `selected` to the initial value as if the node will be reused for
+            // displaying different content it shouldn't be selected straight away.
+            selected = false
+        }
+
+        // some logic which sets `selected` to true when it is selected
+    }
+}
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 1e844e4..adc7989 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
@@ -47,6 +47,7 @@
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.gestures.scrollBy
 import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -65,13 +66,22 @@
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.BottomAppBar
+import androidx.compose.material.DrawerValue
 import androidx.compose.material.DropdownMenu
 import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.FabPosition
+import androidx.compose.material.FloatingActionButton
 import androidx.compose.material.Icon
 import androidx.compose.material.IconButton
+import androidx.compose.material.Scaffold
 import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
 import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
 import androidx.compose.material.icons.filled.MoreVert
+import androidx.compose.material.rememberDrawerState
+import androidx.compose.material.rememberScaffoldState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.SideEffect
@@ -89,12 +99,14 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.graphics.toComposeRect
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.SubcomposeLayout
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.Companion.ClassName
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.Companion.InvalidId
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.Companion.TextFieldClassName
 import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.getAllUncoveredSemanticsNodesToMap
 import androidx.compose.ui.platform.testTag
@@ -106,6 +118,7 @@
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.getOrNull
 import androidx.compose.ui.semantics.invisibleToUser
+import androidx.compose.ui.semantics.isContainer
 import androidx.compose.ui.semantics.paneTitle
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
@@ -140,6 +153,9 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.DpOffset
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.compose.ui.window.Dialog
 import androidx.core.view.ViewCompat
@@ -174,6 +190,7 @@
 import org.mockito.ArgumentMatchers.any
 import org.mockito.internal.matchers.apachecommons.ReflectionEquals
 import java.lang.reflect.Method
+import kotlin.math.max
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -639,7 +656,7 @@
     }
 
     @Test
-    fun testCreateAccessibilityNodeInfo_forTraversalBefore_layout() {
+    fun testSortedAccessibilityNodeInfo_forTraversalBefore_overlaidNodeLayout() {
         val overlaidText = "Overlaid node text"
         val text1 = "Lorem1 ipsum dolor sit amet, consectetur adipiscing elit.\n"
         val text2 = "Lorem2 ipsum dolor sit amet, consectetur adipiscing elit.\n"
@@ -669,11 +686,11 @@
         // comparison (like SemanticsSort), the third text node should come before the overlaid node
         // — OverlaidNode should be read last
         assertNotEquals(ani3TraversalBeforeVal, 0)
-        assertEquals(ani3TraversalBeforeVal!!, overlaidNode.id)
+        assertEquals(ani3TraversalBeforeVal, overlaidNode.id)
     }
 
     @Test
-    fun testCreateAccessibilityNodeInfo_forTraversalAfter_layout() {
+    fun testSortedAccessibilityNodeInfo_forTraversalAfter_overlaidNodeLayout() {
         val overlaidText = "Overlaid node text"
         val text1 = "Lorem1 ipsum dolor sit amet, consectetur adipiscing elit.\n"
         val text2 = "Lorem2 ipsum dolor sit amet, consectetur adipiscing elit.\n"
@@ -704,47 +721,729 @@
         // comparison (like SemanticsSort), the third text node should come before the overlaid node
         // — OverlaidNode should be read last
         assertNotEquals(overlaidTraversalAfterValue, 0)
-        assertEquals(overlaidTraversalAfterValue!!, node3.id)
+        assertEquals(overlaidTraversalAfterValue, node3.id)
+    }
+
+    @Composable
+    fun CardRow(
+        modifier: Modifier,
+        columnNumber: Int,
+        topSampleText: String,
+        bottomSampleText: String
+    ) {
+        Row(
+            modifier,
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.End
+        ) {
+            Column {
+                Text(topSampleText + columnNumber)
+                Text(bottomSampleText + columnNumber)
+            }
+        }
     }
 
     @Test
-    fun testCreateAccessibilityNodeInfo_forTraversalBefore_layoutTestTags() {
-        val overlaidText = "Overlaid node text"
-        val text1 = "Lorem1 ipsum dolor sit amet, consectetur adipiscing elit.\n"
-        val text2 = "Lorem2 ipsum dolor sit amet, consectetur adipiscing elit.\n"
-        val text3 = "Lorem3 ipsum dolor sit amet, consectetur adipiscing elit.\n"
+    fun testSortedAccessibilityNodeInfo_nestedContainers_outerFalse() {
+        var topSampleText = "Top text in column "
+        var bottomSampleText = "Bottom text in column "
         container.setContent {
-            LastElementOverLaidColumn(modifier = Modifier.padding(8.dp)) {
-                Row(modifier = Modifier
-                    .semantics(true) { contentDescription = "Row1" }
-                    .testTag("Row1")
-                ) {
-                    Column(modifier = Modifier.testTag("Column1")) {
-                        Row(modifier = Modifier.testTag("Text1")) { Text(text1) }
-                        Row(modifier = Modifier.testTag("Text2")) { Text(text2) }
-                        Row(modifier = Modifier.testTag("Text3")) { Text(text3) }
-                    }
-                }
-                Row(modifier = Modifier
-                    .semantics(true) { contentDescription = "Row2" }
-                    .testTag("Row2")
-                ) {
-                    Text(overlaidText)
+            Column(
+                Modifier
+                    .testTag("Test Tag")
+                    .semantics { isContainer = false }
+            ) {
+                Row() { Modifier.semantics { isContainer = false }
+                    CardRow(
+                        Modifier.semantics { isContainer = true },
+                        1,
+                        topSampleText,
+                        bottomSampleText)
+                    CardRow(
+                        Modifier.semantics { isContainer = true },
+                        2,
+                        topSampleText,
+                        bottomSampleText)
                 }
             }
         }
 
-        val node3 = rule.onNodeWithText(text3).fetchSemanticsNode()
-        val row2 = rule.onNodeWithTag("Row2").fetchSemanticsNode()
+        val topText1 = rule.onNodeWithText(topSampleText + 1).fetchSemanticsNode()
+        val topText2 = rule.onNodeWithText(topSampleText + 2).fetchSemanticsNode()
+        val bottomText1 = rule.onNodeWithText(bottomSampleText + 1).fetchSemanticsNode()
+        val bottomText2 = rule.onNodeWithText(bottomSampleText + 2).fetchSemanticsNode()
 
-        val ani3 = provider.createAccessibilityNodeInfo(node3.id)
-        val ani3TraversalBeforeVal = ani3?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val topText1ANI = provider.createAccessibilityNodeInfo(topText1.id)
+        val topText2ANI = provider.createAccessibilityNodeInfo(topText2.id)
 
-        // Nodes 1, 2, and 3 are all children of a larger column; this means with a hierarchy
-        // comparison (like SemanticsSort), the third text node should come before the overlaid node
-        // — OverlaidNode and its row should be read last
-        assertNotEquals(ani3TraversalBeforeVal, 0)
-        assertTrue(ani3TraversalBeforeVal!! < row2.id)
+        val topText1Before = topText1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val topText2Before = topText2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        // Here we have the following hierarchy of containers:
+        // `isContainer = false`
+        //    `isContainer = false`
+        //       `isContainer = true`
+        //       `isContainer = true`
+        // meaning the behavior should be as if the first two `isContainer = false` are not present
+        // and all of column 1 should be read before column 2.
+        assertEquals(topText1Before, bottomText1.id)
+        assertEquals(topText2Before, bottomText2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_nestedContainers_outerTrue() {
+        var topSampleText = "Top text in column "
+        var bottomSampleText = "Bottom text in column "
+        container.setContent {
+            Column(
+                Modifier
+                    .testTag("Test Tag")
+                    .semantics { isContainer = true }
+            ) {
+                Row() { Modifier.semantics { isContainer = true }
+                    CardRow(
+                        Modifier
+                            .testTag("Row 1")
+                            .semantics { isContainer = false },
+                        1,
+                        topSampleText,
+                        bottomSampleText)
+                    CardRow(
+                        Modifier
+                            .testTag("Row 2")
+                            .semantics { isContainer = false },
+                        2,
+                        topSampleText,
+                        bottomSampleText)
+                }
+            }
+        }
+
+        val bottomText1 = rule.onNodeWithText(bottomSampleText + 1).fetchSemanticsNode()
+        val bottomText2 = rule.onNodeWithText(bottomSampleText + 2).fetchSemanticsNode()
+
+        val bottomText1ANI = provider.createAccessibilityNodeInfo(bottomText1.id)
+        val bottomText1Before = bottomText1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        // Here we have the following hierarchy of containers:
+        // `isContainer = true`
+        //    `isContainer = true`
+        //       `isContainer = false`
+        //       `isContainer = false`
+        // In this case, we expect all the top text to be read first, then all the bottom text
+        assertEquals(bottomText1Before, bottomText2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_tripleNestedContainers() {
+        var topSampleText = "Top "
+        var bottomSampleText = "Bottom "
+        container.setContent {
+            Row {
+                CardRow(
+                    Modifier.semantics { isContainer = false },
+                    1,
+                    topSampleText,
+                    bottomSampleText)
+                CardRow(
+                    Modifier.semantics { isContainer = false },
+                    2,
+                    topSampleText,
+                    bottomSampleText)
+                CardRow(
+                    Modifier.semantics { isContainer = true },
+                    3,
+                    topSampleText,
+                    bottomSampleText)
+            }
+        }
+
+        val bottomText1 = rule.onNodeWithText(bottomSampleText + 1).fetchSemanticsNode()
+        val bottomText2 = rule.onNodeWithText(bottomSampleText + 2).fetchSemanticsNode()
+        val bottomText3 = rule.onNodeWithText(bottomSampleText + 3).fetchSemanticsNode()
+        val topText3 = rule.onNodeWithText(topSampleText + 3).fetchSemanticsNode()
+
+        val bottomText1ANI = provider.createAccessibilityNodeInfo(bottomText1.id)
+        val bottomText1Before = bottomText1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        val topText3ANI = provider.createAccessibilityNodeInfo(topText3.id)
+        val topText3Before = topText3ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        // Here we have the following hierarchy of containers:
+        // `isContainer = false`
+        // `isContainer = false`
+        // `isContainer = true`
+        // In this case, we expect to read in the order of: Top 1, Top 2, Bottom 1, Bottom 2,
+        // then Top 3, Bottom 3. The first two containers are effectively merged since they are both
+        // set to false, while the third container is structurally significant.
+        assertEquals(bottomText1Before, bottomText2.id)
+        assertEquals(topText3Before, bottomText3.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_nestedContainers_hierarchy() {
+        var topSampleText = "Top text in column "
+        var bottomSampleText = "Bottom text in column "
+
+        container.setContent {
+            Row {
+                CardRow(
+                    Modifier
+                        // adding a vertical scroll here makes the column scrollable, which would
+                        // normally make it structurally significant
+                        .verticalScroll(rememberScrollState())
+                        // but adding in `container = false` should negate that
+                        .semantics { isContainer = false },
+                    1,
+                    topSampleText,
+                    bottomSampleText
+                )
+                CardRow(
+                    Modifier
+                        // adding a vertical scroll here makes the column scrollable, which would
+                        // normally make it structurally significant
+                        .verticalScroll(rememberScrollState())
+                        // but adding in `container = false` should negate that
+                        .semantics { isContainer = false },
+                    2,
+                    topSampleText,
+                    bottomSampleText
+                )
+            }
+        }
+
+        val bottomText1 = rule.onNodeWithText(bottomSampleText + 1).fetchSemanticsNode()
+        val bottomText2 = rule.onNodeWithText(bottomSampleText + 2).fetchSemanticsNode()
+
+        val bottomText1ANI = provider.createAccessibilityNodeInfo(bottomText1.id)
+        val bottomText1Before = bottomText1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        // In this case, we expect all the top text to be read first, then all the bottom text
+        assertEquals(bottomText1Before, bottomText2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_SimpleTopAppBar() {
+        val topAppBarText = "Top App Bar"
+        val textBoxTag = "Text Box"
+        container.setContent {
+            Box(Modifier.testTag(textBoxTag)) {
+                Text(text = "Lorem ipsum ".repeat(200))
+            }
+
+            TopAppBar(
+                title = {
+                    Text(text = topAppBarText)
+                }
+            )
+        }
+
+        val textBoxNode = rule.onNodeWithTag(textBoxTag).fetchSemanticsNode()
+        val topAppBarNode = rule.onNodeWithText(topAppBarText).fetchSemanticsNode()
+
+        val topAppBarANI = provider.createAccessibilityNodeInfo(topAppBarNode.id)
+        val topAppTraverseBefore = topAppBarANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        assertThat(topAppTraverseBefore).isLessThan(textBoxNode.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_SimpleScrollingTopAppBar() {
+        val topAppBarText = "Top App Bar"
+        val sampleText = "Sample text "
+        val sampleText1 = "Sample text 1"
+        val sampleText2 = "Sample text 2"
+        var counter = 1
+
+        container.setContent {
+            Column(
+                Modifier
+                    .verticalScroll(rememberScrollState())
+            ) {
+                TopAppBar(title = { Text(text = topAppBarText) })
+                repeat(100) {
+                    Text(sampleText + counter++)
+                }
+            }
+        }
+
+        val topAppBarNode = rule.onNodeWithText(topAppBarText).fetchSemanticsNode()
+        val topAppBarANI = provider.createAccessibilityNodeInfo(topAppBarNode.id)
+        val topAppTraverseBefore = topAppBarANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        val node1 = rule.onNodeWithText(sampleText1).fetchSemanticsNode()
+        val ANI1 = provider.createAccessibilityNodeInfo(node1.id)
+        val traverseBefore1 = ANI1?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        val node2 = rule.onNodeWithText(sampleText2).fetchSemanticsNode()
+
+        // Assert that the top bar comes before the first node (node 1) and that the first node
+        // comes before the second (node 2)
+        assertEquals(topAppTraverseBefore, node1.id)
+        assertEquals(traverseBefore1, node2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_ScaffoldTopBar() {
+        val topAppBarText = "Top App Bar"
+        val contentText = "Content"
+        val bottomAppBarText = "Bottom App Bar"
+        container.setContent {
+            val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+            Scaffold(
+                scaffoldState = scaffoldState,
+                topBar = { TopAppBar(title = { Text(topAppBarText) }) },
+                floatingActionButtonPosition = FabPosition.End,
+                floatingActionButton = { FloatingActionButton(onClick = {}) {
+                    Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+                } },
+                drawerContent = { Text(text = "Drawer Menu 1") },
+                content = { padding -> Text(contentText, modifier = Modifier.padding(padding)) },
+                bottomBar = { BottomAppBar {
+                    Text(bottomAppBarText) } }
+            )
+        }
+        val topAppBarNode = rule.onNodeWithText(topAppBarText).fetchSemanticsNode()
+        val contentNode = rule.onNodeWithText(contentText).fetchSemanticsNode()
+        val bottomAppBarNode = rule.onNodeWithText(bottomAppBarText).fetchSemanticsNode()
+
+        val topAppBarANI = provider.createAccessibilityNodeInfo(topAppBarNode.id)
+        val contentANI = provider.createAccessibilityNodeInfo(contentNode.id)
+        val topAppTraverseBefore = topAppBarANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val contentTraverseBefore = contentANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        assertEquals(topAppTraverseBefore, contentNode.id)
+        assertThat(contentTraverseBefore).isLessThan(bottomAppBarNode.id)
+    }
+
+    @Composable
+    fun ScrollColumn(testTag: String) {
+        var counter = 0
+        var sampleText = "Sample text in column"
+        Column(
+            Modifier
+                .verticalScroll(rememberScrollState())
+                .testTag(testTag)
+        ) {
+            repeat(100) {
+                Text(sampleText + counter++)
+            }
+        }
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_ScaffoldScrollingTopBar() {
+        val topAppBarText = "Top App Bar"
+        val contentText = "Content"
+        val bottomAppBarText = "Bottom App Bar"
+        val fabIconDescription = "fab icon"
+
+        container.setContent {
+            val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+            Scaffold(
+                scaffoldState = scaffoldState,
+                topBar = { TopAppBar(title = { Text(topAppBarText) }) },
+                floatingActionButtonPosition = FabPosition.End,
+                floatingActionButton = { FloatingActionButton(onClick = {}) {
+                    Icon(imageVector = Icons.Default.Add, contentDescription = fabIconDescription)
+                } },
+                drawerContent = { Text(text = "Drawer Menu 1") },
+                content = { ScrollColumn(contentText) },
+                bottomBar = { BottomAppBar {
+                    Text(bottomAppBarText) } }
+            )
+        }
+
+        val topAppBarNode = rule.onNodeWithText(topAppBarText).fetchSemanticsNode()
+        val contentNode = rule.onNodeWithTag(contentText).fetchSemanticsNode()
+        val bottomAppBarNode = rule.onNodeWithText(bottomAppBarText).fetchSemanticsNode()
+
+        val topAppBarANI = provider.createAccessibilityNodeInfo(topAppBarNode.id)
+        val contentANI = provider.createAccessibilityNodeInfo(contentNode.id)
+
+        val topAppTraverseBefore = topAppBarANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val contentTraverseBefore = contentANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        assertThat(topAppTraverseBefore).isLessThan(contentNode.id)
+        assertThat(contentTraverseBefore).isLessThan(bottomAppBarNode.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_vertical_zIndex() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Column(Modifier.testTag(rootTag)) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .zIndex(1f)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier.requiredSize(50.dp).testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child1TraverseBefore = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child2TraverseAfter = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child1 to come before child2
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child1TraverseBefore).isLessThan(child2.id)
+        assertThat(child2TraverseAfter).isLessThan(child1.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_horizontal_zIndex() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Row(
+                Modifier.testTag(rootTag)
+            ) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .zIndex(1f)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier.requiredSize(50.dp).testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child1TraverseBefore = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child2TraverseAfter = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child1 to come before child2
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child1TraverseBefore).isLessThan(child2.id)
+        assertThat(child2TraverseAfter).isLessThan(child1.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_vertical_offset() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Box(
+                Modifier.testTag(rootTag)
+            ) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .offset(x = 0.dp, y = 50.dp)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier.requiredSize(50.dp).testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child2TraverseBefore).isLessThan(child1.id)
+        assertThat(child1TraverseAfter).isLessThan(child2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_horizontal_offset() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Box(
+                Modifier.testTag(rootTag)
+            ) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .offset(x = 50.dp, y = 0.dp)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier.requiredSize(50.dp).testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child2TraverseBefore).isLessThan(child1.id)
+        assertThat(child1TraverseAfter).isLessThan(child2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_vertical_offset_overlapped() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Box(
+                Modifier.testTag(rootTag)
+            ) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .offset(x = 0.dp, y = 20.dp)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier.requiredSize(50.dp).testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child2TraverseBefore).isLessThan(child1.id)
+        assertThat(child1TraverseAfter).isLessThan(child2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_horizontal_offset_overlapped() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        container.setContent {
+            Box(
+                Modifier.testTag(rootTag)
+            ) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .offset(x = 20.dp, y = 0.dp)
+                        .testTag(childTag1)
+                ) {}
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(50.dp)
+                        .offset(x = 0.dp, y = 20.dp)
+                        .testTag(childTag2)
+                ) {}
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertEquals(child2TraverseBefore, child1.id)
+        assertEquals(child1TraverseAfter, child2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_vertical_subcompose() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        val density = Density(1f)
+        val size = with(density) { 100.dp.roundToPx() }.toFloat()
+        container.setContent {
+            CompositionLocalProvider(LocalDensity provides density) {
+                SimpleSubcomposeLayout(
+                    Modifier.testTag(rootTag),
+                    {
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(childTag1)
+                        ) {}
+                    },
+                    Offset(0f, size),
+                    {
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(childTag2)
+                        ) {}
+                    },
+                    Offset(0f, 0f)
+                )
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child2TraverseBefore).isLessThan(child1.id)
+        assertThat(child1TraverseAfter).isLessThan(child2.id)
+    }
+
+    @Test
+    fun testSortedAccessibilityNodeInfo_horizontal_subcompose() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        val density = Density(1f)
+        val size = with(density) { 100.dp.roundToPx() }.toFloat()
+        container.setContent {
+            CompositionLocalProvider(LocalDensity provides density) {
+                SimpleSubcomposeLayout(
+                    Modifier.testTag(rootTag),
+                    {
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(childTag1)
+                        ) {}
+                    },
+                    Offset(size, 0f),
+                    {
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(childTag2)
+                        ) {}
+                    },
+                    Offset(0f, 0f)
+                )
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        val child1 = rule.onNodeWithTag(childTag1).fetchSemanticsNode()
+        val child2 = rule.onNodeWithTag(childTag2).fetchSemanticsNode()
+
+        val child1ANI = provider.createAccessibilityNodeInfo(child1.id)
+        val child2ANI = provider.createAccessibilityNodeInfo(child2.id)
+        val child2TraverseBefore = child2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val child1TraverseAfter = child1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALAFTER_VAL)
+
+        // We want child2 to come before child1
+        assertEquals(2, root.replacedChildren.size)
+        assertThat(child2TraverseBefore).isLessThan(child1.id)
+        assertThat(child1TraverseAfter).isLessThan(child2.id)
+    }
+
+    @Test
+    fun testChildrenSortedByBounds_rtl() {
+        val rootTag = "root"
+        val childTag1 = "child1"
+        val childTag2 = "child2"
+        val childTag3 = "child3"
+        val rtlChildTag1 = "rtlChild1"
+        val rtlChildTag2 = "rtlChild2"
+        val rtlChildTag3 = "rtlChild3"
+        container.setContent {
+            Column(Modifier.testTag(rootTag)) {
+                Row {
+                    SimpleTestLayout(
+                        Modifier
+                            .requiredSize(100.dp)
+                            .testTag(childTag1)
+                    ) {}
+                    SimpleTestLayout(
+                        Modifier
+                            .requiredSize(100.dp)
+                            .testTag(childTag2)
+                    ) {}
+                    SimpleTestLayout(
+                        Modifier
+                            .requiredSize(100.dp)
+                            .testTag(childTag3)
+                    ) {}
+                }
+                CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                    // Will display rtlChild3 rtlChild2 rtlChild1
+                    Row {
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(rtlChildTag1)
+                        ) {}
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(rtlChildTag2)
+                        ) {}
+                        SimpleTestLayout(
+                            Modifier
+                                .requiredSize(100.dp)
+                                .testTag(rtlChildTag3)
+                        ) {}
+                    }
+                }
+            }
+        }
+
+        val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
+        assertEquals(6, root.replacedChildren.size)
+
+        val rtlChild1 = rule.onNodeWithTag(rtlChildTag1).fetchSemanticsNode()
+        val rtlChild2 = rule.onNodeWithTag(rtlChildTag2).fetchSemanticsNode()
+        val rtlChild3 = rule.onNodeWithTag(rtlChildTag3).fetchSemanticsNode()
+
+        val rtlChild1ANI = provider.createAccessibilityNodeInfo(rtlChild1.id)
+        val rtlChild2ANI = provider.createAccessibilityNodeInfo(rtlChild2.id)
+
+        val rtl1TraverseBefore = rtlChild1ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+        val rtl2TraverseBefore = rtlChild2ANI?.extras?.getInt(EXTRA_DATA_TEST_TRAVERSALBEFORE_VAL)
+
+        // Rtl
+        assertThat(rtl1TraverseBefore).isLessThan(rtlChild2.id)
+        assertThat(rtl2TraverseBefore).isLessThan(rtlChild3.id)
     }
 
     companion object {
@@ -2978,7 +3677,7 @@
         val child = rule.onNodeWithTag("child").fetchSemanticsNode()
 
         rule.runOnIdle {
-            child.layoutNode.innerCoordinator.detach()
+            child.layoutNode.innerCoordinator.onRelease()
         }
 
         rule.runOnIdle {
@@ -3006,8 +3705,8 @@
         val grandChild1 = rule.onNodeWithTag("grandChild1").fetchSemanticsNode()
         val grandChild2 = rule.onNodeWithTag("grandChild2").fetchSemanticsNode()
         rule.runOnIdle {
-            grandChild1.layoutNode.innerCoordinator.detach()
-            grandChild2.layoutNode.innerCoordinator.detach()
+            grandChild1.layoutNode.innerCoordinator.onRelease()
+            grandChild2.layoutNode.innerCoordinator.onRelease()
         }
 
         rule.runOnIdle {
@@ -3466,3 +4165,79 @@
             )
     }
 }
+
+/**
+ * A simple test layout that does the bare minimum required to lay out an arbitrary number of
+ * children reasonably.  Useful for Semantics hierarchy testing
+ */
+@Composable
+private fun SimpleTestLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
+    Layout(modifier = modifier, content = content) { measurables, constraints ->
+        if (measurables.isEmpty()) {
+            layout(constraints.minWidth, constraints.minHeight) {}
+        } else {
+            val placeables = measurables.map {
+                it.measure(constraints)
+            }
+            val (width, height) = with(placeables.filterNotNull()) {
+                Pair(
+                    max(
+                        maxByOrNull { it.width }?.width ?: 0,
+                        constraints.minWidth
+                    ),
+                    max(
+                        maxByOrNull { it.height }?.height ?: 0,
+                        constraints.minHeight
+                    )
+                )
+            }
+            layout(width, height) {
+                for (placeable in placeables) {
+                    placeable.placeRelative(0, 0)
+                }
+            }
+        }
+    }
+}
+
+/**
+ * A simple SubComposeLayout which lays [contentOne] at [positionOne] and lays [contentTwo] at
+ * [positionTwo]. [contentOne] is placed first and [contentTwo] is placed second. Therefore, the
+ * semantics node for [contentOne] is before semantics node for [contentTwo] in
+ * [SemanticsNode.children].
+ */
+@Composable
+private fun SimpleSubcomposeLayout(
+    modifier: Modifier = Modifier,
+    contentOne: @Composable () -> Unit,
+    positionOne: Offset,
+    contentTwo: @Composable () -> Unit,
+    positionTwo: Offset
+) {
+    SubcomposeLayout(modifier) { constraints ->
+        val layoutWidth = constraints.maxWidth
+        val layoutHeight = constraints.maxHeight
+
+        val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
+
+        layout(layoutWidth, layoutHeight) {
+            val placeablesOne = subcompose(TestSlot.First, contentOne).fastMap {
+                it.measure(looseConstraints)
+            }
+
+            val placeablesTwo = subcompose(TestSlot.Second, contentTwo).fastMap {
+                it.measure(looseConstraints)
+            }
+
+            // Placing to control drawing order to match default elevation of each placeable
+            placeablesOne.fastForEach {
+                it.place(positionOne.x.toInt(), positionOne.y.toInt())
+            }
+            placeablesTwo.fastForEach {
+                it.place(positionTwo.x.toInt(), positionTwo.y.toInt())
+            }
+        }
+    }
+}
+
+private enum class TestSlot { First, Second }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index e27cd97..273688d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -125,7 +125,6 @@
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Rule
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -3273,7 +3272,6 @@
         }
     }
 
-    @Ignore // b/266748671
     // Tests that an invalidation on a detached view will draw correctly when attached.
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
@@ -4014,10 +4012,10 @@
     error: () -> String = { "$expected and $color are not similar!" }
 ) {
     val errorString = error()
-    assertEquals(errorString, expected.red, color.red, 0.01f)
-    assertEquals(errorString, expected.green, color.green, 0.01f)
-    assertEquals(errorString, expected.blue, color.blue, 0.01f)
-    assertEquals(errorString, expected.alpha, color.alpha, 0.01f)
+    assertEquals(errorString, expected.red, color.red, 0.05f)
+    assertEquals(errorString, expected.green, color.green, 0.05f)
+    assertEquals(errorString, expected.blue, color.blue, 0.05f)
+    assertEquals(errorString, expected.alpha, color.alpha, 0.05f)
 }
 
 @Composable
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
index f73781e..568809a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
@@ -46,7 +46,6 @@
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -437,7 +436,6 @@
         )
     }
 
-    @Ignore // b/265025605
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testChangingZOrder() {
@@ -571,7 +569,6 @@
         )
     }
 
-    @Ignore // b/265025605
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testChangingZOrderUncle() {
@@ -631,7 +628,6 @@
         )
     }
 
-    @Ignore // b/265025605
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun testChangingReorderedChildSize() {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
index 9a5fc62..8dd27b0 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
@@ -16,25 +16,24 @@
 
 package androidx.compose.ui.input
 
-import android.os.Build
-import android.view.View
+import android.os.Build.VERSION.SDK_INT
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.setFocusableContent
-import androidx.compose.ui.input.InputMode.Companion.Touch
 import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
 import androidx.compose.ui.platform.LocalInputModeManager
-import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
 import androidx.test.filters.FlakyTest
+import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -48,48 +47,36 @@
     val rule = createComposeRule()
 
     private lateinit var inputModeManager: InputModeManager
-    private lateinit var view: View
 
-    init {
+    // Manually set global state to touch mode to prevent flakiness when another test leaves the
+    // system in non-touch mode (b/267368621).
+    @Before
+    fun initializeInTouchMode() {
         InstrumentationRegistry.getInstrumentation().setInTouchMode(param.inputMode == Touch)
     }
 
-    @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
-    fun initialInputMode() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
-        // Arrange.
-        rule.setContentWithInputManager {
-            Box {}
-        }
-
-        // Assert
-        rule.runOnIdle { assertThat(inputModeManager.inputMode).isEqualTo(param.inputMode) }
+    // TODO(b/267253920): Add a compose test API to set/reset InputMode.
+    @After
+    fun resetTouchMode() = with(InstrumentationRegistry.getInstrumentation()) {
+        if (SDK_INT < 33) setInTouchMode(true) else resetInTouchMode()
     }
 
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun switchToTouchModeProgrammatically() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
         // Arrange.
         rule.setContentWithInputManager {
             Box {}
         }
+        val initialMode = rule.runOnIdle { inputModeManager.inputMode }
 
         // Act.
-        val requestGranted = rule.runOnUiThread {
+        val requestGranted = rule.runOnIdle {
             inputModeManager.requestInputMode(Touch)
         }
 
         // Assert
         rule.runOnIdle {
-            when (param.inputMode) {
+            when (initialMode) {
                 Touch -> {
                     assertThat(requestGranted).isTrue()
                     assertThat(inputModeManager.inputMode).isEqualTo(Touch)
@@ -104,12 +91,7 @@
 
     @FlakyTest(bugId = 202524920)
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     fun switchToKeyboardModeProgrammatically() {
-        if (Build.VERSION.SDK_INT == 33 && Build.VERSION.CODENAME != "REL") {
-            return // b/262909049: Do not run this test on pre-release Android U.
-        }
-
         // Arrange.
         val testTag = "Box"
         rule.setContentWithInputManager {
@@ -117,23 +99,23 @@
         }
 
         // Act.
-        val requestGranted = rule.runOnUiThread {
+        val requestGranted = rule.runOnIdle {
             inputModeManager.requestInputMode(Keyboard)
         }
 
         // Assert
         rule.runOnIdle { assertThat(requestGranted).isTrue() }
-        rule.waitUntil { inputModeManager.inputMode == Keyboard }
+        assertThat(inputModeManager.inputMode).isEqualTo(Keyboard)
     }
 
     private fun ComposeContentTestRule.setContentWithInputManager(
         composable: @Composable () -> Unit
     ) {
-        this.setFocusableContent {
+        setFocusableContent {
             inputModeManager = LocalInputModeManager.current
-            view = LocalView.current
             composable()
         }
+        runOnIdle { inputModeManager.requestInputMode(param.inputMode) }
     }
 
     // We need to wrap the inline class parameter in another class because Java can't instantiate
@@ -147,4 +129,4 @@
         @Parameterized.Parameters(name = "initialInputMode = {0}")
         fun initParameters() = listOf(Param(Touch), Param(Keyboard))
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
index 9e3fc69..0bab1a5 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/MeasureAndLayoutDelegateTest.kt
@@ -1305,7 +1305,10 @@
 
         assertThat(activeLayers).isEqualTo(1)
 
-        root.removeAll()
+        val node = root.children[0]
+        root.removeAt(0, 1)
+        // in the real composition after removing the node onRelease() will be called as well
+        node.onRelease()
         delegate.measureAndLayout()
 
         assertThat(activeLayers).isEqualTo(0)
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 45e7c80..71f542b 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
@@ -42,6 +42,7 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.background
@@ -2318,6 +2319,38 @@
         assertThat(error).isInstanceOf(IllegalArgumentException::class.java)
     }
 
+    @Test
+    fun notSubcomposedAnymoreNodesAreNotRecomposed() {
+        var flag by mutableStateOf(true)
+        var updatedInMeasureFlag by mutableStateOf(true)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
+        rule.setContent {
+            SubcomposeLayout(state) {
+                updatedInMeasureFlag = flag
+                Snapshot.sendApplyNotifications()
+                if (flag) {
+                    subcompose(0) {
+                        if (updatedInMeasureFlag) {
+                            Box(Modifier.testTag("tag"))
+                        }
+                    }
+                }
+                layout(100, 100) {}
+            }
+        }
+
+        rule.runOnIdle {
+            flag = false
+        }
+
+        // the node will exist when after `need` was switched to false it will first cause
+        // remeasure, and because during the remeasure we will not subcompose the child
+        // the node will be deactivated before its block recomposes causing the Box to be
+        // removed from the hierarchy.
+        rule.onNodeWithTag("tag")
+            .assertExists()
+    }
+
     private fun composeItems(
         state: SubcomposeLayoutState,
         items: MutableState<List<Int>>
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt
new file mode 100644
index 0000000..1352f5f
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierNodeReuseAndDeactivationTest.kt
@@ -0,0 +1,654 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:OptIn(ExperimentalComposeUiApi::class)
+
+package androidx.compose.ui.modifier
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReusableContent
+import androidx.compose.runtime.ReusableContentHost
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasurePolicy
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.node.DelegatingNode
+import androidx.compose.ui.node.LayoutModifierNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.node.ObserverNode
+import androidx.compose.ui.node.modifierElementOf
+import androidx.compose.ui.node.observeReads
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.Constraints
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class ModifierNodeReuseAndDeactivationTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun reusingCallsResetOnModifier() {
+        var reuseKey by mutableStateOf(0)
+
+        var resetCalls = 0
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                TestLayout(onReset = { resetCalls++ })
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(0)
+            reuseKey = 1
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun nodeIsNotRecreatedWhenReused() {
+        var reuseKey by mutableStateOf(0)
+
+        var createCalls = 0
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                TestLayout(onCreate = { createCalls++ })
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(createCalls).isEqualTo(1)
+            reuseKey = 1
+        }
+
+        rule.runOnIdle {
+            assertThat(createCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun resetIsCalledWhenContentIsDeactivated() {
+        var active by mutableStateOf(true)
+        var resetCalls = 0
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    TestLayout(onReset = { resetCalls++ })
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(0)
+            active = false
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun resetIsCalledAgainWhenContentIsReactivated() {
+        var active by mutableStateOf(true)
+        var resetCalls = 0
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    TestLayout(onReset = { resetCalls++ })
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            active = false
+        }
+
+        rule.runOnIdle {
+            active = true
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun updateIsNotCalledWhenReusedWithTheSameParams() {
+        var reuseKey by mutableStateOf(0)
+        var updateCalls = 0
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                TestLayout(
+                    key = 1,
+                    onUpdate = { updateCalls++ }
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(updateCalls).isEqualTo(0)
+            reuseKey++
+        }
+
+        rule.runOnIdle {
+            assertThat(updateCalls).isEqualTo(0)
+        }
+    }
+
+    @Test
+    fun updateIsCalledWhenReusedWithDifferentParam() {
+        var reuseKey by mutableStateOf(0)
+        var updateCalls = 0
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                TestLayout(
+                    key = reuseKey,
+                    onUpdate = { updateCalls++ }
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(updateCalls).isEqualTo(0)
+            reuseKey++
+        }
+
+        rule.runOnIdle {
+            assertThat(updateCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun nodesAreDetachedWhenReused() {
+        var reuseKey by mutableStateOf(0)
+
+        var onResetCalls = 0
+        var onAttachCalls = 0
+        var onResetCallsWhenDetached: Int? = null
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                TestLayout(
+                    onAttach = { onAttachCalls++ },
+                    onReset = { onResetCalls++ },
+                    onDetach = { onResetCallsWhenDetached = onResetCalls }
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(onAttachCalls).isEqualTo(1)
+            assertThat(onResetCallsWhenDetached).isNull()
+            reuseKey = 1
+        }
+
+        rule.runOnIdle {
+            assertThat(onResetCalls).isEqualTo(1)
+            // makes sure onReset is called before detach:
+            assertThat(onResetCallsWhenDetached).isEqualTo(1)
+            assertThat(onAttachCalls).isEqualTo(2)
+        }
+    }
+
+    @Test
+    fun nodesAreDetachedAndAttachedWhenDeactivatedAndReactivated() {
+        var active by mutableStateOf(true)
+
+        var onResetCalls = 0
+        var onAttachCalls = 0
+        var onResetCallsWhenDetached: Int? = null
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    TestLayout(
+                        onAttach = { onAttachCalls++ },
+                        onReset = { onResetCalls++ },
+                        onDetach = { onResetCallsWhenDetached = onResetCalls }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(onAttachCalls).isEqualTo(1)
+            assertThat(onResetCallsWhenDetached).isNull()
+            active = false
+        }
+
+        rule.runOnIdle {
+            assertThat(onResetCalls).isEqualTo(1)
+            // makes sure onReset is called before detach:
+            assertThat(onResetCallsWhenDetached).isEqualTo(1)
+            assertThat(onAttachCalls).isEqualTo(1)
+            active = true
+        }
+
+        rule.runOnIdle {
+            assertThat(onAttachCalls).isEqualTo(2)
+        }
+    }
+
+    @Test
+    fun reusingStatelessModifierNotCausingInvalidation() {
+        var active by mutableStateOf(true)
+        var reuseKey by mutableStateOf(0)
+
+        var invalidations = 0
+        val onInvalidate: () -> Unit = {
+            invalidations++
+        }
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(reuseKey) {
+                    Layout(
+                        modifier = StatelessModifierElement(onInvalidate),
+                        measurePolicy = MeasurePolicy
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            active = false
+        }
+
+        rule.runOnIdle {
+            active = true
+            reuseKey = 1
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun reusingStatelessModifierWithUpdatedInputCausingInvalidation() {
+        var active by mutableStateOf(true)
+        var reuseKey by mutableStateOf(0)
+        var size by mutableStateOf(10)
+
+        var invalidations = 0
+        val onInvalidate: () -> Unit = {
+            invalidations++
+        }
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(reuseKey) {
+                    Layout(
+                        modifier = StatelessModifierElement(onInvalidate, size),
+                        measurePolicy = MeasurePolicy
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            active = false
+        }
+
+        rule.runOnIdle {
+            active = true
+            reuseKey = 1
+            size = 20
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(2)
+        }
+    }
+
+    @Test
+    fun reusingModifierCausingInvalidationOnDelegatedInnerNode() {
+        var reuseKey by mutableStateOf(0)
+
+        var resetCalls = 0
+        val onReset: () -> Unit = {
+            resetCalls++
+        }
+
+        rule.setContent {
+            ReusableContent(reuseKey) {
+                Layout(
+                    modifier = DelegatingModifierElement(onReset),
+                    measurePolicy = MeasurePolicy
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(0)
+            reuseKey = 1
+        }
+
+        rule.runOnIdle {
+            assertThat(resetCalls).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun reusingModifierReadingStateInLayerBlock() {
+        var active by mutableStateOf(true)
+        var counter by mutableStateOf(0)
+
+        var invalidations = 0
+        val layerBlock: () -> Unit = {
+            // state read
+            counter.toString()
+            invalidations++
+        }
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    Layout(
+                        modifier = LayerModifierElement(layerBlock),
+                        measurePolicy = MeasurePolicy
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            active = false
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            counter++
+        }
+
+        rule.runOnIdle {
+            active = true
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(2)
+            counter++
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(3)
+        }
+    }
+
+    @Test
+    fun reusingModifierObservingState() {
+        var active by mutableStateOf(true)
+        var counter by mutableStateOf(0)
+
+        var invalidations = 0
+        val observedBlock: () -> Unit = {
+            // state read
+            counter.toString()
+            invalidations++
+        }
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    Layout(
+                        modifier = ObserverModifierElement(observedBlock),
+                        measurePolicy = MeasurePolicy
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            active = false
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(1)
+            counter++
+        }
+
+        rule.runOnIdle {
+            active = true
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(2)
+            counter++
+        }
+
+        rule.runOnIdle {
+            assertThat(invalidations).isEqualTo(3)
+        }
+    }
+
+    @Test
+    fun reusingModifierLocalProviderAndConsumer() {
+        val key = modifierLocalOf { -1 }
+        var active by mutableStateOf(true)
+        var providedValue by mutableStateOf(0)
+
+        var receivedValue: Int? = null
+
+        rule.setContent {
+            ReusableContentHost(active) {
+                ReusableContent(0) {
+                    Layout(
+                        modifier = Modifier
+                            .modifierLocalProvider(key) { providedValue }
+                            .modifierLocalConsumer { receivedValue = key.current },
+                        measurePolicy = MeasurePolicy
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(receivedValue).isEqualTo(0)
+            active = false
+        }
+
+        rule.runOnIdle {
+            providedValue = 1
+        }
+
+        rule.runOnIdle {
+            active = true
+        }
+
+        rule.runOnIdle {
+            assertThat(receivedValue).isEqualTo(1)
+        }
+    }
+}
+
+@Composable
+private fun TestLayout(
+    key: Any? = null,
+    onReset: () -> Unit = {},
+    onCreate: () -> Unit = {},
+    onUpdate: () -> Unit = {},
+    onDetach: () -> Unit = {},
+    onAttach: () -> Unit = {}
+) {
+    val currentOnReset by rememberUpdatedState(onReset)
+    val currentOnCreate by rememberUpdatedState(onCreate)
+    val currentOnUpdate by rememberUpdatedState(onUpdate)
+    val currentOnDetach by rememberUpdatedState(onDetach)
+    val currentOnAttach by rememberUpdatedState(onAttach)
+    Layout(
+        modifier = createModifier(
+            key = key,
+            onCreate = { currentOnCreate.invoke() },
+            onUpdate = { currentOnUpdate.invoke() },
+            onReset = { currentOnReset.invoke() },
+            onDetach = { currentOnDetach.invoke() },
+            onAttach = { currentOnAttach.invoke() },
+        ),
+        measurePolicy = MeasurePolicy
+    )
+}
+
+private fun createModifier(
+    key: Any? = null,
+    onCreate: () -> Unit = {},
+    onUpdate: () -> Unit = {},
+    onReset: () -> Unit = {},
+    onDetach: () -> Unit = {},
+    onAttach: () -> Unit = {},
+): Modifier {
+    return modifierElementOf(
+        key = key,
+        create = {
+            onCreate()
+            object : Modifier.Node() {
+                override fun onReset() = onReset()
+                override fun onAttach() = onAttach()
+                override fun onDetach() = onDetach()
+                }
+        },
+        update = {
+            onUpdate()
+        }
+    ) {}
+}
+
+private val MeasurePolicy = MeasurePolicy { _, _ ->
+    layout(100, 100) { }
+}
+
+private class StatelessModifierElement(
+    private val onInvalidate: () -> Unit,
+    private val size: Int = 10
+) : ModifierNodeElement<StatelessModifierElement.Node>(params = size, inspectorInfo = {}) {
+    override fun create() = Node(size, onInvalidate)
+
+    override fun update(node: Node) = node.also {
+        it.size = size
+        it.onMeasure = onInvalidate
+    }
+
+    class Node(var size: Int, var onMeasure: () -> Unit) : Modifier.Node(), LayoutModifierNode {
+        override fun MeasureScope.measure(
+            measurable: Measurable,
+            constraints: Constraints
+        ): MeasureResult {
+            val placeable = measurable.measure(Constraints.fixed(size, size))
+            onMeasure()
+            return layout(placeable.width, placeable.height) {
+                placeable.place(0, 0)
+            }
+        }
+    }
+}
+
+private class DelegatingModifierElement(
+    private val onDelegatedNodeReset: () -> Unit,
+) : ModifierNodeElement<DelegatingModifierElement.Node>(inspectorInfo = {}) {
+    override fun create() = Node(onDelegatedNodeReset)
+
+    override fun update(node: Node) = node.also {
+        it.onReset = onDelegatedNodeReset
+    }
+
+    class Node(var onReset: () -> Unit) : DelegatingNode() {
+        private val inner = delegated {
+            object : Modifier.Node() {
+                override fun onReset() {
+                    this@Node.onReset.invoke()
+                }
+            }
+        }
+    }
+}
+
+private class LayerModifierElement(
+    private val layerBlock: () -> Unit,
+) : ModifierNodeElement<LayerModifierElement.Node>(inspectorInfo = {}) {
+    override fun create() = Node(layerBlock)
+
+    override fun update(node: Node) = node.also {
+        it.layerBlock = layerBlock
+    }
+
+    class Node(var layerBlock: () -> Unit) : Modifier.Node(), LayoutModifierNode {
+        override fun MeasureScope.measure(
+            measurable: Measurable,
+            constraints: Constraints
+        ): MeasureResult {
+            val placeable = measurable.measure(constraints)
+            return layout(placeable.width, placeable.height) {
+                placeable.placeWithLayer(0, 0) {
+                    layerBlock.invoke()
+                }
+            }
+        }
+    }
+}
+
+private class ObserverModifierElement(
+    private val observedBlock: () -> Unit,
+) : ModifierNodeElement<ObserverModifierElement.Node>(inspectorInfo = {}) {
+    override fun create() = Node(observedBlock)
+
+    override fun update(node: Node) = node.also {
+        it.observedBlock = observedBlock
+    }
+
+    class Node(var observedBlock: () -> Unit) : Modifier.Node(), ObserverNode {
+
+        override fun onAttach() {
+            observe()
+        }
+
+        private fun observe() {
+            observeReads {
+                observedBlock()
+            }
+        }
+
+        override fun onObservedReadsChanged() {
+            observe()
+        }
+    }
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
index 0e6b9f5..d7da687 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
@@ -19,16 +19,12 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -38,8 +34,6 @@
 import androidx.compose.ui.layout.MeasurePolicy
 import androidx.compose.ui.layout.SubcomposeLayout
 import androidx.compose.ui.platform.InspectableValue
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.ValueElement
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
@@ -56,8 +50,6 @@
 import androidx.compose.ui.test.onNodeWithContentDescription
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMap
@@ -839,472 +831,6 @@
             root.children[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
-
-    @Test
-    fun testChildrenSortedByBounds_vertical_zIndex() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Column(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .zIndex(1f)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_horizontal_zIndex() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Row(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .zIndex(1f)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_vertical_offset() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 0.dp, y = 50.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_horizontal_offset() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 50.dp, y = 0.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_vertical_offset_overlapped() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 0.dp, y = 20.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_horizontal_offset_overlapped() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 20.dp, y = 0.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(50.dp)
-                        .offset(x = 0.dp, y = 20.dp)
-                        .semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_vertical_offset_overlapped_withPadding() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .offset(x = 25.dp, y = 20.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .padding(25.dp)
-                        .semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_horizontal_offset_overlapped_withPadding() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .offset(x = 20.dp, y = 25.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .padding(25.dp)
-                        .semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_sameOffset_differentSize() {
-        val child1 = "child1"
-        val child2 = "child2"
-        rule.setContent {
-            Box(
-                Modifier.testTag(TestTag)
-            ) {
-                SimpleTestLayout(
-                    Modifier
-                        .requiredSize(100.dp)
-                        .offset(x = 50.dp, y = 0.dp)
-                        .semantics { testTag = child1 }
-                ) {}
-                SimpleTestLayout(
-                    Modifier.requiredSize(50.dp)
-                    .offset(x = 50.dp, y = 0.dp)
-                    .semantics { testTag = child2 }
-                ) {}
-            }
-        }
-
-        // Size should not be a factor.  z-order or placement order should break the tie instead.
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_vertical_subcompose() {
-        val child1 = "child1"
-        val child2 = "child2"
-        val density = Density(1f)
-        val size = with(density) { 100.dp.roundToPx() }.toFloat()
-        rule.setContent {
-            CompositionLocalProvider(LocalDensity provides density) {
-                SimpleSubcomposeLayout(
-                    Modifier.testTag(TestTag),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = child1 }
-                        ) {}
-                    },
-                    Offset(0f, size),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = child2 }
-                        ) {}
-                    },
-                    Offset(0f, 0f)
-                )
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_horizontal_subcompose() {
-        val child1 = "child1"
-        val child2 = "child2"
-        val density = Density(1f)
-        val size = with(density) { 100.dp.roundToPx() }.toFloat()
-        rule.setContent {
-            CompositionLocalProvider(LocalDensity provides density) {
-                SimpleSubcomposeLayout(
-                    Modifier.testTag(TestTag),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = child1 }
-                        ) {}
-                    },
-                    Offset(size, 0f),
-                    {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = child2 }
-                        ) {}
-                    },
-                    Offset(0f, 0f)
-                )
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(2, root.replacedChildrenSortedByBounds.size)
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
-
-    @Test
-    fun testChildrenSortedByBounds_rtl() {
-        val child1 = "child1"
-        val child2 = "child2"
-        val child3 = "child3"
-        val rtlChild1 = "rtlChild1"
-        val rtlChild2 = "rtlChild2"
-        val rtlChild3 = "rtlChild3"
-        rule.setContent {
-            Column(Modifier.testTag(TestTag)) {
-                Row {
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                            .semantics { testTag = child1 }
-                    ) {}
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                            .semantics { testTag = child2 }
-                    ) {}
-                    SimpleTestLayout(
-                        Modifier
-                            .requiredSize(100.dp)
-                            .semantics { testTag = child3 }
-                    ) {}
-                }
-                CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    // Will display rtlChild3 rtlChild2 rtlChild1
-                    Row {
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = rtlChild1 }
-                        ) {}
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = rtlChild2 }
-                        ) {}
-                        SimpleTestLayout(
-                            Modifier
-                                .requiredSize(100.dp)
-                                .semantics { testTag = rtlChild3 }
-                        ) {}
-                    }
-                }
-            }
-        }
-
-        val root = rule.onNodeWithTag(TestTag).fetchSemanticsNode("can't find node $TestTag")
-        assertEquals(6, root.replacedChildrenSortedByBounds.size)
-
-        // Ltr
-        assertEquals(
-            child1,
-            root.replacedChildrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child2,
-            root.replacedChildrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            child3,
-            root.replacedChildrenSortedByBounds[2].config.getOrNull(SemanticsProperties.TestTag)
-        )
-
-        // Rtl
-        assertEquals(
-            rtlChild1,
-            root.replacedChildrenSortedByBounds[3].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            rtlChild2,
-            root.replacedChildrenSortedByBounds[4].config.getOrNull(SemanticsProperties.TestTag)
-        )
-        assertEquals(
-            rtlChild3,
-            root.replacedChildrenSortedByBounds[5].config.getOrNull(SemanticsProperties.TestTag)
-        )
-    }
 }
 
 private fun SemanticsNodeInteraction.assertDoesNotHaveProperty(property: SemanticsPropertyKey<*>) {
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 e8c3bc2..be43b17 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
@@ -1159,6 +1159,9 @@
             onViewTreeOwnersAvailable?.invoke(viewTreeOwners)
             onViewTreeOwnersAvailable = null
         }
+
+        _inputModeManager.inputMode = if (isInTouchMode) Touch else Keyboard
+
         viewTreeOwners!!.lifecycleOwner.lifecycle.addObserver(this)
         viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener)
         viewTreeObserver.addOnScrollChangedListener(scrollChangedListener)
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 c9003f7..d0c2a7d 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
@@ -103,6 +103,74 @@
 import kotlin.math.floor
 import kotlin.math.roundToInt
 import kotlin.math.sign
+import kotlin.math.max
+import kotlin.math.min
+
+// TODO(mnuzen): This code is copy-pasted from experimental API in the Kotlin 1.7 standard library: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/range-until.html.
+// Delete it when this API graduates to stable in Kotlin (when the docs page linked no longer has @ExperimentalStdlibApi annotation).
+/**
+ * Represents a range of values (for example, numbers or characters) where the upper bound is not included in the range.
+ * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/ranges.html) for more information.
+ */
+internal interface OpenEndRange<T : Comparable<T>> {
+    /**
+     * The minimum value in the range.
+     */
+    val start: T
+
+    /**
+     * The maximum value in the range (exclusive).
+     *
+     * @throws IllegalStateException can be thrown if the exclusive end bound cannot be represented
+     * with a value of type [T].
+     */
+    val endExclusive: T
+
+    /**
+     * Checks whether the specified [value] belongs to the range.
+     *
+     * A value belongs to the open-ended range if it is greater than or equal to the [start] bound and strictly less than the [endExclusive] bound.
+     */
+    operator fun contains(value: T): Boolean = value >= start && value < endExclusive
+
+    /**
+     * Checks whether the range is empty.
+     *
+     * The open-ended range is empty if its start value is greater than or equal to the end value.
+     */
+    fun isEmpty(): Boolean = start >= endExclusive
+}
+
+private class OpenEndFloatRange(
+    start: Float,
+    endExclusive: Float
+) : OpenEndRange<Float> {
+    private val _start = start
+    private val _endExclusive = endExclusive
+    override val start: Float get() = _start
+    override val endExclusive: Float get() = _endExclusive
+
+    private fun lessThanOrEquals(a: Float, b: Float): Boolean = a <= b
+
+    override fun contains(value: Float): Boolean = value >= _start && value < _endExclusive
+    override fun isEmpty(): Boolean = !(_start < _endExclusive)
+
+    override fun equals(other: Any?): Boolean {
+        return other is OpenEndFloatRange && (isEmpty() && other.isEmpty() ||
+            _start == other._start && _endExclusive == other._endExclusive)
+    }
+
+    override fun hashCode(): Int {
+        return if (isEmpty()) -1 else 31 * _start.hashCode() + _endExclusive.hashCode()
+    }
+
+    override fun toString(): String = "$_start..<$_endExclusive"
+}
+internal operator fun Float.rangeUntil(that: Float): OpenEndRange<Float> =
+    OpenEndFloatRange(this, that)
+
+private fun OpenEndRange<Float>.overlaps(it: OpenEndRange<Float>) =
+    !isEmpty() && !it.isEmpty() && max(start, it.start) < min(endExclusive, it.endExclusive)
 
 private fun LayoutNode.findClosestParentNode(selector: (LayoutNode) -> Boolean): LayoutNode? {
     var currentParent = this.parent
@@ -444,45 +512,173 @@
         return info.unwrap()
     }
 
+    private fun semanticComparator(
+        layoutIsRtl: Boolean,
+    ): Comparator<SemanticsNode> {
+        // First compare the coordinates LTR
+        var comparator = compareBy<SemanticsNode> (
+            { it.layoutNode.coordinates.boundsInWindow().left },
+            { it.layoutNode.coordinates.boundsInWindow().top },
+            { it.layoutNode.coordinates.boundsInWindow().bottom },
+            { it.layoutNode.coordinates.boundsInWindow().right })
+        // Modify comparison if we're not using LTR comparison strategy to use RTL instead
+        if (layoutIsRtl) {
+            comparator = compareBy(
+                { it.layoutNode.coordinates.boundsInWindow().right },
+                { it.layoutNode.coordinates.boundsInWindow().top },
+                { it.layoutNode.coordinates.boundsInWindow().bottom },
+                { it.layoutNode.coordinates.boundsInWindow().left })
+        }
+        return comparator
+            // then compare by layoutNode's zIndex and placement order
+            .thenBy(LayoutNode.ZComparator) { it.layoutNode }
+            // then compare by semanticsId to break the tie somehow
+            .thenBy { it.id }
+    }
+
+    /**
+     * Returns the results of geometry groupings, which is determined from 1) grouping nodes into
+     * distinct, non-overlapping rows based on their top/bottom coordinates, then 2) sorting nodes
+     * within each row with the semantics comparator.
+     *
+     * This method approaches traversal order with more nuance than an approach considering only
+     * just hierarchy or only just an individual node's bounds.
+     *
+     * If [containerChildrenMapping] exists, there are additional children to add, as well as the
+     * sorted parent itself
+     */
+    private fun sortByGeometryGroupings(
+        layoutIsRtl: Boolean,
+        parentListToSort: MutableList<SemanticsNode>,
+        containerChildrenMapping: MutableMap<Int, MutableList<SemanticsNode>> = mutableMapOf()
+    ): MutableList<SemanticsNode> {
+        // RowGroupings list consists of pairs, first = a rectangle of the bounds of the row
+        // and second = the list of nodes in that row
+        val rowGroupings = mutableListOf<Pair<Rect, MutableList<SemanticsNode>>>()
+
+        // check to see if this entry overlaps with any groupings in rowGroupings
+        fun placedEntryRowOverlaps(
+            node: SemanticsNode
+        ): Boolean {
+            // Conversion to long is needed in order to utilize `until`, which has no float ver
+            val entryTopCoord = node.layoutNode.coordinates.boundsInWindow().top
+            val entryBottomCoord = node.layoutNode.coordinates.boundsInWindow().bottom
+            val entryRange = entryTopCoord.rangeUntil(entryBottomCoord)
+
+            for (currIndex in 0..rowGroupings.lastIndex) {
+                var currRect = rowGroupings[currIndex].first
+                var groupRange = currRect.top.rangeUntil(currRect.bottom)
+
+                // If it overlaps with this row group, update cover and add node
+                if (groupRange.overlaps(entryRange)) {
+                    val newRect = currRect.intersect(
+                        Rect(
+                            0f,
+                            entryTopCoord,
+                            Float.POSITIVE_INFINITY,
+                            entryBottomCoord
+                        )
+                    )
+                    // Replace the cover rectangle, copying over the old list of nodes
+                    rowGroupings[currIndex] = Pair(newRect, rowGroupings[currIndex].second)
+                    // Add current node
+                    rowGroupings[currIndex].second.add(node)
+                    // We've found an overlapping group, return true
+                    return true
+                }
+            }
+
+            // If we've made it here, then there are no groups our entry overlaps with
+            return false
+        }
+
+        for (entryIndex in 0..parentListToSort.lastIndex) {
+            val currEntry = parentListToSort[entryIndex]
+            // If this is the first entry, or vertical groups don't overlap
+            if (entryIndex == 0 || !placedEntryRowOverlaps(currEntry)) {
+                val newRect = currEntry.layoutNode.coordinates.boundsInWindow()
+                rowGroupings.add(Pair(newRect, mutableListOf(currEntry)))
+            } // otherwise, we've already iterated through, found and placed it in a matching group
+        }
+
+        // Sort the rows from top to bottom
+        rowGroupings.sortWith(compareBy({ it.first.top }, { it.first.bottom }))
+
+        val returnList = mutableListOf<SemanticsNode>()
+        rowGroupings.fastForEach { row ->
+            // Sort each individual row's parent nodes
+            row.second.sortWith(semanticComparator(layoutIsRtl))
+            row.second.fastForEach { node ->
+                // If a parent node is a container, then add its children
+                // Otherwise, simply add the parent node
+                returnList.addAll(containerChildrenMapping[node.id] ?: mutableListOf(node))
+            }
+        }
+
+        return returnList
+    }
+
+    /**
+     * This function prepares a subtree for `sortByGeometryGroupings` by retrieving all
+     * non-container nodes and adding them to the list to be geometrically sorted. We recurse on
+     * containers (if they exist) and add their sorted children to an optional mapping.
+     * The list to be sorted and child mapping is passed into `sortByGeometryGroupings`.
+     */
+    private fun subtreeSortedByGeometryGrouping(
+        layoutIsRtl: Boolean,
+        listToSort: MutableList<SemanticsNode>
+    ): MutableList<SemanticsNode> {
+        // This should be mapping of [containerID: listOfSortedChildren], only populated if there
+        // are container nodes in this level. If there are container nodes, `containerMapToChildren`
+        // would look like {containerId: [sortedChild, sortedChild], containerId: [sortedChild]}
+        val containerMapToChildren = mutableMapOf<Int, MutableList<SemanticsNode>>()
+        val geometryList = mutableListOf<SemanticsNode>()
+
+        fun depthFirstSearch(currNode: SemanticsNode) {
+            // Add this node to the list we will eventually sort
+            geometryList.add(currNode)
+            if (currNode.semanticsNodeIsStructurallySignificant) {
+                // Recurse and record the container's children, sorted
+                containerMapToChildren[currNode.id] = subtreeSortedByGeometryGrouping(
+                    layoutIsRtl, currNode.children.toMutableList()
+                )
+            } else {
+                // Otherwise, continue adding children to the list that'll be sorted regardless of
+                // hierarchy
+                currNode.children.fastForEach { child ->
+                    depthFirstSearch(child)
+                }
+            }
+        }
+
+        listToSort.fastForEach { node ->
+            depthFirstSearch(node)
+        }
+
+        return sortByGeometryGroupings(layoutIsRtl, geometryList, containerMapToChildren)
+    }
+
     private fun setTraversalValues() {
         idToBeforeMap.clear()
         idToAfterMap.clear()
-        var idToCoordinatesList = mutableListOf<Pair<Int, Rect>>()
 
-        fun depthFirstSearch(currNode: SemanticsNode) {
-            if (currNode.parent?.layoutNode?.innerCoordinator?.isAttached == true &&
-                currNode.layoutNode.innerCoordinator.isAttached
-            ) {
-                idToCoordinatesList.add(
-                    Pair(
-                        currNode.id,
-                        currNode.layoutNode.coordinates.boundsInWindow()
-                    )
-                )
-            }
-            // This retrieves the children in the order that we want (respecting child/parent
-            // hierarchies)
-            currNode.replacedChildrenSortedByBounds.fastForEach { child ->
-                depthFirstSearch(child)
-            }
-        }
+        val hostSemanticsNode =
+            currentSemanticsNodes[AccessibilityNodeProviderCompat.HOST_VIEW_ID]
+                ?.semanticsNode!!
+        val layoutIsRtl = hostSemanticsNode.isRtl
 
-        currentSemanticsNodes[AccessibilityNodeProviderCompat.HOST_VIEW_ID]?.semanticsNode?.let {
-            depthFirstSearch(
-                it
-            )
-        }
+        val semanticsOrderList = subtreeSortedByGeometryGrouping(
+            layoutIsRtl, hostSemanticsNode.children.toMutableList()
+        )
 
         // Iterate through our ordered list, and creating a mapping of current node to next node ID
         // We'll later read through this and set traversal order with IdToBeforeMap
-        for (i in 1..idToCoordinatesList.lastIndex) {
-            val prevId = idToCoordinatesList[i - 1].first
-            val currId = idToCoordinatesList[i].first
+        for (i in 1..semanticsOrderList.lastIndex) {
+            val prevId = semanticsOrderList[i - 1].id
+            val currId = semanticsOrderList[i].id
             idToBeforeMap[prevId] = currId
             idToAfterMap[currId] = prevId
         }
-
-        return
     }
 
     @VisibleForTesting
@@ -2746,6 +2942,23 @@
 private val SemanticsNode.isPassword: Boolean get() = config.contains(SemanticsProperties.Password)
 private val SemanticsNode.isTextField get() = this.unmergedConfig.contains(SemanticsActions.SetText)
 private val SemanticsNode.isRtl get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
+private val SemanticsNode.isContainer get() = config.getOrNull(SemanticsProperties.IsContainer)
+private val SemanticsNode.hasCollectionInfo get() =
+    config.contains(SemanticsProperties.CollectionInfo)
+private val SemanticsNode.isScrollable get() = config.contains(SemanticsActions.ScrollBy)
+
+private val SemanticsNode.semanticsNodeIsStructurallySignificant: Boolean
+    get() {
+        // We check if `isContainer == false` first to ensure if this flag is set, the node is not
+        // considered structural, even if it is a collection or a scrollable.
+        if (this.isContainer == false) {
+            return false
+        } else if (this.isContainer == true ||
+            this.hasCollectionInfo || this.isScrollable) {
+            return true
+        }
+        return false
+    }
 
 @OptIn(ExperimentalComposeUiApi::class)
 private fun SemanticsNode.excludeLineAndPageGranularities(): Boolean {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
index 0d873b0..99859f7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/Modifier.kt
@@ -175,11 +175,13 @@
         internal var ownerScope: ModifierNodeOwnerScope? = null
         internal var coordinator: NodeCoordinator? = null
             private set
+        internal var insertedNodeAwaitingAttachForInvalidation = false
+        internal var updatedNodeAwaitingAttachForInvalidation = false
         /**
-         * Indicates that the node is attached and part of the tree. This will get set to true
-         * right before [onAttach] is called, and set to false right after [onDetach] is called.
-         *
-         * A Node will never be attached more than once.
+         * Indicates that the node is attached to a [androidx.compose.ui.layout.Layout] which is
+         * part of the UI tree.
+         * This will get set to true right before [onAttach] is called, and set to false right
+         * after [onDetach] is called.
          *
          * @see onAttach
          * @see onDetach
@@ -194,7 +196,7 @@
         @Suppress("NOTHING_TO_INLINE")
         internal inline fun isKind(kind: NodeKind<*>) = kindSet and kind.mask != 0
 
-        internal fun attach() {
+        internal open fun attach() {
             check(!isAttached)
             check(coordinator != null)
             isAttached = true
@@ -202,7 +204,7 @@
             // TODO(lmr): run side effects?
         }
 
-        internal fun detach() {
+        internal open fun detach() {
             check(isAttached)
             check(coordinator != null)
             onDetach()
@@ -211,13 +213,23 @@
             // TODO(lmr): cancel jobs / side effects?
         }
 
+        internal open fun reset() {
+            check(isAttached)
+            onReset()
+        }
+
         /**
+         * Called when the node is attached to a [androidx.compose.ui.layout.Layout] which is
+         * part of the UI tree.
          * When called, `node` is guaranteed to be non-null. You can call sideEffect,
          * coroutineScope, etc.
          */
         open fun onAttach() {}
 
         /**
+         * Called when the node is not attached to a [androidx.compose.ui.layout.Layout] which is
+         * not a part of the UI tree anymore. Note that the node can be reattached again.
+         *
          * This should be called right before the node gets removed from the list, so you should
          * still be able to traverse inside of this method. Ideally we would not allow you to
          * trigger side effects here.
@@ -225,6 +237,22 @@
         open fun onDetach() {}
 
         /**
+         * Called when the node is about to be moved to a pool of layouts ready to be reused.
+         * For example it happens when the node is part of the item of LazyColumn after this item
+         * is scrolled out of the viewport. This means this node could be in future reused for a
+         * [androidx.compose.ui.layout.Layout] displaying a semantically different content when
+         * the list will be populating a new item.
+         *
+         * Use this callback to reset some local item specific state, like "is my component focused".
+         *
+         * This callback is called while the node is attached. Right after this callback the node
+         * will be detached and later reattached when reused.
+         *
+         * @sample androidx.compose.ui.samples.ModifierNodeResetSample
+         */
+        open fun onReset() {}
+
+        /**
          * This can be called to register [effect] as a function to be executed after all of the
          * changes to the tree are applied.
          *
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
index 159b5ed..9789629b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/draw/PainterModifier.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.draw
 
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.Modifier
@@ -30,11 +31,14 @@
 import androidx.compose.ui.layout.times
 import androidx.compose.ui.layout.IntrinsicMeasurable
 import androidx.compose.ui.layout.IntrinsicMeasureScope
-import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
-import androidx.compose.ui.platform.InspectorInfo
-import androidx.compose.ui.platform.InspectorValueInfo
+import androidx.compose.ui.node.DrawModifierNode
+import androidx.compose.ui.node.LayoutModifierNode
+import androidx.compose.ui.node.ModifierNodeElement
+import androidx.compose.ui.node.invalidateDraw
+import androidx.compose.ui.node.invalidateLayer
+import androidx.compose.ui.node.invalidateLayout
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
@@ -54,6 +58,7 @@
  *
  * @sample androidx.compose.ui.samples.PainterModifierSample
  */
+@OptIn(ExperimentalComposeUiApi::class)
 fun Modifier.paint(
     painter: Painter,
     sizeToIntrinsics: Boolean = true,
@@ -61,39 +66,123 @@
     contentScale: ContentScale = ContentScale.Inside,
     alpha: Float = DefaultAlpha,
     colorFilter: ColorFilter? = null
-) = this.then(
-    PainterModifier(
-        painter = painter,
-        sizeToIntrinsics = sizeToIntrinsics,
-        alignment = alignment,
-        contentScale = contentScale,
-        alpha = alpha,
-        colorFilter = colorFilter,
-        inspectorInfo = debugInspectorInfo {
-            name = "paint"
-            properties["painter"] = painter
-            properties["sizeToIntrinsics"] = sizeToIntrinsics
-            properties["alignment"] = alignment
-            properties["contentScale"] = contentScale
-            properties["alpha"] = alpha
-            properties["colorFilter"] = colorFilter
-        }
-    )
+) = this then PainterModifierNodeElement(
+    painter = painter,
+    sizeToIntrinsics = sizeToIntrinsics,
+    alignment = alignment,
+    contentScale = contentScale,
+    alpha = alpha,
+    colorFilter = colorFilter
 )
 
 /**
+ * Customized [ModifierNodeElement] for painting content using [painter].
+ *
+ * IMPORTANT NOTE: This class sets [androidx.compose.ui.node.ModifierNodeElement.autoInvalidate]
+ * to false which means it MUST invalidate both draw and the layout. It invalidates both in the
+ * [PainterModifierNodeElement.update] method through [LayoutModifierNode.invalidateLayer]
+ * (invalidates draw) and [LayoutModifierNode.invalidateLayout] (invalidates layout).
+ *
+ * @param painter used to paint content
+ * @param sizeToIntrinsics `true` to size the element relative to [Painter.intrinsicSize]
+ * @param alignment specifies alignment of the [painter] relative to content
+ * @param contentScale strategy for scaling [painter] if its size does not match the content size
+ * @param alpha opacity of [painter]
+ * @param colorFilter optional [ColorFilter] to apply to [painter]
+ *
+ * @sample androidx.compose.ui.samples.PainterModifierSample
+ */
+@ExperimentalComposeUiApi
+private class PainterModifierNodeElement(
+    val painter: Painter,
+    val sizeToIntrinsics: Boolean,
+    val alignment: Alignment,
+    val contentScale: ContentScale,
+    val alpha: Float,
+    val colorFilter: ColorFilter?
+) : ModifierNodeElement<PainterModifierNode>(
+    autoInvalidate = false,
+    inspectorInfo = debugInspectorInfo {
+        name = "paint"
+        properties["painter"] = painter
+        properties["sizeToIntrinsics"] = sizeToIntrinsics
+        properties["alignment"] = alignment
+        properties["contentScale"] = contentScale
+        properties["alpha"] = alpha
+        properties["colorFilter"] = colorFilter
+    }
+) {
+    override fun create(): PainterModifierNode {
+        return PainterModifierNode(
+            painter = painter,
+            sizeToIntrinsics = sizeToIntrinsics,
+            alignment = alignment,
+            contentScale = contentScale,
+            alpha = alpha,
+            colorFilter = colorFilter,
+        )
+    }
+
+    override fun update(node: PainterModifierNode): PainterModifierNode {
+        val invalidateLayout = node.sizeToIntrinsics != sizeToIntrinsics ||
+            (sizeToIntrinsics && node.painter.intrinsicSize != painter.intrinsicSize)
+
+        node.painter = painter
+        node.sizeToIntrinsics = sizeToIntrinsics
+        node.alignment = alignment
+        node.contentScale = contentScale
+        node.alpha = alpha
+        node.colorFilter = colorFilter
+
+        // Only invalidate layout if Intrinsics have changed.
+        if (invalidateLayout) {
+            node.invalidateLayout()
+        } else {
+            // Otherwise, redraw because one of the node properties has changed.
+            node.invalidateDraw()
+        }
+
+        return node
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is PainterModifierNodeElement) return false
+
+        if (painter !== other.painter) return false
+        if (sizeToIntrinsics != other.sizeToIntrinsics) return false
+        if (alignment != other.alignment) return false
+        if (contentScale != other.contentScale) return false
+        if (alpha != other.alpha) return false
+        if (colorFilter != other.colorFilter) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = painter.hashCode()
+        result = 31 * result + sizeToIntrinsics.hashCode()
+        result = 31 * result + alignment.hashCode()
+        result = 31 * result + contentScale.hashCode()
+        result = 31 * result + alpha.hashCode()
+        result = 31 * result + (colorFilter?.hashCode() ?: 0)
+        return result
+    }
+}
+
+/**
  * [DrawModifier] used to draw the provided [Painter] followed by the contents
  * of the component itself
  */
-private class PainterModifier(
-    val painter: Painter,
-    val sizeToIntrinsics: Boolean,
-    val alignment: Alignment = Alignment.Center,
-    val contentScale: ContentScale = ContentScale.Inside,
-    val alpha: Float = DefaultAlpha,
-    val colorFilter: ColorFilter? = null,
-    inspectorInfo: InspectorInfo.() -> Unit
-) : LayoutModifier, DrawModifier, InspectorValueInfo(inspectorInfo) {
+@OptIn(ExperimentalComposeUiApi::class)
+private class PainterModifierNode(
+    var painter: Painter,
+    var sizeToIntrinsics: Boolean,
+    var alignment: Alignment = Alignment.Center,
+    var contentScale: ContentScale = ContentScale.Inside,
+    var alpha: Float = DefaultAlpha,
+    var colorFilter: ColorFilter? = null
+) : LayoutModifierNode, Modifier.Node(), DrawModifierNode {
 
     /**
      * Helper property to determine if we should size content to the intrinsic
@@ -289,26 +378,6 @@
     private fun Size.hasSpecifiedAndFiniteWidth() = this != Size.Unspecified && width.isFinite()
     private fun Size.hasSpecifiedAndFiniteHeight() = this != Size.Unspecified && height.isFinite()
 
-    override fun hashCode(): Int {
-        var result = painter.hashCode()
-        result = 31 * result + sizeToIntrinsics.hashCode()
-        result = 31 * result + alignment.hashCode()
-        result = 31 * result + contentScale.hashCode()
-        result = 31 * result + alpha.hashCode()
-        result = 31 * result + (colorFilter?.hashCode() ?: 0)
-        return result
-    }
-
-    override fun equals(other: Any?): Boolean {
-        val otherModifier = other as? PainterModifier ?: return false
-        return painter == otherModifier.painter &&
-            sizeToIntrinsics == otherModifier.sizeToIntrinsics &&
-            alignment == otherModifier.alignment &&
-            contentScale == otherModifier.contentScale &&
-            alpha == otherModifier.alpha &&
-            colorFilter == otherModifier.colorFilter
-    }
-
     override fun toString(): String =
         "PainterModifier(" +
             "painter=$painter, " +
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
index 61519df..b73a8cb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTargetModifierNode.kt
@@ -54,14 +54,21 @@
         if (previousFocusState != focusState) refreshFocusEventNodes()
     }
 
-    internal fun onRemoved() {
+    /**
+     * Clears focus if this focus target has it.
+     */
+    override fun onReset() {
         when (focusState) {
             // Clear focus from the current FocusTarget.
             // This currently clears focus from the entire hierarchy, but we can change the
             // implementation so that focus is sent to the immediate focus parent.
             Active, Captured -> requireOwner().focusOwner.clearFocus(force = true)
-
-            ActiveParent, Inactive -> scheduleInvalidationForFocusEvents()
+            ActiveParent -> {
+                scheduleInvalidationForFocusEvents()
+                // This node might be reused, so reset the state to Inactive.
+                focusStateImpl = Inactive
+            }
+            Inactive -> scheduleInvalidationForFocusEvents()
         }
     }
 
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 e6089667..024ee31 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
@@ -475,6 +475,7 @@
     fun disposeOrReuseStartingFromIndex(startIndex: Int) {
         reusableCount = 0
         val lastReusableIndex = root.foldedChildren.size - precomposedCount - 1
+        var needApplyNotification = false
         if (startIndex <= lastReusableIndex) {
             // construct the set of available slot ids
             reusableSlotIdsSet.clear()
@@ -485,26 +486,34 @@
             slotReusePolicy.getSlotsToRetain(reusableSlotIdsSet)
             // iterating backwards so it is easier to remove items
             var i = lastReusableIndex
-            while (i >= startIndex) {
-                val node = root.foldedChildren[i]
-                val nodeState = nodeToNodeState[node]!!
-                val slotId = nodeState.slotId
-                if (reusableSlotIdsSet.contains(slotId)) {
-                    node.measuredByParent = UsageByParent.NotUsed
-                    reusableCount++
-                    nodeState.active = false
-                } else {
-                    ignoreRemeasureRequests {
-                        nodeToNodeState.remove(node)
-                        nodeState.composition?.dispose()
-                        root.removeAt(i, 1)
+            Snapshot.withoutReadObservation {
+                while (i >= startIndex) {
+                    val node = root.foldedChildren[i]
+                    val nodeState = nodeToNodeState[node]!!
+                    val slotId = nodeState.slotId
+                    if (reusableSlotIdsSet.contains(slotId)) {
+                        node.measuredByParent = UsageByParent.NotUsed
+                        reusableCount++
+                        if (nodeState.active) {
+                            nodeState.active = false
+                            needApplyNotification = true
+                        }
+                    } else {
+                        ignoreRemeasureRequests {
+                            nodeToNodeState.remove(node)
+                            nodeState.composition?.dispose()
+                            root.removeAt(i, 1)
+                        }
                     }
+                    // remove it from slotIdToNode so it is not considered active
+                    slotIdToNode.remove(slotId)
+                    i--
                 }
-                // remove it from slotIdToNode so it is not considered active
-                slotIdToNode.remove(slotId)
-                i--
             }
         }
+        if (needApplyNotification) {
+            Snapshot.sendApplyNotifications()
+        }
 
         makeSureStateIsConsistent()
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
index a449536..620349c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalManager.kt
@@ -63,7 +63,7 @@
         val toUpdate = hashSetOf<BackwardsCompatNode>()
         removed.forEachIndexed { i, layout ->
             val key = removedLocal[i]
-            if (layout.isAttached) {
+            if (layout.nodes.head.isAttached) {
                 // if the layout is still attached, that means that this provider got removed and
                 // there's possible some consumers below it that need to be updated
                 invalidateConsumersOfNodeForKey(layout.nodes.head, key, toUpdate)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
index af4d5d2..65f3f8e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/BackwardsCompatNode.kt
@@ -153,7 +153,9 @@
             if (element is DrawCacheModifier) {
                 invalidateCache = true
             }
-            invalidateLayer()
+            if (!duringAttach) {
+                invalidateLayer()
+            }
         }
         if (isKind(Nodes.Layout)) {
             val isChainUpdate = requireLayoutNode().nodes.tail.isAttached
@@ -163,8 +165,10 @@
                 coordinator.layoutModifierNode = this
                 coordinator.onLayoutModifierNodeChanged()
             }
-            invalidateLayer()
-            requireLayoutNode().invalidateMeasurements()
+            if (!duringAttach) {
+                invalidateLayer()
+                requireLayoutNode().invalidateMeasurements()
+            }
         }
         if (element is RemeasurementModifier) {
             element.onRemeasurementAvailable(this)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
index 3b5ac23..8bbe3a8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DelegatingNode.kt
@@ -80,16 +80,21 @@
         }
     }
 
-    override fun onAttach() {
-        super.onAttach()
+    override fun attach() {
+        super.attach()
         forEachDelegate {
             it.updateCoordinator(coordinator)
             it.attach()
         }
     }
 
-    override fun onDetach() {
+    override fun detach() {
         forEachDelegate { it.detach() }
-        super.onDetach()
+        super.detach()
+    }
+
+    override fun reset() {
+        super.reset()
+        forEachDelegate { it.reset() }
     }
 }
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 a410193..2c425f0 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
@@ -15,6 +15,7 @@
  */
 package androidx.compose.ui.node
 
+import androidx.compose.runtime.ComposeNodeLifecycleCallback
 import androidx.compose.runtime.collection.MutableVector
 import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.ExperimentalComposeUiApi
@@ -73,7 +74,11 @@
     private val isVirtual: Boolean = false,
     // The unique semantics ID that is used by all semantics modifiers attached to this LayoutNode.
     override val semanticsId: Int = generateSemanticsId()
-) : Remeasurement, OwnerScope, LayoutInfo, ComposeUiNode,
+) : ComposeNodeLifecycleCallback,
+    Remeasurement,
+    OwnerScope,
+    LayoutInfo,
+    ComposeUiNode,
     Owner.OnLayoutCompletedListener {
 
     val isPlacedInLookahead: Boolean?
@@ -400,7 +405,7 @@
         invalidateMeasurements()
         parent?.invalidateMeasurements()
 
-        forEachCoordinatorIncludingInner { it.attach() }
+        forEachCoordinatorIncludingInner { it.onLayoutNodeAttach() }
         onAttach?.invoke(owner)
 
         invalidateFocusOnAttach()
@@ -425,7 +430,6 @@
         }
         layoutDelegate.resetAlignmentLines()
         onDetach?.invoke(owner)
-        forEachCoordinatorIncludingInner { it.detach() }
 
         @OptIn(ExperimentalComposeUiApi::class)
         if (outerSemantics != null) {
@@ -748,7 +752,6 @@
      */
     override var modifier: Modifier = Modifier
         set(value) {
-            if (value == field) return
             require(!isVirtual || modifier === Modifier) {
                 "Modifiers are not supported on virtual LayoutNodes"
             }
@@ -764,6 +767,10 @@
             layoutDelegate.updateParentData()
         }
 
+    private fun resetModifierState() {
+        nodes.resetState()
+    }
+
     internal fun invalidateParentData() {
         layoutDelegate.invalidateParentData()
     }
@@ -1346,6 +1353,26 @@
     override val parentInfo: LayoutInfo?
         get() = parent
 
+    private var deactivated = false
+
+    override fun onReuse() {
+        if (deactivated) {
+            deactivated = false
+            // we don't need to reset state as it was done when deactivated
+        } else {
+            resetModifierState()
+        }
+    }
+
+    override fun onDeactivate() {
+        deactivated = true
+        resetModifierState()
+    }
+
+    override fun onRelease() {
+        forEachCoordinatorIncludingInner { it.onRelease() }
+    }
+
     internal companion object {
         private val ErrorMeasurePolicy: NoIntrinsicsMeasurePolicy =
             object : NoIntrinsicsMeasurePolicy(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
index 6116c55..a936861 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierNodeElement.kt
@@ -56,7 +56,7 @@
 ) : Modifier.Element, InspectorValueInfo(inspectorInfo) {
     /**
      * This will be called the first time the modifier is applied to the Layout and it should
-     * construct and return the correspoding [Modifier.Node] instance.
+     * construct and return the corresponding [Modifier.Node] instance.
      */
     abstract fun create(): N
 
@@ -85,7 +85,7 @@
  *
  * @param key An object used to determine whether or not the created node should be updated or not.
  * @param create The initial creation of the node. This will be called the first time the modifier
- *  is applied to the Layout and it should construct the correspoding [Modifier.Node] instance,
+ *  is applied to the Layout and it should construct the corresponding [Modifier.Node] instance,
  *  referencing any captured inputs necessary.
  * @param update Called when a modifier is applied to a Layout whose [key] have changed from the
  *  previous application. This lambda will have the current node instance passed in as a parameter,
@@ -123,7 +123,7 @@
  * which accepts a "params" and "update" parameter.
  *
  * @param create The initial creation of the node. This will be called the first time the modifier
- *  is applied to the Layout and it should construct the correspoding [Modifier.Node] instance
+ *  is applied to the Layout and it should construct the corresponding [Modifier.Node] instance
  * @param definitions This lambda will construct a debug-only set of information for use with
  *  tooling.
  *
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
index e1d54e7..e61d347 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeChain.kt
@@ -97,7 +97,7 @@
         // to avoid allocating vectors every time modifier is set, we have two vectors that we
         // reuse over time. Since the common case is the modifier chains will be of equal length,
         // these vectors should be sized appropriately
-        val before = current ?: mutableVectorOf()
+        val before = current ?: MutableVector(capacity = 0)
         val after = m.fillVector(buffer ?: mutableVectorOf())
         if (after.size == before.size) {
             // assume if the sizes are the same, that we are in a common case of no structural
@@ -111,7 +111,7 @@
             while (node != null && i >= 0) {
                 val prev = before[i]
                 val next = after[i]
-                when (reuseActionForModifiers(prev, next)) {
+                when (actionForModifiers(prev, next)) {
                     ActionReplace -> {
                         // TODO(lmr): we could avoid running the diff if i = 0, since that would
                         //  always be simple remove + insert
@@ -128,8 +128,6 @@
                         // reuse the node but also update it
                         val beforeUpdate = node
                         node = updateNodeAndReplaceIfNeeded(prev, next, beforeUpdate)
-                        // if the node is new, we need to run attach on it
-                        attachNeeded = attachNeeded || beforeUpdate !== node
                         logger?.nodeUpdated(i, i, prev, next, beforeUpdate, node)
                     }
                     ActionReuse -> {
@@ -137,10 +135,14 @@
                         // no need to do anything, this is "the same" modifier
                     }
                 }
-                i--
+                // if the node is new, we need to run attach on it
+                if (!node.isAttached) attachNeeded = true
+
                 aggregateChildKindSet = aggregateChildKindSet or node.kindSet
                 node.aggregateChildKindSet = aggregateChildKindSet
+
                 node = node.parent
+                i--
             }
 
             if (i > 0) {
@@ -178,6 +180,18 @@
                 node.aggregateChildKindSet = aggregateChildKindSet
                 i--
             }
+        } else if (after.size == 0) {
+            // common case where we we are removing all the modifiers.
+            var i = before.size - 1
+            // for the linear traversal we want to start with the "unpadded" tail
+            var node: Modifier.Node? = tail.parent
+            while (node != null && i >= 0) {
+                logger?.nodeRemoved(i, before[i], node)
+                val parent = node.parent
+                detachAndRemoveNode(node)
+                node = parent
+                i--
+            }
         } else {
             attachNeeded = true
             coordinatorSyncNeeded = true
@@ -202,6 +216,25 @@
         }
     }
 
+    internal fun resetState() {
+        val current = current
+        if (current == null) {
+            // We have no modifiers set so there is nothing to reset.
+            return
+        }
+        val size = current.size
+        var node: Modifier.Node? = tail.parent
+        var i = size - 1
+        while (node != null && i >= 0) {
+            if (node.isAttached) {
+                node.reset()
+                node.detach()
+            }
+            node = node.parent
+            i--
+        }
+    }
+
     private fun syncCoordinators() {
         var coordinator: NodeCoordinator = innerCoordinator
         var node: Modifier.Node? = tail.parent
@@ -234,7 +267,19 @@
         headToTail {
             if (!it.isAttached) {
                 it.attach()
-                if (performInvalidations) autoInvalidateInsertedNode(it)
+                if (performInvalidations) {
+                    if (it.insertedNodeAwaitingAttachForInvalidation) {
+                        autoInvalidateInsertedNode(it)
+                    }
+                    if (it.updatedNodeAwaitingAttachForInvalidation) {
+                        autoInvalidateUpdatedNode(it)
+                    }
+                }
+                // when we attach with performInvalidations == false no separate
+                // invalidations needed as the whole LayoutNode is attached to the tree.
+                // it will cause all the needed invalidations.
+                it.insertedNodeAwaitingAttachForInvalidation = false
+                it.updatedNodeAwaitingAttachForInvalidation = false
             }
         }
     }
@@ -301,12 +346,14 @@
         var after: MutableVector<Modifier.Element>,
     ) : DiffCallback {
         override fun areItemsTheSame(oldIndex: Int, newIndex: Int): Boolean {
-            return reuseActionForModifiers(before[oldIndex], after[newIndex]) != ActionReplace
+            return actionForModifiers(before[oldIndex], after[newIndex]) != ActionReplace
         }
 
         override fun insert(atIndex: Int, newIndex: Int) {
             val child = node
             node = createAndInsertNodeAsParent(after[newIndex], child)
+            check(!node.isAttached)
+            node.insertedNodeAwaitingAttachForInvalidation = true
             logger?.nodeInserted(atIndex, newIndex, after[newIndex], child, node)
             aggregateChildKindSet = aggregateChildKindSet or node.kindSet
             node.aggregateChildKindSet = aggregateChildKindSet
@@ -315,7 +362,7 @@
         override fun remove(oldIndex: Int) {
             node = node.parent!!
             logger?.nodeRemoved(oldIndex, before[oldIndex], node)
-            node = disposeAndRemoveNode(node)
+            node = detachAndRemoveNode(node)
         }
 
         override fun same(oldIndex: Int, newIndex: Int) {
@@ -427,7 +474,7 @@
         return next
     }
 
-    private fun disposeAndRemoveNode(node: Modifier.Node): Modifier.Node {
+    private fun detachAndRemoveNode(node: Modifier.Node): Modifier.Node {
         if (node.isAttached) {
             // for removing nodes, we always do the autoInvalidateNode call,
             // regardless of whether or not it was a ModifierNodeElement with autoInvalidate
@@ -474,6 +521,8 @@
             }
             else -> BackwardsCompatNode(element)
         }
+        check(!node.isAttached)
+        node.insertedNodeAwaitingAttachForInvalidation = true
         return insertParent(node, child)
     }
 
@@ -503,29 +552,31 @@
     private fun updateNodeAndReplaceIfNeeded(
         prev: Modifier.Element,
         next: Modifier.Element,
-        node: Modifier.Node,
+        node: Modifier.Node
     ): Modifier.Node {
         when {
             prev is ModifierNodeElement<*> && next is ModifierNodeElement<*> -> {
                 val updated = next.updateUnsafe(node)
                 if (updated !== node) {
+                    check(!updated.isAttached)
+                    updated.insertedNodeAwaitingAttachForInvalidation = true
                     // if a new instance is returned, we want to detach the old one
                     if (node.isAttached) {
                         autoInvalidateRemovedNode(node)
                         node.detach()
                     }
-                    val result = replaceNode(node, updated)
-                    if (node.isAttached) {
-                        autoInvalidateInsertedNode(updated)
-                    }
-                    return result
+                    return replaceNode(node, updated)
                 } else {
                     // the node was updated. we are done.
-                    if (next.autoInvalidate && updated.isAttached) {
-                        // the modifier element is labeled as "auto invalidate", which means
-                        // that since the node was updated, we need to invalidate everything
-                        // relevant to it.
-                        autoInvalidateUpdatedNode(updated)
+                    if (next.autoInvalidate) {
+                        if (updated.isAttached) {
+                            // the modifier element is labeled as "auto invalidate", which means
+                            // that since the node was updated, we need to invalidate everything
+                            // relevant to it.
+                            autoInvalidateUpdatedNode(updated)
+                        } else {
+                            updated.updatedNodeAwaitingAttachForInvalidation = true
+                        }
                     }
                     return updated
                 }
@@ -535,6 +586,8 @@
                 // We always autoInvalidate BackwardsCompatNode.
                 if (node.isAttached) {
                     autoInvalidateUpdatedNode(node)
+                } else {
+                    node.updatedNodeAwaitingAttachForInvalidation = true
                 }
                 return node
             }
@@ -661,7 +714,7 @@
  * 2. if modifiers are same class, we REUSE and UPDATE
  * 3. else REPLACE (NO REUSE, NO UPDATE)
  */
-internal fun reuseActionForModifiers(prev: Modifier.Element, next: Modifier.Element): Int {
+internal fun actionForModifiers(prev: Modifier.Element, next: Modifier.Element): Int {
     return if (prev == next)
         ActionReuse
     else if (areObjectsOfSameType(prev, next))
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
index 01cc2c9..19ff440 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeCoordinator.kt
@@ -84,6 +84,8 @@
     override val coordinates: LayoutCoordinates
         get() = this
 
+    private var released = false
+
     private fun headNode(includeTail: Boolean): Modifier.Node? {
         return if (layoutNode.outerCoordinator === this) {
             layoutNode.nodes.head
@@ -158,7 +160,7 @@
         get() = _measureResult != null
 
     override val isAttached: Boolean
-        get() = tail.isAttached
+        get() = !released && layoutNode.isAttached
 
     private var _measureResult: MeasureResult? = null
     override var measureResult: MeasureResult
@@ -926,30 +928,19 @@
     }
 
     /**
-     * Attaches the [NodeCoordinator] and its wrapped [NodeCoordinator] to an active
-     * LayoutNode.
-     *
      * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
      * attached to the [Owner].
-     *
-     * It is also called whenever the modifier chain is replaced and the [NodeCoordinator]s are
-     * recreated.
      */
-    open fun attach() {
+    fun onLayoutNodeAttach() {
         onLayerBlockUpdated(layerBlock)
     }
 
     /**
-     * Detaches the [NodeCoordinator] and its wrapped [NodeCoordinator] from an active
-     * LayoutNode.
-     *
      * This will be called when the [LayoutNode] associated with this [NodeCoordinator] is
-     * detached from the [Owner].
-     *
-     * It is also called whenever the modifier chain is replaced and the [NodeCoordinator]s are
-     * recreated.
+     * released or when the [NodeCoordinator] is released (will not be used anymore).
      */
-    open fun detach() {
+    fun onRelease() {
+        released = true
         if (layer != null) {
             onLayerBlockUpdated(null)
         }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
index 595c6b6..c57a109 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/NodeKind.kt
@@ -210,7 +210,7 @@
         node.invalidateMeasurements()
         if (phase == Removed) {
             val coordinator = node.requireCoordinator(Nodes.Layout)
-            coordinator.detach()
+            coordinator.onRelease()
         }
     }
     if (node.isKind(Nodes.GlobalPositionAware) && node is GlobalPositionAwareModifierNode) {
@@ -227,7 +227,9 @@
     }
     if (node.isKind(Nodes.FocusTarget) && node is FocusTargetModifierNode) {
         when (phase) {
-            Removed -> node.onRemoved()
+            // when we previously had focus target modifier on a node and then this modifier
+            // is removed we need to notify the focus tree about so the focus state is reset.
+            Removed -> node.onReset()
             else -> node.requireOwner().focusOwner.scheduleInvalidation(node)
         }
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
index 8b3d63d..0bf327d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsNode.kt
@@ -201,18 +201,14 @@
         get() = mergingEnabled && unmergedConfig.isMergingSemanticsOfDescendants
 
     internal fun unmergedChildren(
-        sortByBounds: Boolean = false,
         includeFakeNodes: Boolean = false
     ): List<SemanticsNode> {
         // TODO(lmr): we should be able to do this more efficiently using visitSubtree
         if (this.isFake) return listOf()
         val unmergedChildren: MutableList<SemanticsNode> = mutableListOf()
 
-        val semanticsChildren = if (sortByBounds) {
-            this.layoutNode.findOneLayerOfSemanticsWrappersSortedByBounds()
-        } else {
-            this.layoutNode.findOneLayerOfSemanticsWrappers()
-        }
+        val semanticsChildren = this.layoutNode.findOneLayerOfSemanticsWrappers()
+
         semanticsChildren.fastForEach { semanticsChild ->
             unmergedChildren.add(SemanticsNode(semanticsChild, mergingEnabled))
         }
@@ -234,7 +230,6 @@
     //               optimize this when the merging algorithm is improved.
     val children: List<SemanticsNode>
         get() = getChildren(
-            sortByBounds = false,
             includeReplacedSemantics = !mergingEnabled,
             includeFakeNodes = false
         )
@@ -248,27 +243,11 @@
      */
     internal val replacedChildren: List<SemanticsNode>
         get() = getChildren(
-            sortByBounds = false,
             includeReplacedSemantics = false,
             includeFakeNodes = true
         )
 
     /**
-     * Similar to [replacedChildren] but children are sorted by bounds: top to down, left to
-     * right(right to left in RTL mode).
-     */
-    // TODO(b/184376083): This is too expensive for a val (full subtree recreation every call);
-    //               optimize this when the merging algorithm is improved.
-    internal val replacedChildrenSortedByBounds: List<SemanticsNode>
-        get() = getChildren(
-            sortByBounds = true,
-            includeReplacedSemantics = false,
-            includeFakeNodes = true
-        )
-
-    /**
-     * @param sortByBounds if true, nodes in the result list will be sorted with respect to their
-     * bounds. Otherwise children will be in the order they are added to the composition
      * @param includeReplacedSemantics if true, the result will contain children of nodes marked
      * as [clearAndSetSemantics]. For accessibility we always use false, but in testing and
      * debugging we should be able to investigate both
@@ -278,7 +257,6 @@
      * and so will be this parameter.
      */
     private fun getChildren(
-        sortByBounds: Boolean,
         includeReplacedSemantics: Boolean,
         includeFakeNodes: Boolean
     ): List<SemanticsNode> {
@@ -290,10 +268,10 @@
             // In most common merging scenarios like Buttons, this will return nothing.
             // In cases like a clickable Row itself containing a Button, this will
             // return the Button as a child.
-            return findOneLayerOfMergingSemanticsNodes(sortByBounds = sortByBounds)
+            return findOneLayerOfMergingSemanticsNodes()
         }
 
-        return unmergedChildren(sortByBounds, includeFakeNodes)
+        return unmergedChildren(includeFakeNodes)
     }
 
     /**
@@ -327,10 +305,9 @@
         }
 
     private fun findOneLayerOfMergingSemanticsNodes(
-        list: MutableList<SemanticsNode> = mutableListOf(),
-        sortByBounds: Boolean = false
+        list: MutableList<SemanticsNode> = mutableListOf()
     ): List<SemanticsNode> {
-        unmergedChildren(sortByBounds).fastForEach { child ->
+        unmergedChildren().fastForEach { child ->
             if (child.isMergingSemanticsOfDescendants) {
                 list.add(child)
             } else {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
index 9fd19fe..62a5bdb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsSort.kt
@@ -1,5 +1,6 @@
+@file:Suppress("ktlint")
 /*
- * Copyright 2021 The Android Open Source Project
+ * Copyright 2023 The Android Open 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,178 +17,8 @@
 
 package androidx.compose.ui.semantics
 
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.layout.boundsInRoot
 import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.NodeCoordinator
-import androidx.compose.ui.node.SemanticsModifierNode
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.util.fastForEach
-import androidx.compose.ui.util.fastMap
 
-// This part is a copy from ViewGroup#addChildrenForAccessibility.
-@OptIn(ExperimentalComposeUiApi::class)
-internal fun LayoutNode.findOneLayerOfSemanticsWrappersSortedByBounds(
-    list: MutableList<SemanticsModifierNode> = mutableListOf()
-): List<SemanticsModifierNode> {
-    fun sortWithStrategy(holders: List<NodeLocationHolder>): List<NodeLocationHolder> {
-        // This is gross but the least risky solution. The current comparison
-        // strategy breaks transitivity but produces very good results. Coming
-        // up with a new strategy requires time which we do not have, so ...
-        return try {
-            NodeLocationHolder.comparisonStrategy = NodeLocationHolder.ComparisonStrategy.Stripe
-            holders.toMutableList().apply { sort() }
-        } catch (iae: IllegalArgumentException) {
-            // Note that in practice this occurs extremely rarely in a couple
-            // of pathological cases.
-            NodeLocationHolder.comparisonStrategy = NodeLocationHolder.ComparisonStrategy.Location
-            holders.toMutableList().apply { sort() }
-        }
-    }
-
-    if (!isAttached) {
-        return list
-    }
-    val holders = ArrayList<NodeLocationHolder>()
-    children.fastForEach {
-        if (it.isAttached) holders.add(NodeLocationHolder(this, it))
-    }
-    val sortedChildren = sortWithStrategy(holders).fastMap { it.node }
-
-    sortedChildren.fastForEach { child ->
-        val outerSemantics = child.outerSemantics
-        if (outerSemantics != null) {
-            list.add(outerSemantics)
-        } else {
-            child.findOneLayerOfSemanticsWrappersSortedByBounds(list)
-        }
-    }
-    return list
-}
-
-internal class NodeLocationHolder internal constructor(
-    internal val subtreeRoot: LayoutNode,
-    internal val node: LayoutNode
-) : Comparable<NodeLocationHolder> {
-    internal companion object {
-        internal var comparisonStrategy = ComparisonStrategy.Stripe
-    }
-
-    internal enum class ComparisonStrategy { Stripe, Location }
-
-    private val location: Rect?
-
-    private val layoutDirection = subtreeRoot.layoutDirection
-
-    init {
-        val subtreeRootCoordinator = subtreeRoot.innerCoordinator
-        val coordinator = node.findCoordinatorToGetBounds()
-        location = if (subtreeRootCoordinator.isAttached && coordinator.isAttached) {
-            subtreeRootCoordinator.localBoundingBoxOf(coordinator)
-        } else {
-            null
-        }
-    }
-
-    override fun compareTo(other: NodeLocationHolder): Int {
-        if (location == null) {
-            // put the unattached nodes at last. This probably can save accessibility services time.
-            return 1
-        }
-        if (other.location == null) {
-            return -1
-        }
-
-        if (comparisonStrategy == ComparisonStrategy.Stripe) {
-            // First is above second.
-            if (location.bottom - other.location.top <= 0) {
-                return -1
-            }
-            // First is below second.
-            if (location.top - other.location.bottom >= 0) {
-                return 1
-            }
-        }
-
-        // We are ordering left-to-right, top-to-bottom.
-        if (layoutDirection == LayoutDirection.Ltr) {
-            val leftDifference = location.left - other.location.left
-            if (leftDifference != 0f) {
-                return if (leftDifference < 0) -1 else 1
-            }
-        } else { // RTL
-            val rightDifference = location.right - other.location.right
-            if (rightDifference != 0f) {
-                return if (rightDifference < 0) 1 else -1
-            }
-        }
-        // We are ordering left-to-right, top-to-bottom.
-        val topDifference = location.top - other.location.top
-        if (topDifference != 0f) {
-            return if (topDifference < 0) -1 else 1
-        }
-
-        // Find a child of each view with different screen bounds. If we get here, node and
-        // other.node must be attached.
-        val view1Bounds = node.findCoordinatorToGetBounds().boundsInRoot()
-        val view2Bounds = other.node.findCoordinatorToGetBounds().boundsInRoot()
-        val child1 = node.findNodeByPredicateTraversal {
-            val wrapper = it.findCoordinatorToGetBounds()
-            wrapper.isAttached && view1Bounds != wrapper.boundsInRoot()
-        }
-        val child2 = other.node.findNodeByPredicateTraversal {
-            val wrapper = it.findCoordinatorToGetBounds()
-            wrapper.isAttached && view2Bounds != wrapper.boundsInRoot()
-        }
-        // Compare the children recursively
-        if ((child1 != null) && (child2 != null)) {
-            val childHolder1 = NodeLocationHolder(subtreeRoot, child1)
-            val childHolder2 = NodeLocationHolder(other.subtreeRoot, child2)
-            return childHolder1.compareTo(childHolder2)
-        }
-
-        // If only one has a child, use that one
-        if (child1 != null) {
-            return 1
-        }
-
-        if (child2 != null) {
-            return -1
-        }
-
-        val zDifference = LayoutNode.ZComparator.compare(node, other.node)
-        if (zDifference != 0) {
-            return -zDifference
-        }
-
-        // Break tie somehow
-        return node.semanticsId - other.node.semanticsId
-    }
-}
-
-internal fun LayoutNode.findNodeByPredicateTraversal(
-    predicate: (LayoutNode) -> Boolean
-): LayoutNode? {
-    if (predicate(this)) {
-        return this
-    }
-
-    children.fastForEach {
-        val result = it.findNodeByPredicateTraversal(predicate)
-        if (result != null) {
-            return result
-        }
-    }
-
-    return null
-}
-
-/**
- * If this node has semantics, we use the semantics wrapper to get bounds. Otherwise, we use
- * innerCoordinator because it seems the bounds after padding is the effective content.
- */
-@OptIn(ExperimentalComposeUiApi::class)
-internal fun LayoutNode.findCoordinatorToGetBounds(): NodeCoordinator {
-    return (outerMergingSemantics ?: outerSemantics)?.node?.coordinator ?: innerCoordinator
-}
+internal fun LayoutNode.findOneLayerOfSemanticsWrappersSortedByBounds() {
+    fun shimToPreserveFilenameAPI() {}
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
index 84732ff..5b7e198 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/ModifierLocalConsumerEntityTest.kt
@@ -280,9 +280,7 @@
 
     private fun changeModifier(modifier: Modifier) {
         with(layoutNode) {
-            if (isAttached) { forEachNodeCoordinator { it.detach() } }
             this.modifier = modifier
-            if (isAttached) { forEachNodeCoordinator { it.attach() } }
             owner?.onEndApplyChanges()
         }
     }
@@ -314,9 +312,13 @@
             layoutNode: LayoutNode,
             affectsLookahead: Boolean,
             forceRequest: Boolean
-        ) {}
-        override fun onAttach(node: LayoutNode) = node.forEachNodeCoordinator { it.attach() }
-        override fun onDetach(node: LayoutNode) = node.forEachNodeCoordinator { it.detach() }
+        ) {
+        }
+
+        override fun onAttach(node: LayoutNode) =
+            node.forEachNodeCoordinator { it.onLayoutNodeAttach() }
+
+        override fun onDetach(node: LayoutNode) {}
 
         override val root: LayoutNode
             get() = TODO("Not yet implemented")
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/semantics/SemanticsSortTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/semantics/SemanticsSortTest.kt
deleted file mode 100644
index 47ac9fe4..0000000
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/semantics/SemanticsSortTest.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.semantics
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.MockOwner
-import androidx.compose.ui.node.SemanticsModifierNode
-import androidx.compose.ui.zIndex
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@OptIn(ExperimentalComposeUiApi::class)
-@RunWith(JUnit4::class)
-class SemanticsSortTest {
-
-    @Test // regression test for b/207477257
-    fun compareDoesNotViolateComparatorContract() {
-        val root = LayoutNode(0, 0, 720, 1080)
-        repeat(32) { index ->
-            val child = if (index % 2 == 0) {
-                LayoutNode(0, 0, 0, 0)
-            } else {
-                val offset = if (index == 1 || index == 31) 100 else 0
-                LayoutNode(0, 0 - offset, 720, 30 - offset).also {
-                    it.insertAt(0, LayoutNode(0, 0, 100, 100, Modifier.semantics { }))
-                }
-            }
-            root.insertAt(index, child)
-        }
-
-        root.attach(MockOwner())
-        root.findOneLayerOfSemanticsWrappersSortedByBounds()
-
-        // expect - no crash happened
-    }
-
-    @Test
-    fun sortedByZOrderIfHasSameBounds() {
-        val root = LayoutNode(0, 0, 100, 100)
-        repeat(5) { index ->
-            root.insertAt(
-                index,
-                LayoutNode(
-                    0, 0, 100, 100,
-                    Modifier
-                        .semantics { set(LayoutNodeIndex, index) }
-                        .zIndex((index * 3 % 5).toFloat())
-                )
-            )
-        }
-        root.attach(MockOwner())
-        root.remeasure()
-        root.replace()
-        val result = root.findOneLayerOfSemanticsWrappersSortedByBounds()
-
-        assertThat(result[0].layoutNodeIndex()).isEqualTo(3)
-        assertThat(result[1].layoutNodeIndex()).isEqualTo(1)
-        assertThat(result[2].layoutNodeIndex()).isEqualTo(4)
-        assertThat(result[3].layoutNodeIndex()).isEqualTo(2)
-        assertThat(result[4].layoutNodeIndex()).isEqualTo(0)
-    }
-
-    private val LayoutNodeIndex = SemanticsPropertyKey<Int>("LayoutNodeIndex")
-
-    private fun SemanticsModifierNode.layoutNodeIndex(): Int {
-        return semanticsConfiguration[LayoutNodeIndex]
-    }
-}
diff --git a/concurrent/OWNERS b/concurrent/OWNERS
index 36f79b6..b8d37f5 100644
--- a/concurrent/OWNERS
+++ b/concurrent/OWNERS
@@ -1 +1,2 @@
+# Bug component: 610517
 sergeyv@google.com
\ No newline at end of file
diff --git a/constraintlayout/OWNERS b/constraintlayout/OWNERS
index 4a0b20b1..7624d05 100644
--- a/constraintlayout/OWNERS
+++ b/constraintlayout/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 487767
 hoford@google.com
 oscarad@google.com
 shanewong@google.com
\ No newline at end of file
diff --git a/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutComposeIssueRegistry.kt b/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutComposeIssueRegistry.kt
index 13e6bed..f81e031 100644
--- a/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutComposeIssueRegistry.kt
+++ b/constraintlayout/constraintlayout-compose-lint/src/main/java/androidx/constraintlayout/compose/lint/ConstraintLayoutComposeIssueRegistry.kt
@@ -25,7 +25,7 @@
 private const val CL_COMPOSE_NEW_ISSUE = "new?component=323867&template=1023345"
 
 class ConstraintLayoutComposeIssueRegistry : IssueRegistry() {
-    override val api = 13
+    override val api = 14
 
     override val minApi = CURRENT_API
 
diff --git a/constraintlayout/constraintlayout-compose/api/current.txt b/constraintlayout/constraintlayout-compose/api/current.txt
index 9b065fc..00f82e2 100644
--- a/constraintlayout/constraintlayout-compose/api/current.txt
+++ b/constraintlayout/constraintlayout-compose/api/current.txt
@@ -415,9 +415,6 @@
     method public void itemsWithProperties(int count, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.compose.runtime.State<androidx.constraintlayout.compose.MotionLayoutScope.MotionProperties>,kotlin.Unit> itemContent);
   }
 
-  public final class MotionDragHandlerKt {
-  }
-
   public interface MotionItemsProvider {
     method public int count();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getContent(int index);
@@ -425,9 +422,6 @@
     method public boolean hasItemsWithProperties();
   }
 
-  public final class MotionKt {
-  }
-
   public enum MotionLayoutDebugFlags {
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags[] values();
@@ -443,18 +437,6 @@
     enum_constant public static final androidx.constraintlayout.compose.MotionLayoutFlag FullMeasure;
   }
 
-  public final class MotionLayoutKt {
-  }
-
-  public final class MotionLayoutStateKt {
-  }
-
-  public final class MotionSceneKt {
-  }
-
-  public final class MotionSceneScopeKt {
-  }
-
   public final class State extends androidx.constraintlayout.core.state.State {
     ctor public State(androidx.compose.ui.unit.Density density);
     method public androidx.compose.ui.unit.Density getDensity();
@@ -472,12 +454,6 @@
     property public static final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.constraintlayout.compose.DesignInfoProvider> DesignInfoDataKey;
   }
 
-  public final class TransitionKt {
-  }
-
-  public final class TransitionScopeKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class VerticalAlign {
     field public static final androidx.constraintlayout.compose.VerticalAlign.Companion Companion;
   }
@@ -541,10 +517,3 @@
 
 }
 
-package androidx.constraintlayout.compose.carousel {
-
-  public final class CarouselSwipeableKt {
-  }
-
-}
-
diff --git a/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt b/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt
index 9a20684..03cccfe 100644
--- a/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt
+++ b/constraintlayout/constraintlayout-compose/api/public_plus_experimental_current.txt
@@ -590,9 +590,6 @@
     method public void itemsWithProperties(int count, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.compose.runtime.State<androidx.constraintlayout.compose.MotionLayoutScope.MotionProperties>,kotlin.Unit> itemContent);
   }
 
-  public final class MotionDragHandlerKt {
-  }
-
   public interface MotionItemsProvider {
     method public int count();
     method public kotlin.jvm.functions.Function0<kotlin.Unit> getContent(int index);
@@ -600,9 +597,6 @@
     method public boolean hasItemsWithProperties();
   }
 
-  public final class MotionKt {
-  }
-
   public enum MotionLayoutDebugFlags {
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags[] values();
@@ -991,10 +985,3 @@
 
 }
 
-package androidx.constraintlayout.compose.carousel {
-
-  public final class CarouselSwipeableKt {
-  }
-
-}
-
diff --git a/constraintlayout/constraintlayout-compose/api/restricted_current.txt b/constraintlayout/constraintlayout-compose/api/restricted_current.txt
index a52b8ea..4c48ef0 100644
--- a/constraintlayout/constraintlayout-compose/api/restricted_current.txt
+++ b/constraintlayout/constraintlayout-compose/api/restricted_current.txt
@@ -509,10 +509,6 @@
     method public void itemsWithProperties(int count, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.compose.runtime.State<androidx.constraintlayout.compose.MotionLayoutScope.MotionProperties>,kotlin.Unit> itemContent);
   }
 
-  public final class MotionDragHandlerKt {
-    method @kotlin.PublishedApi internal static inline androidx.compose.ui.Modifier motionPointerInput(androidx.compose.ui.Modifier, Object key, androidx.constraintlayout.compose.MotionProgress motionProgress, androidx.constraintlayout.compose.MotionMeasurer measurer);
-  }
-
   @kotlin.PublishedApi internal final class MotionDragState {
     ctor public MotionDragState(boolean isDragging, long dragAmount, long velocity);
     method public boolean component1();
@@ -542,9 +538,6 @@
     method public boolean hasItemsWithProperties();
   }
 
-  public final class MotionKt {
-  }
-
   public enum MotionLayoutDebugFlags {
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.constraintlayout.compose.MotionLayoutDebugFlags[] values();
@@ -584,9 +577,6 @@
     field @kotlin.PublishedApi internal final androidx.constraintlayout.compose.MotionProgress motionProgress;
   }
 
-  public final class MotionLayoutStateKt {
-  }
-
   @kotlin.PublishedApi internal final class MotionMeasurer extends androidx.constraintlayout.compose.Measurer {
     ctor public MotionMeasurer(androidx.compose.ui.unit.Density density);
     method public void clearConstraintSets();
@@ -612,12 +602,6 @@
     method public androidx.constraintlayout.compose.MotionProgress fromState(androidx.compose.runtime.State<java.lang.Float> progressState, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onUpdate);
   }
 
-  public final class MotionSceneKt {
-  }
-
-  public final class MotionSceneScopeKt {
-  }
-
   public final class State extends androidx.constraintlayout.core.state.State {
     ctor public State(androidx.compose.ui.unit.Density density);
     method public androidx.compose.ui.unit.Density getDensity();
@@ -656,12 +640,6 @@
   @kotlin.PublishedApi internal static final class TransitionImpl.Companion {
   }
 
-  public final class TransitionKt {
-  }
-
-  public final class TransitionScopeKt {
-  }
-
   @androidx.compose.runtime.Immutable public final class VerticalAlign {
     field public static final androidx.constraintlayout.compose.VerticalAlign.Companion Companion;
   }
@@ -725,10 +703,3 @@
 
 }
 
-package androidx.constraintlayout.compose.carousel {
-
-  public final class CarouselSwipeableKt {
-  }
-
-}
-
diff --git a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/build.gradle b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/build.gradle
index 00320cd..5824041 100644
--- a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/build.gradle
+++ b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/build.gradle
@@ -18,7 +18,7 @@
 
 plugins {
     id("AndroidXPlugin")
-    id("com.android.test")
+    id("com.android.library")
     id("kotlin-android")
 }
 
@@ -30,37 +30,26 @@
 
     // We need animations to work for MotionLayout
     testOptions.animationsDisabled  false
-
-    targetProjectPath = ":constraintlayout:constraintlayout-compose:integration-tests:macrobenchmark-target"
-    // Enable the benchmark to run separately from the app process
-    experimentalProperties["android.experimental.self-instrumenting"] = true
-
-    buildTypes {
-        // declare a build type to match the target app's build type
-        benchmark {
-            debuggable = true
-            signingConfig = debug.signingConfig
-            // Selects release buildType if the benchmark buildType not available in other modules.
-            matchingFallbacks = ['release']
-        }
-    }
-}
-
-androidComponents {
-    beforeVariants(selector().all()) {
-        // enable only the benchmark buildType, since we only want to measure close to release performance
-        enabled = buildType == 'benchmark'
-    }
 }
 
 dependencies {
-    implementation(project(":benchmark:benchmark-junit4"))
-    implementation(project(":benchmark:benchmark-macro-junit4"))
-    implementation(project(":internal-testutils-macrobenchmark"))
-    implementation(project(":internal-testutils-runtime"))
-    implementation(libs.testRules)
-    implementation(libs.testExtJunit)
-    implementation(libs.testCore)
-    implementation(libs.testRunner)
-    implementation(libs.testUiautomator)
+    androidTestImplementation(project(":benchmark:benchmark-junit4"))
+    androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
+    androidTestImplementation(project(":internal-testutils-macrobenchmark"))
+    androidTestImplementation(project(":internal-testutils-runtime"))
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testUiautomator)
+}
+
+// Define a task dependency so the app is installed before we run macro benchmarks.
+afterEvaluate {
+    tasks.getByPath(":constraintlayout:constraintlayout-compose:integration-tests:macrobenchmark:connectedDebugAndroidTest")
+            .dependsOn(
+                    tasks.getByPath(
+                            ":constraintlayout:constraintlayout-compose:integration-tests:macrobenchmark-target:installRelease"
+                    )
+            )
 }
\ No newline at end of file
diff --git a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/main/AndroidManifest.xml b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/main/AndroidManifest.xml
rename to constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/androidTest/AndroidManifest.xml
diff --git a/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/main/java/androidx/constraintlayout/compose/integration/macrobenchmark/MotionLayoutBenchmark.kt b/constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/constraintlayout/compose/integration/macrobenchmark/MotionLayoutBenchmark.kt
similarity index 100%
rename from constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/main/java/androidx/constraintlayout/compose/integration/macrobenchmark/MotionLayoutBenchmark.kt
rename to constraintlayout/constraintlayout-compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/constraintlayout/compose/integration/macrobenchmark/MotionLayoutBenchmark.kt
diff --git a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/FlowTest.kt b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/FlowTest.kt
index 6adfc6e..f226f10 100644
--- a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/FlowTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/FlowTest.kt
@@ -23,14 +23,19 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.round
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import kotlin.test.assertEquals
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -220,6 +225,182 @@
         expectedX += gapSize
         rule.onNodeWithTag("box3").assertPositionInRootIsEqualTo(expectedX, 194.9.dp)
     }
+
+    @Test
+    fun testChainModeRespectsMaxElements_horizontal() = with(rule.density) {
+        val baseBoxSizePx = 40
+        val itemCount = 6
+        val maxColumns = 3
+
+        // Make one item twice as big so that it pushes the next element into another row
+        val indexOfBigItem = 4
+
+        val horizontalPadding = 10
+
+        // Limit the width to fit the desired columns plus some padding
+        val flowWidth = baseBoxSizePx * maxColumns + horizontalPadding
+
+        val positions = mutableMapOf<Int, IntOffset>()
+
+        val constraintSet = ConstraintSet {
+            val itemRefs = List(itemCount) { createRefFor("item$it") }.toTypedArray()
+            val flow = createFlow(
+                elements = itemRefs,
+                flowVertically = false,
+                maxElement = maxColumns,
+                wrapMode = Wrap.Chain,
+                horizontalStyle = FlowStyle.SpreadInside
+            )
+
+            constrain(flow) {
+                width = flowWidth.toDp().asDimension
+
+                top.linkTo(parent.top)
+                start.linkTo(parent.start)
+            }
+            itemRefs.forEachIndexed { index, itemRef ->
+                constrain(itemRef) {
+                    val widthPx =
+                        if (index == indexOfBigItem) baseBoxSizePx.times(2) else baseBoxSizePx
+                    width = widthPx.toDp().asDimension
+                    height = baseBoxSizePx.toDp().asDimension
+                }
+            }
+        }
+
+        rule.setContent {
+            ConstraintLayout(constraintSet) {
+                for (i in 0 until itemCount) {
+                    Box(
+                        Modifier
+                            .layoutId("item$i")
+                            .background(Color.Red)
+                            .onGloballyPositioned {
+                                positions[i] = it
+                                    .positionInParent()
+                                    .round()
+                            }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(6, positions.size)
+
+            // Row 0
+            var expectedX = 0
+            var expectedY = baseBoxSizePx * 0
+            assertEquals(IntOffset(expectedX, expectedY), positions[0])
+
+            expectedX += baseBoxSizePx + horizontalPadding / 2 // padding split in 2 spaces
+            assertEquals(IntOffset(expectedX, expectedY), positions[1])
+
+            expectedX += baseBoxSizePx + horizontalPadding / 2 // padding split in 2 spaces
+            assertEquals(IntOffset(expectedX, expectedY), positions[2])
+
+            // Row 1
+            expectedX = 0
+            expectedY = baseBoxSizePx * 1
+            assertEquals(IntOffset(expectedX, expectedY), positions[3])
+
+            expectedX = baseBoxSizePx + horizontalPadding
+            assertEquals(IntOffset(expectedX, expectedY), positions[4])
+
+            // Row 2
+            expectedX = 0
+            expectedY = baseBoxSizePx * 2
+            assertEquals(IntOffset(expectedX, expectedY), positions[5])
+        }
+    }
+
+    @Test
+    fun testChainModeRespectsMaxElements_vertical() = with(rule.density) {
+        val baseBoxSizePx = 40
+        val itemCount = 6
+        val maxRows = 3
+
+        // Make one item twice as big so that it pushes the next element into another column
+        val indexOfBigItem = 4
+
+        val verticalPadding = 10
+
+        // Limit the height to fit the desired rows plus some padding
+        val flowHeight = baseBoxSizePx * maxRows + verticalPadding
+
+        val positions = mutableMapOf<Int, IntOffset>()
+
+        val constraintSet = ConstraintSet {
+            val itemRefs = List(itemCount) { createRefFor("item$it") }.toTypedArray()
+            val flow = createFlow(
+                elements = itemRefs,
+                flowVertically = true,
+                maxElement = maxRows,
+                wrapMode = Wrap.Chain,
+                verticalStyle = FlowStyle.SpreadInside
+            )
+
+            constrain(flow) {
+                height = flowHeight.toDp().asDimension
+
+                top.linkTo(parent.top)
+                start.linkTo(parent.start)
+            }
+            itemRefs.forEachIndexed { index, itemRef ->
+                constrain(itemRef) {
+                    val widthPx =
+                        if (index == indexOfBigItem) baseBoxSizePx.times(2) else baseBoxSizePx
+                    height = widthPx.toDp().asDimension
+                    width = baseBoxSizePx.toDp().asDimension
+                }
+            }
+        }
+
+        rule.setContent {
+            ConstraintLayout(constraintSet) {
+                for (i in 0 until itemCount) {
+                    Box(
+                        Modifier
+                            .layoutId("item$i")
+                            .background(Color.Red)
+                            .onGloballyPositioned {
+                                positions[i] = it
+                                    .positionInParent()
+                                    .round()
+                            }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(6, positions.size)
+
+            // Column 0
+            var expectedX = baseBoxSizePx * 0
+            var expectedY = 0
+            assertEquals(IntOffset(expectedX, expectedY), positions[0])
+
+            expectedY += baseBoxSizePx + verticalPadding / 2 // padding split in 2 spaces
+            assertEquals(IntOffset(expectedX, expectedY), positions[1])
+
+            expectedY += baseBoxSizePx + verticalPadding / 2 // padding split in 2 spaces
+            assertEquals(IntOffset(expectedX, expectedY), positions[2])
+
+            // Column 1
+            expectedX = baseBoxSizePx * 1
+            expectedY = 0
+            assertEquals(IntOffset(expectedX, expectedY), positions[3])
+
+            expectedY = baseBoxSizePx + verticalPadding
+            assertEquals(IntOffset(expectedX, expectedY), positions[4])
+
+            // Column 2
+            expectedX = baseBoxSizePx * 2
+            expectedY = 0
+            assertEquals(IntOffset(expectedX, expectedY), positions[5])
+        }
+    }
 }
 
 @Composable
diff --git a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/MotionLayoutTest.kt b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/MotionLayoutTest.kt
index 1709620..237ce90 100644
--- a/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/MotionLayoutTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidAndroidTest/kotlin/androidx/constraintlayout/compose/MotionLayoutTest.kt
@@ -43,6 +43,8 @@
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.layout.boundsInParent
+import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.platform.LocalContext
@@ -56,9 +58,11 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
+import androidx.compose.ui.unit.roundToIntRect
 import androidx.compose.ui.unit.size
 import androidx.compose.ui.unit.sp
 import androidx.constraintlayout.compose.test.R
@@ -267,7 +271,9 @@
                             .background(Color.Green)
                             .layoutId("one")
                             .onGloballyPositioned {
-                                box1Position = it.positionInRoot().round()
+                                box1Position = it
+                                    .positionInRoot()
+                                    .round()
                             })
                     Box(
                         Modifier
@@ -275,7 +281,9 @@
                             .background(Color.Red)
                             .layoutId("two")
                             .onGloballyPositioned {
-                                box2Position = it.positionInRoot().round()
+                                box2Position = it
+                                    .positionInRoot()
+                                    .round()
                             })
                 }
             }
@@ -291,6 +299,102 @@
         }
     }
 
+    @Test
+    fun testTransitionChange_hasCorrectStartAndEnd() = with(rule.density) {
+        val rootWidthPx = 200
+        val rootHeightPx = 50
+
+        val scene = MotionScene {
+            val circleRef = createRefFor("circle")
+            val aCSetRef = constraintSet {
+                constrain(circleRef) {
+                    width = rootHeightPx.toDp().asDimension
+                    height = rootHeightPx.toDp().asDimension
+                    centerVerticallyTo(parent)
+                    start.linkTo(parent.start)
+                }
+            }
+            val bCSetRef = constraintSet {
+                constrain(circleRef) {
+                    width = Dimension.fillToConstraints
+                    height = rootHeightPx.toDp().asDimension
+                    centerTo(parent)
+                }
+            }
+            val cCSetRef = constraintSet(extendConstraintSet = aCSetRef) {
+                constrain(circleRef) {
+                    clearHorizontal()
+                    end.linkTo(parent.end)
+                }
+            }
+            transition(
+                from = aCSetRef,
+                to = bCSetRef,
+                name = "part1"
+            ) {}
+            transition(
+                from = bCSetRef,
+                to = cCSetRef,
+                name = "part2"
+            ) {}
+        }
+
+        val progress = mutableStateOf(0f)
+        var bounds = IntRect.Zero
+
+        rule.setContent {
+            MotionLayout(
+                motionScene = scene,
+                progress = if (progress.value < 0.5) progress.value * 2 else progress.value * 2 - 1,
+                transitionName = if (progress.value < 0.5f) "part1" else "part2",
+                modifier = Modifier.size(width = rootWidthPx.toDp(), height = rootHeightPx.toDp())
+            ) {
+                Box(
+                    modifier = Modifier
+                        .layoutId("circle")
+                        .background(Color.Red)
+                        .onGloballyPositioned {
+                            bounds = it
+                                .boundsInParent()
+                                .roundToIntRect()
+                        }
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertEquals(
+                expected = IntRect(IntOffset(0, 0), IntSize(rootHeightPx, rootHeightPx)),
+                actual = bounds
+            )
+        }
+
+        // Offset attributed to the default non-linear interpolator
+        val offset = 25
+
+        progress.value = 0.25f
+        rule.runOnIdle {
+            assertEquals(
+                expected = IntRect(
+                    offset = IntOffset(0, 0),
+                    size = IntSize(rootWidthPx / 2 + offset, rootHeightPx)
+                ),
+                actual = bounds
+            )
+        }
+
+        progress.value = 0.75f
+        rule.runOnIdle {
+            assertEquals(
+                expected = IntRect(
+                    offset = IntOffset(rootWidthPx / 2 - offset, 0),
+                    size = IntSize(rootWidthPx / 2 + offset, rootHeightPx)
+                ),
+                actual = bounds
+            )
+        }
+    }
+
     private fun Color.toHexString(): String = toArgb().toUInt().toString(16)
 }
 
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
index cd5d8c491..30c52cf 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstrainScope.kt
@@ -114,12 +114,10 @@
     @FloatRange(from = 0.0, to = 1.0)
     var alpha: Float = 1.0f
         set(value) {
-            // Not using delegate to support FloatRange annotation
-            if (value != field) {
-                field = value
-                if (!value.isNaN()) {
-                    containerObject.putNumber("alpha", value)
-                }
+            // FloatRange annotation doesn't work with delegate objects
+            field = value
+            if (!value.isNaN()) {
+                containerObject.putNumber("alpha", value)
             }
         }
 
@@ -207,12 +205,10 @@
     @FloatRange(from = 0.0, to = 1.0)
     var horizontalBias: Float = 0.5f
         set(value) {
-            // Not using delegate to support FloatRange annotation
-            if (value != field) {
-                field = value
-                if (!value.isNaN()) {
-                    containerObject.putNumber("hBias", value)
-                }
+            // FloatRange annotation doesn't work with delegate objects
+            field = value
+            if (!value.isNaN()) {
+                containerObject.putNumber("hBias", value)
             }
         }
 
@@ -224,12 +220,10 @@
     @FloatRange(from = 0.0, to = 1.0)
     var verticalBias: Float = 0.5f
         set(value) {
-            // Not using delegate to support FloatRange annotation
-            if (value != field) {
-                field = value
-                if (!value.isNaN()) {
-                    containerObject.putNumber("vBias", value)
-                }
+            // FloatRange annotation doesn't work with delegate objects
+            field = value
+            if (!value.isNaN()) {
+                containerObject.putNumber("vBias", value)
             }
         }
 
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
index 06e001d..72139b8 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
@@ -1519,7 +1519,7 @@
                 Pair(result.width, result.height)
             }
             else -> {
-                Log.e("CCL", "Can't measure widget: $widgetId")
+                Log.w("CCL", "Nothing to measure for widget: $widgetId")
                 Pair(0, 0)
             }
         }
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionLayout.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionLayout.kt
index c228b64..fefd467 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionLayout.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionLayout.kt
@@ -316,7 +316,7 @@
         motionScene.getTransitionInstance(transitionName)
     }
 
-    val start = remember(motionScene) {
+    val start = remember(motionScene, transition) {
         val startId = transition?.getStartConstraintSetId() ?: "start"
         motionScene.getConstraintSetInstance(startId)
     }
@@ -379,13 +379,12 @@
         motionScene.getTransitionInstance(transitionName)
     }
 
-    val startId = transition?.getStartConstraintSetId() ?: "start"
-    val endId = transition?.getEndConstraintSetId() ?: "end"
-
-    val start = remember(motionScene) {
+    val start = remember(motionScene, transition) {
+        val startId = transition?.getStartConstraintSetId() ?: "start"
         motionScene.getConstraintSetInstance(startId)
     }
-    val end = remember(motionScene) {
+    val end = remember(motionScene, transition) {
+        val endId = transition?.getEndConstraintSetId() ?: "end"
         motionScene.getConstraintSetInstance(endId)
     }
 
diff --git a/constraintlayout/constraintlayout-compose/src/androidTest/kotlin/androidx/constraintlayout/compose/ConstraintSetStabilityTest.kt b/constraintlayout/constraintlayout-compose/src/androidTest/kotlin/androidx/constraintlayout/compose/ConstraintSetStabilityTest.kt
index 4db7089..f843699 100644
--- a/constraintlayout/constraintlayout-compose/src/androidTest/kotlin/androidx/constraintlayout/compose/ConstraintSetStabilityTest.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidTest/kotlin/androidx/constraintlayout/compose/ConstraintSetStabilityTest.kt
@@ -128,6 +128,10 @@
                 width = Dimension.fillToConstraints
                 height = Dimension.value(20.dp)
                 centerVerticallyTo(parent)
+
+                alpha = 0f
+                horizontalBias = 0f
+                verticalBias = 0f
             }
             constrain(box1) {
                 width = Dimension.fillToConstraints
@@ -155,6 +159,14 @@
 
             // Chain params set chain declarations should have no effect
             box0.withChainParams(1.dp, 2.dp, 3.dp, 4.dp)
+
+            constrain(box0) {
+                // Set values back to default, the set should not be ignored, otherwise they would
+                // stay at 0f
+                alpha = 1f
+                horizontalBias = 0.5f
+                verticalBias = 0.5f
+            }
         }
 
         // ConstraintSetB should internally reflect the inherited constraints, and so, should be
@@ -170,6 +182,12 @@
                     width = Dimension.fillToConstraints
                     height = Dimension.value(20.dp)
                     centerVerticallyTo(parent)
+
+                    // We also need to re-set the values here, its absence in the underlying
+                    // structure will cause a failure, we are checking for equality, not equivalency
+                    alpha = 1f
+                    horizontalBias = 0.5f
+                    verticalBias = 0.5f
                 }
                 constrain(box1) {
                     width = Dimension.fillToConstraints
diff --git a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/State.java b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/State.java
index 3ea521d..30ad1b8 100644
--- a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/State.java
+++ b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/state/State.java
@@ -158,7 +158,7 @@
             wrapMap.put("aligned", ALIGNED);
 
             valueMap.put("none", 0);
-            valueMap.put("chain", 1);
+            valueMap.put("chain", 3); // Corresponds to CHAIN_NEW
             valueMap.put("aligned", 2);
         }
 
diff --git a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/widgets/Flow.java b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/widgets/Flow.java
index 794ac0c..6d129db 100644
--- a/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/widgets/Flow.java
+++ b/constraintlayout/constraintlayout-core/src/main/java/androidx/constraintlayout/core/widgets/Flow.java
@@ -1015,12 +1015,12 @@
                     doWrap = true;
                 }
                 if (doWrap) {
+                    col = 1;
                     width = w;
                     list = new WidgetsList(orientation, mLeft, mTop, mRight, mBottom, max);
                     list.setStartIndex(i);
                     mChainList.add(list);
                 } else {
-                    col = 0;
                     if (i > 0) {
                         width += mHorizontalGap + w;
                     } else {
@@ -1033,6 +1033,7 @@
             int height = 0;
             int row = 0;
             for (int i = 0; i < count; i++) {
+                row++;
                 ConstraintWidget widget = widgets[i];
                 int h = getWidgetHeight(widget, max);
                 if (widget.getVerticalDimensionBehaviour() == DimensionBehaviour.MATCH_CONSTRAINT) {
@@ -1044,12 +1045,12 @@
                     doWrap = true;
                 }
                 if (doWrap) {
+                    row = 1;
                     height = h;
                     list = new WidgetsList(orientation, mLeft, mTop, mRight, mBottom, max);
                     list.setStartIndex(i);
                     mChainList.add(list);
                 } else {
-                    row = 0;
                     if (i > 0) {
                         height += mVerticalGap + h;
                     } else {
diff --git a/contentpager/OWNERS b/contentpager/OWNERS
deleted file mode 100644
index 779e918..0000000
--- a/contentpager/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-smckay@google.com
\ No newline at end of file
diff --git a/core/core-animation-integration-tests/OWNERS b/core/core-animation-integration-tests/OWNERS
index 9995116..ef35137 100644
--- a/core/core-animation-integration-tests/OWNERS
+++ b/core/core-animation-integration-tests/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 tianliu@google.com
 yaraki@google.com
diff --git a/core/core-animation-testing/OWNERS b/core/core-animation-testing/OWNERS
index 9995116..ef35137 100644
--- a/core/core-animation-testing/OWNERS
+++ b/core/core-animation-testing/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 tianliu@google.com
 yaraki@google.com
diff --git a/core/core-animation/OWNERS b/core/core-animation/OWNERS
index 9995116..ef35137 100644
--- a/core/core-animation/OWNERS
+++ b/core/core-animation/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 tianliu@google.com
 yaraki@google.com
diff --git a/core/core-appdigest/OWNERS b/core/core-appdigest/OWNERS
index dcaa7ff..2386a4e 100644
--- a/core/core-appdigest/OWNERS
+++ b/core/core-appdigest/OWNERS
@@ -1,5 +1,5 @@
+# Bug component: 461355
 alexbuy@google.com
 leegao@google.com
 patb@google.com
-toddke@google.com
 schfan@google.com
diff --git a/core/core-google-shortcuts/OWNERS b/core/core-google-shortcuts/OWNERS
index 35550c2..857d2c44 100644
--- a/core/core-google-shortcuts/OWNERS
+++ b/core/core-google-shortcuts/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461355
 ddong@google.com
 saurabhkb@google.com
 quazi@google.com
\ No newline at end of file
diff --git a/core/core-i18n/OWNERS b/core/core-i18n/OWNERS
index 542c925..508bb53 100644
--- a/core/core-i18n/OWNERS
+++ b/core/core-i18n/OWNERS
@@ -1 +1,2 @@
+# Bug component: 1223796
 mnita@google.com
diff --git a/core/core-location-altitude/OWNERS b/core/core-location-altitude/OWNERS
index b95c469..b2b8f3b 100644
--- a/core/core-location-altitude/OWNERS
+++ b/core/core-location-altitude/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 bjj@google.com
 sooniln@google.com
diff --git a/core/core-performance/OWNERS b/core/core-performance/OWNERS
index faeff8b..da22b63 100644
--- a/core/core-performance/OWNERS
+++ b/core/core-performance/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 essick@google.com
 nchalko@google.com
diff --git a/core/core-remoteviews/OWNERS b/core/core-remoteviews/OWNERS
index b22348c..a6d7a55 100644
--- a/core/core-remoteviews/OWNERS
+++ b/core/core-remoteviews/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 wvk@google.com
 zakcohen@google.com
diff --git a/core/core-role/OWNERS b/core/core-role/OWNERS
index 45d426b..7128279 100644
--- a/core/core-role/OWNERS
+++ b/core/core-role/OWNERS
@@ -1,3 +1,2 @@
-svetoslavganov@google.com
-moltmann@google.com
+# Bug component: 461355
 zhanghai@google.com
diff --git a/core/core-splashscreen/OWNERS b/core/core-splashscreen/OWNERS
index 831d512..43b4e88 100644
--- a/core/core-splashscreen/OWNERS
+++ b/core/core-splashscreen/OWNERS
@@ -1,8 +1,6 @@
+# Bug component: 1163699
 caen@google.com
 jjaggi@google.com
 cinek@google.com
 yaraki@google.com
-chrisbanes@google.com
 wilsonshih@google.com
-
-
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 3f5d92d..5033a53 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -467,6 +467,7 @@
     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 @RequiresApi(23) public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon?);
     method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
     method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.drawable.Icon?);
     method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 9df9106..2b431b6 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -467,6 +467,7 @@
     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 @RequiresApi(23) public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon?);
     method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
     method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.drawable.Icon?);
     method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 51353767..9556806 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -518,6 +518,7 @@
     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 @RequiresApi(23) public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon?);
     method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
     method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.drawable.Icon?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? getPictureIcon(android.os.Bundle?);
diff --git a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
index 4665258..520a252 100644
--- a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
@@ -1411,7 +1411,7 @@
                 .setSmallIcon(1)
                 .setStyle(new NotificationCompat.BigPictureStyle()
                         .bigPicture(bitmap)
-                        .bigLargeIcon(null)
+                        .bigLargeIcon((Bitmap) null)
                         .setBigContentTitle("Big Content Title")
                         .setSummaryText("Summary Text"))
                 .build();
@@ -1424,6 +1424,52 @@
         }
     }
 
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    public void testBigPictureStyle_withIconNullBigLargeIcon() {
+        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),
+                R.drawable.notification_bg_low_pressed);
+        Notification n = new NotificationCompat.Builder(mContext, "channelId")
+                .setSmallIcon(1)
+                .setStyle(new NotificationCompat.BigPictureStyle()
+                        .bigPicture(bitmap)
+                        .bigLargeIcon((Icon) null)
+                        .setBigContentTitle("Big Content Title")
+                        .setSummaryText("Summary Text"))
+                .build();
+        Bundle extras = NotificationCompat.getExtras(n);
+        assertNotNull(extras);
+        assertTrue(extras.containsKey(NotificationCompat.EXTRA_LARGE_ICON_BIG));
+        assertNull(extras.get(NotificationCompat.EXTRA_LARGE_ICON_BIG));
+    }
+
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    public void testBigPictureStyle_withIconBigLargeIcon() {
+        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),
+                R.drawable.notification_bg_low_pressed);
+        IconCompat iconCompat = IconCompat.createWithResource(mContext, R.drawable.ic_call_decline);
+        Icon icon = iconCompat.toIcon(mContext);
+
+        Notification n = new NotificationCompat.Builder(mContext, "channelId")
+                .setSmallIcon(1)
+                .setStyle(new NotificationCompat.BigPictureStyle()
+                        .bigPicture(bitmap)
+                        .bigLargeIcon(icon)
+                        .setBigContentTitle("Big Content Title")
+                        .setSummaryText("Summary Text"))
+                .build();
+        Bundle extras = NotificationCompat.getExtras(n);
+        assertNotNull(extras);
+        assertTrue(extras.containsKey(NotificationCompat.EXTRA_LARGE_ICON_BIG));
+        assertNotNull(extras.get(NotificationCompat.EXTRA_LARGE_ICON_BIG));
+
+        Icon recoveredIcon = extras.getParcelable(NotificationCompat.EXTRA_LARGE_ICON_BIG);
+        if (Build.VERSION.SDK_INT >= 28) {
+            assertEquals(icon.getResId(), recoveredIcon.getResId());
+        }
+    }
+
     @SdkSuppress(minSdkVersion = 31)
     @Test
     public void testBigPictureStyle_encodesAndRecoversSetContentDescription() {
@@ -2546,9 +2592,9 @@
 
         NotificationCompat.Builder originalBuilder =
                 new NotificationCompat.Builder(mContext, "test id")
-                .setSmallIcon(1)
-                .setContentTitle("test title")
-                .setStyle(callStyle);
+                        .setSmallIcon(1)
+                        .setContentTitle("test title")
+                        .setStyle(callStyle);
 
         Notification notification = originalBuilder.build();
 
diff --git a/core/core/src/androidTest/java/androidx/core/content/FileProviderTest.java b/core/core/src/androidTest/java/androidx/core/content/FileProviderTest.java
index 9de302e..36ef9c7 100644
--- a/core/core/src/androidTest/java/androidx/core/content/FileProviderTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/FileProviderTest.java
@@ -45,6 +45,7 @@
 import org.junit.runner.RunWith;
 
 import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -485,7 +486,7 @@
     /**
      * Closes 'closeable', ignoring any checked exceptions. Does nothing if 'closeable' is null.
      */
-    private static void closeQuietly(AutoCloseable closeable) {
+    private static void closeQuietly(Closeable closeable) {
         if (closeable != null) {
             try {
                 closeable.close();
diff --git a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
index 94855d5..f9226fe 100644
--- a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
@@ -383,7 +383,6 @@
     @FlakyTest
     @SdkSuppress(minSdkVersion = 26)
     public void testBuilder_fromShortcutInfo() throws Exception {
-        final long ts = System.currentTimeMillis();
         String longLabel = "Test long label";
         ComponentName activity = new ComponentName("Package name", "Class name");
         String disabledMessage = "Test disabled message";
@@ -414,7 +413,6 @@
         assertEquals(rank, compat.getRank());
         assertEquals(persistableBundle, compat.getExtras());
         assertEquals(ShortcutInfo.DISABLED_REASON_NOT_DISABLED, compat.getDisabledReason());
-        assertTrue(compat.getLastChangedTimestamp() > ts);
         assertNotNull(compat.getUserHandle());
         assertNotNull(compat.getPackage());
         assertFalse(compat.isCached());
diff --git a/core/core/src/androidTest/java/androidx/core/location/OWNERS b/core/core/src/androidTest/java/androidx/core/location/OWNERS
index a420c39..e97396c 100644
--- a/core/core/src/androidTest/java/androidx/core/location/OWNERS
+++ b/core/core/src/androidTest/java/androidx/core/location/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461355
 wyattriley@google.com
 sooniln@google.com
 weiwa@google.com
diff --git a/core/core/src/androidTest/java/androidx/core/view/OWNERS b/core/core/src/androidTest/java/androidx/core/view/OWNERS
index 86f22a5..da18aa6 100644
--- a/core/core/src/androidTest/java/androidx/core/view/OWNERS
+++ b/core/core/src/androidTest/java/androidx/core/view/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461355
 per-file AccessibilityDelegateCompatTest.java = file:accessibility/OWNERS
\ No newline at end of file
diff --git a/core/core/src/main/java/androidx/core/accessibilityservice/OWNERS b/core/core/src/main/java/androidx/core/accessibilityservice/OWNERS
index d29d58d..7aacfcbd 100644
--- a/core/core/src/main/java/androidx/core/accessibilityservice/OWNERS
+++ b/core/core/src/main/java/androidx/core/accessibilityservice/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461355
 include ../view/accessibility/OWNERS
\ No newline at end of file
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompat.java b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
index 4d30246..679e8e0 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -2497,7 +2497,7 @@
          * this method to explicitly request deferred display.</p>
          *
          * This method has no effect when running on versions prior to
-          * {@link android.os.Build.VERSION_CODES#S}.
+         * {@link android.os.Build.VERSION_CODES#S}.
          */
         @SuppressWarnings("MissingGetterMatchingBuilder") // no underlying getter in platform API
         @NonNull
@@ -3363,6 +3363,16 @@
         }
 
         /**
+         * Override the large icon when the big notification is shown.
+         */
+        @RequiresApi(23)
+        public @NonNull BigPictureStyle bigLargeIcon(@Nullable Icon i) {
+            mBigLargeIcon = i == null ? null : IconCompat.createFromIcon(i);
+            mBigLargeIconSet = true;
+            return this;
+        }
+
+        /**
          * @hide
          */
         @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -4954,7 +4964,7 @@
                     && extras.containsKey(EXTRA_CALL_PERSON)) {
                 mPerson = Person.fromAndroidPerson(
                         (android.app.Person)
-                        extras.getParcelable(EXTRA_CALL_PERSON));
+                                extras.getParcelable(EXTRA_CALL_PERSON));
             } else if (extras.containsKey(EXTRA_CALL_PERSON_COMPAT)) {
                 mPerson = Person.fromBundle(extras.getBundle(EXTRA_CALL_PERSON_COMPAT));
             }
@@ -5286,7 +5296,7 @@
                 }
                 actionBuilder =
                         Api20Impl.createActionBuilder(iconResId, actionCompat.getTitle(),
-                        actionCompat.getActionIntent());
+                                actionCompat.getActionIntent());
             }
             Bundle actionExtras;
             if (actionCompat.getExtras() != null) {
diff --git a/core/core/src/main/java/androidx/core/location/OWNERS b/core/core/src/main/java/androidx/core/location/OWNERS
index d3f0710..2b8f599 100644
--- a/core/core/src/main/java/androidx/core/location/OWNERS
+++ b/core/core/src/main/java/androidx/core/location/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461355
 wyattriley@google.com
 sooniln@google.com
diff --git a/core/core/src/main/java/androidx/core/view/OWNERS b/core/core/src/main/java/androidx/core/view/OWNERS
index abaadb7..1e4e68f 100644
--- a/core/core/src/main/java/androidx/core/view/OWNERS
+++ b/core/core/src/main/java/androidx/core/view/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461355
 per-file AccessibilityDelegateCompat.java = file:accessibility/OWNERS
\ No newline at end of file
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index d7fa104..3f54712a 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -2762,12 +2762,11 @@
      * </p>
      *
      * @see AccessibilityEventCompat#getContentChangeTypes for all content change types.
-     * @param minMillisBetweenContentChanges the minimum duration between content change events.
+     * @param duration the minimum duration between content change events.
      */
-    public void setMinMillisBetweenContentChanges(int minMillisBetweenContentChanges) {
+    public void setMinMillisBetweenContentChanges(int duration) {
         if (Build.VERSION.SDK_INT >= 19) {
-            Api19Impl.getExtras(mInfo).putInt(MIN_MILLIS_BETWEEN_CONTENT_CHANGES_KEY,
-                    minMillisBetweenContentChanges);
+            Api19Impl.getExtras(mInfo).putInt(MIN_MILLIS_BETWEEN_CONTENT_CHANGES_KEY, duration);
         }
     }
 
diff --git a/core/uwb/uwb/api/current.txt b/core/uwb/uwb/api/current.txt
index 34d2568..cd5803b 100644
--- a/core/uwb/uwb/api/current.txt
+++ b/core/uwb/uwb/api/current.txt
@@ -157,10 +157,3 @@
 
 }
 
-package androidx.core.uwb.helper {
-
-  public final class UwbHelperKt {
-  }
-
-}
-
diff --git a/core/uwb/uwb/api/public_plus_experimental_current.txt b/core/uwb/uwb/api/public_plus_experimental_current.txt
index 34d2568..cd5803b 100644
--- a/core/uwb/uwb/api/public_plus_experimental_current.txt
+++ b/core/uwb/uwb/api/public_plus_experimental_current.txt
@@ -157,10 +157,3 @@
 
 }
 
-package androidx.core.uwb.helper {
-
-  public final class UwbHelperKt {
-  }
-
-}
-
diff --git a/core/uwb/uwb/api/restricted_current.txt b/core/uwb/uwb/api/restricted_current.txt
index 34d2568..cd5803b 100644
--- a/core/uwb/uwb/api/restricted_current.txt
+++ b/core/uwb/uwb/api/restricted_current.txt
@@ -157,10 +157,3 @@
 
 }
 
-package androidx.core.uwb.helper {
-
-  public final class UwbHelperKt {
-  }
-
-}
-
diff --git a/credentials/OWNERS b/credentials/OWNERS
index e8f393e..f306188 100644
--- a/credentials/OWNERS
+++ b/credentials/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1282802
 reemabajwa@google.com
 helenqin@google.com
 sgjerry@google.com
diff --git a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/HiddenActivity.kt b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/HiddenActivity.kt
index 55b335f..1df0251 100644
--- a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/HiddenActivity.kt
+++ b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/HiddenActivity.kt
@@ -27,6 +27,7 @@
 import androidx.credentials.exceptions.CreateCredentialUnknownException
 import androidx.credentials.exceptions.GetCredentialInterruptedException
 import androidx.credentials.exceptions.GetCredentialUnknownException
+import androidx.credentials.exceptions.NoCredentialException
 import androidx.credentials.playservices.controllers.CredentialProviderBaseController
 import com.google.android.gms.auth.api.identity.BeginSignInRequest
 import com.google.android.gms.auth.api.identity.Identity
@@ -149,7 +150,7 @@
                                 "failure: ${e.message}")
                 }
             }.addOnFailureListener { e: Exception ->
-                var errName: String = GetCredentialUnknownException::class.java.name
+                var errName: String = NoCredentialException::class.java.name
                 if (e is ApiException && e.statusCode in
                     CredentialProviderBaseController.retryables) {
                     errName = GetCredentialInterruptedException::class.java.name
diff --git a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CreatePublicKeyCredential/PublicKeyCredentialControllerUtility.kt b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CreatePublicKeyCredential/PublicKeyCredentialControllerUtility.kt
index b06e360e..dfcb546 100644
--- a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CreatePublicKeyCredential/PublicKeyCredentialControllerUtility.kt
+++ b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CreatePublicKeyCredential/PublicKeyCredentialControllerUtility.kt
@@ -115,7 +115,9 @@
                 responseJson.put(
                     "attestationObject",
                     b64Encode(authenticatorResponse.attestationObject))
-                val transports = JSONArray(listOf(authenticatorResponse.transports))
+                val transportArray = convertToProperNamingScheme(authenticatorResponse)
+                val transports = JSONArray(transportArray)
+
                 responseJson.put("transports", transports)
                 json.put("response", responseJson)
             } else {
@@ -131,6 +133,20 @@
             return json.toString()
         }
 
+        private fun convertToProperNamingScheme(
+            authenticatorResponse: AuthenticatorAttestationResponse
+        ): Array<out String> {
+            val transportArray = authenticatorResponse.transports
+            var ix = 0
+            for (transport in transportArray) {
+                if (transport == "cable") {
+                    transportArray[ix] = "hybrid"
+                }
+                ix += 1
+            }
+            return transportArray
+        }
+
         private fun addOptionalAuthenticatorAttachmentAndExtensions(
             cred: PublicKeyCredential,
             json: JSONObject
diff --git a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CredentialProviderBaseController.kt b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CredentialProviderBaseController.kt
index c08ab86..c6d6fcb 100644
--- a/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CredentialProviderBaseController.kt
+++ b/credentials/credentials-play-services-auth/src/main/java/androidx/credentials/playservices/controllers/CredentialProviderBaseController.kt
@@ -25,6 +25,7 @@
 import androidx.credentials.exceptions.GetCredentialException
 import androidx.credentials.exceptions.GetCredentialInterruptedException
 import androidx.credentials.exceptions.GetCredentialUnknownException
+import androidx.credentials.exceptions.NoCredentialException
 import com.google.android.gms.common.api.CommonStatusCodes
 
 /**
@@ -85,9 +86,12 @@
         internal fun getCredentialExceptionTypeToException(typeName: String?, msg: String?):
             GetCredentialException {
             return when (typeName) {
-                GetCredentialUnknownException::class.java.name -> {
+                GetCredentialInterruptedException::class.java.name -> {
                     GetCredentialInterruptedException(msg)
                 }
+                NoCredentialException::class.java.name -> {
+                    NoCredentialException(msg)
+                }
                 else -> {
                     GetCredentialUnknownException(msg)
                 }
@@ -97,7 +101,7 @@
         internal fun createCredentialExceptionTypeToException(typeName: String?, msg: String?):
             CreateCredentialException {
             return when (typeName) {
-                GetCredentialInterruptedException::class.java.name -> {
+                CreateCredentialInterruptedException::class.java.name -> {
                     CreateCredentialInterruptedException(msg)
                 }
                 else -> {
diff --git a/credentials/credentials/api/current.txt b/credentials/credentials/api/current.txt
index 9bba4ab..423cdee 100644
--- a/credentials/credentials/api/current.txt
+++ b/credentials/credentials/api/current.txt
@@ -236,7 +236,7 @@
     ctor public ClearCredentialUnknownException();
   }
 
-  public class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
+  public final class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
     ctor public ClearCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public ClearCustomCredentialException(String type);
     method public String getType();
@@ -266,7 +266,7 @@
     ctor public CreateCredentialUnknownException();
   }
 
-  public class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
+  public final class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
     ctor public CreateCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public CreateCustomCredentialException(String type);
     method public String getType();
@@ -296,13 +296,18 @@
     ctor public GetCredentialUnknownException();
   }
 
-  public class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+  public final class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
     ctor public GetCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public GetCustomCredentialException(String type);
     method public String getType();
     property public String type;
   }
 
+  public final class NoCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+    ctor public NoCredentialException(optional CharSequence? errorMessage);
+    ctor public NoCredentialException();
+  }
+
 }
 
 package androidx.credentials.exceptions.domerrors {
diff --git a/credentials/credentials/api/public_plus_experimental_current.txt b/credentials/credentials/api/public_plus_experimental_current.txt
index 9bba4ab..423cdee 100644
--- a/credentials/credentials/api/public_plus_experimental_current.txt
+++ b/credentials/credentials/api/public_plus_experimental_current.txt
@@ -236,7 +236,7 @@
     ctor public ClearCredentialUnknownException();
   }
 
-  public class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
+  public final class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
     ctor public ClearCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public ClearCustomCredentialException(String type);
     method public String getType();
@@ -266,7 +266,7 @@
     ctor public CreateCredentialUnknownException();
   }
 
-  public class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
+  public final class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
     ctor public CreateCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public CreateCustomCredentialException(String type);
     method public String getType();
@@ -296,13 +296,18 @@
     ctor public GetCredentialUnknownException();
   }
 
-  public class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+  public final class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
     ctor public GetCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public GetCustomCredentialException(String type);
     method public String getType();
     property public String type;
   }
 
+  public final class NoCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+    ctor public NoCredentialException(optional CharSequence? errorMessage);
+    ctor public NoCredentialException();
+  }
+
 }
 
 package androidx.credentials.exceptions.domerrors {
diff --git a/credentials/credentials/api/restricted_current.txt b/credentials/credentials/api/restricted_current.txt
index 9bba4ab..423cdee 100644
--- a/credentials/credentials/api/restricted_current.txt
+++ b/credentials/credentials/api/restricted_current.txt
@@ -236,7 +236,7 @@
     ctor public ClearCredentialUnknownException();
   }
 
-  public class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
+  public final class ClearCustomCredentialException extends androidx.credentials.exceptions.ClearCredentialException {
     ctor public ClearCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public ClearCustomCredentialException(String type);
     method public String getType();
@@ -266,7 +266,7 @@
     ctor public CreateCredentialUnknownException();
   }
 
-  public class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
+  public final class CreateCustomCredentialException extends androidx.credentials.exceptions.CreateCredentialException {
     ctor public CreateCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public CreateCustomCredentialException(String type);
     method public String getType();
@@ -296,13 +296,18 @@
     ctor public GetCredentialUnknownException();
   }
 
-  public class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+  public final class GetCustomCredentialException extends androidx.credentials.exceptions.GetCredentialException {
     ctor public GetCustomCredentialException(String type, optional CharSequence? errorMessage);
     ctor public GetCustomCredentialException(String type);
     method public String getType();
     property public String type;
   }
 
+  public final class NoCredentialException extends androidx.credentials.exceptions.GetCredentialException {
+    ctor public NoCredentialException(optional CharSequence? errorMessage);
+    ctor public NoCredentialException();
+  }
+
 }
 
 package androidx.credentials.exceptions.domerrors {
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/CreateCustomCredentialRequestJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/CreateCustomCredentialRequestJavaTest.java
index b5be84f..596d5c5 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/CreateCustomCredentialRequestJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/CreateCustomCredentialRequestJavaTest.java
@@ -90,7 +90,7 @@
         assertThat(TestUtilsKt.equals(request.getCandidateQueryData(),
                 expectedCandidateQueryDataBundle)).isTrue();
         assertThat(request.isSystemProviderRequired()).isEqualTo(expectedSystemProvider);
-        assertThat(request.getDisplayInfo$credentials_debug()).isEqualTo(expectedDisplayInfo);
+        assertThat(request.getDisplayInfo()).isEqualTo(expectedDisplayInfo);
     }
 
     @Test
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePasswordRequestJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePasswordRequestJavaTest.java
index 63951b4..0191ba2 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePasswordRequestJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePasswordRequestJavaTest.java
@@ -91,7 +91,7 @@
 
         assertThat(request.getType()).isEqualTo(PasswordCredential.TYPE_PASSWORD_CREDENTIAL);
         CreateCredentialRequest.DisplayInfo displayInfo =
-                request.getDisplayInfo$credentials_debug();
+                request.getDisplayInfo();
         assertThat(displayInfo.getUserDisplayName()).isNull();
         assertThat(displayInfo.getUserId()).isEqualTo(idExpected);
         assertThat(TestUtilsKt.equals(request.getCandidateQueryData(), Bundle.EMPTY)).isTrue();
@@ -133,7 +133,7 @@
         assertThat(convertedCreatePasswordRequest.getPassword()).isEqualTo(request.getPassword());
         assertThat(convertedCreatePasswordRequest.getId()).isEqualTo(request.getId());
         CreateCredentialRequest.DisplayInfo displayInfo =
-                convertedCreatePasswordRequest.getDisplayInfo$credentials_debug();
+                convertedCreatePasswordRequest.getDisplayInfo();
         assertThat(displayInfo.getUserDisplayName()).isNull();
         assertThat(displayInfo.getUserId()).isEqualTo(idExpected);
         assertThat(displayInfo.getCredentialTypeIcon().getResId())
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestJavaTest.java
index 838217a..2b9c3b7 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestJavaTest.java
@@ -174,7 +174,7 @@
         assertThat(convertedSubclassRequest.preferImmediatelyAvailableCredentials())
                 .isEqualTo(request.preferImmediatelyAvailableCredentials());
         CreateCredentialRequest.DisplayInfo displayInfo =
-                convertedRequest.getDisplayInfo$credentials_debug();
+                convertedRequest.getDisplayInfo();
         assertThat(displayInfo.getUserDisplayName()).isEqualTo(TEST_USER_DISPLAYNAME);
         assertThat(displayInfo.getUserId()).isEqualTo(TEST_USERNAME);
         assertThat(displayInfo.getCredentialTypeIcon().getResId())
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivilegedJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivilegedJavaTest.java
index 85901a3..efba89e 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivilegedJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/CreatePublicKeyCredentialRequestPrivilegedJavaTest.java
@@ -210,7 +210,7 @@
         assertThat(convertedSubclassRequest.preferImmediatelyAvailableCredentials()).isEqualTo(
                 request.preferImmediatelyAvailableCredentials());
         CreateCredentialRequest.DisplayInfo displayInfo =
-                convertedRequest.getDisplayInfo$credentials_debug();
+                convertedRequest.getDisplayInfo();
         assertThat(displayInfo.getUserDisplayName()).isEqualTo(TEST_USER_DISPLAYNAME);
         assertThat(displayInfo.getUserId()).isEqualTo(TEST_USERNAME);
         assertThat(displayInfo.getCredentialTypeIcon().getResId())
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionJavaTest.java
new file mode 100644
index 0000000..79b8f4f
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionJavaTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ClearCredentialUnsupportedExceptionJavaTest {
+    @Test(expected = ClearCredentialUnsupportedException.class)
+    public void construct_inputNonEmpty_success() throws
+            ClearCredentialUnsupportedException {
+        throw new ClearCredentialUnsupportedException("msg");
+    }
+
+    @Test(expected = ClearCredentialUnsupportedException.class)
+    public void construct_errorMessageNull_success() throws
+            ClearCredentialUnsupportedException {
+        throw new ClearCredentialUnsupportedException(null);
+    }
+
+    @Test
+    public void getter_success() {
+        Class<ClearCredentialUnsupportedException> expectedClass =
+                ClearCredentialUnsupportedException.class;
+        String expectedMessage = "message";
+        ClearCredentialUnsupportedException exception = new
+                ClearCredentialUnsupportedException(expectedMessage);
+        assertThat(exception.getClass()).isEqualTo(expectedClass);
+        assertThat(exception.getErrorMessage()).isEqualTo(expectedMessage);
+    }
+}
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionTest.kt
new file mode 100644
index 0000000..ca5684d
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/ClearCredentialUnsupportedExceptionTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ClearCredentialUnsupportedExceptionTest {
+    @Test(expected = ClearCredentialUnsupportedException::class)
+    fun construct_inputNonEmpty_success() {
+        throw ClearCredentialUnsupportedException("msg")
+    }
+
+    @Test(expected = ClearCredentialUnsupportedException::class)
+    fun construct_errorMessageNull_success() {
+        throw ClearCredentialUnsupportedException(null)
+    }
+
+    @Test
+    fun getter_success() {
+        val expectedType =
+            ClearCredentialUnsupportedException
+                .TYPE_CLEAR_CREDENTIAL_UNSUPPORTED_EXCEPTION
+        val expectedMessage = "message"
+        val exception = ClearCredentialUnsupportedException(expectedMessage)
+        assertThat(exception.type).isEqualTo(expectedType)
+        assertThat(exception.errorMessage).isEqualTo(expectedMessage)
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionJavaTest.java
new file mode 100644
index 0000000..c6ae770
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionJavaTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CreateCredentialUnsupportedExceptionJavaTest {
+    @Test(expected = CreateCredentialUnsupportedException.class)
+    public void construct_inputNonEmpty_success() throws
+            CreateCredentialUnsupportedException {
+        throw new CreateCredentialUnsupportedException("msg");
+    }
+
+    @Test(expected = CreateCredentialUnsupportedException.class)
+    public void construct_errorMessageNull_success() throws
+            CreateCredentialUnsupportedException {
+        throw new CreateCredentialUnsupportedException(null);
+    }
+
+    @Test
+    public void getter_success() {
+        Class<CreateCredentialUnsupportedException> expectedClass =
+                CreateCredentialUnsupportedException.class;
+        String expectedMessage = "message";
+        CreateCredentialUnsupportedException exception = new
+                CreateCredentialUnsupportedException(expectedMessage);
+        assertThat(exception.getClass()).isEqualTo(expectedClass);
+        assertThat(exception.getErrorMessage()).isEqualTo(expectedMessage);
+    }
+}
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionTest.kt
new file mode 100644
index 0000000..e9e2417
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/CreateCredentialUnsupportedExceptionTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class CreateCredentialUnsupportedExceptionTest {
+    @Test(expected = CreateCredentialUnsupportedException::class)
+    fun construct_inputNonEmpty_success() {
+        throw CreateCredentialUnsupportedException("msg")
+    }
+
+    @Test(expected = CreateCredentialUnsupportedException::class)
+    fun construct_errorMessageNull_success() {
+        throw CreateCredentialUnsupportedException(null)
+    }
+
+    @Test
+    fun getter_success() {
+        val expectedType =
+            CreateCredentialUnsupportedException
+                .TYPE_CREATE_CREDENTIAL_UNSUPPORTED_EXCEPTION
+        val expectedMessage = "message"
+        val exception = CreateCredentialUnsupportedException(expectedMessage)
+        assertThat(exception.type).isEqualTo(expectedType)
+        assertThat(exception.errorMessage).isEqualTo(expectedMessage)
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionJavaTest.java
new file mode 100644
index 0000000..9ede916
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionJavaTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class GetCredentialUnsupportedExceptionJavaTest {
+    @Test(expected = GetCredentialUnsupportedException.class)
+    public void construct_inputNonEmpty_success() throws
+            GetCredentialUnsupportedException {
+        throw new GetCredentialUnsupportedException("msg");
+    }
+
+    @Test(expected = GetCredentialUnsupportedException.class)
+    public void construct_errorMessageNull_success() throws
+            GetCredentialUnsupportedException {
+        throw new GetCredentialUnsupportedException(null);
+    }
+
+    @Test
+    public void getter_success() {
+        Class<GetCredentialUnsupportedException> expectedClass =
+                GetCredentialUnsupportedException.class;
+        String expectedMessage = "message";
+        GetCredentialUnsupportedException exception = new
+                GetCredentialUnsupportedException(expectedMessage);
+        assertThat(exception.getClass()).isEqualTo(expectedClass);
+        assertThat(exception.getErrorMessage()).isEqualTo(expectedMessage);
+    }
+}
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionTest.kt
new file mode 100644
index 0000000..f6c68d7
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/GetCredentialUnsupportedExceptionTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class GetCredentialUnsupportedExceptionTest {
+    @Test(expected = GetCredentialUnsupportedException::class)
+    fun construct_inputNonEmpty_success() {
+        throw GetCredentialUnsupportedException("msg")
+    }
+
+    @Test(expected = GetCredentialUnsupportedException::class)
+    fun construct_errorMessageNull_success() {
+        throw GetCredentialUnsupportedException(null)
+    }
+
+    @Test
+    fun getter_success() {
+        val expectedType =
+            GetCredentialUnsupportedException
+                .TYPE_GET_CREDENTIAL_UNSUPPORTED_EXCEPTION
+        val expectedMessage = "message"
+        val exception = GetCredentialUnsupportedException(expectedMessage)
+        assertThat(exception.type).isEqualTo(expectedType)
+        assertThat(exception.errorMessage).isEqualTo(expectedMessage)
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionJavaTest.java
new file mode 100644
index 0000000..9e0a489
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionJavaTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class NoCredentialExceptionJavaTest {
+    @Test(expected = NoCredentialException.class)
+    public void construct_inputNonEmpty_success() throws NoCredentialException {
+        throw new NoCredentialException("msg");
+    }
+
+    @Test(expected = NoCredentialException.class)
+    public void construct_errorMessageNull_success() throws NoCredentialException {
+        throw new NoCredentialException(null);
+    }
+    @Test
+    public void getter_success() {
+        Class<NoCredentialException> expectedClass =
+                NoCredentialException.class;
+        String expectedMessage = "message";
+        NoCredentialException exception = new
+                NoCredentialException(expectedMessage);
+        assertThat(exception.getClass()).isEqualTo(expectedClass);
+        assertThat(exception.getErrorMessage()).isEqualTo(expectedMessage);
+    }
+}
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionTest.kt
new file mode 100644
index 0000000..e5ea091
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/exceptions/NoCredentialExceptionTest.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class NoCredentialExceptionTest {
+    @Test(expected = NoCredentialException::class)
+    fun construct_inputNonEmpty_success() {
+        throw NoCredentialException("msg")
+    }
+
+    @Test(expected = NoCredentialException::class)
+    fun construct_errorMessageNull_success() {
+        throw NoCredentialException(null)
+    }
+
+    @Test
+    fun getter_success() {
+        val expectedClass =
+            NoCredentialException::class.java
+        val expectedMessage = "message"
+        val exception = NoCredentialException(expectedMessage)
+        assertThat(exception.javaClass).isEqualTo(expectedClass)
+        assertThat(exception.errorMessage).isEqualTo(expectedMessage)
+    }
+}
diff --git a/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
index e351e8f..761fa8b 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
@@ -47,7 +47,7 @@
     @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     open val isSystemProviderRequired: Boolean,
     /** @hide */
-    internal val displayInfo: DisplayInfo,
+    val displayInfo: DisplayInfo,
 ) {
     /**
      * Information that may be used for display purposes when rendering UIs to collect the user
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnsupportedException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnsupportedException.kt
new file mode 100644
index 0000000..01fc50c
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCredentialUnsupportedException.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+/**
+ * During the clear credential flow, this is thrown when credential manager is unsupported, typically
+ * because the device has disabled it or did not ship with this feature enabled. A software update
+ * or a restart after enabling may fix this issue, but in certain cases, the device hardware may
+ * be the limiting factor.
+ *
+ * @see ClearCredentialException
+ * @hide
+ */
+class ClearCredentialUnsupportedException @JvmOverloads constructor(
+    errorMessage: CharSequence? = null
+) : GetCredentialException(TYPE_CLEAR_CREDENTIAL_UNSUPPORTED_EXCEPTION, errorMessage) {
+    /** @hide */
+    companion object {
+        internal const val TYPE_CLEAR_CREDENTIAL_UNSUPPORTED_EXCEPTION =
+            "androidx.credentials.TYPE_CLEAR_CREDENTIAL_UNSUPPORTED_EXCEPTION"
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCustomCredentialException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCustomCredentialException.kt
index 0b62947..babc2fe 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCustomCredentialException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/ClearCustomCredentialException.kt
@@ -19,16 +19,18 @@
 import androidx.credentials.CredentialManager
 
 /**
- * Represents a custom error thrown during a clear flow with Credential Manager. See
- * [CredentialManager] for more details on how Exceptions work for Credential Manager flows.
+ * Represents a custom error thrown during a clear flow with [CredentialManager].
  *
- * @see CredentialManager
+ * If you get this custom exception, you should match its [type] against exception constants
+ * defined in any third-party sdk with which you used to make the
+ * [androidx.credentials.ClearCredentialStateRequest], and then handle it according to the sdk
+ * recommendation.
  *
  * @property type a string that indicates the type of the credential exception
  * @throws IllegalArgumentException If [type] is empty
  * @throws NullPointerException If [type] is null
  */
-open class ClearCustomCredentialException @JvmOverloads constructor(
+class ClearCustomCredentialException @JvmOverloads constructor(
     override val type: String,
     errorMessage: CharSequence? = null
 ) : ClearCredentialException(type, errorMessage) {
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnsupportedException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnsupportedException.kt
new file mode 100644
index 0000000..963dd8f
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCredentialUnsupportedException.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+/**
+ * During the create credential flow, this is thrown when credential manager is unsupported, typically
+ * because the device has disabled it or did not ship with this feature enabled. A software update
+ * or a restart after enabling may fix this issue, but in certain cases, the device hardware may
+ * be the limiting factor.
+ *
+ * @see CreateCredentialException
+ * @hide
+ */
+class CreateCredentialUnsupportedException @JvmOverloads constructor(
+    errorMessage: CharSequence? = null
+) : GetCredentialException(TYPE_CREATE_CREDENTIAL_UNSUPPORTED_EXCEPTION, errorMessage) {
+    /** @hide */
+    companion object {
+        internal const val TYPE_CREATE_CREDENTIAL_UNSUPPORTED_EXCEPTION =
+            "androidx.credentials.TYPE_CREATE_CREDENTIAL_UNSUPPORTED_EXCEPTION"
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCustomCredentialException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCustomCredentialException.kt
index 37d6e3c..c37ef3e 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCustomCredentialException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/CreateCustomCredentialException.kt
@@ -19,16 +19,18 @@
 import androidx.credentials.CredentialManager
 
 /**
- * Represents a custom error thrown during a create flow with Credential Manager. See
- * [CredentialManager] for more details on how exceptions work for Credential Manager flows.
+ * Represents a custom error thrown during a create flow with [CredentialManager].
  *
- * @see CredentialManager
+ * If you get this custom exception, you should match its [type] against exception constants
+ * defined in any third-party sdk with which you used to make the
+ * [androidx.credentials.CreateCredentialRequest], and then handle it according to the sdk
+ * recommendation.
  *
  * @property type a string that indicates the type of the credential exception
  * @throws IllegalArgumentException If [type] is empty
  * @throws NullPointerException If [type] is null
  */
-open class CreateCustomCredentialException @JvmOverloads constructor(
+class CreateCustomCredentialException @JvmOverloads constructor(
     override val type: String,
     errorMessage: CharSequence? = null
 ) : CreateCredentialException(type, errorMessage) {
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnsupportedException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnsupportedException.kt
new file mode 100644
index 0000000..a260503
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCredentialUnsupportedException.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+/**
+ * During the get credential flow, this is thrown when credential manager is unsupported, typically
+ * because the device has disabled it or did not ship with this feature enabled. A software update
+ * or a restart after enabling may fix this issue, but in certain cases, the device hardware may
+ * be the limiting factor.
+ *
+ * @see GetCredentialException
+ * @hide
+ */
+class GetCredentialUnsupportedException @JvmOverloads constructor(
+    errorMessage: CharSequence? = null
+) : GetCredentialException(TYPE_GET_CREDENTIAL_UNSUPPORTED_EXCEPTION, errorMessage) {
+    /** @hide */
+    companion object {
+        internal const val TYPE_GET_CREDENTIAL_UNSUPPORTED_EXCEPTION =
+            "androidx.credentials.TYPE_GET_CREDENTIAL_UNSUPPORTED_EXCEPTION"
+    }
+}
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCustomCredentialException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCustomCredentialException.kt
index 5e5a022..8cfa559 100644
--- a/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCustomCredentialException.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/GetCustomCredentialException.kt
@@ -19,16 +19,18 @@
 import androidx.credentials.CredentialManager
 
 /**
- * Represents a custom error thrown during a get flow with Credential Manager. See
- * [CredentialManager] for more details on how exceptions work for Credential Manager flows.
+ * Represents a custom error thrown during a get flow with [CredentialManager].
  *
- * @see CredentialManager
+ * If you get this custom exception, you should match its [type] against exception constants
+ * defined in any third-party sdk with which you used to make the
+ * [androidx.credentials.GetCredentialRequest], and then handle it according to the sdk
+ * recommendation.
  *
  * @property type a string that indicates the type of the credential exception
  * @throws IllegalArgumentException If [type] is empty
  * @throws NullPointerException If [type] is null
  */
-open class GetCustomCredentialException @JvmOverloads constructor(
+class GetCustomCredentialException @JvmOverloads constructor(
     override val type: String,
     errorMessage: CharSequence? = null
 ) : GetCredentialException(type, errorMessage) {
diff --git a/credentials/credentials/src/main/java/androidx/credentials/exceptions/NoCredentialException.kt b/credentials/credentials/src/main/java/androidx/credentials/exceptions/NoCredentialException.kt
new file mode 100644
index 0000000..e41a684
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/exceptions/NoCredentialException.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.credentials.exceptions
+
+/**
+ * During the get credential flow, this is returned when no viable credential is available for the
+ * the user. This can be caused by various scenarios such as that the user doesn't have any
+ * credential or the user doesn't grant consent to using any available credential. Upon this
+ * exception, your app should navigate to use the regular app sign-up or sign-in screen.
+ * When that succeeds, you should invoke [androidx.credentials.CredentialManager.createCredential]
+ * (kotlin) or [androidx.credentials.CredentialManager.createCredentialAsync] (java) to store the
+ * login info, so that your user can sign in more easily through Credential Manager the next time.
+ */
+class NoCredentialException @JvmOverloads constructor(
+    errorMessage: CharSequence? = null
+) : GetCredentialException(TYPE_FRAMEWORK_TYPE_NO_CREDENTIAL, errorMessage) {
+
+    /** @hide */
+    companion object {
+        /** Maintain a copy of the framework type so that we aren't restricted by the API level. */
+        internal const val TYPE_FRAMEWORK_TYPE_NO_CREDENTIAL =
+            "android.credentials.GetCredentialException.TYPE_NO_CREDENTIAL"
+    }
+}
\ No newline at end of file
diff --git a/customview/OWNERS b/customview/OWNERS
index 20eea7c..31cd563 100644
--- a/customview/OWNERS
+++ b/customview/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461406
 alanv@google.com
diff --git a/customview/customview-poolingcontainer/OWNERS b/customview/customview-poolingcontainer/OWNERS
index 8a606ef..e2bfd3b 100644
--- a/customview/customview-poolingcontainer/OWNERS
+++ b/customview/customview-poolingcontainer/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461406
 ryanmentley@google.com
diff --git a/datastore/datastore/api/current.ignore b/datastore/datastore/api/current.ignore
index 1301f27..7141632 100644
--- a/datastore/datastore/api/current.ignore
+++ b/datastore/datastore/api/current.ignore
@@ -5,3 +5,7 @@
     Attempted to remove parameter name from parameter arg2 in androidx.datastore.migrations.SharedPreferencesMigration.migrate
 ParameterNameChange: androidx.datastore.migrations.SharedPreferencesMigration#shouldMigrate(T, kotlin.coroutines.Continuation<? super java.lang.Boolean>) parameter #1:
     Attempted to remove parameter name from parameter arg2 in androidx.datastore.migrations.SharedPreferencesMigration.shouldMigrate
+
+
+RemovedClass: androidx.datastore.migrations.SharedPreferencesMigrationKt:
+    Removed class androidx.datastore.migrations.SharedPreferencesMigrationKt
diff --git a/datastore/datastore/api/current.txt b/datastore/datastore/api/current.txt
index 029f07b..c4a6933 100644
--- a/datastore/datastore/api/current.txt
+++ b/datastore/datastore/api/current.txt
@@ -25,9 +25,6 @@
     method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
-  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();
diff --git a/datastore/datastore/api/public_plus_experimental_current.txt b/datastore/datastore/api/public_plus_experimental_current.txt
index 029f07b..c4a6933 100644
--- a/datastore/datastore/api/public_plus_experimental_current.txt
+++ b/datastore/datastore/api/public_plus_experimental_current.txt
@@ -25,9 +25,6 @@
     method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
-  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();
diff --git a/datastore/datastore/api/restricted_current.ignore b/datastore/datastore/api/restricted_current.ignore
index 1301f27..7141632 100644
--- a/datastore/datastore/api/restricted_current.ignore
+++ b/datastore/datastore/api/restricted_current.ignore
@@ -5,3 +5,7 @@
     Attempted to remove parameter name from parameter arg2 in androidx.datastore.migrations.SharedPreferencesMigration.migrate
 ParameterNameChange: androidx.datastore.migrations.SharedPreferencesMigration#shouldMigrate(T, kotlin.coroutines.Continuation<? super java.lang.Boolean>) parameter #1:
     Attempted to remove parameter name from parameter arg2 in androidx.datastore.migrations.SharedPreferencesMigration.shouldMigrate
+
+
+RemovedClass: androidx.datastore.migrations.SharedPreferencesMigrationKt:
+    Removed class androidx.datastore.migrations.SharedPreferencesMigrationKt
diff --git a/datastore/datastore/api/restricted_current.txt b/datastore/datastore/api/restricted_current.txt
index 029f07b..c4a6933 100644
--- a/datastore/datastore/api/restricted_current.txt
+++ b/datastore/datastore/api/restricted_current.txt
@@ -25,9 +25,6 @@
     method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean>);
   }
 
-  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();
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index b864500..86c3857 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -728,6 +728,8 @@
 dagger\.lint\.DaggerIssueRegistry in .*/lint\.jar does not specify a vendor; see IssueRegistry#vendor
 # > Task :compose:foundation:foundation:androidReleaseSourcesJar
 Encountered duplicate path "android[a-zA-Z]*/.+" during copy operation configured with DuplicatesStrategy\.WARN
+# > Task :jvmSourcesJar
+Encountered duplicate path \"jvmMain(\/([a-zA-Z]+))+(\.jvm)?\.kt\" during copy operation configured with DuplicatesStrategy.WARN
 # ./gradlew tasks warns as we have warnings present
 You can use \'\-\-warning\-mode all\' to show the individual deprecation warnings and determine if they come from your own scripts or plugins\.
 # > Task :emoji2:emoji2-bundled:processDebugAndroidTestManifest
diff --git a/development/update-verification-metadata.sh b/development/update-verification-metadata.sh
index 8a08119..bff975b 100755
--- a/development/update-verification-metadata.sh
+++ b/development/update-verification-metadata.sh
@@ -17,51 +17,13 @@
   echo "regenerating verification metadata and keyring"
   # regenerate metadata
   # Need to run a clean build, https://github.com/gradle/gradle/issues/19228
-  runGradle --write-verification-metadata pgp,sha256 --export-keys --dry-run --clean bOS
-  # extract and keep only the <trusted-keys> section
-  WORK_DIR=gradle/update-keys-temp
-  rm -rf "$WORK_DIR"
-  mkdir -p "$WORK_DIR"
-
-  # extract the middle of the new file, https://github.com/gradle/gradle/issues/18569
-  grep -B 10000 "<trusted-keys>" gradle/verification-metadata.dryrun.xml > "$WORK_DIR/new.head"
-  grep -A 10000 "</trusted-keys>" gradle/verification-metadata.dryrun.xml > "$WORK_DIR/new.tail"
-  numTopLines="$(cat "$WORK_DIR/new.head" | wc -l)"
-  numTopLinesPlus1="$(($numTopLines + 1))"
-  numBottomLines="$(cat "$WORK_DIR/new.tail" | wc -l)"
-  numLines="$(cat gradle/verification-metadata.dryrun.xml | wc -l)"
-  numMiddleLines="$(($numLines - $numTopLines - $numBottomLines))"
-  # also remove 'version=' lines, https://github.com/gradle/gradle/issues/20192
-  cat gradle/verification-metadata.dryrun.xml | tail -n "+$numTopLinesPlus1" | head -n "$numMiddleLines" | sed 's/ version="[^"]*"//' > "$WORK_DIR/new.middle"
-
-  # extract the top and bottom of the old file
-  grep -B 10000 "<trusted-keys>" gradle/verification-metadata.xml > "$WORK_DIR/old.head"
-  grep -A 10000 "</trusted-keys>" gradle/verification-metadata.xml > "$WORK_DIR/old.tail"
+  runGradle --stacktrace --write-verification-metadata pgp,sha256 --export-keys --dry-run --clean bOS
 
   # update verification metadata file
-  cat "$WORK_DIR/old.head" "$WORK_DIR/new.middle" "$WORK_DIR/old.tail" > gradle/verification-metadata.xml
-
-  echo "sorting keyring and removing duplicates"
-  # sort and unique the keyring
-  # https://github.com/gradle/gradle/issues/20140
-  # `sed 's/$/NEWLINE/g'` adds the word NEWLINE at the end of each line
-  # `tr -d '\n'` deletes the actual newlines
-  # `sed` again adds a newline at the end of each key, so each key is one line
-  # `sort` orders the keys deterministically
-  # `uniq` removes identical keys
-  # `sed 's/NEWLINE/\n/g'` puts the newlines back
-  cat gradle/verification-keyring-dryrun.keys \
-    | sed 's/$/NEWLINE/g' \
-    | tr -d '\n' \
-    | sed 's/\(-----END PGP PUBLIC KEY BLOCK-----\)/\1\n/g' \
-    | grep "END PGP PUBLIC KEY BLOCK" \
-    | sort \
-    | uniq \
-    | sed 's/NEWLINE/\n/g' \
-    > gradle/verification-keyring.keys
+  # also remove 'version=' lines, https://github.com/gradle/gradle/issues/20192
+  cat gradle/verification-metadata.dryrun.xml | sed 's/ \(trusted-key.*\)version="[^"]*"/\1/' > gradle/verification-metadata.xml
 
   # remove temporary files
-  rm -rf "$WORK_DIR"
   rm -f gradle/verification-keyring-dryrun.gpg
   rm -f gradle/verification-keyring-dryrun.keys
   rm -f gradle/verification-metadata.dryrun.xml
@@ -69,4 +31,4 @@
 regenerateVerificationMetadata
 
 echo
-echo "Done. Please check that these changes look correct ('git diff')"
+echo 'Done. Please check that these changes look correct (`git diff`)'
diff --git a/development/update_studio.sh b/development/update_studio.sh
index 187a9d4..d394214 100755
--- a/development/update_studio.sh
+++ b/development/update_studio.sh
@@ -1,9 +1,24 @@
 #!/bin/bash
+
+function echoAndDo() {
+  echo "$@"
+  eval "$@"
+}
+
 # Get versions
-AGP_VERSION=${1:-8.0.0-alpha07}
-STUDIO_VERSION_STRING=${2:-"Android Studio Flamingo (2022.2.1) Canary 7"}
-STUDIO_IFRAME_LINK=`curl "https://developer.android.com/studio/archive.html" | grep iframe | sed "s/.*src=\"\([a-zA-Z0-9\/\._]*\)\".*/https:\/\/android-dot-devsite-v2-prod.appspot.com\1/g"`
-STUDIO_LINK=`curl -s $STUDIO_IFRAME_LINK | grep -C30 "$STUDIO_VERSION_STRING" | grep Linux | tail -n 1 | sed 's/.*a href="\(.*\).*"/\1/g'`
+echo Getting Studio version and link
+AGP_VERSION=${1:-8.1.0-alpha03}
+STUDIO_VERSION_STRING=${2:-"Android Studio Giraffe | 2022.3.1 Canary 3"}
+STUDIO_IFRAME_LINK=`curl "https://developer.android.com/studio/archive.html" | grep "<iframe " | sed "s/.* src=\"\([^\"]*\)\".*/\1/g"`
+echo iframe link $STUDIO_IFRAME_LINK
+STUDIO_IFRAME_REDIRECT=`curl -s $STUDIO_IFRAME_LINK | grep href | sed 's/.*href="\([^"]*\)".*/\1/g'`
+echo iframe redirect $STUDIO_IFRAME_REDIRECT
+STUDIO_LINK=`curl -s $STUDIO_IFRAME_REDIRECT | grep -C30 "$STUDIO_VERSION_STRING" | grep Linux | tail -n 1 | sed 's/.*a href="\(.*\).*"/\1/g' | sed 's/>.*//'`
+echo STUDIO_LINK: $STUDIO_LINK
+if [ "$STUDIO_LINK" == "" ]; then
+  echo "Error: STUDIO_LINK must not be empty. Open this script and look for parsing errors. Does studio version '$STUDIO_VERSION_STRING' exist?"
+  exit 1
+fi
 STUDIO_VERSION=`echo $STUDIO_LINK | sed "s/.*ide-zips\/\(.*\)\/android-studio-.*/\1/g"`
 
 # Update AGP
@@ -22,7 +37,8 @@
 ARTIFACTS_TO_DOWNLOAD+="com.android.tools.lint:lint-gradle:$LINT_VERSION,"
 ARTIFACTS_TO_DOWNLOAD+="com.android.tools:ninepatch:$LINT_VERSION,"
 
-# Update studio_versions.properties
+# Update libs.versions.toml
+echo Updating dependency versions
 sed -i "s/androidGradlePlugin = .*/androidGradlePlugin = \"$AGP_VERSION\"/g" gradle/libs.versions.toml
 sed -i "s/androidLint = \".*/androidLint = \"$LINT_VERSION\"/g" gradle/libs.versions.toml
 sed -i "s/androidStudio = .*/androidStudio = \"$STUDIO_VERSION\"/g" gradle/libs.versions.toml
@@ -44,4 +60,4 @@
 ARTIFACTS_TO_DOWNLOAD+="com.google.testing.platform:core:$ATP_VERSION"
 
 # Download all the artifacts
-./development/importMaven/importMaven.sh "$ARTIFACTS_TO_DOWNLOAD"
\ No newline at end of file
+echoAndDo ./development/importMaven/importMaven.sh "$ARTIFACTS_TO_DOWNLOAD"
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 99ec90b..1ace70c 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -8,10 +8,10 @@
 }
 
 dependencies {
-    docs("androidx.activity:activity:1.7.0-alpha04")
-    docs("androidx.activity:activity-compose:1.7.0-alpha04")
-    samples("androidx.activity:activity-compose-samples:1.7.0-alpha04")
-    docs("androidx.activity:activity-ktx:1.7.0-alpha04")
+    docs("androidx.activity:activity:1.7.0-beta01")
+    docs("androidx.activity:activity-compose:1.7.0-beta01")
+    samples("androidx.activity:activity-compose-samples:1.7.0-beta01")
+    docs("androidx.activity:activity-ktx:1.7.0-beta01")
     docs("androidx.ads:ads-identifier:1.0.0-alpha04")
     docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
     docs("androidx.annotation:annotation:1.6.0-alpha02")
@@ -182,27 +182,27 @@
     docs("androidx.leanback:leanback-paging:1.1.0-alpha09")
     docs("androidx.leanback:leanback-preference:1.2.0-alpha02")
     docs("androidx.leanback:leanback-tab:1.1.0-beta01")
-    docs("androidx.lifecycle:lifecycle-common:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-common-java8:2.6.0-alpha05")
+    docs("androidx.lifecycle:lifecycle-common:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-common-java8:2.6.0-beta01")
     docs("androidx.lifecycle:lifecycle-extensions:2.2.0")
-    docs("androidx.lifecycle:lifecycle-livedata:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-livedata-core:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-process:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-reactivestreams:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-runtime:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha05")
-    samples("androidx.lifecycle:lifecycle-runtime-compose-samples:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-runtime-testing:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-service:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-viewmodel:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0-alpha05")
-    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-alpha05")
-    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.0-alpha05")
+    docs("androidx.lifecycle:lifecycle-livedata:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-livedata-core:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-process:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-reactivestreams:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-runtime:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-runtime-compose:2.6.0-beta01")
+    samples("androidx.lifecycle:lifecycle-runtime-compose-samples:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-runtime-testing:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-service:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-viewmodel:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0-beta01")
+    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0-beta01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.0-beta01")
     docs("androidx.loader:loader:1.1.0")
     docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0")
     docs("androidx.media2:media2-common:1.2.1")
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index 498ff9f..b3fc1a1 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -19,6 +19,7 @@
     kmpDocs(project(":annotation:annotation"))
     docs(project(":annotation:annotation-experimental"))
     docs(project(":appactions:interaction:interaction-capabilities-core"))
+    docs(project(":appactions:interaction:interaction-capabilities-safety"))
     docs(project(":appactions:interaction:interaction-proto"))
     docs(project(":appactions:interaction:interaction-service"))
     docs(project(":appcompat:appcompat"))
@@ -318,6 +319,7 @@
     docs(project(":wear:protolayout:protolayout"))
     docs(project(":wear:protolayout:protolayout-expression"))
     docs(project(":wear:protolayout:protolayout-expression-pipeline"))
+    docs(project(":wear:protolayout:protolayout-material"))
     docs(project(":wear:protolayout:protolayout-proto"))
     docs(project(":wear:protolayout:protolayout-renderer"))
     docs(project(":wear:wear"))
@@ -361,6 +363,7 @@
     docs(project(":window:window-rxjava2"))
     docs(project(":window:window-rxjava3"))
     stubs(project(":window:sidecar:sidecar"))
+    samples(project(":window:window-samples:"))
     stubs(project(":window:extensions:extensions"))
     stubs(project(":window:extensions:core:core"))
     docs(project(":window:window-testing"))
diff --git a/docs/api_guidelines/modules.md b/docs/api_guidelines/modules.md
index 7ec24f0..85259bd 100644
--- a/docs/api_guidelines/modules.md
+++ b/docs/api_guidelines/modules.md
@@ -252,6 +252,47 @@
 library in this situation to skip versions, e.g. move directly from
 `1.0.0-alpha02` to `2.1.3-beta06`.
 
+#### Kotlin Multiplatform library versions {#modules-kmp-versioning}
+
+When a library adds [Kotlin Multiplatform](/company/teams/androidx/kmp.md)
+support, it is permitted to have different versions for the multiplatform
+artifacts until they reach alpha quality.
+
+##### Atomic Kotlin Multiplatform versions
+
+To specify an atomic version group for the Kotlin Multiplatform artifacts, use
+the `multiplatformGroupVersion` property in the `libraryversions.toml` file.
+
+```
+[versions]
+DATASTORE = "1.2.3"
+DATASTORE_KMP = "1.2.3-dev05"
+[groups]
+DATASTORE = { group = "androidx.datastore", atomicGroupVersion = "versions.DATASTORE", multiplatformGroupVersion = "versions.DATASTORE_KMP" }
+```
+
+Note that you can specify a `multiplatformGroupVersion` if and only if you are
+also specifying a `atomicGroupVersion`.
+
+##### Non atomic Kotlin Multiplatform versions
+
+If your Kotlin Multiplatform Library does not have atomic version groups, you
+can specify a KMP specifc version in the `build gradle` file:
+
+```groovy
+import androidx.build.KmpPlatformsKt
+...
+
+androidx {
+    name = "Android Support Library collections"
+    type = LibraryType.KMP_LIBRARY
+    mavenGroup = LibraryGroups.COLLECTION
+    mavenVersion = KmpPlatformsKt.enableNative(project) ? LibraryVersions.COLLECTION_KMP : LibraryVersions.KMP
+    inceptionYear = "2018"
+    description = "Standalone efficient collections."
+}
+```
+
 ### Choosing a `minSdkVersion` {#module-minsdkversion}
 
 The recommended minimum SDK version for new Jetpack libraries is currently
diff --git a/docs/issue_tracking.md b/docs/issue_tracking.md
index f33022c..5349a8b 100644
--- a/docs/issue_tracking.md
+++ b/docs/issue_tracking.md
@@ -2,16 +2,24 @@
 
 [TOC]
 
+This document provides an external-facing explanation of how to file a bug
+against a Jetpack library or infrastructure component and how to interpret the
+various statuses and priorities displayed in the issue tracker.
+
 ## Issue tracker {#tracker}
 
 The public-facing issue tracker URL is
-[issuetracker.google.com](https://issuetracker.google.com). If you visit this
-URL from a Google-internal account, it will immediately redirect you to the
-internal-facing issue tracker URL. Make sure that any links you paste publicly
-have the correct public-facing URL.
+[issuetracker.google.com](https://issuetracker.google.com).
 
 The top-level Jetpack component is
 [`Android Public Tracker > App Development > Jetpack (androidx)`](https://issuetracker.google.com/components/192731/manage#basic).
+**Do not** file bugs against the top-level component. Individual library
+components are organized by group and can be searched by entering the Maven
+group in the issue tracker's component field, e.g. `androidx.core`.
+
+Issues with tools, processes, or infrastructure should be reported under the
+[`Jetpack (androidx) > Infrastructure`](https://issuetracker.google.com/components/705292/manage#basic)
+component.
 
 ## Reporting guidelines {#reporting}
 
@@ -116,3 +124,8 @@
     propagated into a specific release channel. **Do not** re-open an issue that
     has been fixed unless the fix was reverted or the exact reported issue is
     still occurring.
+1.  A status of **WontFix** means that the issue cannot be resolved within a
+    year due to prioritization, staffing, etc. **Do not** re-open an issue that
+    has been marked as WontFix or file identical issues. Issues that are open to
+    reconsideration will be added to an internal hotlist and revisited when the
+    circumstances surrounding their closure have changed.
diff --git a/docs/kdoc_guidelines.md b/docs/kdoc_guidelines.md
index fdea07c..91c6410 100644
--- a/docs/kdoc_guidelines.md
+++ b/docs/kdoc_guidelines.md
@@ -22,9 +22,9 @@
 /**
  * ...
  *
- * @param1 ...
- * @param2 ...
- * @param3 ...
+ * @param param1 ...
+ * @param param2 ...
+ * @param param3 ...
  */
 fun foo(param1: Int, param2: String, param3: Boolean) {}
 ```
diff --git a/docs/onboarding_images/image4.png b/docs/onboarding_images/image4.png
new file mode 100644
index 0000000..3707d50
--- /dev/null
+++ b/docs/onboarding_images/image4.png
Binary files differ
diff --git a/docs/onboarding_images/image5.png b/docs/onboarding_images/image5.png
new file mode 100644
index 0000000..deca6f9
--- /dev/null
+++ b/docs/onboarding_images/image5.png
Binary files differ
diff --git a/documentfile/OWNERS b/documentfile/OWNERS
index f63fcb8..0ad17a7 100644
--- a/documentfile/OWNERS
+++ b/documentfile/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461432
 nandana@google.com
 corinac@google.com
diff --git a/dynamicanimation/OWNERS b/dynamicanimation/OWNERS
index 20360e8..0997ace 100644
--- a/dynamicanimation/OWNERS
+++ b/dynamicanimation/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461200
 tianliu@google.com
\ No newline at end of file
diff --git a/emoji/OWNERS b/emoji/OWNERS
index f52b9a6..e2d3f4c 100644
--- a/emoji/OWNERS
+++ b/emoji/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461226
 clarabayarri@google.com
 siyamed@google.com
\ No newline at end of file
diff --git a/emoji2/OWNERS b/emoji2/OWNERS
index fe41080..6aabaed 100644
--- a/emoji2/OWNERS
+++ b/emoji2/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461226
 clarabayarri@google.com
 siyamed@google.com
 seanmcq@google.com
diff --git a/emoji2/emoji2-emojipicker/OWNERS b/emoji2/emoji2-emojipicker/OWNERS
index be95047..6e11953 100644
--- a/emoji2/emoji2-emojipicker/OWNERS
+++ b/emoji2/emoji2-emojipicker/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461226
 chelseahao@google.com
 linguo@google.com
 scduan@google.com
diff --git a/emoji2/emoji2-emojipicker/api/current.txt b/emoji2/emoji2-emojipicker/api/current.txt
index e61dfa9..e2360fa 100644
--- a/emoji2/emoji2-emojipicker/api/current.txt
+++ b/emoji2/emoji2-emojipicker/api/current.txt
@@ -23,10 +23,21 @@
     property public final java.util.List<java.lang.String> variants;
   }
 
+  public interface RecentEmojiAsyncProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.List<java.lang.String>> getRecentEmojiListAsync();
+    method public void recordSelection(String emoji);
+  }
+
   public interface RecentEmojiProvider {
     method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
     method public void recordSelection(String emoji);
   }
 
+  public final class RecentEmojiProviderAdapter implements androidx.emoji2.emojipicker.RecentEmojiProvider {
+    ctor public RecentEmojiProviderAdapter(androidx.emoji2.emojipicker.RecentEmojiAsyncProvider recentEmojiAsyncProvider);
+    method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
+    method public void recordSelection(String emoji);
+  }
+
 }
 
diff --git a/emoji2/emoji2-emojipicker/api/public_plus_experimental_current.txt b/emoji2/emoji2-emojipicker/api/public_plus_experimental_current.txt
index e61dfa9..e2360fa 100644
--- a/emoji2/emoji2-emojipicker/api/public_plus_experimental_current.txt
+++ b/emoji2/emoji2-emojipicker/api/public_plus_experimental_current.txt
@@ -23,10 +23,21 @@
     property public final java.util.List<java.lang.String> variants;
   }
 
+  public interface RecentEmojiAsyncProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.List<java.lang.String>> getRecentEmojiListAsync();
+    method public void recordSelection(String emoji);
+  }
+
   public interface RecentEmojiProvider {
     method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
     method public void recordSelection(String emoji);
   }
 
+  public final class RecentEmojiProviderAdapter implements androidx.emoji2.emojipicker.RecentEmojiProvider {
+    ctor public RecentEmojiProviderAdapter(androidx.emoji2.emojipicker.RecentEmojiAsyncProvider recentEmojiAsyncProvider);
+    method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
+    method public void recordSelection(String emoji);
+  }
+
 }
 
diff --git a/emoji2/emoji2-emojipicker/api/restricted_current.txt b/emoji2/emoji2-emojipicker/api/restricted_current.txt
index e61dfa9..e2360fa 100644
--- a/emoji2/emoji2-emojipicker/api/restricted_current.txt
+++ b/emoji2/emoji2-emojipicker/api/restricted_current.txt
@@ -23,10 +23,21 @@
     property public final java.util.List<java.lang.String> variants;
   }
 
+  public interface RecentEmojiAsyncProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.List<java.lang.String>> getRecentEmojiListAsync();
+    method public void recordSelection(String emoji);
+  }
+
   public interface RecentEmojiProvider {
     method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
     method public void recordSelection(String emoji);
   }
 
+  public final class RecentEmojiProviderAdapter implements androidx.emoji2.emojipicker.RecentEmojiProvider {
+    ctor public RecentEmojiProviderAdapter(androidx.emoji2.emojipicker.RecentEmojiAsyncProvider recentEmojiAsyncProvider);
+    method public suspend Object? getRecentEmojiList(kotlin.coroutines.Continuation<? super java.util.List<? extends java.lang.String>>);
+    method public void recordSelection(String emoji);
+  }
+
 }
 
diff --git a/emoji2/emoji2-emojipicker/build.gradle b/emoji2/emoji2-emojipicker/build.gradle
index 3ea643f..fd77405 100644
--- a/emoji2/emoji2-emojipicker/build.gradle
+++ b/emoji2/emoji2-emojipicker/build.gradle
@@ -29,6 +29,7 @@
     implementation("androidx.core:core-ktx:1.8.0")
     implementation project(path: ':emoji2:emoji2')
     implementation project(path: ':core:core')
+    implementation(libs.kotlinCoroutinesGuava)
     implementation 'androidx.appcompat:appcompat:1.5.1'
     implementation 'androidx.recyclerview:recyclerview:1.2.1'
 
diff --git a/emoji2/emoji2-emojipicker/samples/build.gradle b/emoji2/emoji2-emojipicker/samples/build.gradle
index 12415f9..dd1e83e 100644
--- a/emoji2/emoji2-emojipicker/samples/build.gradle
+++ b/emoji2/emoji2-emojipicker/samples/build.gradle
@@ -24,6 +24,7 @@
     api(libs.kotlinStdlib)
     implementation("androidx.appcompat:appcompat:1.5.1")
     implementation project(path: ':emoji2:emoji2-emojipicker')
+    implementation("com.google.guava:guava:31.0.1-android")
 }
 android {
     defaultConfig {
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/AndroidManifest.xml b/emoji2/emoji2-emojipicker/samples/src/main/AndroidManifest.xml
index 45e6dbd..5cee0da 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/AndroidManifest.xml
+++ b/emoji2/emoji2-emojipicker/samples/src/main/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <uses-sdk android:minSdkVersion="21"/>
     <application
-        android:label="Emoji Picker Sample App" >
+        android:label="Emoji Picker Sample App (Customized)" >
         <activity android:name=".MainActivity" android:exported="true"
             android:theme="@style/MyPinkTheme">
             <!-- Handle Google app icon launch. -->
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt b/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
index 1447129..bb892f9 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
+++ b/emoji2/emoji2-emojipicker/samples/src/main/java/androidx/emoji2/emojipicker/samples/MainActivity.kt
@@ -18,11 +18,15 @@
 
 import android.content.Context
 import android.os.Bundle
+import android.widget.Button
 import android.widget.EditText
 import android.widget.ToggleButton
 import androidx.appcompat.app.AppCompatActivity
 import androidx.emoji2.emojipicker.EmojiPickerView
-import androidx.emoji2.emojipicker.RecentEmojiProvider
+import androidx.emoji2.emojipicker.RecentEmojiAsyncProvider
+import androidx.emoji2.emojipicker.RecentEmojiProviderAdapter
+import com.google.common.util.concurrent.Futures
+import com.google.common.util.concurrent.ListenableFuture
 
 class MainActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -33,9 +37,8 @@
         view.setOnEmojiPickedListener {
             findViewById<EditText>(R.id.edit_text).append(it.emoji)
         }
-        view.setRecentEmojiProvider(CustomRecentEmojiProvider(applicationContext))
 
-        findViewById<ToggleButton>(R.id.button)
+        findViewById<ToggleButton>(R.id.toggle_button)
             .setOnCheckedChangeListener { _, isChecked ->
                 if (isChecked) {
                     view.emojiGridColumns = 8
@@ -45,6 +48,11 @@
                     view.emojiGridRows = 15f
                 }
             }
+        findViewById<Button>(R.id.button).setOnClickListener {
+            view.setRecentEmojiProvider(
+                RecentEmojiProviderAdapter(CustomRecentEmojiProvider(applicationContext))
+            )
+        }
     }
 }
 
@@ -53,7 +61,7 @@
  */
 internal class CustomRecentEmojiProvider(
     context: Context
-) : RecentEmojiProvider {
+) : RecentEmojiAsyncProvider {
 
     companion object {
         private const val PREF_KEY_CUSTOM_EMOJI_FREQ = "pref_key_custom_emoji_freq"
@@ -74,8 +82,9 @@
             }?.toMutableMap() ?: mutableMapOf()
     }
 
-    override suspend fun getRecentEmojiList() =
-        emoji2Frequency.toList().sortedByDescending { it.second }.map { it.first }
+    override fun getRecentEmojiListAsync(): ListenableFuture<List<String>> =
+        Futures.immediateFuture(emoji2Frequency.toList().sortedByDescending { it.second }
+            .map { it.first })
 
     override fun recordSelection(emoji: String) {
         emoji2Frequency[emoji] = (emoji2Frequency[emoji] ?: 0) + 1
@@ -88,4 +97,4 @@
             .putString(PREF_KEY_CUSTOM_EMOJI_FREQ, emoji2Frequency.entries.joinToString(SPLIT_CHAR))
             .commit()
     }
-}
+}
\ No newline at end of file
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml b/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
index 41230cb..6f076ad 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
+++ b/emoji2/emoji2-emojipicker/samples/src/main/res/layout-land/main.xml
@@ -25,17 +25,27 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
-    <ToggleButton
-        android:id="@+id/button"
-        android:layout_width="match_parent"
+    <LinearLayout
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textOff="Display Larger Emojis"
-        android:textOn="Display Smaller Emojis" />
+        android:orientation="horizontal">
+        <ToggleButton
+            android:id="@+id/toggle_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textOff="Display Larger Emojis"
+            android:textOn="Display Smaller Emojis" />
+        <Button
+            android:id="@+id/button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Freq Used As Recent" />
+    </LinearLayout>
 
     <androidx.emoji2.emojipicker.EmojiPickerView
         android:id="@+id/emoji_picker"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        app:emojiGridRows="5"
-        app:emojiGridColumns="20" />
+        app:emojiGridColumns="20"
+        app:emojiGridRows="5" />
 </LinearLayout>
diff --git a/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml b/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
index fc424b5..085f307 100644
--- a/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
+++ b/emoji2/emoji2-emojipicker/samples/src/main/res/layout/main.xml
@@ -25,12 +25,22 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
-    <ToggleButton
-        android:id="@+id/button"
-        android:layout_width="match_parent"
+    <LinearLayout
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textOff="Display Larger Emojis"
-        android:textOn="Display Smaller Emojis" />
+        android:orientation="horizontal">
+        <ToggleButton
+            android:id="@+id/toggle_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textOff="Display Larger Emojis"
+            android:textOn="Display Smaller Emojis" />
+        <Button
+            android:id="@+id/button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Freq Used As Recent" />
+    </LinearLayout>
 
     <androidx.emoji2.emojipicker.EmojiPickerView
         android:id="@+id/emoji_picker"
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt
index b8b7ef5..65b90c6 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt
@@ -22,7 +22,6 @@
 import androidx.core.content.res.use
 import androidx.emoji2.emojipicker.utils.FileCache
 import androidx.emoji2.emojipicker.utils.UnicodeRenderableManager
-import androidx.emoji2.text.EmojiCompat
 import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 import kotlinx.coroutines.coroutineScope
@@ -66,17 +65,19 @@
                     context
                 )
             }
+        emojiVariantsLookup = categorizedEmojiData!!
+            .flatMap { it.emojiDataList }
+            .filter { it.variants.isNotEmpty() }
+            .flatMap { it.variants.map { variant -> EmojiViewItem(variant, it.variants) } }
+            .associate { it.emoji to it.variants }
+            .also { emojiVariantsLookup = it }
     }
 
     internal fun getCategorizedEmojiData() = categorizedEmojiData
         ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete")
 
-    internal fun getEmojiVariantsLookup() = emojiVariantsLookup ?: getCategorizedEmojiData()
-        .flatMap { it.emojiDataList }
-        .filter { it.variants.isNotEmpty() }
-        .flatMap { it.variants.map { variant -> EmojiViewItem(variant, it.variants) } }
-        .associate { it.emoji to it.variants }
-        .also { emojiVariantsLookup = it }
+    internal fun getEmojiVariantsLookup() = emojiVariantsLookup
+        ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete")
 
     private suspend fun loadEmoji(
         ta: TypedArray,
@@ -114,7 +115,7 @@
 
     private fun getCacheFileName(categoryIndex: Int) =
         StringBuilder().append("emoji.v1.")
-            .append(if (EmojiCompat.isConfigured()) 1 else 0)
+            .append(if (EmojiPickerView.emojiCompatLoaded) 1 else 0)
             .append(".")
             .append(categoryIndex)
             .append(".")
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
index 21a9b10..4f688fd 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt
@@ -35,7 +35,7 @@
     private val emojiGridColumns: Int,
     private val emojiGridRows: Float,
     private val stickyVariantProvider: StickyVariantProvider,
-    private val emojiPickerItems: EmojiPickerItems,
+    private val emojiPickerItemsProvider: () -> EmojiPickerItems,
     private val onEmojiPickedListener: EmojiPickerBodyAdapter.(EmojiViewItem) -> Unit,
 ) : Adapter<ViewHolder>() {
     private val layoutInflater: LayoutInflater = LayoutInflater.from(context)
@@ -68,13 +68,15 @@
                         onEmojiPickedListener(emojiViewItem)
                     },
                     onEmojiPickedFromPopupListener = { emoji ->
-                        with(
-                            emojiPickerItems.getBodyItem(bindingAdapterPosition)
-                                as EmojiViewData
-                        ) {
-                            if (updateToSticky) {
-                                this.emoji = emoji
-                                notifyItemChanged(bindingAdapterPosition)
+                        val baseEmoji = BundledEmojiListLoader.getEmojiVariantsLookup()[emoji]!![0]
+                        emojiPickerItemsProvider().forEachIndexed { index, itemViewData ->
+                            if (itemViewData is EmojiViewData &&
+                                BundledEmojiListLoader.getEmojiVariantsLookup()
+                                    [itemViewData.emoji]?.get(0) == baseEmoji &&
+                                itemViewData.updateToSticky
+                            ) {
+                                itemViewData.emoji = emoji
+                                notifyItemChanged(index)
                             }
                         }
                     })
@@ -84,7 +86,7 @@
         }
 
     override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
-        val item = emojiPickerItems.getBodyItem(position)
+        val item = emojiPickerItemsProvider().getBodyItem(position)
         when (getItemViewType(position).toItemType()) {
             ItemType.CATEGORY_TITLE -> ViewCompat.requireViewById<TextView>(
                 viewHolder.itemView, R.id.category_name
@@ -102,12 +104,15 @@
         }
     }
 
+    override fun getItemId(position: Int): Long =
+        emojiPickerItemsProvider().getBodyItem(position).hashCode().toLong()
+
     override fun getItemCount(): Int {
-        return emojiPickerItems.size
+        return emojiPickerItemsProvider().size
     }
 
     override fun getItemViewType(position: Int): Int {
-        return emojiPickerItems.getBodyItem(position).viewType
+        return emojiPickerItemsProvider().getBodyItem(position).viewType
     }
 
     private fun getParentWidth(parent: ViewGroup): Int {
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
index a8d08ce..33ea012 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt
@@ -51,6 +51,8 @@
         if (contentIndex == 0 && emptyPlaceholderItem != null) return emptyPlaceholderItem
         return PlaceholderEmoji
     }
+
+    fun getAll(): List<ItemViewData> = IntRange(0, size - 1).map { get(it) }
 }
 
 /**
@@ -58,7 +60,7 @@
  */
 internal class EmojiPickerItems(
     private val groups: List<ItemGroup>,
-) {
+) : Iterable<ItemViewData> {
     val size: Int get() = groups.sumOf { it.size }
 
     init {
@@ -103,4 +105,6 @@
         val index = groups.indexOf(group)
         return firstItemPositionByGroupIndex(index).let { it until it + group.size }
     }
+
+    override fun iterator(): Iterator<ItemViewData> = groups.flatMap { it.getAll() }.iterator()
 }
\ No newline at end of file
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
index 79ce7be..999cb72 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt
@@ -25,6 +25,7 @@
 import androidx.core.util.Consumer
 import androidx.core.view.ViewCompat
 import androidx.emoji2.emojipicker.EmojiPickerConstants.DEFAULT_MAX_RECENT_ITEM_ROWS
+import androidx.emoji2.text.EmojiCompat
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
@@ -44,6 +45,11 @@
     defStyleAttr: Int = 0
 ) :
     FrameLayout(context, attrs, defStyleAttr) {
+
+    internal companion object {
+        internal var emojiCompatLoaded: Boolean = false
+    }
+
     /**
      * The number of rows of the emoji picker.
      *
@@ -103,9 +109,30 @@
         )
         typedArray.recycle()
 
+        if (EmojiCompat.isConfigured()) {
+            when (EmojiCompat.get().loadState) {
+                EmojiCompat.LOAD_STATE_SUCCEEDED -> emojiCompatLoaded = true
+
+                EmojiCompat.LOAD_STATE_LOADING, EmojiCompat.LOAD_STATE_DEFAULT ->
+                    EmojiCompat.get().registerInitCallback(object : EmojiCompat.InitCallback() {
+                        override fun onInitialized() {
+                            emojiCompatLoaded = true
+                            scope.launch(Dispatchers.IO) {
+                                BundledEmojiListLoader.load(context)
+                                withContext(Dispatchers.Main) {
+                                    emojiPickerItems = buildEmojiPickerItems()
+                                    bodyAdapter.notifyDataSetChanged()
+                                }
+                            }
+                        }
+
+                        override fun onFailed(throwable: Throwable?) {}
+                    })
+            }
+        }
         scope.launch(Dispatchers.IO) {
             val load = launch { BundledEmojiListLoader.load(context) }
-            refreshRecentItems()
+            refreshRecent()
             load.join()
 
             withContext(Dispatchers.Main) {
@@ -114,50 +141,49 @@
         }
     }
 
-    private fun createEmojiPickerBodyAdapter(
-        emojiPickerItems: EmojiPickerItems,
-    ): EmojiPickerBodyAdapter {
+    private fun createEmojiPickerBodyAdapter(): EmojiPickerBodyAdapter {
         return EmojiPickerBodyAdapter(
             context,
             emojiGridColumns,
             emojiGridRows,
             stickyVariantProvider,
-            emojiPickerItems,
+            emojiPickerItemsProvider = { emojiPickerItems },
             onEmojiPickedListener = { emojiViewItem ->
                 onEmojiPickedListener?.accept(emojiViewItem)
 
                 scope.launch {
                     recentEmojiProvider.recordSelection(emojiViewItem.emoji)
-                    refreshRecentItems()
                 }
             }
         )
     }
 
-    private fun showEmojiPickerView() {
-        emojiPickerItems = EmojiPickerItems(buildList {
-            add(ItemGroup(
-                R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24,
-                CategoryTitle(context.getString(R.string.emoji_category_recent)),
-                recentItems,
-                forceContentSize = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns,
-                emptyPlaceholderItem = PlaceholderText(
-                    context.getString(R.string.emoji_empty_recent_category)
-                )
-            ).also { recentItemGroup = it })
+    internal fun buildEmojiPickerItems() = EmojiPickerItems(buildList {
+        add(ItemGroup(
+            R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24,
+            CategoryTitle(context.getString(R.string.emoji_category_recent)),
+            recentItems,
+            forceContentSize = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns,
+            emptyPlaceholderItem = PlaceholderText(
+                context.getString(R.string.emoji_empty_recent_category)
+            )
+        ).also { recentItemGroup = it })
 
-            for ((headerIconId, name, emojis) in BundledEmojiListLoader.getCategorizedEmojiData()) {
-                add(
-                    ItemGroup(
-                        headerIconId,
-                        CategoryTitle(name),
-                        emojis.map {
-                            EmojiViewData(stickyVariantProvider[it.emoji])
-                        },
-                    )
+        for ((headerIconId, name, emojis) in BundledEmojiListLoader.getCategorizedEmojiData()) {
+            add(
+                ItemGroup(
+                    headerIconId,
+                    CategoryTitle(name),
+                    emojis.map {
+                        EmojiViewData(stickyVariantProvider[it.emoji])
+                    },
                 )
-            }
-        })
+            )
+        }
+    })
+
+    private fun showEmojiPickerView() {
+        emojiPickerItems = buildEmojiPickerItems()
 
         val bodyLayoutManager = GridLayoutManager(
             context,
@@ -167,19 +193,25 @@
         ).apply {
             spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
                 override fun getSpanSize(position: Int): Int {
-                    return if (emojiPickerItems.getBodyItem(position).occupyEntireRow)
-                        emojiGridColumns
-                    else 1
+                    return when (emojiPickerItems.getBodyItem(position).itemType) {
+                        ItemType.PLACEHOLDER_EMOJI -> 0
+                        ItemType.CATEGORY_TITLE, ItemType.PLACEHOLDER_TEXT -> emojiGridColumns
+                        else -> 1
+                    }
                 }
             }
         }
 
         val headerAdapter =
             EmojiPickerHeaderAdapter(context, emojiPickerItems, onHeaderIconClicked = {
-                bodyLayoutManager.scrollToPositionWithOffset(
-                    emojiPickerItems.firstItemPositionByGroupIndex(it),
-                    0
-                )
+                with(emojiPickerItems.firstItemPositionByGroupIndex(it)) {
+                    if (this == emojiPickerItems.groupRange(recentItemGroup).first) {
+                        scope.launch {
+                            refreshRecent()
+                        }
+                    }
+                    bodyLayoutManager.scrollToPositionWithOffset(this, 0)
+                }
             })
 
         // clear view's children in case of resetting layout
@@ -205,7 +237,9 @@
             // set bodyView
             ViewCompat.requireViewById<RecyclerView>(this, R.id.emoji_picker_body).apply {
                 layoutManager = bodyLayoutManager
-                adapter = createEmojiPickerBodyAdapter(emojiPickerItems).also { bodyAdapter = it }
+                adapter = createEmojiPickerBodyAdapter().apply {
+                    setHasStableIds(true)
+                }.also { bodyAdapter = it }
                 addOnScrollListener(object : RecyclerView.OnScrollListener() {
                     override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                         super.onScrolled(recyclerView, dx, dy)
@@ -213,6 +247,11 @@
                             bodyLayoutManager.findFirstCompletelyVisibleItemPosition()
                         headerAdapter.selectedGroupIndex =
                             emojiPickerItems.groupIndexByItemPosition(position)
+                        if (position !in emojiPickerItems.groupRange(recentItemGroup)) {
+                            scope.launch {
+                                refreshRecent()
+                            }
+                        }
                     }
                 })
                 // Disable item insertion/deletion animation. This keeps view holder unchanged when
@@ -228,7 +267,7 @@
         }
     }
 
-    private suspend fun refreshRecentItems() {
+    internal suspend fun refreshRecent() {
         val recent = recentEmojiProvider.getRecentEmojiList()
         recentItems.clear()
         recentItems.addAll(recent.map {
@@ -237,6 +276,12 @@
                 updateToSticky = false,
             )
         })
+        if (isLaidOut) {
+            val range = emojiPickerItems.groupRange(recentItemGroup)
+            withContext(Dispatchers.Main) {
+                bodyAdapter.notifyItemRangeChanged(range.first, range.last + 1)
+            }
+        }
     }
 
     /**
@@ -249,15 +294,8 @@
 
     fun setRecentEmojiProvider(recentEmojiProvider: RecentEmojiProvider) {
         this.recentEmojiProvider = recentEmojiProvider
-
         scope.launch {
-            refreshRecentItems()
-            if (::emojiPickerItems.isInitialized) {
-                val range = emojiPickerItems.groupRange(recentItemGroup)
-                withContext(Dispatchers.Main) {
-                    bodyAdapter.notifyItemRangeChanged(range.first, range.last + 1)
-                }
-            }
+            refreshRecent()
         }
     }
 
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt
index eba6054..e46d259 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt
@@ -41,8 +41,6 @@
 
     companion object {
         private const val EMOJI_DRAW_TEXT_SIZE_SP = 30
-        private val emojiCompatLoaded = EmojiCompat.isConfigured() &&
-            EmojiCompat.get().loadState == EmojiCompat.LOAD_STATE_SUCCEEDED
     }
 
     private val textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply {
@@ -80,22 +78,24 @@
     var emoji: CharSequence? = null
         set(value) {
             field = value
-            offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT)
             if (value != null) {
                 post {
                     if (value == this.emoji) {
                         drawEmoji(
-                            if (emojiCompatLoaded)
+                            if (EmojiPickerView.emojiCompatLoaded)
                                 EmojiCompat.get().process(value) ?: value else value
                         )
                         contentDescription = value
                     }
                     invalidate()
                 }
+            } else {
+                offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT)
             }
         }
 
     private fun drawEmoji(emoji: CharSequence) {
+        offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT)
         offscreenCanvasBitmap.applyCanvas {
             if (emoji is Spanned) {
                 createStaticLayout(emoji, width).draw(this)
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
index 6f54129..3813964 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt
@@ -76,7 +76,10 @@
         itemView.layoutParams = LayoutParams(width, height)
         emojiView = itemView.findViewById(R.id.emoji_view)
         emojiView.isClickable = true
-        emojiView.setOnClickListener { onEmojiPickedListener(emojiViewItem) }
+        emojiView.setOnClickListener {
+            it.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
+            onEmojiPickedListener(emojiViewItem)
+        }
         indicator = itemView.findViewById(R.id.variant_availability_indicator)
     }
 
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt
index f27cf69..33cfcfb 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt
@@ -26,26 +26,24 @@
 /**
  * Represents an item within the body RecyclerView.
  */
-internal sealed class ItemViewData(itemType: ItemType, val occupyEntireRow: Boolean = false) {
+internal sealed class ItemViewData(val itemType: ItemType) {
     val viewType = itemType.ordinal
 }
 
 /**
  * Title of each category.
  */
-internal class CategoryTitle(val title: String) :
-    ItemViewData(ItemType.CATEGORY_TITLE, occupyEntireRow = true)
+internal data class CategoryTitle(val title: String) : ItemViewData(ItemType.CATEGORY_TITLE)
 
 /**
  * Text to display when the category contains no items.
  */
-internal class PlaceholderText(val text: String) :
-    ItemViewData(ItemType.PLACEHOLDER_TEXT, occupyEntireRow = true)
+internal data class PlaceholderText(val text: String) : ItemViewData(ItemType.PLACEHOLDER_TEXT)
 
 /**
  * Represents an emoji.
  */
-internal class EmojiViewData(
+internal data class EmojiViewData(
     var emoji: String,
     val updateToSticky: Boolean = true
 ) : ItemViewData(ItemType.EMOJI)
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt
new file mode 100644
index 0000000..2ef673f
--- /dev/null
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.emojipicker
+
+import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.guava.await
+
+/**
+ * A interface equivalent to [RecentEmojiProvider] that allows java clients to override the
+ * [ListenableFuture] based function [getRecentEmojiListAsync] in order to provide recent emojis.
+ */
+interface RecentEmojiAsyncProvider {
+    fun recordSelection(emoji: String)
+
+    fun getRecentEmojiListAsync(): ListenableFuture<List<String>>
+}
+
+/**
+ * An adapter for the [RecentEmojiAsyncProvider].
+ */
+class RecentEmojiProviderAdapter(private val recentEmojiAsyncProvider: RecentEmojiAsyncProvider) :
+    RecentEmojiProvider {
+    override fun recordSelection(emoji: String) {
+        recentEmojiAsyncProvider.recordSelection(emoji)
+    }
+
+    override suspend fun getRecentEmojiList() =
+        recentEmojiAsyncProvider.getRecentEmojiListAsync().await()
+}
\ No newline at end of file
diff --git a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt
index 1d56bc7..3e5f5a8 100644
--- a/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt
+++ b/emoji2/emoji2-emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt
@@ -20,6 +20,7 @@
 import android.text.TextPaint
 import androidx.annotation.VisibleForTesting
 import androidx.core.graphics.PaintCompat
+import androidx.emoji2.emojipicker.EmojiPickerView
 import androidx.emoji2.text.EmojiCompat
 
 /**
@@ -59,8 +60,7 @@
      * Note: For older API version, codepoints {@code U+0xFE0F} are removed.
      */
     internal fun isEmojiRenderable(emoji: String) =
-        if (EmojiCompat.isConfigured() &&
-            EmojiCompat.get().loadState == EmojiCompat.LOAD_STATE_SUCCEEDED)
+        if (EmojiPickerView.emojiCompatLoaded)
             EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) > 0
         else getClosestRenderable(emoji) != null
 
diff --git a/enterprise/OWNERS b/enterprise/OWNERS
index 73cf679..8f42a2b 100644
--- a/enterprise/OWNERS
+++ b/enterprise/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 606793
 alexkershaw@google.com
 scottjonathan@google.com
diff --git a/fragment/fragment-lint/OWNERS b/fragment/fragment-lint/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/fragment/fragment-lint/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
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 3032c3a..f44dbf7 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
@@ -26,7 +26,7 @@
 @Suppress("UnstableApiUsage")
 class FragmentIssueRegistry : IssueRegistry() {
     // tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         FragmentTagDetector.ISSUE,
diff --git a/fragment/fragment-testing-lint/OWNERS b/fragment/fragment-testing-lint/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/fragment/fragment-testing-lint/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
diff --git a/fragment/fragment-testing-lint/src/main/java/androidx/fragment/testing/lint/FragmentTestingIssueRegistry.kt b/fragment/fragment-testing-lint/src/main/java/androidx/fragment/testing/lint/FragmentTestingIssueRegistry.kt
index 3ba8a76..304b578 100644
--- a/fragment/fragment-testing-lint/src/main/java/androidx/fragment/testing/lint/FragmentTestingIssueRegistry.kt
+++ b/fragment/fragment-testing-lint/src/main/java/androidx/fragment/testing/lint/FragmentTestingIssueRegistry.kt
@@ -22,7 +22,7 @@
 
 @Suppress("UnstableApiUsage")
 class FragmentTestingIssueRegistry : IssueRegistry() {
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(GradleConfigurationDetector.ISSUE)
     override val vendor = Vendor(
diff --git a/fragment/fragment-testing-manifest-lint/OWNERS b/fragment/fragment-testing-manifest-lint/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/fragment/fragment-testing-manifest-lint/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
diff --git a/fragment/fragment-testing-manifest-lint/src/main/java/androidx/fragment/testing/manifest/lint/FragmentTestingManifestIssueRegistry.kt b/fragment/fragment-testing-manifest-lint/src/main/java/androidx/fragment/testing/manifest/lint/FragmentTestingManifestIssueRegistry.kt
index 7ce1350..41a082b 100644
--- a/fragment/fragment-testing-manifest-lint/src/main/java/androidx/fragment/testing/manifest/lint/FragmentTestingManifestIssueRegistry.kt
+++ b/fragment/fragment-testing-manifest-lint/src/main/java/androidx/fragment/testing/manifest/lint/FragmentTestingManifestIssueRegistry.kt
@@ -22,7 +22,7 @@
 
 @Suppress("UnstableApiUsage")
 class FragmentTestingManifestIssueRegistry : IssueRegistry() {
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(GradleConfigurationDetector.ISSUE)
     override val vendor = Vendor(
diff --git a/fragment/fragment-testing/OWNERS b/fragment/fragment-testing/OWNERS
index 0d174ef..be245e0 100644
--- a/fragment/fragment-testing/OWNERS
+++ b/fragment/fragment-testing/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461227
 hummer@google.com
\ No newline at end of file
diff --git a/fragment/fragment-truth/OWNERS b/fragment/fragment-truth/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/fragment/fragment-truth/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index 8417281..b44ca72 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -339,6 +339,8 @@
   }
 
   public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public default void onBackStackChangeCommitted(androidx.fragment.app.Fragment, boolean);
+    method @MainThread public default void onBackStackChangeStarted(androidx.fragment.app.Fragment, boolean);
     method @MainThread public void onBackStackChanged();
   }
 
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index 8417281..b44ca72 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -339,6 +339,8 @@
   }
 
   public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public default void onBackStackChangeCommitted(androidx.fragment.app.Fragment, boolean);
+    method @MainThread public default void onBackStackChangeStarted(androidx.fragment.app.Fragment, boolean);
     method @MainThread public void onBackStackChanged();
   }
 
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 3671696..cb5b014 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -344,6 +344,8 @@
   }
 
   public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public default void onBackStackChangeCommitted(androidx.fragment.app.Fragment, boolean);
+    method @MainThread public default void onBackStackChangeStarted(androidx.fragment.app.Fragment, boolean);
     method @MainThread public void onBackStackChanged();
   }
 
@@ -454,12 +456,12 @@
     method protected void getBoundsOnScreen(android.view.View!, android.graphics.Rect!);
     method protected static boolean isNullOrEmpty(java.util.List!);
     method public abstract Object! mergeTransitionsInSequence(Object?, Object?, Object?);
-    method public abstract Object! mergeTransitionsTogether(Object, Object, Object?);
+    method public abstract Object! mergeTransitionsTogether(Object?, Object?, Object?);
     method public abstract void removeTarget(Object, android.view.View);
     method public abstract void replaceTargets(Object, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
     method public abstract void scheduleHideFragmentView(Object, android.view.View, java.util.ArrayList<android.view.View!>);
     method public abstract void scheduleRemoveTargets(Object, Object?, java.util.ArrayList<android.view.View!>?, Object?, java.util.ArrayList<android.view.View!>?, Object?, java.util.ArrayList<android.view.View!>?);
-    method public abstract void setEpicenter(Object, android.view.View);
+    method public abstract void setEpicenter(Object, android.view.View?);
     method public abstract void setEpicenter(Object, android.graphics.Rect);
     method public void setListenerForTransitionEnd(androidx.fragment.app.Fragment, Object, androidx.core.os.CancellationSignal, Runnable);
     method public abstract void setSharedElementTargets(Object, android.view.View, java.util.ArrayList<android.view.View!>);
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt
new file mode 100644
index 0000000..8dacb98
--- /dev/null
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/OnBackStackChangedListenerTest.kt
@@ -0,0 +1,338 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.fragment.app.FragmentManager.OnBackStackChangedListener
+import androidx.fragment.app.test.FragmentTestActivity
+import androidx.fragment.test.R
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertThat
+import leakcanary.DetectLeaksAfterTestSuccess
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class OnBackStackChangedListenerTest {
+    @get:Rule
+    val rule = DetectLeaksAfterTestSuccess()
+
+    @Test
+    fun testOnBackChangeStartedAdd() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+            lateinit var innerFragment: Fragment
+            var innerPop = false
+            var count = 0
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeStarted(fragment: Fragment, pop: Boolean) {
+                    innerFragment = fragment
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            assertThat(fragment1).isSameInstanceAs(innerFragment)
+            assertThat(innerPop).isFalse()
+            assertThat(count).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeStartedReplace() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            var innerPop = false
+            var count = 0
+
+            val incomingFragments = mutableListOf<Fragment>()
+
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeStarted(fragment: Fragment, pop: Boolean) {
+                    incomingFragments.add(fragment)
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            val fragment2 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .replace(R.id.content, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            assertThat(incomingFragments).containsExactlyElementsIn(listOf(fragment1, fragment2))
+            assertThat(innerPop).isFalse()
+            assertThat(count).isEqualTo(2)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeStartedPop() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            val fragment2 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .replace(R.id.content, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            var innerPop = false
+            var count = 0
+
+            val incomingFragments = mutableListOf<Fragment>()
+
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeStarted(fragment: Fragment, pop: Boolean) {
+                    incomingFragments.add(fragment)
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            fragmentManager.popBackStack()
+            executePendingTransactions()
+
+            assertThat(incomingFragments).containsExactlyElementsIn(listOf(fragment1, fragment2))
+            assertThat(innerPop).isTrue()
+            assertThat(count).isEqualTo(2)
+
+            incomingFragments.remove(fragment2)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeCommittedAdd() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+            lateinit var innerFragment: Fragment
+            var innerPop = false
+            var count = 0
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeCommitted(fragment: Fragment, pop: Boolean) {
+                    innerFragment = fragment
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            assertThat(fragment1).isSameInstanceAs(innerFragment)
+            assertThat(innerPop).isFalse()
+            assertThat(count).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeCommittedReplace() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            var innerPop = false
+            var count = 0
+
+            val incomingFragments = mutableListOf<Fragment>()
+
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeCommitted(fragment: Fragment, pop: Boolean) {
+                    incomingFragments.add(fragment)
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            val fragment2 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .replace(R.id.content, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            assertThat(incomingFragments).containsExactlyElementsIn(listOf(fragment1, fragment2))
+            assertThat(innerPop).isFalse()
+            assertThat(count).isEqualTo(2)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeCommittedPop() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment1 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment1)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            val fragment2 = StrictFragment()
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .replace(R.id.content, fragment2)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            var innerPop = false
+            var count = 0
+
+            val incomingFragments = mutableListOf<Fragment>()
+
+            fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */
+                }
+
+                override fun onBackStackChangeCommitted(fragment: Fragment, pop: Boolean) {
+                    incomingFragments.add(fragment)
+                    innerPop = pop
+                    count++
+                }
+            })
+
+            fragmentManager.popBackStack()
+            executePendingTransactions()
+
+            assertThat(incomingFragments).containsExactlyElementsIn(listOf(fragment1, fragment2))
+            assertThat(innerPop).isTrue()
+            assertThat(count).isEqualTo(2)
+
+            incomingFragments.remove(fragment2)
+        }
+    }
+
+    @Test
+    fun testOnBackChangeRemoveListenerAfterStarted() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragmentManager = withActivity { supportFragmentManager }
+
+            val fragment = StrictFragment()
+            var startedCount = 0
+            var committedCount = 0
+            val listener = object : OnBackStackChangedListener {
+                override fun onBackStackChanged() { /* nothing */ }
+
+                override fun onBackStackChangeStarted(fragment: Fragment, pop: Boolean) {
+                    startedCount++
+                }
+
+                override fun onBackStackChangeCommitted(fragment: Fragment, pop: Boolean) {
+                    committedCount++
+                }
+            }
+            fragmentManager.addOnBackStackChangedListener(listener)
+            withActivity {
+                fragment.lifecycle.addObserver(object : LifecycleEventObserver {
+                    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                        if (event == Lifecycle.Event.ON_START) {
+                            fragmentManager.removeOnBackStackChangedListener(listener)
+                        }
+                    }
+                })
+            }
+
+            fragmentManager.beginTransaction()
+                .setReorderingAllowed(true)
+                .add(R.id.content, fragment)
+                .addToBackStack(null)
+                .commit()
+            executePendingTransactions()
+
+            assertThat(startedCount).isEqualTo(1)
+            assertThat(committedCount).isEqualTo(0)
+        }
+    }
+}
\ No newline at end of file
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 123bcf4..b912cad 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
@@ -468,7 +468,7 @@
 ) : SpecialEffectsController(container) {
     val operationsToExecute = mutableListOf<Operation>()
 
-    override fun executeOperations(operations: MutableList<Operation>, isPop: Boolean) {
+    override fun executeOperations(operations: List<Operation>, isPop: Boolean) {
         operationsToExecute.addAll(operations)
         operations.forEach { operation ->
             operation.addCompletionListener {
@@ -488,7 +488,7 @@
 ) : SpecialEffectsController(container) {
     var executeOperationsCallCount = 0
 
-    override fun executeOperations(operations: MutableList<Operation>, isPop: Boolean) {
+    override fun executeOperations(operations: List<Operation>, isPop: Boolean) {
         executeOperationsCallCount++
         operations.forEach(Operation::complete)
     }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
deleted file mode 100644
index 5c30741..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
+++ /dev/null
@@ -1,1001 +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.fragment.app;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.collection.ArrayMap;
-import androidx.core.app.SharedElementCallback;
-import androidx.core.os.CancellationSignal;
-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;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A SpecialEffectsController that hooks into the existing Fragment APIs to run
- * animations and transitions.
- */
-class DefaultSpecialEffectsController extends SpecialEffectsController {
-
-    DefaultSpecialEffectsController(@NonNull ViewGroup container) {
-        super(container);
-    }
-
-    @Override
-    void executeOperations(@NonNull List<Operation> operations, boolean isPop) {
-        // Shared element transitions are done between the first fragment leaving and
-        // the last fragment coming in. Finding these operations is the first priority
-        Operation firstOut = null;
-        Operation lastIn = null;
-        for (final Operation operation : operations) {
-            Operation.State currentState = Operation.State.from(operation.getFragment().mView);
-            switch (operation.getFinalState()) {
-                case GONE:
-                case INVISIBLE:
-                case REMOVED:
-                    if (currentState == Operation.State.VISIBLE && firstOut == null) {
-                        // The firstOut Operation is the first Operation moving from VISIBLE
-                        firstOut = operation;
-                    }
-                    break;
-                case VISIBLE:
-                    if (currentState != Operation.State.VISIBLE) {
-                        // The last Operation that moves to VISIBLE is the lastIn Operation
-                        lastIn = operation;
-                    }
-                    break;
-            }
-        }
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG, "Executing operations from " + firstOut + " to " + lastIn);
-        }
-
-        // Now iterate through the operations, collecting the set of animations
-        // and transitions that need to be executed
-        List<AnimationInfo> animations = new ArrayList<>();
-        List<TransitionInfo> transitions = new ArrayList<>();
-        final List<Operation> awaitingContainerChanges = new ArrayList<>(operations);
-
-        // sync animations together before we start loading them.
-        syncAnimations(operations);
-
-        for (final Operation operation : operations) {
-            // Create the animation CancellationSignal
-            CancellationSignal animCancellationSignal = new CancellationSignal();
-            operation.markStartedSpecialEffect(animCancellationSignal);
-            // Add the animation special effect
-            animations.add(new AnimationInfo(operation, animCancellationSignal, isPop));
-
-            // Create the transition CancellationSignal
-            CancellationSignal transitionCancellationSignal = new CancellationSignal();
-            operation.markStartedSpecialEffect(transitionCancellationSignal);
-            // Add the transition special effect
-            transitions.add(new TransitionInfo(operation, transitionCancellationSignal, isPop,
-                    isPop ? operation == firstOut : operation == lastIn));
-
-            // Ensure that if the Operation is synchronously complete, we still
-            // apply the container changes before the Operation completes
-            operation.addCompletionListener(new Runnable() {
-                @Override
-                public void run() {
-                    if (awaitingContainerChanges.contains(operation)) {
-                        awaitingContainerChanges.remove(operation);
-                        applyContainerChanges(operation);
-                    }
-                }
-            });
-        }
-
-        // Start transition special effects
-        Map<Operation, Boolean> startedTransitions = startTransitions(transitions,
-                awaitingContainerChanges, isPop, firstOut, lastIn);
-        boolean startedAnyTransition = startedTransitions.containsValue(true);
-
-        // Start animation special effects
-        startAnimations(animations, awaitingContainerChanges,
-                startedAnyTransition, startedTransitions);
-
-        for (final Operation operation : awaitingContainerChanges) {
-            applyContainerChanges(operation);
-        }
-        awaitingContainerChanges.clear();
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "Completed executing operations from " + firstOut + " to " + lastIn);
-        }
-    }
-
-    /**
-     * Syncs the animations of all other operations with the animations of the last operation.
-     */
-    private void syncAnimations(@NonNull List<Operation> operations) {
-        // get the last operation's fragment
-        Fragment lastOpFragment = operations.get(operations.size() - 1).getFragment();
-        // change the animations of all other fragments to match the last one.
-        for (final Operation operation : operations) {
-            operation.getFragment().mAnimationInfo.mEnterAnim =
-                    lastOpFragment.mAnimationInfo.mEnterAnim;
-            operation.getFragment().mAnimationInfo.mExitAnim =
-                    lastOpFragment.mAnimationInfo.mExitAnim;
-            operation.getFragment().mAnimationInfo.mPopEnterAnim =
-                    lastOpFragment.mAnimationInfo.mPopEnterAnim;
-            operation.getFragment().mAnimationInfo.mPopExitAnim =
-                    lastOpFragment.mAnimationInfo.mPopExitAnim;
-        }
-    }
-
-    private void startAnimations(@NonNull List<AnimationInfo> animationInfos,
-            @NonNull List<Operation> awaitingContainerChanges,
-            boolean startedAnyTransition, @NonNull Map<Operation, Boolean> startedTransitions) {
-        final ViewGroup container = getContainer();
-        final Context context = container.getContext();
-        ArrayList<AnimationInfo> animationsToRun = new ArrayList<>();
-
-        // First run Animators
-        boolean startedAnyAnimator = false;
-        for (final AnimationInfo animationInfo : animationInfos) {
-            if (animationInfo.isVisibilityUnchanged()) {
-                // No change in visibility, so we can immediately complete the animation
-                animationInfo.completeSpecialEffect();
-                continue;
-            }
-            FragmentAnim.AnimationOrAnimator anim = animationInfo.getAnimation(context);
-            if (anim == null) {
-                // No Animator or Animation, so we can immediately complete the animation
-                animationInfo.completeSpecialEffect();
-                continue;
-            }
-            final Animator animator = anim.animator;
-            if (animator == null) {
-                // We must have an Animation to run. Save those for a second pass
-                animationsToRun.add(animationInfo);
-                continue;
-            }
-
-            // First make sure we haven't already started a Transition for this Operation
-            final Operation operation = animationInfo.getOperation();
-            final Fragment fragment = operation.getFragment();
-            boolean startedTransition = Boolean.TRUE.equals(startedTransitions.get(operation));
-            if (startedTransition) {
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, "Ignoring Animator set on "
-                            + fragment + " as this Fragment was involved in a Transition.");
-                }
-                animationInfo.completeSpecialEffect();
-                continue;
-            }
-
-            // Okay, let's run the Animator!
-            startedAnyAnimator = true;
-            final boolean isHideOperation = operation.getFinalState() == Operation.State.GONE;
-            if (isHideOperation) {
-                // We don't want to immediately applyState() to hide operations as that
-                // immediately stops the Animator. Instead we'll applyState() manually
-                // when the Animator ends.
-                awaitingContainerChanges.remove(operation);
-            }
-            final View viewToAnimate = fragment.mView;
-            container.startViewTransition(viewToAnimate);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator anim) {
-                    container.endViewTransition(viewToAnimate);
-                    if (isHideOperation) {
-                        // Specifically for hide operations with Animator, we can't
-                        // applyState until the Animator finishes
-                        operation.getFinalState().applyState(viewToAnimate);
-                    }
-                    animationInfo.completeSpecialEffect();
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG, "Animator from operation " + operation + " has "
-                                + "ended.");
-                    }
-                }
-            });
-            animator.setTarget(viewToAnimate);
-            animator.start();
-            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                Log.v(FragmentManager.TAG, "Animator from operation " + operation + " has "
-                        + "started.");
-            }
-            // Listen for cancellation and use that to cancel the Animator
-            CancellationSignal signal = animationInfo.getSignal();
-            signal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
-                @Override
-                public void onCancel() {
-                    animator.end();
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG, "Animator from operation " + operation + " has "
-                                + "been canceled.");
-                    }
-                }
-            });
-        }
-
-        // Now run Animations
-        for (final AnimationInfo animationInfo : animationsToRun) {
-            // First make sure we haven't already started any Transition
-            final Operation operation = animationInfo.getOperation();
-            final Fragment fragment = operation.getFragment();
-            if (startedAnyTransition) {
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, "Ignoring Animation set on "
-                            + fragment + " as Animations cannot run alongside Transitions.");
-                }
-                animationInfo.completeSpecialEffect();
-                continue;
-            }
-            // Then make sure we haven't already started any Animator
-            if (startedAnyAnimator) {
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, "Ignoring Animation set on "
-                            + fragment + " as Animations cannot run alongside Animators.");
-                }
-                animationInfo.completeSpecialEffect();
-                continue;
-            }
-
-            // Okay, let's run the Animation!
-            final View viewToAnimate = fragment.mView;
-            Animation anim = Preconditions.checkNotNull(
-                    Preconditions.checkNotNull(animationInfo.getAnimation(context)).animation);
-            Operation.State finalState = operation.getFinalState();
-            if (finalState != Operation.State.REMOVED) {
-                // If the operation does not remove the view, we can't use a
-                // AnimationSet due that causing the introduction of visual artifacts (b/163084315).
-                viewToAnimate.startAnimation(anim);
-                // This means we can't use setAnimationListener() without overriding
-                // any listener that the Fragment has set themselves, so we
-                // just mark the special effect as complete immediately.
-                animationInfo.completeSpecialEffect();
-            } else {
-                container.startViewTransition(viewToAnimate);
-                final Animation animation = new FragmentAnim.EndViewTransitionAnimation(
-                        anim, container, viewToAnimate);
-                animation.setAnimationListener(new Animation.AnimationListener() {
-                    @Override
-                    public void onAnimationStart(Animation animation) {
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG, "Animation from operation " + operation
-                                    + " has reached onAnimationStart.");
-                        }
-                    }
-
-                    @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 complete the
-                        // animation until after the onAnimationEnd()
-                        container.post(new Runnable() {
-                            @Override
-                            public void run() {
-                                container.endViewTransition(viewToAnimate);
-                                animationInfo.completeSpecialEffect();
-                            }
-                        });
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG, "Animation from operation " + operation
-                                    + " has ended.");
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationRepeat(Animation animation) {
-                    }
-                });
-                viewToAnimate.startAnimation(animation);
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, "Animation from operation " + operation
-                            + " has started.");
-                }
-            }
-            // Listen for cancellation and use that to cancel the Animation
-            CancellationSignal signal = animationInfo.getSignal();
-            signal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
-                @Override
-                public void onCancel() {
-                    viewToAnimate.clearAnimation();
-                    container.endViewTransition(viewToAnimate);
-                    animationInfo.completeSpecialEffect();
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG, "Animation from operation " + operation
-                                + " has been cancelled.");
-                    }
-                }
-            });
-        }
-    }
-
-    @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<>();
-        // First verify that we can run all transitions together
-        FragmentTransitionImpl transitionImpl = null;
-        for (TransitionInfo transitionInfo : transitionInfos) {
-            if (transitionInfo.isVisibilityUnchanged()) {
-                // No change in visibility, so we can skip this TransitionInfo
-                continue;
-            }
-            FragmentTransitionImpl handlingImpl = transitionInfo.getHandlingImpl();
-            if (transitionImpl == null) {
-                transitionImpl = handlingImpl;
-            } else if (handlingImpl != null && transitionImpl != handlingImpl) {
-                throw new IllegalArgumentException("Mixing framework transitions and "
-                        + "AndroidX transitions is not allowed. Fragment "
-                        + transitionInfo.getOperation().getFragment() + " returned Transition "
-                        + transitionInfo.getTransition() + " which uses a different Transition "
-                        + " type than other Fragments.");
-            }
-        }
-        if (transitionImpl == null) {
-            // There were no transitions at all so we can just complete all of them
-            for (TransitionInfo transitionInfo : transitionInfos) {
-                startedTransitions.put(transitionInfo.getOperation(), false);
-                transitionInfo.completeSpecialEffect();
-            }
-            return startedTransitions;
-        }
-
-        // Every transition needs to target at least one View so that they
-        // don't interfere with one another. This is the view we use
-        // in cases where there are no real views to target
-        final View nonExistentView = new View(getContainer().getContext());
-
-        // Now find the shared element transition if it exists
-        Object sharedElementTransition = null;
-        View firstOutEpicenterView = null;
-        boolean hasLastInEpicenter = false;
-        final Rect lastInEpicenterRect = new Rect();
-        ArrayList<View> sharedElementFirstOutViews = new ArrayList<>();
-        ArrayList<View> sharedElementLastInViews = new ArrayList<>();
-        ArrayMap<String, String> sharedElementNameMapping = new ArrayMap<>();
-        for (final TransitionInfo transitionInfo : transitionInfos) {
-            boolean hasSharedElementTransition = transitionInfo.hasSharedElementTransition();
-            // Compute the shared element transition between the firstOut and lastIn Fragments
-            if (hasSharedElementTransition && firstOut != null && lastIn != null) {
-                // swapSharedElementTargets requires wrapping this in a TransitionSet
-                sharedElementTransition = transitionImpl.wrapTransitionInSet(
-                        transitionImpl.cloneTransition(
-                                transitionInfo.getSharedElementTransition()));
-                // The exiting shared elements default to the source names from the
-                // last in fragment
-                ArrayList<String> exitingNames = lastIn.getFragment()
-                        .getSharedElementSourceNames();
-                // But if we're doing multiple transactions, we may need to re-map
-                // the names from the first out fragment
-                ArrayList<String> firstOutSourceNames = firstOut.getFragment()
-                        .getSharedElementSourceNames();
-                ArrayList<String> firstOutTargetNames = firstOut.getFragment()
-                        .getSharedElementTargetNames();
-                // We do this by iterating through each first out target,
-                // seeing if there is a match from the last in sources
-                for (int index = 0; index < firstOutTargetNames.size(); index++) {
-                    int nameIndex = exitingNames.indexOf(firstOutTargetNames.get(index));
-                    if (nameIndex != -1) {
-                        // If we found a match, replace the last in source name
-                        // with the first out source name
-                        exitingNames.set(nameIndex, firstOutSourceNames.get(index));
-                    }
-                }
-                ArrayList<String> enteringNames = lastIn.getFragment()
-                        .getSharedElementTargetNames();
-                SharedElementCallback exitingCallback;
-                SharedElementCallback enteringCallback;
-                if (!isPop) {
-                    // Forward transitions have firstOut fragment exiting and the
-                    // lastIn fragment entering
-                    exitingCallback = firstOut.getFragment().getExitTransitionCallback();
-                    enteringCallback = lastIn.getFragment().getEnterTransitionCallback();
-                } else {
-                    // A pop is the reverse: the firstOut fragment is entering and the
-                    // lastIn fragment is exiting
-                    exitingCallback = firstOut.getFragment().getEnterTransitionCallback();
-                    enteringCallback = lastIn.getFragment().getExitTransitionCallback();
-                }
-                int numSharedElements = exitingNames.size();
-                for (int i = 0; i < numSharedElements; i++) {
-                    String exitingName = exitingNames.get(i);
-                    String enteringName = enteringNames.get(i);
-                    sharedElementNameMapping.put(exitingName, enteringName);
-                }
-
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, ">>> entering view names <<<");
-                    for (String name: enteringNames) {
-                        Log.v(FragmentManager.TAG,  "Name: " + name);
-                    }
-                    Log.v(FragmentManager.TAG, ">>> exiting view names <<<");
-                    for (String name: exitingNames) {
-                        Log.v(FragmentManager.TAG,  "Name: " + name);
-                    }
-                }
-
-                // Find all of the Views from the firstOut fragment that are
-                // part of the shared element transition
-                final ArrayMap<String, View> firstOutViews = new ArrayMap<>();
-                findNamedViews(firstOutViews, firstOut.getFragment().mView);
-                firstOutViews.retainAll(exitingNames);
-                if (exitingCallback != null) {
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG,
-                                "Executing exit callback for operation " + firstOut);
-                    }
-                    // Give the SharedElementCallback a chance to override the default mapping
-                    exitingCallback.onMapSharedElements(exitingNames, firstOutViews);
-                    for (int i = exitingNames.size() - 1; i >= 0; i--) {
-                        String name = exitingNames.get(i);
-                        View view = firstOutViews.get(name);
-                        if (view == null) {
-                            sharedElementNameMapping.remove(name);
-                        } else if (!name.equals(ViewCompat.getTransitionName(view))) {
-                            String targetValue = sharedElementNameMapping.remove(name);
-                            sharedElementNameMapping.put(ViewCompat.getTransitionName(view),
-                                    targetValue);
-                        }
-                    }
-                } else {
-                    // Only keep the mapping of elements that were found in the firstOut Fragment
-                    sharedElementNameMapping.retainAll(firstOutViews.keySet());
-                }
-
-                // Find all of the Views from the lastIn fragment that are
-                // part of the shared element transition
-                final ArrayMap<String, View> lastInViews = new ArrayMap<>();
-                findNamedViews(lastInViews, lastIn.getFragment().mView);
-                lastInViews.retainAll(enteringNames);
-                lastInViews.retainAll(sharedElementNameMapping.values());
-                if (enteringCallback != null) {
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG,
-                                "Executing enter callback for operation " + lastIn);
-                    }
-                    // Give the SharedElementCallback a chance to override the default mapping
-                    enteringCallback.onMapSharedElements(enteringNames, lastInViews);
-                    for (int i = enteringNames.size() - 1; i >= 0; i--) {
-                        String name = enteringNames.get(i);
-                        View view = lastInViews.get(name);
-                        if (view == null) {
-                            String key = FragmentTransition.findKeyForValue(
-                                    sharedElementNameMapping, name);
-                            if (key != null) {
-                                sharedElementNameMapping.remove(key);
-                            }
-                        } else if (!name.equals(ViewCompat.getTransitionName(view))) {
-                            String key = FragmentTransition.findKeyForValue(
-                                    sharedElementNameMapping, name);
-                            if (key != null) {
-                                sharedElementNameMapping.put(key,
-                                        ViewCompat.getTransitionName(view));
-                            }
-                        }
-                    }
-                } else {
-                    // Only keep the mapping of elements that were found in the lastIn Fragment
-                    FragmentTransition.retainValues(sharedElementNameMapping, lastInViews);
-                }
-
-                // Now make a final pass through the Views list to ensure they
-                // don't still have elements that were removed from the mapping
-                retainMatchingViews(firstOutViews, sharedElementNameMapping.keySet());
-                retainMatchingViews(lastInViews, sharedElementNameMapping.values());
-
-                if (sharedElementNameMapping.isEmpty()) {
-                    // We couldn't find any valid shared element mappings, so clear out
-                    // the shared element transition information entirely
-                    sharedElementTransition = null;
-                    sharedElementFirstOutViews.clear();
-                    sharedElementLastInViews.clear();
-                } else {
-                    // Call through to onSharedElementStart() before capturing the
-                    // starting values for the shared element transition
-                    FragmentTransition.callSharedElementStartEnd(
-                            lastIn.getFragment(), firstOut.getFragment(), isPop,
-                            firstOutViews, true);
-                    // Trigger the onSharedElementEnd callback in the next frame after
-                    // the starting values are captured and before capturing the end states
-                    OneShotPreDrawListener.add(getContainer(), new Runnable() {
-                        @Override
-                        public void run() {
-                            FragmentTransition.callSharedElementStartEnd(
-                                    lastIn.getFragment(), firstOut.getFragment(), isPop,
-                                    lastInViews, false);
-                        }
-                    });
-
-                    sharedElementFirstOutViews.addAll(firstOutViews.values());
-
-                    // Compute the epicenter of the firstOut transition
-                    if (!exitingNames.isEmpty()) {
-                        String epicenterViewName = exitingNames.get(0);
-                        firstOutEpicenterView = firstOutViews.get(epicenterViewName);
-                        transitionImpl.setEpicenter(sharedElementTransition,
-                                firstOutEpicenterView);
-                    }
-
-                    sharedElementLastInViews.addAll(lastInViews.values());
-
-                    // Compute the epicenter of the lastIn transition
-                    if (!enteringNames.isEmpty()) {
-                        String epicenterViewName = enteringNames.get(0);
-                        final View lastInEpicenterView = lastInViews.get(epicenterViewName);
-                        if (lastInEpicenterView != null) {
-                            hasLastInEpicenter = true;
-                            // We can't set the epicenter here directly since the View might
-                            // not have been laid out as of yet, so instead we set a Rect as
-                            // the epicenter and compute the bounds one frame later
-                            final FragmentTransitionImpl impl = transitionImpl;
-                            OneShotPreDrawListener.add(getContainer(), new Runnable() {
-                                @Override
-                                public void run() {
-                                    impl.getBoundsOnScreen(lastInEpicenterView,
-                                            lastInEpicenterRect);
-                                }
-                            });
-                        }
-                    }
-
-                    // Now set the transition's targets to only the firstOut Fragment's views
-                    // It'll be swapped to the lastIn Fragment's views after the
-                    // transition is started
-                    transitionImpl.setSharedElementTargets(sharedElementTransition,
-                            nonExistentView, sharedElementFirstOutViews);
-                    // After the swap to the lastIn Fragment's view (done below), we
-                    // need to clean up those targets. We schedule this here so that it
-                    // runs directly after the swap
-                    transitionImpl.scheduleRemoveTargets(sharedElementTransition,
-                            null, null, null, null,
-                            sharedElementTransition, sharedElementLastInViews);
-                    // Both the firstOut and lastIn Operations are now associated
-                    // with a Transition
-                    startedTransitions.put(firstOut, true);
-                    startedTransitions.put(lastIn, true);
-                }
-            }
-        }
-        ArrayList<View> enteringViews = new ArrayList<>();
-        // These transitions run together, overlapping one another
-        Object mergedTransition = null;
-        // These transitions run only after all of the other transitions complete
-        Object mergedNonOverlappingTransition = null;
-        // Now iterate through the set of transitions and merge them together
-        for (final TransitionInfo transitionInfo : transitionInfos) {
-            if (transitionInfo.isVisibilityUnchanged()) {
-                // No change in visibility, so we can immediately complete the transition
-                startedTransitions.put(transitionInfo.getOperation(), false);
-                transitionInfo.completeSpecialEffect();
-                continue;
-            }
-            Object transition = transitionImpl.cloneTransition(transitionInfo.getTransition());
-            Operation operation = transitionInfo.getOperation();
-            boolean involvedInSharedElementTransition = sharedElementTransition != null
-                    && (operation == firstOut || operation == lastIn);
-            if (transition == null) {
-                // Nothing more to do if the transition is null
-                if (!involvedInSharedElementTransition) {
-                    // Only complete the transition if this fragment isn't involved
-                    // in the shared element transition (as otherwise we need to wait
-                    // for that to finish)
-                    startedTransitions.put(operation, false);
-                    transitionInfo.completeSpecialEffect();
-                }
-            } else {
-                // Target the Transition to *only* the set of transitioning views
-                final ArrayList<View> transitioningViews = new ArrayList<>();
-                captureTransitioningViews(transitioningViews,
-                        operation.getFragment().mView);
-                if (involvedInSharedElementTransition) {
-                    // Remove all of the shared element views from the transition
-                    if (operation == firstOut) {
-                        transitioningViews.removeAll(sharedElementFirstOutViews);
-                    } else {
-                        transitioningViews.removeAll(sharedElementLastInViews);
-                    }
-                }
-                if (transitioningViews.isEmpty()) {
-                    transitionImpl.addTarget(transition, nonExistentView);
-                } else {
-                    transitionImpl.addTargets(transition, transitioningViews);
-                    transitionImpl.scheduleRemoveTargets(transition,
-                            transition, transitioningViews,
-                            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
-                        ArrayList<View> transitioningViewsToHide =
-                                new ArrayList<>(transitioningViews);
-                        transitioningViewsToHide.remove(operation.getFragment().mView);
-                        transitionImpl.scheduleHideFragmentView(transition,
-                                operation.getFragment().mView, transitioningViewsToHide);
-                        // 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.
-                        OneShotPreDrawListener.add(getContainer(), new Runnable() {
-                            @Override
-                            public void run() {
-                                FragmentTransition.setViewVisibility(transitioningViews,
-                                        View.INVISIBLE);
-                            }
-                        });
-                    }
-                }
-                if (operation.getFinalState() == Operation.State.VISIBLE) {
-                    enteringViews.addAll(transitioningViews);
-                    if (hasLastInEpicenter) {
-                        transitionImpl.setEpicenter(transition, lastInEpicenterRect);
-                    }
-                } else {
-                    transitionImpl.setEpicenter(transition, firstOutEpicenterView);
-                }
-                startedTransitions.put(operation, true);
-                // Now determine how this transition should be merged together
-                if (transitionInfo.isOverlapAllowed()) {
-                    // Overlap is allowed, so add them to the mergeTransition set
-                    mergedTransition = transitionImpl.mergeTransitionsTogether(
-                            mergedTransition, transition, null);
-                } else {
-                    // Overlap is not allowed, add them to the mergedNonOverlappingTransition
-                    mergedNonOverlappingTransition = transitionImpl.mergeTransitionsTogether(
-                            mergedNonOverlappingTransition, transition, null);
-                }
-            }
-        }
-
-        // Make sure that the mergedNonOverlappingTransition set
-        // runs after the mergedTransition set is complete
-        mergedTransition = transitionImpl.mergeTransitionsInSequence(mergedTransition,
-                mergedNonOverlappingTransition, sharedElementTransition);
-
-        // If there's no transitions playing together, no non-overlapping transitions,
-        // and no shared element transitions, mergedTransition will be null and
-        // there's nothing else we need to do
-        if (mergedTransition == null) {
-            return startedTransitions;
-        }
-
-        // Now set up our completion signal on the completely merged transition set
-        for (final TransitionInfo transitionInfo : transitionInfos) {
-            if (transitionInfo.isVisibilityUnchanged()) {
-                // No change in visibility, so we've already completed the transition
-                continue;
-            }
-            Object transition = transitionInfo.getTransition();
-            Operation operation = transitionInfo.getOperation();
-            boolean involvedInSharedElementTransition = sharedElementTransition != null
-                    && (operation == firstOut || operation == lastIn);
-            if (transition != null || involvedInSharedElementTransition) {
-                // If the container has never been laid out, transitions will not start so
-                // so lets instantly complete them.
-                if (!ViewCompat.isLaidOut(getContainer())) {
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG,
-                                "SpecialEffectsController: Container " + getContainer()
-                                        + " has not been laid out. Completing operation "
-                                        + operation);
-                    }
-                    transitionInfo.completeSpecialEffect();
-                } else {
-                    transitionImpl.setListenerForTransitionEnd(
-                            transitionInfo.getOperation().getFragment(),
-                            mergedTransition,
-                            transitionInfo.getSignal(),
-                            new Runnable() {
-                                @Override
-                                public void run() {
-                                    transitionInfo.completeSpecialEffect();
-                                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                                        Log.v(FragmentManager.TAG,
-                                                "Transition for operation " + operation + "has "
-                                                        + "completed");
-                                    }
-                                }
-                            });
-                }
-            }
-        }
-        // Transitions won't run if the container isn't laid out so
-        // we can return early here to avoid doing unnecessary work.
-        if (!ViewCompat.isLaidOut(getContainer())) {
-            return startedTransitions;
-        }
-        // First, hide all of the entering views so they're in
-        // the correct initial state
-        FragmentTransition.setViewVisibility(enteringViews, View.INVISIBLE);
-        ArrayList<String> inNames =
-                transitionImpl.prepareSetNameOverridesReordered(sharedElementLastInViews);
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG, ">>>>> Beginning transition <<<<<");
-            Log.v(FragmentManager.TAG, ">>>>> SharedElementFirstOutViews <<<<<");
-            for (View view: sharedElementFirstOutViews) {
-                Log.v(FragmentManager.TAG,
-                        "View: " + view + " Name: " + ViewCompat.getTransitionName(view));
-            }
-            Log.v(FragmentManager.TAG, ">>>>> SharedElementLastInViews <<<<<");
-            for (View view: sharedElementLastInViews) {
-                Log.v(FragmentManager.TAG,  "View: " + view + " Name: "
-                        + ViewCompat.getTransitionName(view));
-            }
-        }
-        // Now actually start the transition
-        transitionImpl.beginDelayedTransition(getContainer(), mergedTransition);
-        transitionImpl.setNameOverridesReordered(getContainer(), sharedElementFirstOutViews,
-                sharedElementLastInViews, inNames, sharedElementNameMapping);
-        // Then, show all of the entering views, putting them into
-        // the correct final state
-        FragmentTransition.setViewVisibility(enteringViews, View.VISIBLE);
-        transitionImpl.swapSharedElementTargets(sharedElementTransition,
-                sharedElementFirstOutViews, sharedElementLastInViews);
-        return startedTransitions;
-    }
-
-    /**
-     * Retain only the shared element views that have a transition name that is in
-     * the set of transition names.
-     *
-     * @param sharedElementViews The map of shared element transitions that should be filtered.
-     * @param transitionNames The set of transition names to be retained.
-     */
-    void retainMatchingViews(@NonNull ArrayMap<String, View> sharedElementViews,
-            @NonNull Collection<String> transitionNames) {
-        Iterator<Map.Entry<String, View>> iterator = sharedElementViews.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Map.Entry<String, View> entry = iterator.next();
-            if (!transitionNames.contains(ViewCompat.getTransitionName(entry.getValue()))) {
-                iterator.remove();
-            }
-        }
-    }
-
-    /**
-     * Gets the Views in the hierarchy affected by entering and exiting transitions.
-     *
-     * @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) {
-            ViewGroup viewGroup = (ViewGroup) view;
-            if (ViewGroupCompat.isTransitionGroup(viewGroup)) {
-                if (!transitioningViews.contains(view)) {
-                    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);
-                    }
-                }
-            }
-        } else {
-            if (!transitioningViews.contains(view)) {
-                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) {
-        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);
-                if (child.getVisibility() == View.VISIBLE) {
-                    findNamedViews(namedViews, child);
-                }
-            }
-        }
-    }
-
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    void applyContainerChanges(@NonNull Operation operation) {
-        View view = operation.getFragment().mView;
-        operation.getFinalState().applyState(view);
-    }
-
-    private static class SpecialEffectsInfo {
-        @NonNull
-        private final Operation mOperation;
-        @NonNull
-        private final CancellationSignal mSignal;
-
-        SpecialEffectsInfo(@NonNull Operation operation, @NonNull CancellationSignal signal) {
-            mOperation = operation;
-            mSignal = signal;
-        }
-
-        @NonNull
-        Operation getOperation() {
-            return mOperation;
-        }
-
-        @NonNull
-        CancellationSignal getSignal() {
-            return mSignal;
-        }
-
-        boolean isVisibilityUnchanged() {
-            Operation.State currentState = Operation.State.from(
-                    mOperation.getFragment().mView);
-            Operation.State finalState = mOperation.getFinalState();
-            return currentState == finalState || (currentState != Operation.State.VISIBLE
-                    && finalState != Operation.State.VISIBLE);
-        }
-
-        void completeSpecialEffect() {
-            mOperation.completeSpecialEffect(mSignal);
-        }
-    }
-
-    private static class AnimationInfo extends SpecialEffectsInfo {
-
-        private boolean mIsPop;
-        private boolean mLoadedAnim = false;
-        @Nullable
-        private FragmentAnim.AnimationOrAnimator mAnimation;
-
-        AnimationInfo(@NonNull Operation operation, @NonNull CancellationSignal signal,
-                boolean isPop) {
-            super(operation, signal);
-            mIsPop = isPop;
-        }
-
-        @Nullable
-        FragmentAnim.AnimationOrAnimator getAnimation(@NonNull Context context) {
-            if (mLoadedAnim) {
-                return mAnimation;
-            }
-            mAnimation = FragmentAnim.loadAnimation(context,
-                    getOperation().getFragment(),
-                    getOperation().getFinalState() == Operation.State.VISIBLE,
-                    mIsPop);
-            mLoadedAnim = true;
-            return mAnimation;
-        }
-    }
-
-    private static class TransitionInfo extends SpecialEffectsInfo {
-        @Nullable
-        private final Object mTransition;
-        private final boolean mOverlapAllowed;
-        @Nullable
-        private final Object mSharedElementTransition;
-
-        TransitionInfo(@NonNull Operation operation,
-                @NonNull CancellationSignal signal, boolean isPop,
-                boolean providesSharedElementTransition) {
-            super(operation, signal);
-            if (operation.getFinalState() == Operation.State.VISIBLE) {
-                mTransition = isPop
-                        ? operation.getFragment().getReenterTransition()
-                        : operation.getFragment().getEnterTransition();
-                // Entering transitions can choose to run after all exit
-                // transitions complete, rather than overlapping with them
-                mOverlapAllowed = isPop
-                        ? operation.getFragment().getAllowReturnTransitionOverlap()
-                        : operation.getFragment().getAllowEnterTransitionOverlap();
-            } else {
-                mTransition = isPop
-                        ? operation.getFragment().getReturnTransition()
-                        : operation.getFragment().getExitTransition();
-                // Removing Fragments always overlap other transitions
-                mOverlapAllowed = true;
-            }
-            if (providesSharedElementTransition) {
-                if (isPop) {
-                    mSharedElementTransition =
-                            operation.getFragment().getSharedElementReturnTransition();
-                } else {
-                    mSharedElementTransition =
-                            operation.getFragment().getSharedElementEnterTransition();
-                }
-            } else {
-                mSharedElementTransition = null;
-            }
-        }
-
-        @Nullable
-        Object getTransition() {
-            return mTransition;
-        }
-
-        boolean isOverlapAllowed() {
-            return mOverlapAllowed;
-        }
-
-        public boolean hasSharedElementTransition() {
-            return mSharedElementTransition != null;
-        }
-
-        @Nullable
-        public Object getSharedElementTransition() {
-            return mSharedElementTransition;
-        }
-
-        @Nullable
-        FragmentTransitionImpl getHandlingImpl() {
-            FragmentTransitionImpl transitionImpl = getHandlingImpl(mTransition);
-            FragmentTransitionImpl sharedElementTransitionImpl =
-                    getHandlingImpl(mSharedElementTransition);
-            if (transitionImpl != null && sharedElementTransitionImpl != null
-                    && transitionImpl != sharedElementTransitionImpl) {
-                throw new IllegalArgumentException("Mixing framework transitions and "
-                        + "AndroidX transitions is not allowed. Fragment "
-                        + getOperation().getFragment() + " returned Transition "
-                        + mTransition + " which uses a different Transition "
-                        + " type than its shared element transition "
-                        + mSharedElementTransition);
-            }
-            return transitionImpl != null ? transitionImpl : sharedElementTransitionImpl;
-        }
-
-        @Nullable
-        private FragmentTransitionImpl getHandlingImpl(Object transition) {
-            if (transition == null) {
-                return null;
-            }
-            if (FragmentTransition.PLATFORM_IMPL != null
-                    && FragmentTransition.PLATFORM_IMPL.canHandle(transition)) {
-                return FragmentTransition.PLATFORM_IMPL;
-            }
-            if (FragmentTransition.SUPPORT_IMPL != null
-                    && FragmentTransition.SUPPORT_IMPL.canHandle(transition)) {
-                return FragmentTransition.SUPPORT_IMPL;
-            }
-            throw new IllegalArgumentException("Transition " + transition + " for fragment "
-                    + getOperation().getFragment() + " is not a valid framework Transition or "
-                    + "AndroidX Transition");
-        }
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt
new file mode 100644
index 0000000..fb949ef
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt
@@ -0,0 +1,874 @@
+/*
+ * 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.fragment.app
+
+import android.content.Context
+import android.graphics.Rect
+import android.util.Log
+import android.view.View
+import android.view.ViewGroup
+import android.view.animation.Animation
+import androidx.collection.ArrayMap
+import androidx.core.animation.doOnEnd
+import androidx.core.os.CancellationSignal
+import androidx.core.view.OneShotPreDrawListener
+import androidx.core.view.ViewCompat
+import androidx.core.view.ViewGroupCompat
+import androidx.fragment.app.FragmentTransition.callSharedElementStartEnd
+import androidx.fragment.app.FragmentTransition.findKeyForValue
+import androidx.fragment.app.FragmentTransition.retainValues
+import androidx.fragment.app.FragmentTransition.setViewVisibility
+import androidx.fragment.app.SpecialEffectsController.Operation.State.Companion.asOperationState
+
+/**
+ * A SpecialEffectsController that hooks into the existing Fragment APIs to run
+ * animations and transitions.
+ */
+internal class DefaultSpecialEffectsController(
+    container: ViewGroup
+) : SpecialEffectsController(container) {
+    override fun executeOperations(operations: List<Operation>, isPop: Boolean) {
+        // Shared element transitions are done between the first fragment leaving and
+        // the last fragment coming in. Finding these operations is the first priority
+        val firstOut = operations.firstOrNull { operation ->
+            val currentState = operation.fragment.mView.asOperationState()
+            // The firstOut Operation is the first Operation moving from VISIBLE
+            currentState == Operation.State.VISIBLE &&
+                operation.finalState != Operation.State.VISIBLE
+        }
+        val lastIn = operations.lastOrNull { operation ->
+            val currentState = operation.fragment.mView.asOperationState()
+            // The last Operation that moves to VISIBLE is the lastIn Operation
+            currentState != Operation.State.VISIBLE &&
+                operation.finalState == Operation.State.VISIBLE
+        }
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(FragmentManager.TAG, "Executing operations from $firstOut to $lastIn")
+        }
+
+        // Now iterate through the operations, collecting the set of animations
+        // and transitions that need to be executed
+        val animations = mutableListOf<AnimationInfo>()
+        val transitions = mutableListOf<TransitionInfo>()
+        val awaitingContainerChanges = operations.toMutableList()
+
+        // sync animations together before we start loading them.
+        syncAnimations(operations)
+        for (operation: Operation in operations) {
+            // Create the animation CancellationSignal
+            val animCancellationSignal = CancellationSignal()
+            operation.markStartedSpecialEffect(animCancellationSignal)
+            // Add the animation special effect
+            animations.add(AnimationInfo(operation, animCancellationSignal, isPop))
+
+            // Create the transition CancellationSignal
+            val transitionCancellationSignal = CancellationSignal()
+            operation.markStartedSpecialEffect(transitionCancellationSignal)
+            // Add the transition special effect
+            transitions.add(TransitionInfo(operation, transitionCancellationSignal, isPop,
+                    if (isPop) operation === firstOut else operation === lastIn))
+
+            // Ensure that if the Operation is synchronously complete, we still
+            // apply the container changes before the Operation completes
+            operation.addCompletionListener {
+                if (awaitingContainerChanges.contains(operation)) {
+                    awaitingContainerChanges.remove(operation)
+                    applyContainerChanges(operation)
+                }
+            }
+        }
+
+        // Start transition special effects
+        val startedTransitions = startTransitions(transitions, awaitingContainerChanges, isPop,
+            firstOut, lastIn)
+        val startedAnyTransition = startedTransitions.containsValue(true)
+
+        // Start animation special effects
+        startAnimations(animations, awaitingContainerChanges, startedAnyTransition,
+            startedTransitions)
+        for (operation: Operation in awaitingContainerChanges) {
+            applyContainerChanges(operation)
+        }
+        awaitingContainerChanges.clear()
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(FragmentManager.TAG,
+                "Completed executing operations from $firstOut to $lastIn")
+        }
+    }
+
+    /**
+     * Syncs the animations of all other operations with the animations of the last operation.
+     */
+    private fun syncAnimations(operations: List<Operation>) {
+        // get the last operation's fragment
+        val lastOpFragment = operations.last().fragment
+        // change the animations of all other fragments to match the last one.
+        for (operation: Operation in operations) {
+            operation.fragment.mAnimationInfo.mEnterAnim = lastOpFragment.mAnimationInfo.mEnterAnim
+            operation.fragment.mAnimationInfo.mExitAnim = lastOpFragment.mAnimationInfo.mExitAnim
+            operation.fragment.mAnimationInfo.mPopEnterAnim =
+                lastOpFragment.mAnimationInfo.mPopEnterAnim
+            operation.fragment.mAnimationInfo.mPopExitAnim =
+                lastOpFragment.mAnimationInfo.mPopExitAnim
+        }
+    }
+
+    private fun startAnimations(
+        animationInfos: List<AnimationInfo>,
+        awaitingContainerChanges: MutableList<Operation>,
+        startedAnyTransition: Boolean,
+        startedTransitions: Map<Operation, Boolean>
+    ) {
+        val context = container.context
+        val animationsToRun = mutableListOf<AnimationInfo>()
+
+        // First run Animators
+        var startedAnyAnimator = false
+        for (animationInfo: AnimationInfo in animationInfos) {
+            if (animationInfo.isVisibilityUnchanged) {
+                // No change in visibility, so we can immediately complete the animation
+                animationInfo.completeSpecialEffect()
+                continue
+            }
+            val anim = animationInfo.getAnimation(context)
+            if (anim == null) {
+                // No Animator or Animation, so we can immediately complete the animation
+                animationInfo.completeSpecialEffect()
+                continue
+            }
+            val animator = anim.animator
+            if (animator == null) {
+                // We must have an Animation to run. Save those for a second pass
+                animationsToRun.add(animationInfo)
+                continue
+            }
+
+            // First make sure we haven't already started a Transition for this Operation
+            val operation: Operation = animationInfo.operation
+            val fragment = operation.fragment
+            val startedTransition = startedTransitions[operation] == true
+            if (startedTransition) {
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Ignoring Animator set on $fragment as this Fragment was involved " +
+                            "in a Transition.")
+                }
+                animationInfo.completeSpecialEffect()
+                continue
+            }
+
+            // Okay, let's run the Animator!
+            startedAnyAnimator = true
+            val isHideOperation = operation.finalState === Operation.State.GONE
+            if (isHideOperation) {
+                // We don't want to immediately applyState() to hide operations as that
+                // immediately stops the Animator. Instead we'll applyState() manually
+                // when the Animator ends.
+                awaitingContainerChanges.remove(operation)
+            }
+            val viewToAnimate = fragment.mView
+            container.startViewTransition(viewToAnimate)
+            animator.doOnEnd {
+                container.endViewTransition(viewToAnimate)
+                if (isHideOperation) {
+                    // Specifically for hide operations with Animator, we can't
+                    // applyState until the Animator finishes
+                    operation.finalState.applyState(viewToAnimate)
+                }
+                animationInfo.completeSpecialEffect()
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Animator from operation $operation has ended.")
+                }
+            }
+            animator.setTarget(viewToAnimate)
+            animator.start()
+            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                Log.v(FragmentManager.TAG,
+                    "Animator from operation $operation has started.")
+            }
+            // Listen for cancellation and use that to cancel the Animator
+            val signal: CancellationSignal = animationInfo.signal
+            signal.setOnCancelListener {
+                animator.end()
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Animator from operation $operation has been canceled.")
+                }
+            }
+        }
+
+        // Now run Animations
+        for (animationInfo: AnimationInfo in animationsToRun) {
+            // First make sure we haven't already started any Transition
+            val operation: Operation = animationInfo.operation
+            val fragment = operation.fragment
+            if (startedAnyTransition) {
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Ignoring Animation set on $fragment as Animations cannot " +
+                            "run alongside Transitions.")
+                }
+                animationInfo.completeSpecialEffect()
+                continue
+            }
+            // Then make sure we haven't already started any Animator
+            if (startedAnyAnimator) {
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Ignoring Animation set on $fragment as Animations cannot " +
+                            "run alongside Animators.")
+                }
+                animationInfo.completeSpecialEffect()
+                continue
+            }
+
+            // Okay, let's run the Animation!
+            val viewToAnimate = fragment.mView
+            val anim = checkNotNull(checkNotNull(animationInfo.getAnimation(context)).animation)
+            val finalState = operation.finalState
+            if (finalState !== Operation.State.REMOVED) {
+                // If the operation does not remove the view, we can't use a
+                // AnimationSet due that causing the introduction of visual artifacts (b/163084315).
+                viewToAnimate.startAnimation(anim)
+                // This means we can't use setAnimationListener() without overriding
+                // any listener that the Fragment has set themselves, so we
+                // just mark the special effect as complete immediately.
+                animationInfo.completeSpecialEffect()
+            } else {
+                container.startViewTransition(viewToAnimate)
+                val animation: Animation = FragmentAnim.EndViewTransitionAnimation(anim,
+                    container, viewToAnimate)
+                animation.setAnimationListener(object : Animation.AnimationListener {
+                    override fun onAnimationStart(animation: Animation) {
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(FragmentManager.TAG,
+                                "Animation from operation $operation has reached " +
+                                    "onAnimationStart.")
+                        }
+                    }
+
+                    override fun onAnimationEnd(animation: Animation) {
+                        // onAnimationEnd() comes during draw(), so there can still be some
+                        // draw events happening after this call. We don't want to complete the
+                        // animation until after the onAnimationEnd()
+                        container.post {
+                            container.endViewTransition(viewToAnimate)
+                            animationInfo.completeSpecialEffect()
+                        }
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(FragmentManager.TAG,
+                                "Animation from operation $operation has ended.")
+                        }
+                    }
+
+                    override fun onAnimationRepeat(animation: Animation) {}
+                })
+                viewToAnimate.startAnimation(animation)
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Animation from operation $operation has started.")
+                }
+            }
+            // Listen for cancellation and use that to cancel the Animation
+            val signal: CancellationSignal = animationInfo.signal
+            signal.setOnCancelListener {
+                viewToAnimate.clearAnimation()
+                container.endViewTransition(viewToAnimate)
+                animationInfo.completeSpecialEffect()
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG,
+                        "Animation from operation $operation has been cancelled.")
+                }
+            }
+        }
+    }
+
+    private fun startTransitions(
+        transitionInfos: List<TransitionInfo>,
+        awaitingContainerChanges: MutableList<Operation>,
+        isPop: Boolean,
+        firstOut: Operation?,
+        lastIn: Operation?
+    ): Map<Operation, Boolean> {
+        val startedTransitions = mutableMapOf<Operation, Boolean>()
+        // First verify that we can run all transitions together
+        val transitionImpl = transitionInfos.filterNot { transitionInfo ->
+            // If there is no change in visibility, we can skip the TransitionInfo
+            transitionInfo.isVisibilityUnchanged
+        }.filter { transitionInfo ->
+            transitionInfo.handlingImpl != null
+        }.fold(null as FragmentTransitionImpl?) { chosenImpl, transitionInfo ->
+            val handlingImpl = transitionInfo.handlingImpl
+            require(chosenImpl == null || handlingImpl === chosenImpl) {
+                "Mixing framework transitions and AndroidX transitions is not allowed. Fragment " +
+                    "${transitionInfo.operation.fragment} returned Transition " +
+                    "${transitionInfo.transition} which uses a different Transition " +
+                    "type than other Fragments."
+            }
+            handlingImpl
+        }
+        if (transitionImpl == null) {
+            // There were no transitions at all so we can just complete all of them
+            for (transitionInfo: TransitionInfo in transitionInfos) {
+                startedTransitions[transitionInfo.operation] = false
+                transitionInfo.completeSpecialEffect()
+            }
+            return startedTransitions
+        }
+
+        // Every transition needs to target at least one View so that they
+        // don't interfere with one another. This is the view we use
+        // in cases where there are no real views to target
+        val nonExistentView = View(container.context)
+
+        // Now find the shared element transition if it exists
+        var sharedElementTransition: Any? = null
+        var firstOutEpicenterView: View? = null
+        var hasLastInEpicenter = false
+        val lastInEpicenterRect = Rect()
+        val sharedElementFirstOutViews = ArrayList<View>()
+        val sharedElementLastInViews = ArrayList<View>()
+        val sharedElementNameMapping = ArrayMap<String, String>()
+        for (transitionInfo: TransitionInfo in transitionInfos) {
+            val hasSharedElementTransition = transitionInfo.hasSharedElementTransition()
+            // Compute the shared element transition between the firstOut and lastIn Fragments
+            if (hasSharedElementTransition && (firstOut != null) && (lastIn != null)) {
+                // swapSharedElementTargets requires wrapping this in a TransitionSet
+                sharedElementTransition = transitionImpl.wrapTransitionInSet(
+                    transitionImpl.cloneTransition(transitionInfo.sharedElementTransition))
+                // The exiting shared elements default to the source names from the
+                // last in fragment
+                val exitingNames = lastIn.fragment.sharedElementSourceNames
+                // But if we're doing multiple transactions, we may need to re-map
+                // the names from the first out fragment
+                val firstOutSourceNames = firstOut.fragment.sharedElementSourceNames
+                val firstOutTargetNames = firstOut.fragment.sharedElementTargetNames
+                // We do this by iterating through each first out target,
+                // seeing if there is a match from the last in sources
+                for (index in firstOutTargetNames.indices) {
+                    val nameIndex = exitingNames.indexOf(firstOutTargetNames[index])
+                    if (nameIndex != -1) {
+                        // If we found a match, replace the last in source name
+                        // with the first out source name
+                        exitingNames[nameIndex] = firstOutSourceNames[index]
+                    }
+                }
+                val enteringNames = lastIn.fragment.sharedElementTargetNames
+                val (exitingCallback, enteringCallback) = if (!isPop) {
+                    // Forward transitions have firstOut fragment exiting and the
+                    // lastIn fragment entering
+                    firstOut.fragment.exitTransitionCallback to
+                        lastIn.fragment.enterTransitionCallback
+                } else {
+                    // A pop is the reverse: the firstOut fragment is entering and the
+                    // lastIn fragment is exiting
+                    firstOut.fragment.enterTransitionCallback to
+                        lastIn.fragment.exitTransitionCallback
+                }
+                val numSharedElements = exitingNames.size
+                for (i in 0 until numSharedElements) {
+                    val exitingName = exitingNames[i]
+                    val enteringName = enteringNames[i]
+                    sharedElementNameMapping[exitingName] = enteringName
+                }
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(FragmentManager.TAG, ">>> entering view names <<<")
+                    for (name: String? in enteringNames) {
+                        Log.v(FragmentManager.TAG, "Name: $name")
+                    }
+                    Log.v(FragmentManager.TAG, ">>> exiting view names <<<")
+                    for (name: String? in exitingNames) {
+                        Log.v(FragmentManager.TAG, "Name: $name")
+                    }
+                }
+
+                // Find all of the Views from the firstOut fragment that are
+                // part of the shared element transition
+                val firstOutViews = ArrayMap<String, View>()
+                findNamedViews(firstOutViews, firstOut.fragment.mView)
+                firstOutViews.retainAll(exitingNames)
+                if (exitingCallback != null) {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(FragmentManager.TAG,
+                            "Executing exit callback for operation $firstOut")
+                    }
+                    // Give the SharedElementCallback a chance to override the default mapping
+                    exitingCallback.onMapSharedElements(exitingNames, firstOutViews)
+                    for (i in exitingNames.indices.reversed()) {
+                        val name = exitingNames[i]
+                        val view = firstOutViews[name]
+                        if (view == null) {
+                            sharedElementNameMapping.remove(name)
+                        } else if (name != ViewCompat.getTransitionName(view)) {
+                            val targetValue = sharedElementNameMapping.remove(name)
+                            sharedElementNameMapping[ViewCompat.getTransitionName(view)] =
+                                targetValue
+                        }
+                    }
+                } else {
+                    // Only keep the mapping of elements that were found in the firstOut Fragment
+                    sharedElementNameMapping.retainAll(firstOutViews.keys)
+                }
+
+                // Find all of the Views from the lastIn fragment that are
+                // part of the shared element transition
+                val lastInViews = ArrayMap<String, View>()
+                findNamedViews(lastInViews, lastIn.fragment.mView)
+                lastInViews.retainAll(enteringNames)
+                lastInViews.retainAll(sharedElementNameMapping.values)
+                if (enteringCallback != null) {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(FragmentManager.TAG,
+                            "Executing enter callback for operation $lastIn")
+                    }
+                    // Give the SharedElementCallback a chance to override the default mapping
+                    enteringCallback.onMapSharedElements(enteringNames, lastInViews)
+                    for (i in enteringNames.indices.reversed()) {
+                        val name = enteringNames[i]
+                        val view = lastInViews[name]
+                        if (view == null) {
+                            val key = sharedElementNameMapping.findKeyForValue(name)
+                            if (key != null) {
+                                sharedElementNameMapping.remove(key)
+                            }
+                        } else if (name != ViewCompat.getTransitionName(view)) {
+                            val key = sharedElementNameMapping.findKeyForValue(name)
+                            if (key != null) {
+                                sharedElementNameMapping[key] = ViewCompat.getTransitionName(view)
+                            }
+                        }
+                    }
+                } else {
+                    // Only keep the mapping of elements that were found in the lastIn Fragment
+                    sharedElementNameMapping.retainValues(lastInViews)
+                }
+
+                // Now make a final pass through the Views list to ensure they
+                // don't still have elements that were removed from the mapping
+                firstOutViews.retainMatchingViews(sharedElementNameMapping.keys)
+                lastInViews.retainMatchingViews(sharedElementNameMapping.values)
+                @Suppress("UsePropertyAccessSyntax") /* Collection 1.3.X requires isEmpty() */
+                if (sharedElementNameMapping.isEmpty()) {
+                    // We couldn't find any valid shared element mappings, so clear out
+                    // the shared element transition information entirely
+                    sharedElementTransition = null
+                    sharedElementFirstOutViews.clear()
+                    sharedElementLastInViews.clear()
+                } else {
+                    // Call through to onSharedElementStart() before capturing the
+                    // starting values for the shared element transition
+                    callSharedElementStartEnd(lastIn.fragment, firstOut.fragment, isPop,
+                        firstOutViews, true)
+                    // Trigger the onSharedElementEnd callback in the next frame after
+                    // the starting values are captured and before capturing the end states
+                    OneShotPreDrawListener.add(container) {
+                        callSharedElementStartEnd(lastIn.fragment, firstOut.fragment, isPop,
+                            lastInViews, false)
+                    }
+                    sharedElementFirstOutViews.addAll(firstOutViews.values)
+
+                    // Compute the epicenter of the firstOut transition
+                    if (exitingNames.isNotEmpty()) {
+                        val epicenterViewName = exitingNames[0]
+                        firstOutEpicenterView = firstOutViews[epicenterViewName]
+                        transitionImpl.setEpicenter(sharedElementTransition, firstOutEpicenterView)
+                    }
+                    sharedElementLastInViews.addAll(lastInViews.values)
+
+                    // Compute the epicenter of the lastIn transition
+                    if (enteringNames.isNotEmpty()) {
+                        val epicenterViewName = enteringNames[0]
+                        val lastInEpicenterView = lastInViews[epicenterViewName]
+                        if (lastInEpicenterView != null) {
+                            hasLastInEpicenter = true
+                            // We can't set the epicenter here directly since the View might
+                            // not have been laid out as of yet, so instead we set a Rect as
+                            // the epicenter and compute the bounds one frame later
+                            val impl: FragmentTransitionImpl = transitionImpl
+                            OneShotPreDrawListener.add(container) {
+                                impl.getBoundsOnScreen(lastInEpicenterView, lastInEpicenterRect)
+                            }
+                        }
+                    }
+
+                    // Now set the transition's targets to only the firstOut Fragment's views
+                    // It'll be swapped to the lastIn Fragment's views after the
+                    // transition is started
+                    transitionImpl.setSharedElementTargets(sharedElementTransition,
+                        nonExistentView, sharedElementFirstOutViews)
+                    // After the swap to the lastIn Fragment's view (done below), we
+                    // need to clean up those targets. We schedule this here so that it
+                    // runs directly after the swap
+                    transitionImpl.scheduleRemoveTargets(sharedElementTransition, null, null,
+                        null, null, sharedElementTransition, sharedElementLastInViews)
+                    // Both the firstOut and lastIn Operations are now associated
+                    // with a Transition
+                    startedTransitions[firstOut] = true
+                    startedTransitions[lastIn] = true
+                }
+            }
+        }
+        val enteringViews = ArrayList<View>()
+        // These transitions run together, overlapping one another
+        var mergedTransition: Any? = null
+        // These transitions run only after all of the other transitions complete
+        var mergedNonOverlappingTransition: Any? = null
+        // Now iterate through the set of transitions and merge them together
+        for (transitionInfo: TransitionInfo in transitionInfos) {
+            if (transitionInfo.isVisibilityUnchanged) {
+                // No change in visibility, so we can immediately complete the transition
+                startedTransitions[transitionInfo.operation] = false
+                transitionInfo.completeSpecialEffect()
+                continue
+            }
+            val transition = transitionImpl.cloneTransition(transitionInfo.transition)
+            val operation: Operation = transitionInfo.operation
+            val involvedInSharedElementTransition = (sharedElementTransition != null &&
+                (operation === firstOut || operation === lastIn))
+            if (transition == null) {
+                // Nothing more to do if the transition is null
+                if (!involvedInSharedElementTransition) {
+                    // Only complete the transition if this fragment isn't involved
+                    // in the shared element transition (as otherwise we need to wait
+                    // for that to finish)
+                    startedTransitions[operation] = false
+                    transitionInfo.completeSpecialEffect()
+                }
+            } else {
+                // Target the Transition to *only* the set of transitioning views
+                val transitioningViews = ArrayList<View>()
+                captureTransitioningViews(transitioningViews, operation.fragment.mView)
+                if (involvedInSharedElementTransition) {
+                    // Remove all of the shared element views from the transition
+                    if (operation === firstOut) {
+                        transitioningViews.removeAll(sharedElementFirstOutViews.toSet())
+                    } else {
+                        transitioningViews.removeAll(sharedElementLastInViews.toSet())
+                    }
+                }
+                if (transitioningViews.isEmpty()) {
+                    transitionImpl.addTarget(transition, nonExistentView)
+                } else {
+                    transitionImpl.addTargets(transition, transitioningViews)
+                    transitionImpl.scheduleRemoveTargets(transition, transition,
+                        transitioningViews, null, null, null, null)
+                    if (operation.finalState === 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
+                        val transitioningViewsToHide = ArrayList(transitioningViews)
+                        transitioningViewsToHide.remove(operation.fragment.mView)
+                        transitionImpl.scheduleHideFragmentView(transition,
+                            operation.fragment.mView, transitioningViewsToHide)
+                        // 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.
+                        OneShotPreDrawListener.add(container) {
+                            setViewVisibility(transitioningViews, View.INVISIBLE)
+                        }
+                    }
+                }
+                if (operation.finalState === Operation.State.VISIBLE) {
+                    enteringViews.addAll(transitioningViews)
+                    if (hasLastInEpicenter) {
+                        transitionImpl.setEpicenter(transition, lastInEpicenterRect)
+                    }
+                } else {
+                    transitionImpl.setEpicenter(transition, firstOutEpicenterView)
+                }
+                startedTransitions[operation] = true
+                // Now determine how this transition should be merged together
+                if (transitionInfo.isOverlapAllowed) {
+                    // Overlap is allowed, so add them to the mergeTransition set
+                    mergedTransition = transitionImpl.mergeTransitionsTogether(
+                        mergedTransition, transition, null)
+                } else {
+                    // Overlap is not allowed, add them to the mergedNonOverlappingTransition
+                    mergedNonOverlappingTransition = transitionImpl.mergeTransitionsTogether(
+                        mergedNonOverlappingTransition, transition, null)
+                }
+            }
+        }
+
+        // Make sure that the mergedNonOverlappingTransition set
+        // runs after the mergedTransition set is complete
+        mergedTransition = transitionImpl.mergeTransitionsInSequence(mergedTransition,
+            mergedNonOverlappingTransition, sharedElementTransition)
+
+        // If there's no transitions playing together, no non-overlapping transitions,
+        // and no shared element transitions, mergedTransition will be null and
+        // there's nothing else we need to do
+        if (mergedTransition == null) {
+            return startedTransitions
+        }
+
+        // Now set up our completion signal on the completely merged transition set
+        transitionInfos.filterNot { transitionInfo ->
+            // If there's change in visibility, we've already completed the transition
+            transitionInfo.isVisibilityUnchanged
+        }.forEach { transitionInfo: TransitionInfo ->
+            val transition: Any? = transitionInfo.transition
+            val operation: Operation = transitionInfo.operation
+            val involvedInSharedElementTransition = sharedElementTransition != null &&
+                (operation === firstOut || operation === lastIn)
+            if (transition != null || involvedInSharedElementTransition) {
+                // If the container has never been laid out, transitions will not start so
+                // so lets instantly complete them.
+                if (!ViewCompat.isLaidOut(container)) {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(FragmentManager.TAG,
+                            "SpecialEffectsController: Container $container has not been " +
+                                "laid out. Completing operation $operation")
+                    }
+                    transitionInfo.completeSpecialEffect()
+                } else {
+                    transitionImpl.setListenerForTransitionEnd(
+                        transitionInfo.operation.fragment,
+                        mergedTransition,
+                        transitionInfo.signal,
+                        Runnable {
+                            transitionInfo.completeSpecialEffect()
+                            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                                Log.v(FragmentManager.TAG,
+                                    "Transition for operation $operation has completed")
+                            }
+                        })
+                }
+            }
+        }
+        // Transitions won't run if the container isn't laid out so
+        // we can return early here to avoid doing unnecessary work.
+        if (!ViewCompat.isLaidOut(container)) {
+            return startedTransitions
+        }
+        // First, hide all of the entering views so they're in
+        // the correct initial state
+        setViewVisibility(enteringViews, View.INVISIBLE)
+        val inNames = transitionImpl.prepareSetNameOverridesReordered(sharedElementLastInViews)
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(FragmentManager.TAG, ">>>>> Beginning transition <<<<<")
+            Log.v(FragmentManager.TAG, ">>>>> SharedElementFirstOutViews <<<<<")
+            for (view: View in sharedElementFirstOutViews) {
+                Log.v(FragmentManager.TAG,
+                    "View: $view Name: ${ViewCompat.getTransitionName(view)}")
+            }
+            Log.v(FragmentManager.TAG, ">>>>> SharedElementLastInViews <<<<<")
+            for (view: View in sharedElementLastInViews) {
+                Log.v(FragmentManager.TAG,
+                    "View: $view Name: ${ViewCompat.getTransitionName(view)}")
+            }
+        }
+        // Now actually start the transition
+        transitionImpl.beginDelayedTransition(container, mergedTransition)
+        transitionImpl.setNameOverridesReordered(container, sharedElementFirstOutViews,
+            sharedElementLastInViews, inNames, sharedElementNameMapping)
+        // Then, show all of the entering views, putting them into
+        // the correct final state
+        setViewVisibility(enteringViews, View.VISIBLE)
+        transitionImpl.swapSharedElementTargets(sharedElementTransition,
+            sharedElementFirstOutViews, sharedElementLastInViews)
+        return startedTransitions
+    }
+
+    /**
+     * Retain only the views that have a transition name that is in the set of [names].
+     */
+    private fun ArrayMap<String, View>.retainMatchingViews(names: Collection<String>) {
+        entries.retainAll { entry ->
+            names.contains(ViewCompat.getTransitionName(entry.value))
+        }
+    }
+
+    /**
+     * Gets the Views in the hierarchy affected by entering and exiting transitions.
+     *
+     * @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
+     * [android.view.ViewGroup.isTransitionGroup] true.
+     * @param view The base of the view hierarchy to look in.
+     */
+    private fun captureTransitioningViews(transitioningViews: ArrayList<View>, view: View) {
+        if (view is ViewGroup) {
+            if (ViewGroupCompat.isTransitionGroup(view)) {
+                if (!transitioningViews.contains(view)) {
+                    transitioningViews.add(view)
+                }
+            } else {
+                val count = view.childCount
+                for (i in 0 until count) {
+                    val child = view.getChildAt(i)
+                    if (child.visibility == View.VISIBLE) {
+                        captureTransitioningViews(transitioningViews, child)
+                    }
+                }
+            }
+        } else {
+            if (!transitioningViews.contains(view)) {
+                transitioningViews.add(view)
+            }
+        }
+    }
+
+    /**
+     * Finds all views that have transition names in the hierarchy under the given view and
+     * stores them in [namedViews] map with the name as the key.
+     */
+    private fun findNamedViews(namedViews: MutableMap<String, View>, view: View) {
+        val transitionName = ViewCompat.getTransitionName(view)
+        if (transitionName != null) {
+            namedViews[transitionName] = view
+        }
+        if (view is ViewGroup) {
+            val count = view.childCount
+            for (i in 0 until count) {
+                val child = view.getChildAt(i)
+                if (child.visibility == View.VISIBLE) {
+                    findNamedViews(namedViews, child)
+                }
+            }
+        }
+    }
+
+    private fun applyContainerChanges(operation: Operation) {
+        val view = operation.fragment.mView
+        operation.finalState.applyState(view)
+    }
+
+    private open class SpecialEffectsInfo(
+        val operation: Operation,
+        val signal: CancellationSignal
+    ) {
+
+        val isVisibilityUnchanged: Boolean
+            get() {
+                val currentState = operation.fragment.mView.asOperationState()
+                val finalState = operation.finalState
+                return currentState === finalState || (currentState !== Operation.State.VISIBLE &&
+                    finalState !== Operation.State.VISIBLE)
+            }
+
+        fun completeSpecialEffect() {
+            operation.completeSpecialEffect(signal)
+        }
+    }
+
+    private class AnimationInfo(
+        operation: Operation,
+        signal: CancellationSignal,
+        private val isPop: Boolean
+    ) : SpecialEffectsInfo(operation, signal) {
+        private var isAnimLoaded = false
+        private var animation: FragmentAnim.AnimationOrAnimator? = null
+
+        fun getAnimation(
+            context: Context
+        ): FragmentAnim.AnimationOrAnimator? = if (isAnimLoaded) {
+            animation
+        } else {
+            FragmentAnim.loadAnimation(
+                context,
+                operation.fragment,
+                operation.finalState === Operation.State.VISIBLE,
+                isPop
+            ).also {
+                animation = it
+                isAnimLoaded = true
+            }
+        }
+    }
+
+    private class TransitionInfo(
+        operation: Operation,
+        signal: CancellationSignal,
+        isPop: Boolean,
+        providesSharedElementTransition: Boolean
+    ) : SpecialEffectsInfo(operation, signal) {
+        val transition: Any? = if (operation.finalState === Operation.State.VISIBLE) {
+            if (isPop) operation.fragment.reenterTransition else operation.fragment.enterTransition
+        } else {
+            if (isPop) operation.fragment.returnTransition else operation.fragment.exitTransition
+        }
+
+        val isOverlapAllowed = if (operation.finalState === Operation.State.VISIBLE) {
+            // Entering transitions can choose to run after all exit
+            // transitions complete, rather than overlapping with them
+            if (isPop) {
+                operation.fragment.allowReturnTransitionOverlap
+            } else {
+                operation.fragment.allowEnterTransitionOverlap
+            }
+        } else {
+            // Removing Fragments always overlap other transitions
+            true
+        }
+
+        val sharedElementTransition: Any? = if (providesSharedElementTransition) {
+            if (isPop) {
+                operation.fragment.sharedElementReturnTransition
+            } else {
+                operation.fragment.sharedElementEnterTransition
+            }
+        } else {
+            null
+        }
+
+        fun hasSharedElementTransition(): Boolean {
+            return sharedElementTransition != null
+        }
+
+        val handlingImpl: FragmentTransitionImpl?
+            get() {
+                val transitionImpl = getHandlingImpl(transition)
+                val sharedElementTransitionImpl = getHandlingImpl(sharedElementTransition)
+                require(transitionImpl == null || sharedElementTransitionImpl == null ||
+                    transitionImpl === sharedElementTransitionImpl
+                ) {
+                    "Mixing framework transitions and AndroidX transitions is not allowed. " +
+                        "Fragment ${operation.fragment} returned Transition $transition " +
+                        "which uses a different Transition  type than its shared element " +
+                        "transition $sharedElementTransition"
+                }
+                return transitionImpl ?: sharedElementTransitionImpl
+            }
+
+        private fun getHandlingImpl(transition: Any?): FragmentTransitionImpl? {
+            if (transition == null) {
+                return null
+            }
+            if ((FragmentTransition.PLATFORM_IMPL != null &&
+                    FragmentTransition.PLATFORM_IMPL.canHandle(transition))
+            ) {
+                return FragmentTransition.PLATFORM_IMPL
+            }
+            if ((FragmentTransition.SUPPORT_IMPL != null &&
+                    FragmentTransition.SUPPORT_IMPL.canHandle(transition))
+            ) {
+                return FragmentTransition.SUPPORT_IMPL
+            }
+            throw IllegalArgumentException(
+                "Transition $transition for fragment ${operation.fragment} is not a valid " +
+                    "framework Transition or AndroidX Transition"
+            )
+        }
+    }
+}
\ No newline at end of file
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 af6591c..c84669f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -221,6 +221,25 @@
          */
         @MainThread
         void onBackStackChanged();
+
+        /**
+         * Called whenever the contents of the back stack are starting to be changed, before
+         * fragments being to move to their target states.
+         *
+         * @param fragment that is affected by the starting back stack change
+         * @param pop whether this back stack change is a pop
+         */
+        @MainThread
+        default void onBackStackChangeStarted(@NonNull Fragment fragment, boolean pop) { }
+
+        /**
+         * Called whenever the contents of a back stack change is committed.
+         *
+         * @param fragment that is affected by the committed back stack change
+         * @param pop whether this back stack change is a pop
+         */
+        @MainThread
+        default void onBackStackChangeCommitted(@NonNull Fragment fragment, boolean pop) { }
     }
 
     /**
@@ -1875,6 +1894,18 @@
         // 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);
+
+        if (mBackStackChangeListeners != null) {
+            // we dispatch callbacks based on each record
+            for (BackStackRecord record : records) {
+                for (Fragment fragment : fragmentsFromRecord(record)) {
+                    // We give all fragment the back stack changed started signal first
+                    for (OnBackStackChangedListener listener : mBackStackChangeListeners) {
+                        listener.onBackStackChangeStarted(fragment, isPop);
+                    }
+                }
+            }
+        }
         // Ensure that Fragments directly affected by operations
         // are moved to their expected state in operation order
         for (int index = startIndex; index < endIndex; index++) {
@@ -1922,6 +1953,17 @@
         }
         if (addToBackStack) {
             reportBackStackChanged();
+            if (mBackStackChangeListeners != null) {
+                // we dispatch callbacks based on each record
+                for (BackStackRecord record : records) {
+                    for (Fragment fragment : fragmentsFromRecord(record)) {
+                        // Then we give them all the committed signal
+                        for (OnBackStackChangedListener listener : mBackStackChangeListeners) {
+                            listener.onBackStackChangeCommitted(fragment, isPop);
+                        }
+                    }
+                }
+            }
         }
     }
 
@@ -2091,6 +2133,17 @@
         }
     }
 
+    private Set<Fragment> fragmentsFromRecord(@NonNull BackStackRecord record) {
+        Set<Fragment> fragments = new HashSet<>();
+        for (int i = 0; i < record.mOps.size(); i++) {
+            Fragment f = record.mOps.get(i).mFragment;
+            if (f != null) {
+                fragments.add(f);
+            }
+        }
+        return fragments;
+    }
+
     void addBackStackState(BackStackRecord state) {
         if (mBackStack == null) {
             mBackStack = new ArrayList<>();
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java
deleted file mode 100644
index 6ee0e076..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.fragment.app;
-
-import android.os.Build;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.collection.ArrayMap;
-import androidx.core.app.SharedElementCallback;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Contains the Fragment Transition functionality.
- */
-class FragmentTransition {
-    static final FragmentTransitionImpl PLATFORM_IMPL = Build.VERSION.SDK_INT >= 21
-            ? new FragmentTransitionCompat21()
-            : null;
-
-    static final FragmentTransitionImpl SUPPORT_IMPL = resolveSupportImpl();
-
-    private static FragmentTransitionImpl resolveSupportImpl() {
-        try {
-            @SuppressWarnings("unchecked")
-            Class<FragmentTransitionImpl> impl = (Class<FragmentTransitionImpl>) Class.forName(
-                    "androidx.transition.FragmentTransitionSupport");
-            return impl.getDeclaredConstructor().newInstance();
-        } catch (Exception ignored) {
-            // support-transition is not loaded; ignore
-        }
-        return null;
-    }
-
-    /**
-     * Utility to find the String key in {@code map} that maps to {@code value}.
-     */
-    static String findKeyForValue(ArrayMap<String, String> map, String value) {
-        final int numElements = map.size();
-        for (int i = 0; i < numElements; i++) {
-            if (value.equals(map.valueAt(i))) {
-                return map.keyAt(i);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 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.
-     */
-    static void retainValues(@NonNull ArrayMap<String, String> nameOverrides,
-            @NonNull ArrayMap<String, View> namedViews) {
-        for (int i = nameOverrides.size() - 1; i >= 0; i--) {
-            final String targetName = nameOverrides.valueAt(i);
-            if (!namedViews.containsKey(targetName)) {
-                nameOverrides.removeAt(i);
-            }
-        }
-    }
-
-    /**
-     * Calls the {@link SharedElementCallback#onSharedElementStart(List, List, List)} or
-     * {@link SharedElementCallback#onSharedElementEnd(List, List, List)} on the appropriate
-     * incoming or outgoing fragment.
-     *
-     * @param inFragment The incoming fragment
-     * @param outFragment The outgoing fragment
-     * @param isPop Is the incoming fragment part of a pop transaction?
-     * @param sharedElements The shared element Views
-     * @param isStart Call the start or end call on the SharedElementCallback
-     */
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static void callSharedElementStartEnd(Fragment inFragment, Fragment outFragment,
-            boolean isPop, ArrayMap<String, View> sharedElements, boolean isStart) {
-        SharedElementCallback sharedElementCallback = isPop
-                ? outFragment.getEnterTransitionCallback()
-                : inFragment.getEnterTransitionCallback();
-        if (sharedElementCallback != null) {
-            ArrayList<View> views = new ArrayList<>();
-            ArrayList<String> names = new ArrayList<>();
-            final int count = sharedElements == null ? 0 : sharedElements.size();
-            for (int i = 0; i < count; i++) {
-                names.add(sharedElements.keyAt(i));
-                views.add(sharedElements.valueAt(i));
-            }
-            if (isStart) {
-                sharedElementCallback.onSharedElementStart(names, views, null);
-            } else {
-                sharedElementCallback.onSharedElementEnd(names, views, null);
-            }
-        }
-    }
-
-    /**
-     * Sets the visibility of all Views in {@code views} to {@code visibility}.
-     */
-    static void setViewVisibility(ArrayList<View> views, int visibility) {
-        if (views == null) {
-            return;
-        }
-        for (int i = views.size() - 1; i >= 0; i--) {
-            final View view = views.get(i);
-            view.setVisibility(visibility);
-        }
-    }
-
-    static boolean supportsTransition() {
-        return PLATFORM_IMPL != null || SUPPORT_IMPL != null;
-    }
-
-    private FragmentTransition() {
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.kt b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.kt
new file mode 100644
index 0000000..399643a
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.kt
@@ -0,0 +1,122 @@
+/*
+ * 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.fragment.app
+
+import android.os.Build
+import android.view.View
+import androidx.collection.ArrayMap
+
+/**
+ * Contains the Fragment Transition functionality.
+ */
+internal object FragmentTransition {
+    @JvmField
+    val PLATFORM_IMPL: FragmentTransitionImpl? =
+        if (Build.VERSION.SDK_INT >= 21) FragmentTransitionCompat21() else null
+
+    @JvmField
+    val SUPPORT_IMPL = resolveSupportImpl()
+
+    @Suppress("UNCHECKED_CAST")
+    private fun resolveSupportImpl(): FragmentTransitionImpl? = try {
+        val impl = Class.forName(
+            "androidx.transition.FragmentTransitionSupport"
+        ) as Class<FragmentTransitionImpl>
+        impl.getDeclaredConstructor().newInstance()
+    } catch (ignored: Exception) {
+        // support-transition is not loaded; ignore
+        null
+    }
+
+    /**
+     * Utility to find the String key in [map] that maps to [value].
+     */
+    @JvmStatic
+    fun ArrayMap<String, String>.findKeyForValue(
+        value: String
+    ): String? = filter { entry ->
+        // Find the entries with the given value
+        entry.value == value
+    }.map { entry ->
+        // And get the key associated with that value
+        entry.key
+    }.firstOrNull()
+
+    /**
+     * A utility to retain only the mappings in the map that have a value
+     * that has a key in [namedViews]. This is a useful equivalent to
+     * [ArrayMap.retainAll] for values.
+     */
+    @JvmStatic
+    fun ArrayMap<String, String>.retainValues(namedViews: ArrayMap<String, View>) {
+        for (i in (size - 1) downTo 0) {
+            val targetName = valueAt(i)
+            if (!namedViews.containsKey(targetName)) {
+                removeAt(i)
+            }
+        }
+    }
+
+    /**
+     * Calls the [android.app.SharedElementCallback.onSharedElementStart] or
+     * [android.app.SharedElementCallback.onSharedElementEnd] on the appropriate
+     * incoming or outgoing fragment.
+     *
+     * @param inFragment The incoming fragment
+     * @param outFragment The outgoing fragment
+     * @param isPop Is the incoming fragment part of a pop transaction?
+     * @param sharedElements The shared element Views
+     * @param isStart Call the start or end call on the SharedElementCallback
+     */
+    @JvmStatic
+    fun callSharedElementStartEnd(
+        inFragment: Fragment,
+        outFragment: Fragment,
+        isPop: Boolean,
+        sharedElements: ArrayMap<String, View>,
+        isStart: Boolean
+    ) {
+        val sharedElementCallback = if (isPop) {
+            outFragment.enterTransitionCallback
+        } else {
+            inFragment.enterTransitionCallback
+        }
+        if (sharedElementCallback != null) {
+            val views = sharedElements.map { it.value }
+            val names = sharedElements.map { it.key }
+            if (isStart) {
+                sharedElementCallback.onSharedElementStart(names, views, null)
+            } else {
+                sharedElementCallback.onSharedElementEnd(names, views, null)
+            }
+        }
+    }
+
+    /**
+     * Sets the visibility of all Views in [views] to [visibility].
+     */
+    @JvmStatic
+    fun setViewVisibility(views: List<View>, visibility: Int) {
+        views.forEach { view ->
+            view.visibility = visibility
+        }
+    }
+
+    @JvmStatic
+    fun supportsTransition(): Boolean {
+        return PLATFORM_IMPL != null || SUPPORT_IMPL != null
+    }
+}
\ No newline at end of file
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionCompat21.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionCompat21.java
index 9abe01b..0f0145d 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionCompat21.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionCompat21.java
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public void setEpicenter(@NonNull Object transitionObj, @NonNull View view) {
+    public void setEpicenter(@NonNull Object transitionObj, @Nullable View view) {
         if (view != null) {
             Transition transition = (Transition) transitionObj;
             final Rect epicenter = new Rect();
@@ -126,7 +126,8 @@
     }
 
     @Override
-    public Object mergeTransitionsTogether(@NonNull Object transition1, @NonNull Object transition2,
+    public Object mergeTransitionsTogether(@Nullable Object transition1,
+            @Nullable Object transition2,
             @Nullable Object transition3) {
         TransitionSet transitionSet = new TransitionSet();
         if (transition1 != null) {
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 e82df80..1e76988 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
@@ -72,7 +72,7 @@
     /**
      * Sets a transition epicenter to the rectangle of a given View.
      */
-    public abstract void setEpicenter(@NonNull Object transitionObj, @NonNull View view);
+    public abstract void setEpicenter(@NonNull Object transitionObj, @Nullable View view);
 
     /**
      * Replacement for view.getBoundsOnScreen because that is not public. This returns a rect
@@ -122,8 +122,8 @@
      * transitions passed will not be added to the set. If all are null, then an empty
      * TransitionSet will be returned.
      */
-    public abstract Object mergeTransitionsTogether(@NonNull Object transition1,
-            @NonNull Object transition2, @Nullable Object transition3);
+    public abstract Object mergeTransitionsTogether(@Nullable Object transition1,
+            @Nullable Object transition2, @Nullable Object transition3);
 
     /**
      * After the transition completes, the fragment's view is set to GONE and the exiting
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java
deleted file mode 100644
index f7bfb02..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java
+++ /dev/null
@@ -1,774 +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.fragment.app;
-
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.CallSuper;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.os.CancellationSignal;
-import androidx.core.view.ViewCompat;
-import androidx.fragment.R;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
-/**
- * Controller for all "special effects" (such as Animation, Animator, framework Transition, and
- * AndroidX Transition) that can be applied to a Fragment as part of the addition or removal
- * of that Fragment from its container.
- * <p>
- * Each SpecialEffectsController is responsible for a single {@link ViewGroup} container.
- */
-abstract class SpecialEffectsController {
-
-    /**
-     * Get the {@link SpecialEffectsController} for a given container if it already exists
-     * or create it. This will automatically find the containing FragmentManager and use the
-     * factory provided by {@link FragmentManager#getSpecialEffectsControllerFactory()}.
-     *
-     * @param container ViewGroup to find the associated SpecialEffectsController for.
-     * @return a SpecialEffectsController for the given container
-     */
-    @NonNull
-    static SpecialEffectsController getOrCreateController(
-            @NonNull ViewGroup container, @NonNull FragmentManager fragmentManager) {
-        SpecialEffectsControllerFactory factory =
-                fragmentManager.getSpecialEffectsControllerFactory();
-        return getOrCreateController(container, factory);
-    }
-
-    /**
-     * Get the {@link SpecialEffectsController} for a given container if it already exists
-     * or create it using the given {@link SpecialEffectsControllerFactory} if it does not.
-     *
-     * @param container ViewGroup to find the associated SpecialEffectsController for.
-     * @param factory The factory to use to create a new SpecialEffectsController if one does
-     *                not already exist for this container.
-     * @return a SpecialEffectsController for the given container
-     */
-    @NonNull
-    static SpecialEffectsController getOrCreateController(
-            @NonNull ViewGroup container,
-            @NonNull SpecialEffectsControllerFactory factory) {
-        Object controller = container.getTag(R.id.special_effects_controller_view_tag);
-        if (controller instanceof SpecialEffectsController) {
-            return (SpecialEffectsController) controller;
-        }
-        // Else, create a new SpecialEffectsController
-        SpecialEffectsController newController = factory.createController(container);
-        container.setTag(R.id.special_effects_controller_view_tag, newController);
-        return newController;
-    }
-
-    private final ViewGroup mContainer;
-
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    final ArrayList<Operation> mPendingOperations = new ArrayList<>();
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    final ArrayList<Operation> mRunningOperations = new ArrayList<>();
-
-    boolean mOperationDirectionIsPop = false;
-    boolean mIsContainerPostponed = false;
-
-    SpecialEffectsController(@NonNull ViewGroup container) {
-        mContainer = container;
-    }
-
-    @NonNull
-    public ViewGroup getContainer() {
-        return mContainer;
-    }
-
-    /**
-     * Checks what {@link Operation.LifecycleImpact lifecycle impact} of special effect for the
-     * given FragmentStateManager is still awaiting completion (or cancellation).
-     * <p>
-     * This could be because the Operation is still pending (and
-     * {@link #executePendingOperations()} hasn't been called) or because all
-     * {@link Operation#markStartedSpecialEffect(CancellationSignal) started special effects}
-     * haven't {@link Operation#completeSpecialEffect(CancellationSignal) completed}.
-     *
-     * @param fragmentStateManager the FragmentStateManager to check for
-     * @return The {@link Operation.LifecycleImpact} of the awaiting Operation, or null if there is
-     * no special effects still in progress.
-     */
-    @Nullable
-    Operation.LifecycleImpact getAwaitingCompletionLifecycleImpact(
-            @NonNull FragmentStateManager fragmentStateManager) {
-        Operation.LifecycleImpact lifecycleImpact = null;
-        // First search through pending operations
-        Operation pendingOperation = findPendingOperation(fragmentStateManager.getFragment());
-        if (pendingOperation != null) {
-            lifecycleImpact = pendingOperation.getLifecycleImpact();
-        }
-        // Then search through running operations
-        Operation runningOperation = findRunningOperation(fragmentStateManager.getFragment());
-        // Only use the running operation if the pending operation is null or NONE
-        if (runningOperation != null
-                && (lifecycleImpact == null || lifecycleImpact == Operation.LifecycleImpact.NONE)) {
-            return runningOperation.getLifecycleImpact();
-        }
-        return lifecycleImpact;
-    }
-
-    @Nullable
-    private Operation findPendingOperation(@NonNull Fragment fragment) {
-        for (Operation operation : mPendingOperations) {
-            if (operation.getFragment().equals(fragment) && !operation.isCanceled()) {
-                return operation;
-            }
-        }
-        return null;
-    }
-
-    @Nullable
-    private Operation findRunningOperation(@NonNull Fragment fragment) {
-        for (Operation operation : mRunningOperations) {
-            if (operation.getFragment().equals(fragment) && !operation.isCanceled()) {
-                return operation;
-            }
-        }
-        return null;
-    }
-
-    void enqueueAdd(@NonNull Operation.State finalState,
-            @NonNull FragmentStateManager fragmentStateManager) {
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "SpecialEffectsController: Enqueuing add operation for fragment "
-                            + fragmentStateManager.getFragment());
-        }
-        enqueue(finalState, Operation.LifecycleImpact.ADDING, fragmentStateManager);
-    }
-
-    void enqueueShow(@NonNull FragmentStateManager fragmentStateManager) {
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "SpecialEffectsController: Enqueuing show operation for fragment "
-                            + fragmentStateManager.getFragment());
-        }
-        enqueue(Operation.State.VISIBLE, Operation.LifecycleImpact.NONE, fragmentStateManager);
-    }
-
-    void enqueueHide(@NonNull FragmentStateManager fragmentStateManager) {
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "SpecialEffectsController: Enqueuing hide operation for fragment "
-                            + fragmentStateManager.getFragment());
-        }
-        enqueue(Operation.State.GONE, Operation.LifecycleImpact.NONE, fragmentStateManager);
-    }
-
-    void enqueueRemove(@NonNull FragmentStateManager fragmentStateManager) {
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "SpecialEffectsController: Enqueuing remove operation for fragment "
-                            + fragmentStateManager.getFragment());
-        }
-        enqueue(Operation.State.REMOVED, Operation.LifecycleImpact.REMOVING, fragmentStateManager);
-    }
-
-    private void enqueue(@NonNull Operation.State finalState,
-            @NonNull Operation.LifecycleImpact lifecycleImpact,
-            @NonNull final FragmentStateManager fragmentStateManager) {
-        synchronized (mPendingOperations) {
-            final CancellationSignal signal = new CancellationSignal();
-            Operation existingOperation =
-                    findPendingOperation(fragmentStateManager.getFragment());
-            if (existingOperation != null) {
-                // Update the existing operation by merging in the new information
-                // rather than creating a new Operation entirely
-                existingOperation.mergeWith(finalState, lifecycleImpact);
-                return;
-            }
-            final FragmentStateManagerOperation operation = new FragmentStateManagerOperation(
-                    finalState, lifecycleImpact, fragmentStateManager, signal);
-            mPendingOperations.add(operation);
-            // Ensure that we still run the applyState() call for pending operations
-            operation.addCompletionListener(new Runnable() {
-                @Override
-                public void run() {
-                    if (mPendingOperations.contains(operation)) {
-                        operation.getFinalState().applyState(operation.getFragment().mView);
-                    }
-                }
-            });
-            // Ensure that we remove the Operation from the list of
-            // operations when the operation is complete
-            operation.addCompletionListener(new Runnable() {
-                @Override
-                public void run() {
-                    mPendingOperations.remove(operation);
-                    mRunningOperations.remove(operation);
-                }
-            });
-        }
-    }
-
-    void updateOperationDirection(boolean isPop) {
-        mOperationDirectionIsPop = isPop;
-    }
-
-    void markPostponedState() {
-        synchronized (mPendingOperations) {
-            updateFinalState();
-            // Default to not postponed
-            mIsContainerPostponed = false;
-            for (int index = mPendingOperations.size() - 1; index >= 0; index--) {
-                Operation operation = mPendingOperations.get(index);
-                // Only consider operations with entering transitions
-                Operation.State currentState = Operation.State.from(operation.getFragment().mView);
-                if (operation.getFinalState() == Operation.State.VISIBLE
-                        && currentState != Operation.State.VISIBLE) {
-                    Fragment fragment = operation.getFragment();
-                    // The container is considered postponed if the Fragment
-                    // associated with the last entering Operation is postponed
-                    mIsContainerPostponed = fragment.isPostponed();
-                    break;
-                }
-            }
-        }
-    }
-
-    void forcePostponedExecutePendingOperations() {
-        if (mIsContainerPostponed) {
-            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                Log.v(FragmentManager.TAG,
-                        "SpecialEffectsController: Forcing postponed operations"
-                );
-            }
-            mIsContainerPostponed = false;
-            executePendingOperations();
-        }
-    }
-
-    void executePendingOperations() {
-        if (mIsContainerPostponed) {
-            // No operations should execute while the container is postponed
-            return;
-        }
-        // If the container is not attached to the window, ignore the special effect
-        // since none of the special effect systems will run them anyway.
-        if (!ViewCompat.isAttachedToWindow(mContainer)) {
-            forceCompleteAllOperations();
-            mOperationDirectionIsPop = false;
-            return;
-        }
-        synchronized (mPendingOperations) {
-            if (!mPendingOperations.isEmpty()) {
-                ArrayList<Operation> currentlyRunningOperations =
-                        new ArrayList<>(mRunningOperations);
-                mRunningOperations.clear();
-                for (Operation operation : currentlyRunningOperations) {
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG,
-                                "SpecialEffectsController: Cancelling operation " + operation);
-                    }
-                    operation.cancel();
-                    if (!operation.isComplete()) {
-                        // Re-add any animations that didn't synchronously call complete()
-                        // to continue to track them as running operations
-                        mRunningOperations.add(operation);
-                    }
-                }
-
-                updateFinalState();
-
-                ArrayList<Operation> newPendingOperations = new ArrayList<>(mPendingOperations);
-                mPendingOperations.clear();
-                mRunningOperations.addAll(newPendingOperations);
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG,
-                            "SpecialEffectsController: Executing pending operations");
-                }
-                for (Operation operation : newPendingOperations) {
-                    operation.onStart();
-                }
-                executeOperations(newPendingOperations, mOperationDirectionIsPop);
-                mOperationDirectionIsPop = false;
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG,
-                            "SpecialEffectsController: Finished executing pending operations");
-                }
-            }
-        }
-    }
-
-    void forceCompleteAllOperations() {
-        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-            Log.v(FragmentManager.TAG,
-                    "SpecialEffectsController: Forcing all operations to complete"
-            );
-        }
-        boolean attachedToWindow = ViewCompat.isAttachedToWindow(mContainer);
-        synchronized (mPendingOperations) {
-            updateFinalState();
-            for (Operation operation : mPendingOperations) {
-                operation.onStart();
-            }
-
-            // First cancel running operations
-            ArrayList<Operation> runningOperations = new ArrayList<>(mRunningOperations);
-            for (Operation operation : runningOperations) {
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG,
-                            "SpecialEffectsController: " + (attachedToWindow ? "" :
-                                    "Container " + mContainer + " is not attached to window. ")
-                                    + "Cancelling running operation " + operation);
-                }
-                operation.cancel();
-            }
-
-            // Then cancel pending operations
-            ArrayList<Operation> pendingOperations = new ArrayList<>(mPendingOperations);
-            for (Operation operation : pendingOperations) {
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG,
-                            "SpecialEffectsController: " + (attachedToWindow ? "" :
-                                    "Container " + mContainer + " is not attached to window. ")
-                                    + "Cancelling pending operation " + operation);
-                }
-                operation.cancel();
-            }
-        }
-    }
-
-    private void updateFinalState() {
-        for (Operation operation: mPendingOperations) {
-            // update the final state of adding operations
-            if (operation.getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
-                Fragment fragment = operation.getFragment();
-                View view = fragment.requireView();
-                Operation.State finalState = Operation.State.from(view.getVisibility());
-                operation.mergeWith(finalState, Operation.LifecycleImpact.NONE);
-            }
-        }
-    }
-
-    /**
-     * Execute all of the given operations.
-     * <p>
-     * If there are no special effects for a given operation, the SpecialEffectsController
-     * should call {@link Operation#complete()}. Otherwise, a
-     * {@link CancellationSignal} representing each special effect should be added via
-     * {@link Operation#markStartedSpecialEffect(CancellationSignal)}, calling
-     * {@link Operation#completeSpecialEffect(CancellationSignal)} when that specific
-     * special effect finishes. When the last started special effect is completed,
-     * {@link Operation#completeSpecialEffect(CancellationSignal)} will call
-     * {@link Operation#complete()} automatically.
-     * <p>
-     * It is <strong>strongly recommended</strong> that each
-     * {@link CancellationSignal} added with
-     * {@link Operation#markStartedSpecialEffect(CancellationSignal)} listen for cancellation,
-     * properly cancelling the special effect when the signal is cancelled.
-     *
-     * @param operations the list of operations to execute in order.
-     * @param isPop whether this set of operations should be considered as triggered by a 'pop'.
-     *              This can be used to control the direction of any special effects if they
-     *              are not symmetric.
-     */
-    abstract void executeOperations(@NonNull List<Operation> operations, boolean isPop);
-
-    /**
-     * Class representing an ongoing special effects operation.
-     *
-     * @see #executeOperations(List, boolean)
-     */
-    static class Operation {
-
-        /**
-         * The state that the fragment's View should be in after applying this operation.
-         *
-         * @see #applyState(View)
-         */
-        enum State {
-            /**
-             * The fragment's view should be completely removed from the container.
-             */
-            REMOVED,
-            /**
-             * The fragment's view should be made {@link View#VISIBLE}.
-             */
-            VISIBLE,
-            /**
-             * The fragment's view should be made {@link View#GONE}.
-             */
-            GONE,
-            /**
-             * The fragment's view should be made {@link View#INVISIBLE}.
-             */
-            INVISIBLE;
-
-            /**
-             * Create a new State from the {@link View#getVisibility() view's visibility}.
-             *
-             * @param view The view to get the current visibility from.
-             * @return A new State from the view's visibility.
-             */
-            @NonNull
-            static State from(@NonNull View view) {
-                // We should consider views with an alpha of 0 as INVISIBLE.
-                if (view.getAlpha() == 0f && view.getVisibility() == View.VISIBLE) {
-                    return INVISIBLE;
-                }
-                return from(view.getVisibility());
-            }
-
-            /**
-             * Create a new State from the visibility of a View.
-             *
-             * @param visibility The visibility constant to translate into a State.
-             * @return A new State from the visibility.
-             */
-            @NonNull
-            static State from(int visibility) {
-                switch (visibility) {
-                    case View.VISIBLE:
-                        return VISIBLE;
-                    case View.INVISIBLE:
-                        return INVISIBLE;
-                    case View.GONE:
-                        return GONE;
-                    default:
-                        throw new IllegalArgumentException("Unknown visibility " + visibility);
-                }
-            }
-
-            /**
-             * Applies this state to the given View.
-             *
-             * @param view The View to apply this state to.
-             */
-            void applyState(@NonNull View view) {
-                switch (this) {
-                    case REMOVED:
-                        ViewGroup parent = (ViewGroup) view.getParent();
-                        if (parent != null) {
-                            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                                Log.v(FragmentManager.TAG, "SpecialEffectsController: Removing "
-                                        + "view " + view + " from container " + parent);
-                            }
-                            parent.removeView(view);
-                        }
-                        break;
-                    case VISIBLE:
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG, "SpecialEffectsController: Setting view "
-                                    + view + " to VISIBLE");
-                        }
-                        view.setVisibility(View.VISIBLE);
-                        break;
-                    case GONE:
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG,
-                                    "SpecialEffectsController: Setting view " + view + " to GONE");
-                        }
-                        view.setVisibility(View.GONE);
-                        break;
-                    case INVISIBLE:
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG,
-                                    "SpecialEffectsController: Setting view " + view + " to "
-                                            + "INVISIBLE");
-                        }
-                        view.setVisibility(View.INVISIBLE);
-                        break;
-                }
-            }
-        }
-
-        /**
-         * The impact that this operation has on the lifecycle of the fragment.
-         */
-        enum LifecycleImpact {
-            /**
-             * No impact on the fragment's lifecycle.
-             */
-            NONE,
-            /**
-             * This operation is associated with adding a fragment.
-             */
-            ADDING,
-            /**
-             * This operation is associated with removing a fragment.
-             */
-            REMOVING,
-        }
-
-        @NonNull
-        private State mFinalState;
-        @NonNull
-        private LifecycleImpact mLifecycleImpact;
-        @NonNull
-        private final Fragment mFragment;
-        @NonNull
-        private final List<Runnable> mCompletionListeners = new ArrayList<>();
-        @NonNull
-        private final HashSet<CancellationSignal> mSpecialEffectsSignals = new HashSet<>();
-
-        private boolean mIsCanceled = false;
-        private boolean mIsComplete = false;
-
-        /**
-         * Construct a new Operation.
-         *
-         * @param finalState What the final state after this operation should be.
-         * @param lifecycleImpact The impact on the fragment's lifecycle.
-         * @param fragment The Fragment being affected.
-         * @param cancellationSignal A signal for handling cancellation
-         */
-        Operation(@NonNull State finalState, @NonNull LifecycleImpact lifecycleImpact,
-                @NonNull Fragment fragment, @NonNull CancellationSignal cancellationSignal) {
-            mFinalState = finalState;
-            mLifecycleImpact = lifecycleImpact;
-            mFragment = fragment;
-            // Connect the CancellationSignal to our own
-            cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
-                @Override
-                public void onCancel() {
-                    cancel();
-                }
-            });
-        }
-
-        /**
-         * Returns what the final state after this operation should be.
-         *
-         * @return The final state after this operation should be.
-         */
-        @NonNull
-        public State getFinalState() {
-            return mFinalState;
-        }
-
-        /**
-         * Returns how this Operation affects the lifecycle of the fragment.
-         *
-         * @return How this Operation affects the lifecycle of the fragment.
-         */
-        @NonNull
-        LifecycleImpact getLifecycleImpact() {
-            return mLifecycleImpact;
-        }
-
-        /**
-         * The Fragment being added / removed.
-         * @return An {@link Fragment#isAdded() added} Fragment.
-         */
-        @NonNull
-        public final Fragment getFragment() {
-            return mFragment;
-        }
-
-        final boolean isCanceled() {
-            return mIsCanceled;
-        }
-
-        @NonNull
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append("Operation ");
-            sb.append("{");
-            sb.append(Integer.toHexString(System.identityHashCode(this)));
-            sb.append("} ");
-            sb.append("{");
-            sb.append("mFinalState = ");
-            sb.append(mFinalState);
-            sb.append("} ");
-            sb.append("{");
-            sb.append("mLifecycleImpact = ");
-            sb.append(mLifecycleImpact);
-            sb.append("} ");
-            sb.append("{");
-            sb.append("mFragment = ");
-            sb.append(mFragment);
-            sb.append("}");
-            return sb.toString();
-        }
-
-        final void cancel() {
-            if (isCanceled()) {
-                return;
-            }
-            mIsCanceled = true;
-            if (mSpecialEffectsSignals.isEmpty()) {
-                complete();
-            } else {
-                ArrayList<CancellationSignal> signals = new ArrayList<>(mSpecialEffectsSignals);
-                for (CancellationSignal signal : signals) {
-                    signal.cancel();
-                }
-            }
-        }
-
-        final void mergeWith(@NonNull State finalState, @NonNull LifecycleImpact lifecycleImpact) {
-            switch (lifecycleImpact) {
-                case ADDING:
-                    if (mFinalState == State.REMOVED) {
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG, "SpecialEffectsController: For fragment "
-                                    + mFragment + " mFinalState = REMOVED -> VISIBLE. "
-                                    + "mLifecycleImpact = " + mLifecycleImpact + " to ADDING.");
-                        }
-                        // Applying an ADDING operation to a REMOVED fragment
-                        // moves it back to ADDING
-                        mFinalState = State.VISIBLE;
-                        mLifecycleImpact = LifecycleImpact.ADDING;
-                    }
-                    break;
-                case REMOVING:
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG, "SpecialEffectsController: For fragment "
-                                + mFragment + " mFinalState = " + mFinalState + " -> REMOVED. "
-                                + "mLifecycleImpact  = " + mLifecycleImpact + " to REMOVING.");
-                    }
-                    // Any REMOVING operation overrides whatever we had before
-                    mFinalState = State.REMOVED;
-                    mLifecycleImpact = LifecycleImpact.REMOVING;
-                    break;
-                case NONE:
-                    // This is a hide or show operation
-                    if (mFinalState != State.REMOVED) {
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(FragmentManager.TAG, "SpecialEffectsController: For fragment "
-                                    + mFragment + " mFinalState = " + mFinalState + " -> "
-                                    + finalState + ". ");
-                        }
-                        mFinalState = finalState;
-                    }
-            }
-        }
-
-        final void addCompletionListener(@NonNull Runnable listener) {
-            mCompletionListeners.add(listener);
-        }
-
-        /**
-         * Callback for when the operation is about to start.
-         */
-        void onStart() {}
-
-        /**
-         * Add new {@link CancellationSignal} for special effects.
-         *
-         * @param signal A CancellationSignal that can be used to cancel this special effect.
-         */
-        public final void markStartedSpecialEffect(@NonNull CancellationSignal signal) {
-            onStart();
-            mSpecialEffectsSignals.add(signal);
-        }
-
-        /**
-         * Complete a {@link CancellationSignal} that was previously added with
-         * {@link #markStartedSpecialEffect(CancellationSignal)}.
-         *
-         * This calls through to {@link Operation#complete()} when the last special effect is
-         * complete.
-         */
-        public final void completeSpecialEffect(@NonNull CancellationSignal signal) {
-            if (mSpecialEffectsSignals.remove(signal) && mSpecialEffectsSignals.isEmpty()) {
-                complete();
-            }
-        }
-
-        final boolean isComplete() {
-            return mIsComplete;
-        }
-
-        /**
-         * Mark this Operation as complete. This should only be called when all
-         * special effects associated with this Operation have completed successfully.
-         */
-        @CallSuper
-        public void complete() {
-            if (mIsComplete) {
-                return;
-            }
-            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                Log.v(FragmentManager.TAG,
-                        "SpecialEffectsController: " + this + " has called complete.");
-            }
-            mIsComplete = true;
-            for (Runnable listener : mCompletionListeners) {
-                listener.run();
-            }
-        }
-    }
-
-    private static class FragmentStateManagerOperation extends Operation {
-        @NonNull
-        private final FragmentStateManager mFragmentStateManager;
-
-        FragmentStateManagerOperation(@NonNull State finalState,
-                @NonNull LifecycleImpact lifecycleImpact,
-                @NonNull FragmentStateManager fragmentStateManager,
-                @NonNull CancellationSignal cancellationSignal) {
-            super(finalState, lifecycleImpact, fragmentStateManager.getFragment(),
-                    cancellationSignal);
-            mFragmentStateManager = fragmentStateManager;
-        }
-
-        @Override
-        void onStart() {
-            if (getLifecycleImpact() == Operation.LifecycleImpact.ADDING) {
-                Fragment fragment = mFragmentStateManager.getFragment();
-                View focusedView = fragment.mView.findFocus();
-                if (focusedView != null) {
-                    fragment.setFocusedView(focusedView);
-                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                        Log.v(FragmentManager.TAG, "requestFocus: Saved focused view " + focusedView
-                                + " for Fragment " + fragment);
-                    }
-                }
-                View view = getFragment().requireView();
-                // We need to ensure that the fragment's view is re-added
-                // for ADDING operations to properly handle cases where the
-                // exit animation was interrupted.
-                if (view.getParent() == null) {
-                    mFragmentStateManager.addViewToContainer();
-                    view.setAlpha(0f);
-                }
-                // Change the view alphas back to their original values before we execute our
-                // transitions.
-                if (view.getAlpha() == 0f && view.getVisibility() == View.VISIBLE) {
-                    view.setVisibility(View.INVISIBLE);
-                }
-                view.setAlpha(fragment.getPostOnViewCreatedAlpha());
-            } else if (getLifecycleImpact() == LifecycleImpact.REMOVING) {
-                Fragment fragment = mFragmentStateManager.getFragment();
-                View view = fragment.requireView();
-                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                    Log.v(FragmentManager.TAG, "Clearing focus " + view.findFocus() + " on view "
-                            + view + " for Fragment " + fragment);
-                }
-                view.clearFocus();
-            }
-        }
-
-        @Override
-        public void complete() {
-            super.complete();
-            mFragmentStateManager.moveToExpectedState();
-        }
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
new file mode 100644
index 0000000..ec638b2
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
@@ -0,0 +1,710 @@
+/*
+ * 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.fragment.app
+
+import android.util.Log
+import android.view.View
+import android.view.ViewGroup
+import androidx.annotation.CallSuper
+import androidx.core.os.CancellationSignal
+import androidx.core.view.ViewCompat
+import androidx.fragment.R
+import androidx.fragment.app.SpecialEffectsController.Operation.State.Companion.asOperationState
+
+/**
+ * Controller for all "special effects" (such as Animation, Animator, framework Transition, and
+ * AndroidX Transition) that can be applied to a Fragment as part of the addition or removal
+ * of that Fragment from its container.
+ *
+ * Each SpecialEffectsController is responsible for a single [ViewGroup] container.
+ */
+internal abstract class SpecialEffectsController(val container: ViewGroup) {
+    private val pendingOperations = mutableListOf<Operation>()
+    private val runningOperations = mutableListOf<Operation>()
+    private var operationDirectionIsPop = false
+    private var isContainerPostponed = false
+
+    /**
+     * Checks what [lifecycle impact][Operation.LifecycleImpact] of special effect for the
+     * given FragmentStateManager is still awaiting completion (or cancellation).
+     *
+     * This could be because the Operation is still pending (and
+     * [executePendingOperations] hasn't been called) or because all
+     * [started special effects][Operation.markStartedSpecialEffect]
+     * haven't [completed][Operation.completeSpecialEffect].
+     *
+     * @param fragmentStateManager the FragmentStateManager to check for
+     * @return The [Operation.LifecycleImpact] of the awaiting Operation, or null if there is
+     * no special effects still in progress.
+     */
+    fun getAwaitingCompletionLifecycleImpact(
+        fragmentStateManager: FragmentStateManager
+    ): Operation.LifecycleImpact? {
+        val fragment = fragmentStateManager.fragment
+        val pendingLifecycleImpact = findPendingOperation(fragment)?.lifecycleImpact
+        val runningLifecycleImpact = findRunningOperation(fragment)?.lifecycleImpact
+        // Only use the running operation if the pending operation is null or NONE
+        return when (pendingLifecycleImpact) {
+            null -> runningLifecycleImpact
+            Operation.LifecycleImpact.NONE -> runningLifecycleImpact
+            else -> pendingLifecycleImpact
+        }
+    }
+
+    private fun findPendingOperation(
+        fragment: Fragment
+    ) = pendingOperations.firstOrNull { operation ->
+        operation.fragment == fragment && !operation.isCanceled
+    }
+
+    private fun findRunningOperation(
+        fragment: Fragment
+    ) = runningOperations.firstOrNull { operation ->
+        operation.fragment == fragment && !operation.isCanceled
+    }
+
+    fun enqueueAdd(
+        finalState: Operation.State,
+        fragmentStateManager: FragmentStateManager
+    ) {
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(
+                FragmentManager.TAG,
+                "SpecialEffectsController: Enqueuing add operation for fragment " +
+                    fragmentStateManager.fragment
+            )
+        }
+        enqueue(finalState, Operation.LifecycleImpact.ADDING, fragmentStateManager)
+    }
+
+    fun enqueueShow(fragmentStateManager: FragmentStateManager) {
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(
+                FragmentManager.TAG,
+                "SpecialEffectsController: Enqueuing show operation for fragment " +
+                    fragmentStateManager.fragment
+            )
+        }
+        enqueue(Operation.State.VISIBLE, Operation.LifecycleImpact.NONE, fragmentStateManager)
+    }
+
+    fun enqueueHide(fragmentStateManager: FragmentStateManager) {
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(
+                FragmentManager.TAG,
+                "SpecialEffectsController: Enqueuing hide operation for fragment " +
+                    fragmentStateManager.fragment
+            )
+        }
+        enqueue(Operation.State.GONE, Operation.LifecycleImpact.NONE, fragmentStateManager)
+    }
+
+    fun enqueueRemove(fragmentStateManager: FragmentStateManager) {
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(
+                FragmentManager.TAG,
+                "SpecialEffectsController: Enqueuing remove operation for fragment " +
+                    fragmentStateManager.fragment
+            )
+        }
+        enqueue(Operation.State.REMOVED, Operation.LifecycleImpact.REMOVING, fragmentStateManager)
+    }
+
+    private fun enqueue(
+        finalState: Operation.State,
+        lifecycleImpact: Operation.LifecycleImpact,
+        fragmentStateManager: FragmentStateManager
+    ) {
+        synchronized(pendingOperations) {
+            val signal = CancellationSignal()
+            val existingOperation = findPendingOperation(fragmentStateManager.fragment)
+            if (existingOperation != null) {
+                // Update the existing operation by merging in the new information
+                // rather than creating a new Operation entirely
+                existingOperation.mergeWith(finalState, lifecycleImpact)
+                return
+            }
+            val operation = FragmentStateManagerOperation(
+                finalState, lifecycleImpact, fragmentStateManager, signal
+            )
+            pendingOperations.add(operation)
+            // Ensure that we still run the applyState() call for pending operations
+            operation.addCompletionListener {
+                if (pendingOperations.contains(operation)) {
+                    operation.finalState.applyState(operation.fragment.mView)
+                }
+            }
+            // Ensure that we remove the Operation from the list of
+            // operations when the operation is complete
+            operation.addCompletionListener {
+                pendingOperations.remove(operation)
+                runningOperations.remove(operation)
+            }
+        }
+    }
+
+    fun updateOperationDirection(isPop: Boolean) {
+        operationDirectionIsPop = isPop
+    }
+
+    fun markPostponedState() {
+        synchronized(pendingOperations) {
+            updateFinalState()
+            val lastEnteringFragment = pendingOperations.lastOrNull { operation ->
+                // Only consider operations with entering transitions
+                val currentState = operation.fragment.mView.asOperationState()
+                operation.finalState == Operation.State.VISIBLE &&
+                    currentState != Operation.State.VISIBLE
+            }?.fragment
+            // The container is considered postponed if the Fragment
+            // associated with the last entering Operation is postponed
+            isContainerPostponed = lastEnteringFragment?.isPostponed ?: false
+        }
+    }
+
+    fun forcePostponedExecutePendingOperations() {
+        if (isContainerPostponed) {
+            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                Log.v(
+                    FragmentManager.TAG,
+                    "SpecialEffectsController: Forcing postponed operations"
+                )
+            }
+            isContainerPostponed = false
+            executePendingOperations()
+        }
+    }
+
+    fun executePendingOperations() {
+        if (isContainerPostponed) {
+            // No operations should execute while the container is postponed
+            return
+        }
+        // If the container is not attached to the window, ignore the special effect
+        // since none of the special effect systems will run them anyway.
+        if (!ViewCompat.isAttachedToWindow(container)) {
+            forceCompleteAllOperations()
+            operationDirectionIsPop = false
+            return
+        }
+        synchronized(pendingOperations) {
+            if (pendingOperations.isNotEmpty()) {
+                val currentlyRunningOperations = runningOperations.toMutableList()
+                runningOperations.clear()
+                for (operation in currentlyRunningOperations) {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(
+                            FragmentManager.TAG,
+                            "SpecialEffectsController: Cancelling operation $operation"
+                        )
+                    }
+                    operation.cancel()
+                    if (!operation.isComplete) {
+                        // Re-add any animations that didn't synchronously call complete()
+                        // to continue to track them as running operations
+                        runningOperations.add(operation)
+                    }
+                }
+                updateFinalState()
+                val newPendingOperations = pendingOperations.toMutableList()
+                pendingOperations.clear()
+                runningOperations.addAll(newPendingOperations)
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(
+                        FragmentManager.TAG,
+                        "SpecialEffectsController: Executing pending operations"
+                    )
+                }
+                for (operation in newPendingOperations) {
+                    operation.onStart()
+                }
+                executeOperations(newPendingOperations, operationDirectionIsPop)
+                operationDirectionIsPop = false
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(
+                        FragmentManager.TAG,
+                        "SpecialEffectsController: Finished executing pending operations"
+                    )
+                }
+            }
+        }
+    }
+
+    fun forceCompleteAllOperations() {
+        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+            Log.v(
+                FragmentManager.TAG,
+                "SpecialEffectsController: Forcing all operations to complete"
+            )
+        }
+        val attachedToWindow = ViewCompat.isAttachedToWindow(container)
+        synchronized(pendingOperations) {
+            updateFinalState()
+            for (operation in pendingOperations) {
+                operation.onStart()
+            }
+
+            // First cancel running operations
+            val runningOperations = runningOperations.toMutableList()
+            for (operation in runningOperations) {
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    val notAttachedMessage = if (attachedToWindow) {
+                        ""
+                    } else {
+                        "Container $container is not attached to window. "
+                    }
+                    Log.v(
+                        FragmentManager.TAG,
+                        "SpecialEffectsController: " + notAttachedMessage +
+                            "Cancelling running operation $operation"
+                    )
+                }
+                operation.cancel()
+            }
+
+            // Then cancel pending operations
+            val pendingOperations = pendingOperations.toMutableList()
+            for (operation in pendingOperations) {
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    val notAttachedMessage = if (attachedToWindow) {
+                        ""
+                    } else {
+                        "Container $container is not attached to window. "
+                    }
+                    Log.v(
+                        FragmentManager.TAG,
+                        "SpecialEffectsController: " + notAttachedMessage +
+                            "Cancelling pending operation $operation"
+                    )
+                }
+                operation.cancel()
+            }
+        }
+    }
+
+    private fun updateFinalState() {
+        for (operation in pendingOperations) {
+            // update the final state of adding operations
+            if (operation.lifecycleImpact == Operation.LifecycleImpact.ADDING) {
+                val fragment = operation.fragment
+                val view = fragment.requireView()
+                val finalState = Operation.State.from(view.visibility)
+                operation.mergeWith(finalState, Operation.LifecycleImpact.NONE)
+            }
+        }
+    }
+
+    /**
+     * Execute all of the given operations.
+     *
+     * If there are no special effects for a given operation, the SpecialEffectsController
+     * should call [Operation.complete]. Otherwise, a
+     * [CancellationSignal] representing each special effect should be added via
+     * [Operation.markStartedSpecialEffect], calling
+     * [Operation.completeSpecialEffect] when that specific
+     * special effect finishes. When the last started special effect is completed,
+     * [Operation.completeSpecialEffect] will call
+     * [Operation.complete] automatically.
+     *
+     * It is **strongly recommended** that each [CancellationSignal] added with
+     * [Operation.markStartedSpecialEffect] listen for cancellation,
+     * properly cancelling the special effect when the signal is cancelled.
+     *
+     * @param operations the list of operations to execute in order.
+     * @param isPop whether this set of operations should be considered as triggered by a 'pop'.
+     * This can be used to control the direction of any special effects if they
+     * are not symmetric.
+     */
+    abstract fun executeOperations(
+        operations: List<@JvmSuppressWildcards Operation>,
+        isPop: Boolean
+    )
+
+    /**
+     * Class representing an ongoing special effects operation.
+     *
+     * @see executeOperations
+     */
+    internal open class Operation(
+        /**
+         * The final state after this operation should be.
+         */
+        var finalState: State,
+        /**
+         * How this Operation affects the lifecycle of the fragment.
+         */
+        var lifecycleImpact: LifecycleImpact,
+        /**
+         * The Fragment being added / removed.
+         */
+        val fragment: Fragment,
+        /**
+         * A signal for handling cancellation
+         */
+        cancellationSignal: CancellationSignal
+    ) {
+        /**
+         * The state that the fragment's View should be in after applying this operation.
+         *
+         * @see applyState
+         */
+        internal enum class State {
+            /**
+             * The fragment's view should be completely removed from the container.
+             */
+            REMOVED,
+            /**
+             * The fragment's view should be made [View.VISIBLE].
+             */
+            VISIBLE,
+            /**
+             * The fragment's view should be made [View.GONE].
+             */
+            GONE,
+            /**
+             * The fragment's view should be made [View.INVISIBLE].
+             */
+            INVISIBLE;
+
+            /**
+             * Applies this state to the given View.
+             *
+             * @param view The View to apply this state to.
+             */
+            fun applyState(view: View) {
+                when (this) {
+                    REMOVED -> {
+                        val parent = view.parent as? ViewGroup
+                        if (parent != null) {
+                            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                                Log.v(
+                                    FragmentManager.TAG, "SpecialEffectsController: " +
+                                        "Removing view $view from container $parent"
+                                )
+                            }
+                            parent.removeView(view)
+                        }
+                    }
+
+                    VISIBLE -> {
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(
+                                FragmentManager.TAG, "SpecialEffectsController: " +
+                                    "Setting view $view to VISIBLE"
+                            )
+                        }
+                        view.visibility = View.VISIBLE
+                    }
+
+                    GONE -> {
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(
+                                FragmentManager.TAG,
+                                "SpecialEffectsController: Setting view $view to GONE"
+                            )
+                        }
+                        view.visibility = View.GONE
+                    }
+
+                    INVISIBLE -> {
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(
+                                FragmentManager.TAG,
+                                "SpecialEffectsController: Setting view $view to INVISIBLE"
+                            )
+                        }
+                        view.visibility = View.INVISIBLE
+                    }
+                }
+            }
+
+            companion object {
+                /**
+                 * Create a new State from the [view's visibility][View.getVisibility].
+                 */
+                fun View.asOperationState() = if (alpha == 0f && visibility == View.VISIBLE) {
+                    // We should consider views with an alpha of 0 as INVISIBLE.
+                    INVISIBLE
+                } else {
+                    from(visibility)
+                }
+
+                /**
+                 * Create a new State from the visibility of a View.
+                 *
+                 * @param visibility The visibility constant to translate into a State.
+                 * @return A new State from the visibility.
+                 */
+                @JvmStatic
+                fun from(visibility: Int): State {
+                    return when (visibility) {
+                        View.VISIBLE -> VISIBLE
+                        View.INVISIBLE -> INVISIBLE
+                        View.GONE -> GONE
+                        else -> throw IllegalArgumentException("Unknown visibility $visibility")
+                    }
+                }
+            }
+        }
+
+        /**
+         * The impact that this operation has on the lifecycle of the fragment.
+         */
+        internal enum class LifecycleImpact {
+            /**
+             * No impact on the fragment's lifecycle.
+             */
+            NONE,
+            /**
+             * This operation is associated with adding a fragment.
+             */
+            ADDING,
+            /**
+             * This operation is associated with removing a fragment.
+             */
+            REMOVING,
+        }
+
+        private val completionListeners = mutableListOf<Runnable>()
+        private val specialEffectsSignals = mutableSetOf<CancellationSignal>()
+        var isCanceled = false
+            private set
+        var isComplete = false
+            private set
+
+        init {
+            // Connect the CancellationSignal to our own
+            cancellationSignal.setOnCancelListener { cancel() }
+        }
+
+        override fun toString(): String {
+            val identityHash = Integer.toHexString(System.identityHashCode(this))
+            return "Operation {$identityHash} {" +
+                "finalState = $finalState " +
+                "lifecycleImpact = $lifecycleImpact " +
+                "fragment = $fragment}"
+        }
+
+        fun cancel() {
+            if (isCanceled) {
+                return
+            }
+            isCanceled = true
+            if (specialEffectsSignals.isEmpty()) {
+                complete()
+            } else {
+                val signals = specialEffectsSignals.toMutableSet()
+                for (signal in signals) {
+                    signal.cancel()
+                }
+            }
+        }
+
+        fun mergeWith(finalState: State, lifecycleImpact: LifecycleImpact) {
+            when (lifecycleImpact) {
+                LifecycleImpact.ADDING -> if (this.finalState == State.REMOVED) {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(
+                            FragmentManager.TAG,
+                            "SpecialEffectsController: For fragment $fragment " +
+                                "mFinalState = REMOVED -> VISIBLE. " +
+                                "mLifecycleImpact = ${this.lifecycleImpact} to ADDING."
+                        )
+                    }
+                    // Applying an ADDING operation to a REMOVED fragment
+                    // moves it back to ADDING
+                    this.finalState = State.VISIBLE
+                    this.lifecycleImpact = LifecycleImpact.ADDING
+                }
+                LifecycleImpact.REMOVING -> {
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(
+                            FragmentManager.TAG,
+                            "SpecialEffectsController: For fragment $fragment " +
+                                "mFinalState = ${this.finalState} -> REMOVED. " +
+                                "mLifecycleImpact  = ${this.lifecycleImpact} to REMOVING."
+                        )
+                    }
+                    // Any REMOVING operation overrides whatever we had before
+                    this.finalState = State.REMOVED
+                    this.lifecycleImpact = LifecycleImpact.REMOVING
+                }
+                LifecycleImpact.NONE -> // This is a hide or show operation
+                    if (this.finalState != State.REMOVED) {
+                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                            Log.v(
+                                FragmentManager.TAG,
+                                "SpecialEffectsController: For fragment $fragment " +
+                                    "mFinalState = ${this.finalState} -> $finalState."
+                            )
+                        }
+                        this.finalState = finalState
+                    }
+            }
+        }
+
+        fun addCompletionListener(listener: Runnable) {
+            completionListeners.add(listener)
+        }
+
+        /**
+         * Callback for when the operation is about to start.
+         */
+        open fun onStart() {}
+
+        /**
+         * Add new [CancellationSignal] for special effects.
+         *
+         * @param signal A CancellationSignal that can be used to cancel this special effect.
+         */
+        fun markStartedSpecialEffect(signal: CancellationSignal) {
+            onStart()
+            specialEffectsSignals.add(signal)
+        }
+
+        /**
+         * Complete a [CancellationSignal] that was previously added with
+         * [markStartedSpecialEffect].
+         *
+         * This calls through to [Operation.complete] when the last special effect is
+         * complete.
+         */
+        fun completeSpecialEffect(signal: CancellationSignal) {
+            if (specialEffectsSignals.remove(signal) && specialEffectsSignals.isEmpty()) {
+                complete()
+            }
+        }
+
+        /**
+         * Mark this Operation as complete. This should only be called when all
+         * special effects associated with this Operation have completed successfully.
+         */
+        @CallSuper
+        open fun complete() {
+            if (isComplete) {
+                return
+            }
+            if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                Log.v(
+                    FragmentManager.TAG,
+                    "SpecialEffectsController: $this has called complete."
+                )
+            }
+            isComplete = true
+            completionListeners.forEach { listener ->
+                listener.run()
+            }
+        }
+    }
+
+    private class FragmentStateManagerOperation(
+        finalState: State,
+        lifecycleImpact: LifecycleImpact,
+        private val fragmentStateManager: FragmentStateManager,
+        cancellationSignal: CancellationSignal
+    ) : Operation(
+        finalState, lifecycleImpact, fragmentStateManager.fragment,
+        cancellationSignal
+    ) {
+        override fun onStart() {
+            if (lifecycleImpact == LifecycleImpact.ADDING) {
+                val fragment = fragmentStateManager.fragment
+                val focusedView = fragment.mView.findFocus()
+                if (focusedView != null) {
+                    fragment.focusedView = focusedView
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(
+                            FragmentManager.TAG,
+                            "requestFocus: Saved focused view $focusedView for Fragment $fragment"
+                        )
+                    }
+                }
+                val view = this.fragment.requireView()
+                // We need to ensure that the fragment's view is re-added
+                // for ADDING operations to properly handle cases where the
+                // exit animation was interrupted.
+                if (view.parent == null) {
+                    fragmentStateManager.addViewToContainer()
+                    view.alpha = 0f
+                }
+                // Change the view alphas back to their original values before we execute our
+                // transitions.
+                if (view.alpha == 0f && view.visibility == View.VISIBLE) {
+                    view.visibility = View.INVISIBLE
+                }
+                view.alpha = fragment.postOnViewCreatedAlpha
+            } else if (lifecycleImpact == LifecycleImpact.REMOVING) {
+                val fragment = fragmentStateManager.fragment
+                val view = fragment.requireView()
+                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                    Log.v(
+                        FragmentManager.TAG,
+                        "Clearing focus ${view.findFocus()} on view $view for Fragment $fragment"
+                    )
+                }
+                view.clearFocus()
+            }
+        }
+
+        override fun complete() {
+            super.complete()
+            fragmentStateManager.moveToExpectedState()
+        }
+    }
+
+    companion object {
+        /**
+         * Get the [SpecialEffectsController] for a given container if it already exists
+         * or create it. This will automatically find the containing FragmentManager and use the
+         * factory provided by [FragmentManager.getSpecialEffectsControllerFactory].
+         *
+         * @param container ViewGroup to find the associated SpecialEffectsController for.
+         * @return a SpecialEffectsController for the given container
+         */
+        @JvmStatic
+        fun getOrCreateController(
+            container: ViewGroup,
+            fragmentManager: FragmentManager
+        ): SpecialEffectsController {
+            val factory = fragmentManager.specialEffectsControllerFactory
+            return getOrCreateController(container, factory)
+        }
+
+        /**
+         * Get the [SpecialEffectsController] for a given container if it already exists
+         * or create it using the given [SpecialEffectsControllerFactory] if it does not.
+         *
+         * @param container ViewGroup to find the associated SpecialEffectsController for.
+         * @param factory The factory to use to create a new SpecialEffectsController if one does
+         * not already exist for this container.
+         * @return a SpecialEffectsController for the given container
+         */
+        @JvmStatic
+        fun getOrCreateController(
+            container: ViewGroup,
+            factory: SpecialEffectsControllerFactory
+        ): SpecialEffectsController {
+            val controller = container.getTag(R.id.special_effects_controller_view_tag)
+            if (controller is SpecialEffectsController) {
+                return controller
+            }
+            // Else, create a new SpecialEffectsController
+            val newController = factory.createController(container)
+            container.setTag(R.id.special_effects_controller_view_tag, newController)
+            return newController
+        }
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget-preview/api/current.txt b/glance/glance-appwidget-preview/api/current.txt
index 873473c..e6f50d0 100644
--- a/glance/glance-appwidget-preview/api/current.txt
+++ b/glance/glance-appwidget-preview/api/current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.appwidget.preview {
-
-  public final class GlanceAppWidgetViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget-preview/api/public_plus_experimental_current.txt b/glance/glance-appwidget-preview/api/public_plus_experimental_current.txt
index 873473c..e6f50d0 100644
--- a/glance/glance-appwidget-preview/api/public_plus_experimental_current.txt
+++ b/glance/glance-appwidget-preview/api/public_plus_experimental_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.appwidget.preview {
-
-  public final class GlanceAppWidgetViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget-preview/api/restricted_current.txt b/glance/glance-appwidget-preview/api/restricted_current.txt
index 873473c..e6f50d0 100644
--- a/glance/glance-appwidget-preview/api/restricted_current.txt
+++ b/glance/glance-appwidget-preview/api/restricted_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.appwidget.preview {
-
-  public final class GlanceAppWidgetViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget/api/current.txt b/glance/glance-appwidget/api/current.txt
index c3751e8..0bfd96b 100644
--- a/glance/glance-appwidget/api/current.txt
+++ b/glance/glance-appwidget/api/current.txt
@@ -10,18 +10,6 @@
     method public static androidx.glance.GlanceModifier appWidgetBackground(androidx.glance.GlanceModifier);
   }
 
-  public final class AppWidgetModifiersKt {
-  }
-
-  public final class AppWidgetSessionKt {
-  }
-
-  public final class AppWidgetUtilsKt {
-  }
-
-  public final class ApplyModifiersKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
@@ -50,12 +38,6 @@
     method public static androidx.glance.GlanceModifier cornerRadius(androidx.glance.GlanceModifier, @DimenRes int radius);
   }
 
-  public final class CoroutineBroadcastReceiverKt {
-  }
-
-  public final class GeneratedLayoutsKt {
-  }
-
   public abstract class GlanceAppWidget {
     ctor public GlanceAppWidget(optional @LayoutRes int errorUiLayout);
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void Content();
@@ -86,9 +68,6 @@
     method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
-  public final class GlanceAppWidgetManagerKt {
-  }
-
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
     ctor public GlanceAppWidgetReceiver();
     method public abstract androidx.glance.appwidget.GlanceAppWidget getGlanceAppWidget();
@@ -100,30 +79,15 @@
   public static final class GlanceAppWidgetReceiver.Companion {
   }
 
-  public final class GlanceAppWidgetReceiverKt {
-  }
-
-  public final class GlanceRemoteViewsKt {
-  }
-
-  public final class IgnoreResultKt {
-  }
-
   public final class ImageProvidersKt {
     method public static androidx.glance.ImageProvider ImageProvider(android.net.Uri uri);
   }
 
-  public final class LayoutSelectionKt {
-  }
-
   public final class LinearProgressIndicatorKt {
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
   }
 
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class ProgressIndicatorDefaults {
     method public androidx.glance.unit.ColorProvider getBackgroundColorProvider();
     method public androidx.glance.unit.ColorProvider getIndicatorColorProvider();
@@ -143,12 +107,6 @@
     method public static androidx.glance.GlanceModifier selectableGroup(androidx.glance.GlanceModifier);
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -175,12 +133,6 @@
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors();
   }
 
-  public final class UtilsKt {
-  }
-
-  public final class WidgetLayoutKt {
-  }
-
 }
 
 package androidx.glance.appwidget.action {
@@ -189,12 +141,6 @@
     method public suspend Object? onAction(android.content.Context context, androidx.glance.GlanceId glanceId, androidx.glance.action.ActionParameters parameters, kotlin.coroutines.Continuation<? super kotlin.Unit>);
   }
 
-  public final class ActionTrampolineKt {
-  }
-
-  public final class ApplyActionKt {
-  }
-
   public final class RunCallbackActionKt {
     method public static <T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(Class<T> callbackClass, optional androidx.glance.action.ActionParameters parameters);
     method public static inline <reified T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(optional androidx.glance.action.ActionParameters parameters);
@@ -310,9 +256,6 @@
     method @androidx.compose.runtime.Composable public static void GalleryTemplate(androidx.glance.template.GalleryTemplateData data);
   }
 
-  public final class GlanceAppWidgetTemplatesKt {
-  }
-
   public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
     ctor public GlanceTemplateAppWidget();
     method @androidx.compose.runtime.Composable public final void Content();
@@ -335,44 +278,3 @@
 
 }
 
-package androidx.glance.appwidget.translators {
-
-  public final class CheckBoxTranslatorKt {
-  }
-
-  public final class CircularProgressIndicatorTranslatorKt {
-  }
-
-  public final class CompoundButtonTranslatorKt {
-  }
-
-  public final class ImageTranslatorKt {
-  }
-
-  public final class LazyListTranslatorKt {
-  }
-
-  public final class LazyVerticalGridTranslatorKt {
-  }
-
-  public final class LinearProgressIndicatorTranslatorKt {
-  }
-
-  public final class RadioButtonTranslatorKt {
-  }
-
-  public final class SwitchTranslatorKt {
-  }
-
-  public final class TextTranslatorKt {
-  }
-
-}
-
-package androidx.glance.appwidget.unit {
-
-  public final class ColorProviderKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget/api/public_plus_experimental_current.txt b/glance/glance-appwidget/api/public_plus_experimental_current.txt
index 9516a38..be1ed4e 100644
--- a/glance/glance-appwidget/api/public_plus_experimental_current.txt
+++ b/glance/glance-appwidget/api/public_plus_experimental_current.txt
@@ -10,18 +10,6 @@
     method public static androidx.glance.GlanceModifier appWidgetBackground(androidx.glance.GlanceModifier);
   }
 
-  public final class AppWidgetModifiersKt {
-  }
-
-  public final class AppWidgetSessionKt {
-  }
-
-  public final class AppWidgetUtilsKt {
-  }
-
-  public final class ApplyModifiersKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
@@ -50,15 +38,9 @@
     method public static androidx.glance.GlanceModifier cornerRadius(androidx.glance.GlanceModifier, @DimenRes int radius);
   }
 
-  public final class CoroutineBroadcastReceiverKt {
-  }
-
   @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalGlanceRemoteViewsApi {
   }
 
-  public final class GeneratedLayoutsKt {
-  }
-
   public abstract class GlanceAppWidget {
     ctor public GlanceAppWidget(optional @LayoutRes int errorUiLayout);
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void Content();
@@ -89,9 +71,6 @@
     method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
-  public final class GlanceAppWidgetManagerKt {
-  }
-
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
     ctor public GlanceAppWidgetReceiver();
     method public abstract androidx.glance.appwidget.GlanceAppWidget getGlanceAppWidget();
@@ -103,35 +82,20 @@
   public static final class GlanceAppWidgetReceiver.Companion {
   }
 
-  public final class GlanceAppWidgetReceiverKt {
-  }
-
   @androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi public final class GlanceRemoteViews {
     ctor public GlanceRemoteViews();
     method public suspend Object? compose(android.content.Context context, long size, optional Object? state, optional android.os.Bundle appWidgetOptions, kotlin.jvm.functions.Function0<kotlin.Unit> content, kotlin.coroutines.Continuation<? super androidx.glance.appwidget.RemoteViewsCompositionResult>);
   }
 
-  public final class GlanceRemoteViewsKt {
-  }
-
-  public final class IgnoreResultKt {
-  }
-
   public final class ImageProvidersKt {
     method public static androidx.glance.ImageProvider ImageProvider(android.net.Uri uri);
   }
 
-  public final class LayoutSelectionKt {
-  }
-
   public final class LinearProgressIndicatorKt {
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
   }
 
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class ProgressIndicatorDefaults {
     method public androidx.glance.unit.ColorProvider getBackgroundColorProvider();
     method public androidx.glance.unit.ColorProvider getIndicatorColorProvider();
@@ -157,12 +121,6 @@
     property public final android.widget.RemoteViews remoteViews;
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -189,12 +147,6 @@
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors();
   }
 
-  public final class UtilsKt {
-  }
-
-  public final class WidgetLayoutKt {
-  }
-
 }
 
 package androidx.glance.appwidget.action {
@@ -203,12 +155,6 @@
     method public suspend Object? onAction(android.content.Context context, androidx.glance.GlanceId glanceId, androidx.glance.action.ActionParameters parameters, kotlin.coroutines.Continuation<? super kotlin.Unit>);
   }
 
-  public final class ActionTrampolineKt {
-  }
-
-  public final class ApplyActionKt {
-  }
-
   public final class RunCallbackActionKt {
     method public static <T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(Class<T> callbackClass, optional androidx.glance.action.ActionParameters parameters);
     method public static inline <reified T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(optional androidx.glance.action.ActionParameters parameters);
@@ -324,9 +270,6 @@
     method @androidx.compose.runtime.Composable public static void GalleryTemplate(androidx.glance.template.GalleryTemplateData data);
   }
 
-  public final class GlanceAppWidgetTemplatesKt {
-  }
-
   public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
     ctor public GlanceTemplateAppWidget();
     method @androidx.compose.runtime.Composable public final void Content();
@@ -349,44 +292,3 @@
 
 }
 
-package androidx.glance.appwidget.translators {
-
-  public final class CheckBoxTranslatorKt {
-  }
-
-  public final class CircularProgressIndicatorTranslatorKt {
-  }
-
-  public final class CompoundButtonTranslatorKt {
-  }
-
-  public final class ImageTranslatorKt {
-  }
-
-  public final class LazyListTranslatorKt {
-  }
-
-  public final class LazyVerticalGridTranslatorKt {
-  }
-
-  public final class LinearProgressIndicatorTranslatorKt {
-  }
-
-  public final class RadioButtonTranslatorKt {
-  }
-
-  public final class SwitchTranslatorKt {
-  }
-
-  public final class TextTranslatorKt {
-  }
-
-}
-
-package androidx.glance.appwidget.unit {
-
-  public final class ColorProviderKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget/api/restricted_current.txt b/glance/glance-appwidget/api/restricted_current.txt
index c3751e8..0bfd96b 100644
--- a/glance/glance-appwidget/api/restricted_current.txt
+++ b/glance/glance-appwidget/api/restricted_current.txt
@@ -10,18 +10,6 @@
     method public static androidx.glance.GlanceModifier appWidgetBackground(androidx.glance.GlanceModifier);
   }
 
-  public final class AppWidgetModifiersKt {
-  }
-
-  public final class AppWidgetSessionKt {
-  }
-
-  public final class AppWidgetUtilsKt {
-  }
-
-  public final class ApplyModifiersKt {
-  }
-
   public final class BackgroundKt {
     method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
@@ -50,12 +38,6 @@
     method public static androidx.glance.GlanceModifier cornerRadius(androidx.glance.GlanceModifier, @DimenRes int radius);
   }
 
-  public final class CoroutineBroadcastReceiverKt {
-  }
-
-  public final class GeneratedLayoutsKt {
-  }
-
   public abstract class GlanceAppWidget {
     ctor public GlanceAppWidget(optional @LayoutRes int errorUiLayout);
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void Content();
@@ -86,9 +68,6 @@
     method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
-  public final class GlanceAppWidgetManagerKt {
-  }
-
   public abstract class GlanceAppWidgetReceiver extends android.appwidget.AppWidgetProvider {
     ctor public GlanceAppWidgetReceiver();
     method public abstract androidx.glance.appwidget.GlanceAppWidget getGlanceAppWidget();
@@ -100,30 +79,15 @@
   public static final class GlanceAppWidgetReceiver.Companion {
   }
 
-  public final class GlanceAppWidgetReceiverKt {
-  }
-
-  public final class GlanceRemoteViewsKt {
-  }
-
-  public final class IgnoreResultKt {
-  }
-
   public final class ImageProvidersKt {
     method public static androidx.glance.ImageProvider ImageProvider(android.net.Uri uri);
   }
 
-  public final class LayoutSelectionKt {
-  }
-
   public final class LinearProgressIndicatorKt {
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
     method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.unit.ColorProvider color, optional androidx.glance.unit.ColorProvider backgroundColor);
   }
 
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class ProgressIndicatorDefaults {
     method public androidx.glance.unit.ColorProvider getBackgroundColorProvider();
     method public androidx.glance.unit.ColorProvider getIndicatorColorProvider();
@@ -143,12 +107,6 @@
     method public static androidx.glance.GlanceModifier selectableGroup(androidx.glance.GlanceModifier);
   }
 
-  public final class RemoteViewsTranslatorKt {
-  }
-
-  public final class SizeBoxKt {
-  }
-
   public sealed interface SizeMode {
   }
 
@@ -175,12 +133,6 @@
     method @androidx.compose.runtime.Composable public static androidx.glance.appwidget.SwitchColors switchColors();
   }
 
-  public final class UtilsKt {
-  }
-
-  public final class WidgetLayoutKt {
-  }
-
 }
 
 package androidx.glance.appwidget.action {
@@ -189,12 +141,6 @@
     method public suspend Object? onAction(android.content.Context context, androidx.glance.GlanceId glanceId, androidx.glance.action.ActionParameters parameters, kotlin.coroutines.Continuation<? super kotlin.Unit>);
   }
 
-  public final class ActionTrampolineKt {
-  }
-
-  public final class ApplyActionKt {
-  }
-
   public final class RunCallbackActionKt {
     method public static <T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(Class<T> callbackClass, optional androidx.glance.action.ActionParameters parameters);
     method public static inline <reified T extends androidx.glance.appwidget.action.ActionCallback> androidx.glance.action.Action actionRunCallback(optional androidx.glance.action.ActionParameters parameters);
@@ -310,9 +256,6 @@
     method @androidx.compose.runtime.Composable public static void GalleryTemplate(androidx.glance.template.GalleryTemplateData data);
   }
 
-  public final class GlanceAppWidgetTemplatesKt {
-  }
-
   public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
     ctor public GlanceTemplateAppWidget();
     method @androidx.compose.runtime.Composable public final void Content();
@@ -335,44 +278,3 @@
 
 }
 
-package androidx.glance.appwidget.translators {
-
-  public final class CheckBoxTranslatorKt {
-  }
-
-  public final class CircularProgressIndicatorTranslatorKt {
-  }
-
-  public final class CompoundButtonTranslatorKt {
-  }
-
-  public final class ImageTranslatorKt {
-  }
-
-  public final class LazyListTranslatorKt {
-  }
-
-  public final class LazyVerticalGridTranslatorKt {
-  }
-
-  public final class LinearProgressIndicatorTranslatorKt {
-  }
-
-  public final class RadioButtonTranslatorKt {
-  }
-
-  public final class SwitchTranslatorKt {
-  }
-
-  public final class TextTranslatorKt {
-  }
-
-}
-
-package androidx.glance.appwidget.unit {
-
-  public final class ColorProviderKt {
-  }
-
-}
-
diff --git a/glance/glance-appwidget/integration-tests/macrobenchmark-target/build.gradle b/glance/glance-appwidget/integration-tests/macrobenchmark-target/build.gradle
index c4be7d4..f3f0f5d 100644
--- a/glance/glance-appwidget/integration-tests/macrobenchmark-target/build.gradle
+++ b/glance/glance-appwidget/integration-tests/macrobenchmark-target/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-
 plugins {
     id("AndroidXPlugin")
     id("AndroidXComposePlugin")
@@ -26,6 +25,7 @@
     implementation(libs.kotlinStdlib)
     implementation(project(":glance:glance"))
     implementation(project(":glance:glance-appwidget"))
+    implementation(project(":profileinstaller:profileinstaller"))
 }
 
 android {
diff --git a/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetHostRule.kt b/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetHostRule.kt
index 93939ba..90abda1 100644
--- a/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetHostRule.kt
+++ b/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetHostRule.kt
@@ -21,13 +21,14 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.os.Build
 import android.os.Trace
+import androidx.annotation.RequiresApi
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.rules.ActivityScenarioRule
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
 import org.junit.rules.RuleChain
@@ -35,7 +36,7 @@
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
 
-@SdkSuppress(minSdkVersion = 29)
+@RequiresApi(Build.VERSION_CODES.Q)
 class AppWidgetHostRule(
     private var mPortraitSize: DpSize = DpSize(200.dp, 300.dp),
     private var mLandscapeSize: DpSize = DpSize(300.dp, 200.dp),
diff --git a/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetUpdateBenchmark.kt b/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetUpdateBenchmark.kt
index 578f12f..039a39b 100644
--- a/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetUpdateBenchmark.kt
+++ b/glance/glance-appwidget/integration-tests/macrobenchmark/src/androidTest/java/androidx/glance/appwidget/macrobenchmark/AppWidgetUpdateBenchmark.kt
@@ -16,14 +16,13 @@
 
 package androidx.glance.appwidget.macrobenchmark
 
-import android.os.Build
-import androidx.annotation.RequiresApi
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.ExperimentalMetricApi
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.TraceSectionMetric
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import org.junit.Rule
 import org.junit.Test
@@ -31,7 +30,7 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@RequiresApi(Build.VERSION_CODES.Q)
+@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class AppWidgetUpdateBenchmark(
     private val startupMode: StartupMode,
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
index c1762c0..ccf627a 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
@@ -20,9 +20,11 @@
 import android.content.Context
 import android.os.Build
 import android.os.Bundle
+import android.util.Log
 import android.view.View
 import android.view.ViewGroup
 import android.widget.RelativeLayout
+import android.widget.TextView
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.max
 import androidx.compose.ui.unit.min
@@ -143,3 +145,23 @@
     }
     error("Could not update the AtomicReference")
 }
+
+/**
+ * Print the view hierarchy from the current view to the log.
+ *
+ * @param tag Log tag to use for logging
+ * @param parent view to start the hierarchy print from
+ * @param indent to use for the log messages
+ */
+fun logViewHierarchy(tag: String, parent: ViewGroup, indent: String) {
+    for (child in parent.children) {
+        var childString = child.toString()
+        if (child is TextView) {
+            childString = "$childString '${child.text}'"
+        }
+        Log.e(tag, "$indent|- $childString")
+        if (child is ViewGroup) {
+            logViewHierarchy(tag, child, "$indent  ")
+        }
+    }
+}
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
index 64bd87c..de35f2f 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
@@ -22,6 +22,7 @@
 import android.content.Context
 import android.content.pm.ActivityInfo
 import android.content.res.Configuration
+import android.util.Log
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewTreeObserver
@@ -142,6 +143,12 @@
         val hostView = checkNotNull(mMaybeHostView) { "Host view wasn't successfully started" }
         hostView.resetRemoteViewsLatch()
         withContext(Dispatchers.Main) { block() }
+
+        // b/267494219 these tests are currently flaking due to possible changes to the views after
+        // the initial update. Sleeping here is not the final fix, we need a better way to decide
+        // the UI has settled. In the short term this does reduce the flakiness.
+        Thread.sleep(5000)
+
         // Do not wait on the main thread so that the UI handlers can run.
         runAndWaitForChildren {
             hostView.waitForRemoteViews()
@@ -183,10 +190,32 @@
      * possibly the one to get the exact size.
      */
     inline fun <reified T : View> onUnboxedHostView(crossinline block: (T) -> Unit) {
-        onHostActivity {
-            val boxingView = assertIs<ViewGroup>(mHostView.getChildAt(0))
-            block(boxingView.children.single().getTargetView())
+
+        // b/267494219 these tests are currently flaking due to possible changes to the views after
+        // the initial update. Sleeping here is not the final fix, we need a better way to decide
+        // the UI has settled. In the short term this does reduce the flakiness.
+        var found = false
+        for (i in 1..20) {
+            if (!found) {
+                onHostActivity {
+                    val boxingView = assertIs<ViewGroup>(mHostView.getChildAt(0))
+                    val childCount = boxingView.childCount
+
+                    if (childCount != 0) {
+                        if (i > 1) Log.i(RECEIVER_TEST_TAG, "...now we have children")
+                        block(boxingView.children.single().getTargetView())
+                        found = true
+                    } else {
+                        Log.i(RECEIVER_TEST_TAG, "$i Boxing view is empty, waiting...")
+                        Log.i(RECEIVER_TEST_TAG, "Boxing view: $boxingView")
+                        Thread.sleep(500)
+                    }
+                }
+            } else {
+                return
+            }
         }
+        fail("Waited for boxing view not to be empty, but it never got children")
     }
 
     /** Change the orientation to landscape.*/
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
index 2b9f6b6..86837e0 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
@@ -25,6 +25,7 @@
 import android.content.Context
 import android.content.res.Configuration
 import android.graphics.Color
+import android.graphics.Rect
 import android.os.Bundle
 import android.os.LocaleList
 import android.util.Log
@@ -100,7 +101,6 @@
         val context = this.createConfigurationContext(config)
 
         val hostView = host.createView(context, appWidgetId, info) as TestAppWidgetHostView
-        hostView.setPadding(0, 0, 0, 0)
         val contentFrame = findViewById<FrameLayout>(R.id.content)
         contentFrame.addView(hostView)
         hostView.setSizes(portraitSize, landscapeSize)
@@ -181,6 +181,10 @@
     }
 
     override fun updateAppWidget(remoteViews: RemoteViews?) {
+        if (VERBOSE_LOG) {
+            Log.d(RECEIVER_TEST_TAG, "updateAppWidget() called with: $remoteViews")
+        }
+
         super.updateAppWidget(remoteViews)
         synchronized(this) {
             mRemoteViews = remoteViews
@@ -190,6 +194,14 @@
         }
     }
 
+    override fun prepareView(view: View?) {
+        if (VERBOSE_LOG) {
+            Log.d(RECEIVER_TEST_TAG, "prepareView() called with: view = $view")
+        }
+
+        super.prepareView(view)
+    }
+
     /** Reset the latch used to detect the arrival of a new RemoteViews. */
     fun resetRemoteViewsLatch() {
         synchronized(this) {
@@ -213,7 +225,18 @@
         val displayMetrics = resources.displayMetrics
         val width = size.width.toPixels(displayMetrics)
         val height = size.height.toPixels(displayMetrics)
-        layoutParams = LayoutParams(width, height, Gravity.CENTER)
+
+        // The widget host applies a default padding that is difficult to remove. Make the outer
+        // host view bigger by the default padding amount, so that the inner view that we care about
+        // matches the provided size.
+        val hostViewPadding = Rect()
+        val testComponent =
+            ComponentName(context.applicationContext, TestGlanceAppWidgetReceiver::class.java)
+        getDefaultPaddingForWidget(context, testComponent, hostViewPadding)
+        val paddedWidth = width + hostViewPadding.left + hostViewPadding.right
+        val paddedHeight = height + hostViewPadding.top + hostViewPadding.bottom
+
+        layoutParams = LayoutParams(paddedWidth, paddedHeight, Gravity.CENTER)
         requestLayout()
     }
 
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
index ac37082..2dd1faa 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
@@ -26,6 +26,7 @@
 import android.text.style.StyleSpan
 import android.text.style.TextAppearanceSpan
 import android.text.style.UnderlineSpan
+import android.util.Log
 import android.view.View
 import android.widget.CompoundButton
 import android.widget.FrameLayout
@@ -35,10 +36,8 @@
 import android.widget.TextView
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.DpSize
@@ -110,12 +109,18 @@
 import kotlinx.coroutines.test.runTest
 import org.junit.Assert.assertThrows
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
+import org.junit.rules.TestWatcher
+import org.junit.runner.Description
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
+/** Enable verbose logging for test failure investigation. Enable for b/267494219 */
+const val VERBOSE_LOG = true
+
+const val RECEIVER_TEST_TAG = "GAWRT" // shorten to avoid long tag lint
+
 @OptIn(ExperimentalCoroutinesApi::class)
 @SdkSuppress(minSdkVersion = 29)
 @MediumTest
@@ -124,6 +129,9 @@
     @get:Rule
     val mHostRule = AppWidgetHostRule(useSessionManager = useSessionManager)
 
+    @get:Rule
+    val mViewDumpRule = ViewHierarchyFailureWatcher()
+
     val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
     companion object {
@@ -228,7 +236,6 @@
         }
     }
 
-    @Ignore("b/266588723")
     @Test
     fun createTextWithFillMaxDimensions() {
         TestGlanceAppWidget.uiDefinition = {
@@ -347,7 +354,6 @@
         }
     }
 
-    @Ignore("b/265078768")
     @Test
     fun createRowWithTwoTexts() {
         TestGlanceAppWidget.uiDefinition = {
@@ -365,6 +371,7 @@
             val children = row.notGoneChildren.toList()
             val child1 = children[0].getTargetView<TextView>()
             val child2 = assertIs<TextView>(children[1])
+
             assertViewSize(child1, DpSize(mHostRule.portraitSize.width / 2, 100.dp))
             assertViewSize(
                 child2,
@@ -399,7 +406,10 @@
     }
 
     @Test
-    fun createColumnWithTwoTexts2() {
+    fun columnWithWeightedItemRespectsSizeOfOtherItem() {
+        // When one item has a default weight, it should scale to respect the size of the other item
+        // in this case the other item fills the column, so the weighted item should take up no
+        // space, that is, has height 0.
         TestGlanceAppWidget.uiDefinition = {
             Column(modifier = GlanceModifier.fillMaxWidth().fillMaxHeight()) {
                 Text("Inside 1", modifier = GlanceModifier.fillMaxWidth().defaultWeight())
@@ -767,7 +777,6 @@
         }
     }
 
-    @Ignore // b/259718271
     @Test
     fun compoundButtonAction() {
         val checkbox = "checkbox"
@@ -924,6 +933,7 @@
                 )
             assertThat(view.hasOnClickListeners()).isTrue()
         }
+
         updateAppWidgetState(context, AppWidgetId(mHostRule.appWidgetId)) {
             it[testBoolKey] = false
         }
@@ -1105,9 +1115,11 @@
 
     private fun assertViewSize(view: View, expectedSize: DpSize) {
         val density = view.context.resources.displayMetrics.density
-        assertThat(view.width / density).isWithin(1.1f / density)
+        assertWithMessage("${view.accessibilityClassName} width").that(view.width / density)
+            .isWithin(1.1f / density)
             .of(expectedSize.width.value)
-        assertThat(view.height / density).isWithin(1.1f / density)
+        assertWithMessage("${view.accessibilityClassName} height").that(view.height / density)
+            .isWithin(1.1f / density)
             .of(expectedSize.height.value)
     }
 
@@ -1117,6 +1129,24 @@
     }
 
     enum class EffectState { Initial, Started, Disposed }
+
+    inner class ViewHierarchyFailureWatcher : TestWatcher() {
+        override fun starting(description: Description) {
+            super.starting(description)
+            if (VERBOSE_LOG) {
+                Log.d(RECEIVER_TEST_TAG, "")
+                Log.d(RECEIVER_TEST_TAG, "")
+                Log.d(RECEIVER_TEST_TAG, "Starting: ${description.methodName}")
+                Log.d(RECEIVER_TEST_TAG, "---------------------")
+            }
+        }
+
+        override fun failed(e: Throwable?, description: Description?) {
+            Log.e(RECEIVER_TEST_TAG, "$description failed")
+            Log.e(RECEIVER_TEST_TAG, "Host view hierarchy at failure:")
+            logViewHierarchy(RECEIVER_TEST_TAG, mHostRule.mHostView, "")
+        }
+    }
 }
 
 private val testKey = intPreferencesKey("testKey")
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
index feed04a..5f1ff3d 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
@@ -20,7 +20,6 @@
 import android.os.Build
 import android.view.Gravity
 import android.view.View
-import android.widget.Button
 import android.widget.FrameLayout
 import android.widget.ListView
 import android.widget.TextView
@@ -358,6 +357,10 @@
 
     private inline fun <reified T : View> ListView.getUnboxedListItem(position: Int): T {
         val remoteViewFrame = assertIs<FrameLayout>(getChildAt(position))
+        // Each list item frame has an explicit focusable = true, see
+        // "Glance.AppWidget.Theme.ListChildren" style.
+        assertThat(remoteViewFrame.isFocusable).isTrue()
+
         // Android S- have a RemoteViewsAdapter$RemoteViewsFrameLayout first, Android T+ do not.
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) {
             return remoteViewFrame.getChildAt(0).getTargetView()
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/TestGlanceAppWidgetReceiver.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/TestGlanceAppWidgetReceiver.kt
index fb9ff6c..8600754 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/TestGlanceAppWidgetReceiver.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/TestGlanceAppWidgetReceiver.kt
@@ -30,6 +30,10 @@
     }
 
     override fun onReceive(context: Context, intent: Intent) {
+        if (VERBOSE_LOG) {
+            Log.d(RECEIVER_TEST_TAG, "Test Receiver onReceive ${intent.action}")
+        }
+
         if (ignoreBroadcasts) {
             Log.w("TestGlanceAppWidgetReceiver", "Ignored $intent")
             return
diff --git a/glance/glance-appwidget/src/androidAndroidTest/res/layout/empty_layout.xml b/glance/glance-appwidget/src/androidAndroidTest/res/layout/empty_layout.xml
index 92aab83..aebf291 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/res/layout/empty_layout.xml
+++ b/glance/glance-appwidget/src/androidAndroidTest/res/layout/empty_layout.xml
@@ -14,7 +14,7 @@
   limitations under the License.
   -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/root_view"
+    android:id="@+id/loadingView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" />
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetSession.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetSession.kt
index 46cfa21..7490c7f 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetSession.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/AppWidgetSession.kt
@@ -33,7 +33,6 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.ui.unit.DpSize
-import androidx.datastore.preferences.core.emptyPreferences
 import androidx.glance.EmittableWithChildren
 import androidx.glance.GlanceComposable
 import androidx.glance.GlanceId
@@ -44,7 +43,6 @@
 import androidx.glance.session.Session
 import androidx.glance.state.ConfigManager
 import androidx.glance.state.GlanceState
-import androidx.glance.state.PreferencesGlanceStateDefinition
 import java.util.concurrent.atomic.AtomicReference
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CancellableContinuation
@@ -81,7 +79,7 @@
         const val DEBUG = false
     }
 
-    private val glanceState = mutableStateOf(emptyPreferences(), neverEqualPolicy())
+    private val glanceState = mutableStateOf<Any?>(null, neverEqualPolicy())
     private val options = mutableStateOf(Bundle(), neverEqualPolicy())
     private var lambdas = mapOf<String, List<LambdaAction>>()
     @VisibleForTesting
@@ -107,8 +105,10 @@
             }
             val configIsReady by produceState(false) {
                 options.value = initialOptions ?: manager.getAppWidgetOptions(id.appWidgetId)
-                glanceState.value =
-                    configManager.getValue(context, PreferencesGlanceStateDefinition, key)
+                widget.stateDefinition?.let {
+                    glanceState.value =
+                        configManager.getValue(context, it, key)
+                }
                 value = true
             }
             remember { widget.runGlance(context, id) }
@@ -168,8 +168,9 @@
         when (event) {
             is UpdateGlanceState -> {
                 if (DEBUG) Log.i(TAG, "Received UpdateGlanceState event for session($key)")
-                val newGlanceState =
-                    configManager.getValue(context, PreferencesGlanceStateDefinition, key)
+                val newGlanceState = widget.stateDefinition?.let {
+                    configManager.getValue(context, it, key)
+                }
                 Snapshot.withMutableSnapshot {
                     glanceState.value = newGlanceState
                 }
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/glance_list.xml b/glance/glance-appwidget/src/androidMain/res/layout/glance_list.xml
index c74685b..fe0fa2d 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/glance_list.xml
+++ b/glance/glance-appwidget/src/androidMain/res/layout/glance_list.xml
@@ -20,4 +20,5 @@
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:divider="@null"
+    android:theme="@style/Glance.AppWidget.Theme.ListChildren"
     style="@style/Glance.AppWidget.List"/>
diff --git a/glance/glance-appwidget/src/main/res/values-v29/themes.xml b/glance/glance-appwidget/src/main/res/values-v29/themes.xml
index 1f24a9a..2c2cd04 100644
--- a/glance/glance-appwidget/src/main/res/values-v29/themes.xml
+++ b/glance/glance-appwidget/src/main/res/values-v29/themes.xml
@@ -16,4 +16,13 @@
 
 <resources>
     <style name="Glance.AppWidget.Theme" parent="android:Theme.DeviceDefault.DayNight"/>
+    <style name="Glance.AppWidget.Theme.ListChildren" parent="">
+        <!--
+            AbsListView sets a list item to be clickable if the focusable is not explicitly set.
+            This has effect of list items showing up as numbered when Voice access is activated
+            (even if they don't have any click listeners). See ListItemAccessibilityDelegate. In
+            order to prevent this, we explicitly set focusable as true here.
+        -->
+        <item name="android:focusable">true</item>
+    </style>
 </resources>
diff --git a/glance/glance-appwidget/src/main/res/values/themes.xml b/glance/glance-appwidget/src/main/res/values/themes.xml
index 55e7eb7..e2c0807 100644
--- a/glance/glance-appwidget/src/main/res/values/themes.xml
+++ b/glance/glance-appwidget/src/main/res/values/themes.xml
@@ -16,4 +16,13 @@
 
 <resources>
     <style name="Glance.AppWidget.Theme" parent="android:Theme.DeviceDefault" />
+    <style name="Glance.AppWidget.Theme.ListChildren" parent="">
+        <!--
+            AbsListView sets a list item to be clickable if the focusable is not explicitly set.
+            This has effect of list items showing up as numbered when Voice access is activated
+            (even if they don't have any click listeners). See ListItemAccessibilityDelegate. In
+            order to prevent this, we explicitly set focusable as true here.
+        -->
+        <item name="android:focusable">true</item>
+    </style>
 </resources>
diff --git a/glance/glance-appwidget/src/test/res/layout/empty_layout.xml b/glance/glance-appwidget/src/test/res/layout/empty_layout.xml
index 0376b8a..b7d4388 100644
--- a/glance/glance-appwidget/src/test/res/layout/empty_layout.xml
+++ b/glance/glance-appwidget/src/test/res/layout/empty_layout.xml
@@ -15,7 +15,7 @@
   -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/root_view"
+    android:id="@+id/loadingView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" />
\ No newline at end of file
diff --git a/glance/glance-wear-tiles-preview/api/current.txt b/glance/glance-wear-tiles-preview/api/current.txt
index 5bfa654..e6f50d0 100644
--- a/glance/glance-wear-tiles-preview/api/current.txt
+++ b/glance/glance-wear-tiles-preview/api/current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.wear.tiles.preview {
-
-  public final class GlanceTileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-wear-tiles-preview/api/public_plus_experimental_current.txt b/glance/glance-wear-tiles-preview/api/public_plus_experimental_current.txt
index 5bfa654..e6f50d0 100644
--- a/glance/glance-wear-tiles-preview/api/public_plus_experimental_current.txt
+++ b/glance/glance-wear-tiles-preview/api/public_plus_experimental_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.wear.tiles.preview {
-
-  public final class GlanceTileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-wear-tiles-preview/api/restricted_current.txt b/glance/glance-wear-tiles-preview/api/restricted_current.txt
index 5bfa654..e6f50d0 100644
--- a/glance/glance-wear-tiles-preview/api/restricted_current.txt
+++ b/glance/glance-wear-tiles-preview/api/restricted_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.glance.wear.tiles.preview {
-
-  public final class GlanceTileServiceViewAdapterKt {
-  }
-
-}
-
diff --git a/glance/glance-wear-tiles/api/current.txt b/glance/glance-wear-tiles/api/current.txt
index d057ed0..c693cbc 100644
--- a/glance/glance-wear-tiles/api/current.txt
+++ b/glance/glance-wear-tiles/api/current.txt
@@ -15,9 +15,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.wear.tiles.TimeInterval> LocalTimeInterval;
   }
 
-  public final class ErrorUiLayoutKt {
-  }
-
   public abstract class GlanceTileService extends androidx.wear.tiles.TileService {
     ctor public GlanceTileService(optional androidx.wear.tiles.LayoutElementBuilders.LayoutElement? errorUiLayout);
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void Content();
@@ -32,12 +29,6 @@
     property public androidx.glance.wear.tiles.TimelineMode timelineMode;
   }
 
-  public final class GlanceWearTilesKt {
-  }
-
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class TimeInterval {
     ctor public TimeInterval(optional java.time.Instant start, optional java.time.Instant end);
     method public java.time.Instant component1();
@@ -62,9 +53,6 @@
     property public final java.util.Set<androidx.glance.wear.tiles.TimeInterval> timeIntervals;
   }
 
-  public final class WearCompositionTranslatorKt {
-  }
-
 }
 
 package androidx.glance.wear.tiles.action {
diff --git a/glance/glance-wear-tiles/api/public_plus_experimental_current.txt b/glance/glance-wear-tiles/api/public_plus_experimental_current.txt
index 7f2a598..ecc93bf 100644
--- a/glance/glance-wear-tiles/api/public_plus_experimental_current.txt
+++ b/glance/glance-wear-tiles/api/public_plus_experimental_current.txt
@@ -15,9 +15,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.wear.tiles.TimeInterval> LocalTimeInterval;
   }
 
-  public final class ErrorUiLayoutKt {
-  }
-
   @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalGlanceWearTilesApi {
   }
 
@@ -39,9 +36,6 @@
     method @androidx.glance.wear.tiles.ExperimentalGlanceWearTilesApi public static suspend Object? compose(android.content.Context context, long size, optional Object? state, kotlin.jvm.functions.Function0<kotlin.Unit> content, kotlin.coroutines.Continuation<? super androidx.glance.wear.tiles.WearTilesCompositionResult>);
   }
 
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class TimeInterval {
     ctor public TimeInterval(optional java.time.Instant start, optional java.time.Instant end);
     method public java.time.Instant component1();
@@ -66,9 +60,6 @@
     property public final java.util.Set<androidx.glance.wear.tiles.TimeInterval> timeIntervals;
   }
 
-  public final class WearCompositionTranslatorKt {
-  }
-
   @androidx.glance.wear.tiles.ExperimentalGlanceWearTilesApi public final class WearTilesCompositionResult {
     ctor public WearTilesCompositionResult(androidx.wear.tiles.LayoutElementBuilders.LayoutElement layout, androidx.wear.tiles.ResourceBuilders.Resources resources);
     method public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getLayout();
diff --git a/glance/glance-wear-tiles/api/restricted_current.txt b/glance/glance-wear-tiles/api/restricted_current.txt
index d057ed0..c693cbc 100644
--- a/glance/glance-wear-tiles/api/restricted_current.txt
+++ b/glance/glance-wear-tiles/api/restricted_current.txt
@@ -15,9 +15,6 @@
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.wear.tiles.TimeInterval> LocalTimeInterval;
   }
 
-  public final class ErrorUiLayoutKt {
-  }
-
   public abstract class GlanceTileService extends androidx.wear.tiles.TileService {
     ctor public GlanceTileService(optional androidx.wear.tiles.LayoutElementBuilders.LayoutElement? errorUiLayout);
     method @androidx.compose.runtime.Composable @androidx.glance.GlanceComposable public abstract void Content();
@@ -32,12 +29,6 @@
     property public androidx.glance.wear.tiles.TimelineMode timelineMode;
   }
 
-  public final class GlanceWearTilesKt {
-  }
-
-  public final class NormalizeCompositionTreeKt {
-  }
-
   public final class TimeInterval {
     ctor public TimeInterval(optional java.time.Instant start, optional java.time.Instant end);
     method public java.time.Instant component1();
@@ -62,9 +53,6 @@
     property public final java.util.Set<androidx.glance.wear.tiles.TimeInterval> timeIntervals;
   }
 
-  public final class WearCompositionTranslatorKt {
-  }
-
 }
 
 package androidx.glance.wear.tiles.action {
diff --git a/glance/glance/api/current.txt b/glance/glance/api/current.txt
index e92fd04..6363bcd 100644
--- a/glance/glance/api/current.txt
+++ b/glance/glance/api/current.txt
@@ -79,9 +79,6 @@
     method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  @androidx.glance.GlanceComposable public final class GlanceNodeKt {
-  }
-
   public final class GlanceTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public androidx.glance.color.ColorProviders getColors();
     property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public final androidx.glance.color.ColorProviders colors;
@@ -102,9 +99,6 @@
   public interface ImageProvider {
   }
 
-  public final class UtilsKt {
-  }
-
   public enum Visibility {
     method public static androidx.glance.Visibility valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.glance.Visibility[] values();
@@ -423,9 +417,6 @@
 
 package androidx.glance.session {
 
-  public final class SessionKt {
-  }
-
   public final class SessionManagerKt {
   }
 
diff --git a/glance/glance/api/public_plus_experimental_current.txt b/glance/glance/api/public_plus_experimental_current.txt
index e92fd04..6363bcd 100644
--- a/glance/glance/api/public_plus_experimental_current.txt
+++ b/glance/glance/api/public_plus_experimental_current.txt
@@ -79,9 +79,6 @@
     method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  @androidx.glance.GlanceComposable public final class GlanceNodeKt {
-  }
-
   public final class GlanceTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public androidx.glance.color.ColorProviders getColors();
     property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public final androidx.glance.color.ColorProviders colors;
@@ -102,9 +99,6 @@
   public interface ImageProvider {
   }
 
-  public final class UtilsKt {
-  }
-
   public enum Visibility {
     method public static androidx.glance.Visibility valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.glance.Visibility[] values();
@@ -423,9 +417,6 @@
 
 package androidx.glance.session {
 
-  public final class SessionKt {
-  }
-
   public final class SessionManagerKt {
   }
 
diff --git a/glance/glance/api/restricted_current.txt b/glance/glance/api/restricted_current.txt
index e92fd04..6363bcd 100644
--- a/glance/glance/api/restricted_current.txt
+++ b/glance/glance/api/restricted_current.txt
@@ -79,9 +79,6 @@
     method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  @androidx.glance.GlanceComposable public final class GlanceNodeKt {
-  }
-
   public final class GlanceTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public androidx.glance.color.ColorProviders getColors();
     property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable @androidx.glance.GlanceComposable public final androidx.glance.color.ColorProviders colors;
@@ -102,9 +99,6 @@
   public interface ImageProvider {
   }
 
-  public final class UtilsKt {
-  }
-
   public enum Visibility {
     method public static androidx.glance.Visibility valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.glance.Visibility[] values();
@@ -423,9 +417,6 @@
 
 package androidx.glance.session {
 
-  public final class SessionKt {
-  }
-
   public final class SessionManagerKt {
   }
 
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index d0edcbe..7ed33f1 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -2,13 +2,13 @@
 # -----------------------------------------------------------------------------
 # All of the following should be updated in sync.
 # -----------------------------------------------------------------------------
-androidGradlePlugin = "8.0.0-alpha07"
+androidGradlePlugin = "8.1.0-alpha03"
 # 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 = "31.0.0-alpha07"
+androidLint = "31.1.0-alpha03"
 # 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.
-androidStudio = "2022.2.1.7"
+androidStudio = "2022.3.1.3"
 # -----------------------------------------------------------------------------
 
 androidGradlePluginMin = "7.0.4"
@@ -36,13 +36,13 @@
 hilt = "2.44"
 incap = "0.2"
 jcodec = "0.2.5"
-kotlin = "1.8.0"
+kotlin = "1.8.10"
 kotlinBenchmark = "0.4.7"
-kotlinNative = "1.8.0"
+kotlinNative = "1.8.10"
 kotlinCompileTesting = "1.4.9"
 kotlinCoroutines = "1.6.4"
 kotlinSerialization = "1.3.3"
-ksp = "1.8.0-1.0.8"
+ksp = "1.8.10-1.0.9"
 ktlint = "0.46.0-20220520.192227-74"
 leakcanary = "2.8.1"
 media3 = "1.0.0-beta03"
@@ -73,7 +73,9 @@
 androidLintTests = { module = "com.android.tools.lint:lint-tests", version.ref = "androidLint" }
 androidToolsCommon = { module = "com.android.tools:common", version.ref = "androidLint" }
 androidToolsNinepatch = { module = "com.android.tools:ninepatch", version.ref = "androidLint" }
+androidToolsRepository= { module = "com.android.tools:repository", version.ref = "androidLint" }
 androidToolsSdkCommon = { module = "com.android.tools:sdk-common", version.ref = "androidLint" }
+androidToolsAnalyticsProtos = { module = "com.android.tools.analytics-library:protos", version.ref = "androidLint" }
 autoCommon = { module = "com.google.auto:auto-common", version = "0.11" }
 atomicFu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "atomicFu" }
 atomicFuPluginz = { module = "org.jetbrains.kotlinx:atomicfu-gradle-plugin", version.ref = "atomicFu" }
@@ -100,6 +102,7 @@
 daggerCompiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
 dexmakerMockito = { module = "com.linkedin.dexmaker:dexmaker-mockito", version.ref = "dexmaker" }
 dexmakerMockitoInline = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "dexmaker" }
+dexmakerMockitoInlineExtended = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline-extended", version.ref = "dexmaker" }
 dexMemberList = { module = "com.jakewharton.dex:dex-member-list", version = "4.1.1" }
 dokkaCli = { module = "org.jetbrains.dokka:dokka-cli", version.ref = "dokka" }
 dokkaAnalysis = { module = "org.jetbrains.dokka:dokka-analysis", version.ref = "dokka" }
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 1cf4e56..9c21f38 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -1,32 +1,32 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<verification-metadata xmlns="https://schema.gradle.org/dependency-verification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.1.xsd">
+<verification-metadata xmlns="https://schema.gradle.org/dependency-verification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.2.xsd">
    <configuration>
       <verify-metadata>true</verify-metadata>
       <verify-signatures>true</verify-signatures>
       <key-servers enabled="false"/>
       <trusted-artifacts>
+         <trust group="ch.qos.logback" name="logback-classic" version="1.2.11" reason="b/234161459"/>
+         <trust group="ch.qos.logback" name="logback-core" version="1.2.11" reason="b/234161459"/>
+         <trust group="ch.qos.logback" name="logback-parent" version="1.2.11" reason="b/234161459"/>
+         <trust group="com.google.android.datatransport" reason="b/215442095"/>
+         <trust group="com.google.android.gms" reason="b/215442095"/>
+         <trust group="com.google.android.material" reason="b/216192082"/>
+         <trust group="com.google.android.play" reason="b/255621183"/>
+         <trust group="com.google.devsite" reason="developed by our own team, not signed yet"/>
+         <trust group="com.google.firebase" reason="b/223907608"/>
+         <trust group="com.google.mlkit" reason="b/223907608"/>
+         <trust group="com.google.testing.platform" reason="b/215430394"/>
+         <trust group="com.pinterest" name="ktlint" version="0.46.0-20220520.192227-74" reason="b/234161459"/>
+         <trust group="com.pinterest.ktlint" version="0.46.0-20220520.192227-74" reason="b/234161459"/>
          <trust group="gradle" name="gradle"/>
+         <trust group="info.picocli" name="picocli" version="4.6.3" reason="b/234161459"/>
+         <trust group="org.slf4j" name="slf4j-api" version="1.7.32" reason="b/234161459"/>
+         <trust group="org.slf4j" name="slf4j-parent" version="1.7.32" reason="b/234161459"/>
          <trust file=".*-javadoc[.]jar" regex="true"/>
          <trust file=".*-sources[.]jar" regex="true"/>
-         <trust group="^androidx($|([.].*))" regex="true"/> <!-- not signed yet -->
-         <trust group="com.google.devsite"/> <!-- developed by our own team, not signed yet -->
-         <trust group="^com[.]android($|([.].*))" regex="true"/> <!-- b/215430394 -->
-         <trust group="com.google.testing.platform"/> <!-- b/215430394 -->
-         <trust group="com.google.android.gms"/> <!-- b/215442095 -->
-         <trust group="com.google.android.datatransport"/> <!-- b/215442095 -->
-         <trust group="com.google.android.material"/> <!-- b/216192082 -->
-         <trust group="com.google.android.play"/> <!-- b/255621183 -->
-         <trust group="com.google.firebase"/> <!-- b/223907608 -->
-         <trust group="com.google.mlkit"/> <!-- b/223907608 -->
-         <trust file=".*kotlin-native-prebuilt-macos-.*" regex="true"/> <!-- b/228184608 -->
-         <trust group="ch.qos.logback" name="logback-classic" version="1.2.11"/> <!-- b/234161459 -->
-         <trust group="ch.qos.logback" name="logback-core" version="1.2.11"/> <!-- b/234161459 -->
-         <trust group="ch.qos.logback" name="logback-parent" version="1.2.11"/> <!-- b/234161459 -->
-         <trust group="info.picocli" name="picocli" version="4.6.3"/> <!-- b/234161459 -->
-         <trust group="org.slf4j" name="slf4j-api" version="1.7.32"/> <!-- b/234161459 -->
-         <trust group="org.slf4j" name="slf4j-parent" version="1.7.32"/> <!-- b/234161459 -->
-         <trust group="com.pinterest" name="ktlint" version="0.46.0-20220520.192227-74"/> <!-- b/234161459 -->
-         <trust group="com.pinterest.ktlint" version="0.46.0-20220520.192227-74"/> <!-- b/234161459 -->
+         <trust file=".*kotlin-native-prebuilt-macos-.*" regex="true" reason="b/228184608"/>
+         <trust group="^androidx($|([.].*))" regex="true" reason="not signed yet"/>
+         <trust group="^com[.]android($|([.].*))" regex="true" reason="b/215430394"/>
       </trusted-artifacts>
       <trusted-keys>
          <trusted-key id="00089ee8c3afa95a854d0f1df800dd0933ecf7f7" group="com.google.guava" name="guava"/>
@@ -503,15 +503,22 @@
       </trusted-keys>
    </configuration>
    <components>
-      <component group="com.google.camerax.effects" name="portrait" version="0.0.1" androidx:reason="Unsigned. Used by CameraX. b/250921323">
-         <artifact name="portrait-0.0.1.pom">
-            <sha256 value="057a0111636ba5d261050fd8f02f4c84226613666e7378da2456ca6976eb7dff" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="portrait-0.0.1.aar">
-            <sha256 value="86d3e99a6123e3f830bf3f70392b30fc8d238374104ce00a02de20d8613af607" origin="Generated by Gradle"/>
+      <component group="" name="kotlin-native-prebuilt-linux-x86_64" version="1.8.10">
+         <artifact name="kotlin-native-prebuilt-linux-x86_64-1.8.10.tar.gz">
+            <sha256 value="7c031ecc225cacc96c9479be28249d57226ff10a1d9ad78340ed6efffd06bdf5" origin="Hand-built using sha256sum kotlin-native-prebuilt-linux-x86_64-1.8.10.tar.gz" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="com.github.gundy" name="semver4j" version="0.16.4" androidx:reason="Unsigned https://github.com/gundy/semver4j/issues/6">
+      <component group="" name="kotlin-native-prebuilt-macos-aarch64" version="1.8.10">
+         <artifact name="kotlin-native-prebuilt-macos-aarch64-1.8.10.tar.gz">
+            <sha256 value="b15d176c8b88ee6d4bc8017e17462222081dca2e97347fd9eecd554c5839a819" origin="Hand-built using sha256sum kotlin-native-prebuilt-macos-aarch64-1.8.10.tar.gz"/>
+         </artifact>
+      </component>
+      <component group="" name="kotlin-native-prebuilt-macos-x86_64" version="1.8.10">
+         <artifact name="kotlin-native-prebuilt-macos-x86_64-1.8.10.tar.gz">
+            <sha256 value="8a31a27a776ba55974936b897be76edca1cf871d9ae75537e593a7f1b83380e9" origin="Hand-built using sha256sum kotlin-native-prebuilt-macos-x86_64-1.8.10.tar.gz"/>
+         </artifact>
+      </component>
+      <component group="com.github.gundy" name="semver4j" version="0.16.4">
          <artifact name="semver4j-0.16.4-nodeps.jar">
             <sha256 value="3f59eca516374ccd4fd3551625bf50f8a4b191f700508f7ce4866460a6128af0" origin="Generated by Gradle"/>
          </artifact>
@@ -520,41 +527,33 @@
             <sha256 value="32001db2443b339dd21f5b79ff29d1ade722d1ba080c214bde819f0f72d1604d" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="com.google" name="google" version="1" androidx:reason="Unsigned. Used by protoc https://github.com/protocolbuffers/protobuf/pull/10290">
+      <component group="com.google" name="google" version="1">
          <artifact name="google-1.pom">
-            <sha256 value="cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="3.1.2">
-         <artifact name="accessibility-test-framework-3.1.2.pom">
-            <sha256 value="bc787098a208e6bdc8d93720a162bbea01df1b26394d1c1ef5ec523b1d604e8b" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="accessibility-test-framework-3.1.2.aar">
-            <sha256 value="9b586dc8eeeb4f601038e23ef8ffd6a1deeca1163276d02797b0d2b8f9764b62" origin="Generated by Gradle"/>
+            <sha256 value="cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
       <component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="2.1">
-         <artifact name="accessibility-test-framework-2.1.pom">
-            <sha256 value="d46777ad3ea8bca73491b2e02fc85b3664486abf5314cc4dc6740908bd855330" origin="Generated by Gradle"/>
-         </artifact>
          <artifact name="accessibility-test-framework-2.1.jar">
-            <sha256 value="7b0aa6ed7553597ce0610684a9f7eca8021eee218f2e2f427c04a7fbf5f920bd" origin="Generated by Gradle"/>
+            <sha256 value="7b0aa6ed7553597ce0610684a9f7eca8021eee218f2e2f427c04a7fbf5f920bd" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+         <artifact name="accessibility-test-framework-2.1.pom">
+            <sha256 value="d46777ad3ea8bca73491b2e02fc85b3664486abf5314cc4dc6740908bd855330" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="3.1.2">
+         <artifact name="accessibility-test-framework-3.1.2.aar">
+            <sha256 value="9b586dc8eeeb4f601038e23ef8ffd6a1deeca1163276d02797b0d2b8f9764b62" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+         <artifact name="accessibility-test-framework-3.1.2.pom">
+            <sha256 value="bc787098a208e6bdc8d93720a162bbea01df1b26394d1c1ef5ec523b1d604e8b" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
       <component group="com.google.android.odml" name="image" version="1.0.0-beta1">
          <artifact name="image-1.0.0-beta1.aar">
-            <sha256 value="2e71aa31f83a9415277f119de67195726f07d1760e9542c111778c320e3aa1f2" origin="Generated by Gradle"/>
+            <sha256 value="2e71aa31f83a9415277f119de67195726f07d1760e9542c111778c320e3aa1f2" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="image-1.0.0-beta1.pom">
-            <sha256 value="795f4793c375eedf4332a0381082981a5ce70b7a0a776221ca24ad9d40cbea1c" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="com.google.android.play" name="core" version="1.10.3">
-         <artifact name="core-1.10.3.aar">
-            <sha256 value="d3e404065b077cc86f58b787c44ebda6cf1ff691e5e954c4b09d6e6c9d0fa562" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="core-1.10.3.pom">
-            <sha256 value="1877e3a98c1ffee187ac24ae93b60a4a03c5c79d820fec612df6a1fb91672cff" origin="Generated by Gradle"/>
+            <sha256 value="795f4793c375eedf4332a0381082981a5ce70b7a0a776221ca24ad9d40cbea1c" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
       <component group="com.google.android.play" name="core" version="1.10.2">
@@ -565,6 +564,14 @@
             <sha256 value="f91604c35547195bb07a46cbc76fae47bd726335e976f78bb126c677d25c236f" origin="Generated by Gradle"/>
          </artifact>
       </component>
+      <component group="com.google.android.play" name="core" version="1.10.3">
+         <artifact name="core-1.10.3.aar">
+            <sha256 value="d3e404065b077cc86f58b787c44ebda6cf1ff691e5e954c4b09d6e6c9d0fa562" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="core-1.10.3.pom">
+            <sha256 value="1877e3a98c1ffee187ac24ae93b60a4a03c5c79d820fec612df6a1fb91672cff" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="com.google.android.play" name="core" version="1.9.1">
          <artifact name="core-1.9.1.aar">
             <sha256 value="c85fa108dffd89eb9e85c9d8657f966b064ad2d84dd2fce573192492a03e6f08" origin="Generated by Gradle"/>
@@ -573,49 +580,57 @@
             <sha256 value="c6898b1f71e69b15bf90c31fc3ef2de1cffbf454a770700f755b5a47ea48b540" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="com.google.code.findbugs" name="jsr305" version="1.3.9" androidx:reason="Unsigned">
+      <component group="com.google.camerax.effects" name="portrait" version="0.0.1">
+         <artifact name="portrait-0.0.1.aar">
+            <sha256 value="86d3e99a6123e3f830bf3f70392b30fc8d238374104ce00a02de20d8613af607" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="portrait-0.0.1.pom">
+            <sha256 value="057a0111636ba5d261050fd8f02f4c84226613666e7378da2456ca6976eb7dff" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.code.findbugs" name="jsr305" version="1.3.9">
          <artifact name="jsr305-1.3.9.jar">
-            <sha256 value="905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed" origin="Generated by Gradle"/>
+            <sha256 value="905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="jsr305-1.3.9.pom">
-            <sha256 value="feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a" origin="Generated by Gradle"/>
+            <sha256 value="feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="com.google.code.findbugs" name="jsr305" version="2.0.1" androidx:reason="Unsigned">
+      <component group="com.google.code.findbugs" name="jsr305" version="2.0.1">
          <artifact name="jsr305-2.0.1.jar">
-            <sha256 value="1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468" origin="Generated by Gradle"/>
+            <sha256 value="1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="jsr305-2.0.1.pom">
-            <sha256 value="02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0" origin="Generated by Gradle"/>
+            <sha256 value="02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
-       </component>
-      <component group="com.google.prefab" name="cli" version="2.0.0" androidx:reason="Unsigned. https://github.com/google/prefab/issues/157">
+      </component>
+      <component group="com.google.prefab" name="cli" version="2.0.0">
          <artifact name="cli-2.0.0-all.jar">
-            <sha256 value="d9bd89f68446b82be038aae774771ad85922d0b375209b17625a2734b5317e29" origin="Generated by Gradle"/>
+            <sha256 value="d9bd89f68446b82be038aae774771ad85922d0b375209b17625a2734b5317e29" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="cli-2.0.0.pom">
-            <sha256 value="4856401a263b39c5394b36a16e0d99628cf05c68008a0cda9691c72bb101e1df" origin="Generated by Gradle"/>
+            <sha256 value="4856401a263b39c5394b36a16e0d99628cf05c68008a0cda9691c72bb101e1df" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="com.googlecode.json-simple" name="json-simple" version="1.1" androidx:reason="Unsigned. Used by AGP. b/239967984">
+      <component group="com.googlecode.json-simple" name="json-simple" version="1.1">
          <artifact name="json-simple-1.1.jar">
-            <sha256 value="2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439" origin="Generated by Gradle"/>
+            <sha256 value="2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="json-simple-1.1.pom">
-            <sha256 value="47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab" origin="Generated by Gradle"/>
+            <sha256 value="47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="com.gradle" name="common-custom-user-data-gradle-plugin" version="1.7.2" androidx:reason="Unsigned https://github.com/gradle/gradle/issues/20349">
+      <component group="com.gradle" name="common-custom-user-data-gradle-plugin" version="1.7.2">
          <artifact name="common-custom-user-data-gradle-plugin-1.7.2.pom">
-            <sha256 value="c70db912c8b127b1b9a6c0cccac1a9353e9fc3b063a3be0114a5208f43c09c31" origin="Generated by Gradle"/>
+            <sha256 value="c70db912c8b127b1b9a6c0cccac1a9353e9fc3b063a3be0114a5208f43c09c31" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="com.gradle" name="gradle-enterprise-gradle-plugin" version="3.10.2" androidx:reason="Unsigned https://github.com/gradle/gradle/issues/20349">
+      <component group="com.gradle" name="gradle-enterprise-gradle-plugin" version="3.10.2">
          <artifact name="gradle-enterprise-gradle-plugin-3.10.2.pom">
             <sha256 value="57603c9a75a9ef86ce30b1cb2db728d3cd9caf1be967343f1fc2316c85df5653" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="de.undercouch" name="gradle-download-task" version="4.1.1" androidx:reason="Invalid signature https://github.com/michel-kraemer/gradle-download-task/issues/187">
+      <component group="de.undercouch" name="gradle-download-task" version="4.1.1">
          <artifact name="gradle-download-task-4.1.1.jar">
             <ignored-keys>
                <ignored-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" reason="PGP verification failed"/>
@@ -633,23 +648,23 @@
             </sha256>
          </artifact>
       </component>
-      <component group="gradle.plugin.com.github.johnrengelman" name="shadow" version="7.1.1" androidx:reason="Unsigned https://github.com/johnrengelman/shadow/issues/760">
+      <component group="gradle.plugin.com.github.johnrengelman" name="shadow" version="7.1.1">
          <artifact name="shadow-7.1.1.jar">
-            <sha256 value="a870861a7a3d54ffd97822051a27b2f1b86dd5c480317f0b97f3b27581b742af" origin="Generated by Gradle"/>
+            <sha256 value="a870861a7a3d54ffd97822051a27b2f1b86dd5c480317f0b97f3b27581b742af" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="shadow-7.1.1.pom">
-            <sha256 value="683be0cd32af9c80a6d4a143b9a6ac2eb45ebc3ccd16db4ca11b94e55fc5e52f" origin="Generated by Gradle"/>
+            <sha256 value="683be0cd32af9c80a6d4a143b9a6ac2eb45ebc3ccd16db4ca11b94e55fc5e52f" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="gradle.plugin.com.google.protobuf" name="protobuf-gradle-plugin" version="0.8.13" androidx:reason="Unsigned">
+      <component group="gradle.plugin.com.google.protobuf" name="protobuf-gradle-plugin" version="0.8.13">
          <artifact name="protobuf-gradle-plugin-0.8.13.jar">
-            <sha256 value="8a04b6eee4eab68c73b6e61cc8e00206753691b781d042afbae746f97e8c6f2d" origin="Generated by Gradle"/>
+            <sha256 value="8a04b6eee4eab68c73b6e61cc8e00206753691b781d042afbae746f97e8c6f2d" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="protobuf-gradle-plugin-0.8.13.pom">
-            <sha256 value="d8c46016037cda6360561b9c6a21a6c2a4847cad15c3c63903e15328fbcccc45" origin="Generated by Gradle"/>
+            <sha256 value="d8c46016037cda6360561b9c6a21a6c2a4847cad15c3c63903e15328fbcccc45" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="javax.annotation" name="jsr250-api" version="1.0" androidx:reason="Unsigned">
+      <component group="javax.annotation" name="jsr250-api" version="1.0">
          <artifact name="jsr250-api-1.0.jar">
             <sha256 value="a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f" origin="Generated by Gradle"/>
          </artifact>
@@ -657,59 +672,93 @@
             <sha256 value="548b0ef6f04356ef2283af5140d9404f38fd3891a509d468537abf2f9462944d" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="javax.inject" name="javax.inject" version="1" androidx:reason="Unsigned">
+      <component group="javax.inject" name="javax.inject" version="1">
          <artifact name="javax.inject-1.jar">
-            <sha256 value="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" origin="Generated by Gradle"/>
+            <sha256 value="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="javax.inject-1.pom">
-            <sha256 value="943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa" origin="Generated by Gradle"/>
+            <sha256 value="943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="javax.xml.stream" name="stax-api" version="1.0-2" androidx:reason="Unsigned">
+      <component group="javax.xml.stream" name="stax-api" version="1.0-2">
          <artifact name="stax-api-1.0-2.jar">
-            <sha256 value="e8c70ebd76f982c9582a82ef82cf6ce14a7d58a4a4dca5cb7b7fc988c80089b7" origin="Generated by Gradle because artifact wasn't signed"/>
+            <sha256 value="e8c70ebd76f982c9582a82ef82cf6ce14a7d58a4a4dca5cb7b7fc988c80089b7" origin="Generated by Gradle because artifact wasn't signed" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="stax-api-1.0-2.pom">
-            <sha256 value="2864f19da84fd52763d75a197a71779b2decbccaac3eb4e4760ffc884c5af4a2" origin="Generated by Gradle because artifact wasn't signed"/>
+            <sha256 value="2864f19da84fd52763d75a197a71779b2decbccaac3eb4e4760ffc884c5af4a2" origin="Generated by Gradle because artifact wasn't signed" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="kxml2" name="kxml2" version="2.3.0" androidx:reason="https://github.com/kobjects/kxml2/issues/20">
+      <component group="kxml2" name="kxml2" version="2.3.0">
          <artifact name="kxml2-2.3.0.pom">
             <sha256 value="095bf24f46ded9de0b66ca9d671dcf54f8f615ba95150b1a313c3475c55fd6a5" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="net.java" name="jvnet-parent" version="1" androidx:reason="Unsigned">
+      <component group="net.java" name="jvnet-parent" version="1">
          <artifact name="jvnet-parent-1.pom">
             <sha256 value="281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="net.java" name="jvnet-parent" version="3" androidx:reason="Unsigned">
+      <component group="net.java" name="jvnet-parent" version="3">
          <artifact name="jvnet-parent-3.pom">
+            <pgp value="e82d2eaf2e83830ce1f7f6be571a5291e827e1c7"/>
             <sha256 value="30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="net.java" name="jvnet-parent" version="4" androidx:reason="Unsigned">
+      <component group="net.java" name="jvnet-parent" version="4">
          <artifact name="jvnet-parent-4.pom">
-            <sha256 value="471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb" origin="Generated by Gradle"/>
-            <!-- Gradle doesn't add keyring files for parent poms so we need to explicitly specify it here to trust -->
-            <!-- see: https://github.com/gradle/gradle/issues/20194 -->
             <pgp value="44fbdbbc1a00fe414f1c1873586654072ead6677"/>
+            <sha256 value="471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="net.java" name="jvnet-parent" version="5" androidx:reason="Unsigned">
+      <component group="net.java" name="jvnet-parent" version="5">
          <artifact name="jvnet-parent-5.pom">
-            <sha256 value="1af699f8d9ddab67f9a0d202fbd7915eb0362a5a6dfd5ffc54cafa3465c9cb0a" origin="Generated by Gradle"/>
+            <sha256 value="1af699f8d9ddab67f9a0d202fbd7915eb0362a5a6dfd5ffc54cafa3465c9cb0a" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="net.sf.kxml" name="kxml2" version="2.3.0" androidx:reason="https://github.com/kobjects/kxml2/issues/20">
+      <component group="net.sf.kxml" name="kxml2" version="2.3.0">
          <artifact name="kxml2-2.3.0.jar">
-            <sha256 value="f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" origin="Generated by Gradle"/>
+            <sha256 value="f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="kxml2-2.3.0.pom">
-            <sha256 value="31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685" origin="Generated by Gradle"/>
+            <sha256 value="31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="org.ccil.cowan.tagsoup" name="tagsoup" version="1.2" androidx:reason="Unsigned. Used by espresso-web. cr/160019907">
+      <component group="org.apache" name="apache" version="15">
+         <artifact name="apache-15.pom">
+            <pgp value="6bdaca2c0493cca133b372d09c4f7e9d98b1cc53"/>
+         </artifact>
+      </component>
+      <component group="org.apache" name="apache" version="16">
+         <artifact name="apache-16.pom">
+            <pgp value="0cde80149711eb46dff17ae421a24b3f8b0f594a"/>
+         </artifact>
+      </component>
+      <component group="org.apache" name="apache" version="17">
+         <artifact name="apache-17.pom">
+            <pgp value="ae9e53fc28ff2ab1012273d0bf1518e0160788a2"/>
+         </artifact>
+      </component>
+      <component group="org.apache" name="apache" version="18">
+         <artifact name="apache-18.pom">
+            <pgp value="190d5a957ff22273e601f7a7c92c5fec70161c62"/>
+         </artifact>
+      </component>
+      <component group="org.apache" name="apache" version="7">
+         <artifact name="apache-7.pom">
+            <pgp value="ba926f64ca647b6d853a38672e2010f8a7ff4a41"/>
+         </artifact>
+      </component>
+      <component group="org.apache" name="apache" version="9">
+         <artifact name="apache-9.pom">
+            <pgp value="da7a1bb85b19e4fb05073431205c8673dc742c7c"/>
+         </artifact>
+      </component>
+      <component group="org.apache.commons" name="commons-parent" version="39">
+         <artifact name="commons-parent-39.pom">
+            <pgp value="808d78b17a5a2d7c3668e31fbffc9b54721244ad"/>
+         </artifact>
+      </component>
+      <component group="org.ccil.cowan.tagsoup" name="tagsoup" version="1.2">
          <artifact name="tagsoup-1.2.jar">
             <sha256 value="10d12b82c9a58a7842765a1152a56fbbd11eac9122a621f5a86a087503297266" origin="Generated by Gradle"/>
          </artifact>
@@ -717,71 +766,41 @@
             <sha256 value="186fd460ee13150e31188703a2c871bf86e20332636f3ede4ab959cd5568da78" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.dokka" name="all-modules-page-plugin" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="all-modules-page-plugin-1.7.20-dev-178.module">
-            <sha256 value="c4692062327e1e4cea88e5c4ce10e9420525fe746c7b73aeb672738f7109389c" origin="Generated manually"/>
+      <component group="org.codehaus.mojo" name="mojo-parent" version="40">
+         <artifact name="mojo-parent-40.pom">
+            <pgp value="d433f9c895710db8ab087fa6b7c3b43d18eaa8b7"/>
          </artifact>
+      </component>
+      <component group="org.codehaus.mojo" name="mojo-parent" version="50">
+         <artifact name="mojo-parent-50.pom">
+            <pgp value="720746177725a89207a7075bfd5dea07fcb690a8"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="all-modules-page-plugin" version="1.7.20-dev-178">
          <artifact name="all-modules-page-plugin-1.7.20-dev-178.jar">
             <sha256 value="968267f870e4c3a21b23fd61249a380df5b32d6eb4b295df93b9b25f0020e49f" origin="Generated manually"/>
          </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="android-documentation-plugin" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="android-documentation-plugin-1.7.20-dev-178.module">
-            <sha256 value="38745965f41d21794376b62b2c285f0feeb612e6a1eef8b32ce42bbba2330d48" origin="Generated manually"/>
+         <artifact name="all-modules-page-plugin-1.7.20-dev-178.module">
+            <sha256 value="c4692062327e1e4cea88e5c4ce10e9420525fe746c7b73aeb672738f7109389c" origin="Generated manually"/>
          </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="android-documentation-plugin" version="1.7.20-dev-178">
          <artifact name="android-documentation-plugin-1.7.20-dev-178.jar">
             <sha256 value="d446f3e440984e927712e8fd894a0fcb004a1d5626a66f2e3eebf85497f7f4c9" origin="Generated manually"/>
          </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="dokka-analysis" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="dokka-analysis-1.7.20-dev-178.module">
-            <sha256 value="c2238793675e470beff29a013f1ff97df3a89a53afadca94b022ff55d3d66dd7" origin="Generated manually"/>
+         <artifact name="android-documentation-plugin-1.7.20-dev-178.module">
+            <sha256 value="38745965f41d21794376b62b2c285f0feeb612e6a1eef8b32ce42bbba2330d48" origin="Generated manually"/>
          </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="dokka-analysis" version="1.7.20-dev-178">
          <artifact name="dokka-analysis-1.7.20-dev-178.jar">
             <sha256 value="18e8e9dbf885e80de803c00744a820095511915f8eb13c6973478f37b8937f95" origin="Generated manually"/>
          </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="dokka-base" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="dokka-base-1.7.20-dev-178.module">
-            <sha256 value="ddee298e92ee3e8b60c55967bc2b66d8871725db2758d8f44bec3069a7165986" origin="Generated manually"/>
-         </artifact>
-         <artifact name="dokka-base-1.7.20-dev-178.jar">
-            <sha256 value="043de520b665454fa144a0018875a9303454f16c3cda45c63f3d354f86fdfe66" origin="Generated manually"/>
+         <artifact name="dokka-analysis-1.7.20-dev-178.module">
+            <sha256 value="c2238793675e470beff29a013f1ff97df3a89a53afadca94b022ff55d3d66dd7" origin="Generated manually"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.dokka" name="dokka-cli" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="dokka-cli-1.7.20-dev-178.pom">
-            <sha256 value="68d9a1bbaa5bca1fea9034450be55cc25ad3f7017f9d017c9b4b65db2f47064a" origin="Generated manually"/>
-         </artifact>
-         <artifact name="dokka-cli-1.7.20-dev-178.jar">
-            <sha256 value="4ed2e6846156cd619b00ba942c1bb46489a9cd88118fa7a9236d9ceb2b036930" origin="Generated manually"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="kotlin-analysis-compiler" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="kotlin-analysis-compiler-1.7.20-dev-178.pom">
-            <sha256 value="9dded49204804e237fc0b237b1f073b87a4bde9901eca6482fc3b6dddf44bf4c" origin="Generated manually"/>
-         </artifact>
-         <artifact name="kotlin-analysis-compiler-1.7.20-dev-178.jar">
-            <sha256 value="051c0ed61798fb30ca74eabe20b0c97e510db34080dd4ca40bae7c6465625f8d" origin="Generated manually"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="kotlin-analysis-intellij" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="kotlin-analysis-intellij-1.7.20-dev-178.pom">
-            <sha256 value="7bb00911c8f9610c56748277169ea6d95f2d32afca4e9edcfcb4efe23c43cca4" origin="Generated manually"/>
-         </artifact>
-         <artifact name="kotlin-analysis-intellij-1.7.20-dev-178.jar">
-            <sha256 value="85976e1cdd4152d93e6c20be62e0b725c357119955c0a1cc0026a1ba60610acd" origin="Generated manually"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="templating-plugin" version="1.7.20-dev-178" androidx:reason="Unsigned">
-         <artifact name="templating-plugin-1.7.20-dev-178.module">
-            <sha256 value="86b38d52c54ffdd52344326e751c5f8020dd7783bc1c8324435932c470b46d1f" origin="Generated manually"/>
-         </artifact>
-         <artifact name="templating-plugin-1.7.20-dev-178.jar">
-            <sha256 value="41347b118770f3dc48a14c18f728395c40ce6f769018709a0d018bade1a64237" origin="Generated manually"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.dokka" name="dokka-android-gradle-plugin" version="0.9.17-g014" androidx:reason="Unsigned">
+      <component group="org.jetbrains.dokka" name="dokka-android-gradle-plugin" version="0.9.17-g014">
          <artifact name="dokka-android-gradle-plugin-0.9.17-g014.jar">
             <sha256 value="64b2e96fd20762351c74f08d598d49c25a490a3b685b8a09446e81d6db36fe81" origin="Generated by Gradle"/>
          </artifact>
@@ -789,7 +808,23 @@
             <sha256 value="956ff381c6c775161a82823bb52d0aa40a8f6a37ab85059f149531f5e5efb7da" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.dokka" name="dokka-fatjar" version="0.9.17-g014" androidx:reason="Unsigned">
+      <component group="org.jetbrains.dokka" name="dokka-base" version="1.7.20-dev-178">
+         <artifact name="dokka-base-1.7.20-dev-178.jar">
+            <sha256 value="043de520b665454fa144a0018875a9303454f16c3cda45c63f3d354f86fdfe66" origin="Generated manually"/>
+         </artifact>
+         <artifact name="dokka-base-1.7.20-dev-178.module">
+            <sha256 value="ddee298e92ee3e8b60c55967bc2b66d8871725db2758d8f44bec3069a7165986" origin="Generated manually"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="dokka-cli" version="1.7.20-dev-178">
+         <artifact name="dokka-cli-1.7.20-dev-178.jar">
+            <sha256 value="4ed2e6846156cd619b00ba942c1bb46489a9cd88118fa7a9236d9ceb2b036930" origin="Generated manually"/>
+         </artifact>
+         <artifact name="dokka-cli-1.7.20-dev-178.pom">
+            <sha256 value="68d9a1bbaa5bca1fea9034450be55cc25ad3f7017f9d017c9b4b65db2f47064a" origin="Generated manually"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="dokka-fatjar" version="0.9.17-g014">
          <artifact name="dokka-fatjar-0.9.17-g014.jar">
             <sha256 value="47cf09501402a101e555588cf5fa9ed83f8572bce9fd60db29e74b5d079628e3" origin="Generated by Gradle"/>
          </artifact>
@@ -797,7 +832,7 @@
             <sha256 value="ceb601f55f14337261fea474bb061407dc0e52146f80d74cd0b43d66febd401f" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.dokka" name="dokka-gradle-plugin" version="0.9.17-g014" androidx:reason="Unsigned">
+      <component group="org.jetbrains.dokka" name="dokka-gradle-plugin" version="0.9.17-g014">
          <artifact name="dokka-gradle-plugin-0.9.17-g014.jar">
             <sha256 value="643a7eddeb521832c6021508b7477b603517438481bc06633dca12eb1f339422" origin="Generated by Gradle"/>
          </artifact>
@@ -805,38 +840,85 @@
             <sha256 value="b217e9a1f1503c9f0c744b736fc2afed6fa6c3c2e86e5276a3c549f5bd48baef" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.3.71" androidx:reason="https://youtrack.jetbrains.com/issue/KT-50957">
+      <component group="org.jetbrains.dokka" name="kotlin-analysis-compiler" version="1.7.20-dev-178">
+         <artifact name="kotlin-analysis-compiler-1.7.20-dev-178.jar">
+            <sha256 value="051c0ed61798fb30ca74eabe20b0c97e510db34080dd4ca40bae7c6465625f8d" origin="Generated manually"/>
+         </artifact>
+         <artifact name="kotlin-analysis-compiler-1.7.20-dev-178.pom">
+            <sha256 value="9dded49204804e237fc0b237b1f073b87a4bde9901eca6482fc3b6dddf44bf4c" origin="Generated manually"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="kotlin-analysis-intellij" version="1.7.20-dev-178">
+         <artifact name="kotlin-analysis-intellij-1.7.20-dev-178.jar">
+            <sha256 value="85976e1cdd4152d93e6c20be62e0b725c357119955c0a1cc0026a1ba60610acd" origin="Generated manually"/>
+         </artifact>
+         <artifact name="kotlin-analysis-intellij-1.7.20-dev-178.pom">
+            <sha256 value="7bb00911c8f9610c56748277169ea6d95f2d32afca4e9edcfcb4efe23c43cca4" origin="Generated manually"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.dokka" name="templating-plugin" version="1.7.20-dev-178">
+         <artifact name="templating-plugin-1.7.20-dev-178.jar">
+            <sha256 value="41347b118770f3dc48a14c18f728395c40ce6f769018709a0d018bade1a64237" origin="Generated manually"/>
+         </artifact>
+         <artifact name="templating-plugin-1.7.20-dev-178.module">
+            <sha256 value="86b38d52c54ffdd52344326e751c5f8020dd7783bc1c8324435932c470b46d1f" origin="Generated manually"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.3.71">
          <artifact name="kotlin-reflect-1.3.71.pom">
             <sha256 value="4df94aaeee8d900be431386e31ef44e82a66e57c3ae30866aec2875aff01fe70" origin="Generated by Gradle"/>
          </artifact>
       </component>
       <component group="org.jetbrains.kotlinx" name="kotlinx-benchmark-plugin" version="0.4.7">
          <artifact name="kotlinx-benchmark-plugin-0.4.7.jar">
-            <sha256 value="f090dad33b57e3dba4ea25a42350e19d6863213342937a5982c88a74166d08db" origin="generated by gradle"/>
+            <sha256 value="f090dad33b57e3dba4ea25a42350e19d6863213342937a5982c88a74166d08db" origin="generated by gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="kotlinx-benchmark-plugin-0.4.7.module">
-            <sha256 value="7a937502d3a6c6cca8e08ff7c9b6947d410c13abd17f43a9dca79446ee2e1ca3" origin="generated by gradle"/>
+            <sha256 value="7a937502d3a6c6cca8e08ff7c9b6947d410c13abd17f43a9dca79446ee2e1ca3" origin="generated by gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-metadata" version="1.4.1">
+         <artifact name="kotlinx-coroutines-core-metadata-1.4.1-all.jar">
+            <sha256 value="877057d99a7fff9282059ba6631a9039bf3b54795d397b7e69a67363b7d2dcfe" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core-metadata" version="1.0.1">
+         <artifact name="kotlinx-serialization-core-metadata-1.0.1-all.jar">
+            <sha256 value="0201172838d77b1db848d738e88895cc83fe72f68de43ff928045c7c4c5d64c4" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-metadata" version="1.0.1">
+         <artifact name="kotlinx-serialization-json-metadata-1.0.1-all.jar">
+            <sha256 value="96762495e07d30d42a38692461708e5f8a2dd347be8474d249d7187be94cf187" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+         <artifact name="kotlinx-serialization-json-metadata-1.0.1.module">
+            <sha256 value="c6c38e1fb8d99d1d41728b0f055e490d5e463c1252f13e7bb6f7015c22c95ab6" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
       <component group="org.jetbrains.kotlinx.benchmark" name="org.jetbrains.kotlinx.benchmark.gradle.plugin" version="0.4.7">
          <artifact name="org.jetbrains.kotlinx.benchmark.gradle.plugin-0.4.7.pom">
-            <sha256 value="59fec57251015a7c2577b1527a8e213d08278aa0e1b121e3e146dec3f2eb1680" origin="Generated by Gradle"/>
+            <sha256 value="59fec57251015a7c2577b1527a8e213d08278aa0e1b121e3e146dec3f2eb1680" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="org.ow2" name="ow2" version="1.5" androidx:reason="https://gitlab.ow2.org/asm/asm/-/merge_requests/354">
+      <component group="org.jetbrains.skiko" name="skiko" version="0.7.7">
+         <artifact name="skiko-metadata-0.7.7-all.jar">
+            <sha256 value="c0c39f941138dd193676a3b1c28b8a36b7433ec760b979c69699241bdecee4cb" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="org.ow2" name="ow2" version="1.5">
          <artifact name="ow2-1.5.pom">
-            <sha256 value="0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b" origin="Generated by Gradle"/>
+            <sha256 value="0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="org.ow2.asm" name="asm" version="7.0" androidx:reason="Unsigned. Used by AGP 7.0 dependency of androidx.benchmark library">
+      <component group="org.ow2.asm" name="asm" version="7.0">
          <artifact name="asm-7.0.jar">
-            <sha256 value="b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf" origin="Generated by Gradle"/>
+            <sha256 value="b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="asm-7.0.pom">
-            <sha256 value="83f65b1083d5ce4f8ba7f9545cfe9ff17824589c9a7cc82c3a4695801e4f5f68" origin="Generated by Gradle"/>
+            <sha256 value="83f65b1083d5ce4f8ba7f9545cfe9ff17824589c9a7cc82c3a4695801e4f5f68" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="org.ow2.asm" name="asm-analysis" version="7.0" androidx:reason="Unsigned. Used by AGP 7.0 dependency of androidx.benchmark library">
+      <component group="org.ow2.asm" name="asm-analysis" version="7.0">
          <artifact name="asm-analysis-7.0.jar">
             <sha256 value="e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474" origin="Generated by Gradle"/>
          </artifact>
@@ -844,7 +926,7 @@
             <sha256 value="c6b54477e9d5bae1e7addff2e24cbf92aaff2ff08fd6bc0596c3933c3fadc2cb" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.ow2.asm" name="asm-commons" version="7.0" androidx:reason="Unsigned. Used by AGP 7.0 dependency of androidx.benchmark library">
+      <component group="org.ow2.asm" name="asm-commons" version="7.0">
          <artifact name="asm-commons-7.0.jar">
             <sha256 value="fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d" origin="Generated by Gradle"/>
          </artifact>
@@ -852,15 +934,15 @@
             <sha256 value="f4c697886cdb4a5b2472054a0b5e34371e9b48e620be40c3ed48e1f4b6d51eb4" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.ow2.asm" name="asm-tree" version="7.0" androidx:reason="Unsigned. Used by AGP 7.0 dependency of androidx.benchmark library">
+      <component group="org.ow2.asm" name="asm-tree" version="7.0">
          <artifact name="asm-tree-7.0.jar">
-            <sha256 value="cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c" origin="Generated by Gradle"/>
+            <sha256 value="cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="asm-tree-7.0.pom">
-            <sha256 value="d39e7dd12f4ff535a0839d1949c39c7644355a4470220c94b76a5c168c57a068" origin="Generated by Gradle"/>
+            <sha256 value="d39e7dd12f4ff535a0839d1949c39c7644355a4470220c94b76a5c168c57a068" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="org.ow2.asm" name="asm-util" version="7.0" androidx:reason="Unsigned. Used by AGP 7.0 dependency of androidx.benchmark library">
+      <component group="org.ow2.asm" name="asm-util" version="7.0">
          <artifact name="asm-util-7.0.jar">
             <sha256 value="75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145" origin="Generated by Gradle"/>
          </artifact>
@@ -868,12 +950,22 @@
             <sha256 value="e07bce4bb55d5a06f4c10d912fc9dee8a9b9c04ec549bbb8db4f20db34706f75" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="org.sonatype.oss" name="oss-parent" version="7" androidx:reason="Unsigned">
-         <artifact name="oss-parent-7.pom">
-            <sha256 value="b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454" origin="Generated by Gradle"/>
+      <component group="org.sonatype.oss" name="oss-parent" version="4">
+         <artifact name="oss-parent-4.pom">
+            <pgp value="2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd"/>
          </artifact>
       </component>
-      <component group="org.tensorflow" name="tensorflow-lite-metadata" version="0.1.0-rc2" androidx:reason="Invalid signature">
+      <component group="org.sonatype.oss" name="oss-parent" version="7">
+         <artifact name="oss-parent-7.pom">
+            <sha256 value="b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454" origin="Generated by Gradle" reason="Artifact is not signed"/>
+         </artifact>
+      </component>
+      <component group="org.sonatype.oss" name="oss-parent" version="9">
+         <artifact name="oss-parent-9.pom">
+            <pgp value="44fbdbbc1a00fe414f1c1873586654072ead6677"/>
+         </artifact>
+      </component>
+      <component group="org.tensorflow" name="tensorflow-lite-metadata" version="0.1.0-rc2">
          <artifact name="tensorflow-lite-metadata-0.1.0-rc2.jar">
             <pgp value="db0597e3144342256bc81e3ec727d053c4481cf5"/>
             <sha256 value="2c2a264f842498c36d34d2a7b91342490d9a962862c85baac1acd54ec2fca6d9" origin="Generated by Gradle"/>
@@ -887,45 +979,28 @@
             </sha256>
          </artifact>
       </component>
-      <component group="pull-parser" name="pull-parser" version="2" androidx:reason="Unsigned">
+      <component group="pull-parser" name="pull-parser" version="2">
          <artifact name="pull-parser-2.jar">
-            <sha256 value="b20c1e56513faeffb9b01d9d03ba1a36128ac3f9be39b2d0edbe2e240b029d3f" origin="Generated by Gradle"/>
+            <sha256 value="b20c1e56513faeffb9b01d9d03ba1a36128ac3f9be39b2d0edbe2e240b029d3f" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="pull-parser-2.pom">
-            <sha256 value="4823677670797c2b71e8ebbe5437c41151f4e8edb7c6c0d473279715070f36d3" origin="Generated by Gradle"/>
+            <sha256 value="4823677670797c2b71e8ebbe5437c41151f4e8edb7c6c0d473279715070f36d3" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="xmlpull" name="xmlpull" version="1.1.3.1" androidx:reason="Unsigned">
+      <component group="xmlpull" name="xmlpull" version="1.1.3.1">
          <artifact name="xmlpull-1.1.3.1.jar">
-            <sha256 value="34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63" origin="Generated by Gradle"/>
+            <sha256 value="34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="xmlpull-1.1.3.1.pom">
-            <sha256 value="8f10ffd8df0d3e9819c8cc8402709c6b248bc53a954ef6e45470d9ae3a5735fb" origin="Generated by Gradle"/>
+            <sha256 value="8f10ffd8df0d3e9819c8cc8402709c6b248bc53a954ef6e45470d9ae3a5735fb" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
-      <component group="xpp3" name="xpp3" version="1.1.4c" androidx:reason="Unsigned">
+      <component group="xpp3" name="xpp3" version="1.1.4c">
          <artifact name="xpp3-1.1.4c.jar">
-            <sha256 value="0341395a481bb887803957145a6a37879853dd625e9244c2ea2509d9bb7531b9" origin="Generated by Gradle"/>
+            <sha256 value="0341395a481bb887803957145a6a37879853dd625e9244c2ea2509d9bb7531b9" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
          <artifact name="xpp3-1.1.4c.pom">
-            <sha256 value="4e54622f5dc0f8b6c51e28650268f001e3b55d076c8e3a9d9731c050820c0a3d" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="" name="kotlin-native-prebuilt-linux-x86_64" version="1.8.0" androidx:reason="Unsigned, b/227204920">
-         <artifact name="kotlin-native-prebuilt-linux-x86_64-1.8.0.tar.gz">
-            <sha256 value="841582a0259eb0440e90f8ac6c71bd164ac1dcd01eef02c66ac9852179a86d9f" origin="Hand-built using sha256sum kotlin-native-prebuilt-linux-x86_64-1.7.21.tar.gz"/>
-         </artifact>
-      </component>
-
-      <component group="" name="kotlin-native-prebuilt-macos-aarch64" version="1.8.0">
-         <artifact name="kotlin-native-prebuilt-macos-aarch64-1.8.0.tar.gz">
-            <sha256 value="83022c4b47d5e0c261dd4844ec775c3cedc998d08e8cff07a9318b309ca7fbf1" origin="Hand-built using sha256sum kotlin-native-prebuilt-macos-aarch64-1.7.21.tar.gz"/>
-         </artifact>
-      </component>
-
-      <component group="" name="kotlin-native-prebuilt-macos-x86_64" version="1.8.0">
-         <artifact name="kotlin-native-prebuilt-macos-x86_64-1.8.0.tar.gz">
-            <sha256 value="27f9b7de732ce36b3daf291f7970762ba7e538cf1eb75603dd2377ae8ebf9513" origin="Hand-built using sha256sum kotlin-native-prebuilt-macos-x86_64-1.7.21.tar.gz"/>
+            <sha256 value="4e54622f5dc0f8b6c51e28650268f001e3b55d076c8e3a9d9731c050820c0a3d" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
    </components>
diff --git a/graphics/filters/OWNERS b/graphics/filters/OWNERS
index 6c8a8b5..1bc1576 100644
--- a/graphics/filters/OWNERS
+++ b/graphics/filters/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1137062
 njawad@google.com
 whisperwing@google.com
 chet@google.com
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
index 160db4b..82dfd0a 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
@@ -21,7 +21,6 @@
 import android.opengl.GLES20
 import android.opengl.Matrix
 import android.os.Build
-import android.view.InputDevice
 import android.view.MotionEvent
 import android.view.SurfaceView
 import androidx.annotation.RequiresApi
@@ -121,12 +120,10 @@
     val renderCount = AtomicInteger(0)
 
     init {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-            requestUnbufferedDispatch(InputDevice.SOURCE_CLASS_POINTER)
-        }
         setOnTouchListener { _, event ->
             when (event.action) {
                 MotionEvent.ACTION_DOWN -> {
+                    requestUnbufferedDispatch(event)
                     mCurrentX = event.x
                     mCurrentY = event.y
                     renderCount.set(0)
diff --git a/graphics/graphics-shapes/api/current.txt b/graphics/graphics-shapes/api/current.txt
index fa9797d2..f6613a7 100644
--- a/graphics/graphics-shapes/api/current.txt
+++ b/graphics/graphics-shapes/api/current.txt
@@ -99,8 +99,5 @@
     method public static androidx.graphics.shapes.RoundedPolygon Star(int numOuterVertices, @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float innerRadiusRatio);
   }
 
-  public final class Utils {
-  }
-
 }
 
diff --git a/graphics/graphics-shapes/api/public_plus_experimental_current.txt b/graphics/graphics-shapes/api/public_plus_experimental_current.txt
index fa9797d2..f6613a7 100644
--- a/graphics/graphics-shapes/api/public_plus_experimental_current.txt
+++ b/graphics/graphics-shapes/api/public_plus_experimental_current.txt
@@ -99,8 +99,5 @@
     method public static androidx.graphics.shapes.RoundedPolygon Star(int numOuterVertices, @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float innerRadiusRatio);
   }
 
-  public final class Utils {
-  }
-
 }
 
diff --git a/graphics/graphics-shapes/api/restricted_current.txt b/graphics/graphics-shapes/api/restricted_current.txt
index fa9797d2..f6613a7 100644
--- a/graphics/graphics-shapes/api/restricted_current.txt
+++ b/graphics/graphics-shapes/api/restricted_current.txt
@@ -99,8 +99,5 @@
     method public static androidx.graphics.shapes.RoundedPolygon Star(int numOuterVertices, @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float innerRadiusRatio);
   }
 
-  public final class Utils {
-  }
-
 }
 
diff --git a/gridlayout/OWNERS b/gridlayout/OWNERS
index 20eea7c..c352bd1 100644
--- a/gridlayout/OWNERS
+++ b/gridlayout/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461201
 alanv@google.com
diff --git a/health/OWNERS b/health/OWNERS
index 3339b73..ee53f1c 100644
--- a/health/OWNERS
+++ b/health/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1126127
 arkivanov@google.com
 itsleo@google.com
 jstembridge@google.com
diff --git a/health/connect/connect-client/OWNERS b/health/connect/connect-client/OWNERS
index eca4cae..4b5b683 100644
--- a/health/connect/connect-client/OWNERS
+++ b/health/connect/connect-client/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1126127
 arkivanov@google.com
 hengruicao@google.com
 itsleo@google.com
diff --git a/health/connect/connect-client/api/api_lint.ignore b/health/connect/connect-client/api/api_lint.ignore
new file mode 100644
index 0000000..4ad84ae
--- /dev/null
+++ b/health/connect/connect-client/api/api_lint.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+ActionValue: androidx.health.connect.client.HealthConnectClient#ACTION_HEALTH_CONNECT_SETTINGS:
+    Inconsistent action value; expected `androidx.health.connect.client.action.HEALTH_CONNECT_SETTINGS`, was `androidx.health.ACTION_HEALTH_CONNECT_SETTINGS`
+ActionValue: androidx.health.connect.client.HealthConnectClient.Companion#ACTION_HEALTH_CONNECT_SETTINGS:
+    Inconsistent action value; expected `androidx.health.connect.client.action.HEALTH_CONNECT_SETTINGS`, was `androidx.health.ACTION_HEALTH_CONNECT_SETTINGS`
diff --git a/health/connect/connect-client/api/current.txt b/health/connect/connect-client/api/current.txt
index b0febf5..e5fb7f2 100644
--- a/health/connect/connect-client/api/current.txt
+++ b/health/connect/connect-client/api/current.txt
@@ -13,22 +13,34 @@
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
     method public androidx.health.connect.client.PermissionController getPermissionController();
     method public suspend Object? insertRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.InsertRecordsResponse>);
-    method public default static boolean isApiSupported();
-    method public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public default static boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public default static boolean isApiSupported();
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String recordId, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordResponse<T>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecords(androidx.health.connect.client.request.ReadRecordsRequest<T> request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordsResponse<T>>);
+    method public default static int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public default static int sdkStatus(android.content.Context context);
     method public suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
     field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   public static final class HealthConnectClient.Companion {
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isApiSupported();
-    method public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public boolean isApiSupported();
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context);
+    method public int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public int sdkStatus(android.content.Context context);
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   @kotlin.jvm.JvmDefaultWithCompatibility public interface PermissionController {
@@ -427,36 +439,21 @@
     property public final String? title;
     field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
     field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> EXERCISE_DURATION_TOTAL;
-    field public static final int EXERCISE_TYPE_BACK_EXTENSION = 1; // 0x1
     field public static final int EXERCISE_TYPE_BADMINTON = 2; // 0x2
-    field public static final int EXERCISE_TYPE_BARBELL_SHOULDER_PRESS = 3; // 0x3
     field public static final int EXERCISE_TYPE_BASEBALL = 4; // 0x4
     field public static final int EXERCISE_TYPE_BASKETBALL = 5; // 0x5
-    field public static final int EXERCISE_TYPE_BENCH_PRESS = 6; // 0x6
-    field public static final int EXERCISE_TYPE_BENCH_SIT_UP = 7; // 0x7
     field public static final int EXERCISE_TYPE_BIKING = 8; // 0x8
     field public static final int EXERCISE_TYPE_BIKING_STATIONARY = 9; // 0x9
     field public static final int EXERCISE_TYPE_BOOT_CAMP = 10; // 0xa
     field public static final int EXERCISE_TYPE_BOXING = 11; // 0xb
-    field public static final int EXERCISE_TYPE_BURPEE = 12; // 0xc
     field public static final int EXERCISE_TYPE_CALISTHENICS = 13; // 0xd
     field public static final int EXERCISE_TYPE_CRICKET = 14; // 0xe
-    field public static final int EXERCISE_TYPE_CRUNCH = 15; // 0xf
     field public static final int EXERCISE_TYPE_DANCING = 16; // 0x10
-    field public static final int EXERCISE_TYPE_DEADLIFT = 17; // 0x11
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM = 18; // 0x12
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM = 19; // 0x13
-    field public static final int EXERCISE_TYPE_DUMBBELL_FRONT_RAISE = 20; // 0x14
-    field public static final int EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE = 21; // 0x15
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = 22; // 0x16
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = 23; // 0x17
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = 24; // 0x18
     field public static final int EXERCISE_TYPE_ELLIPTICAL = 25; // 0x19
     field public static final int EXERCISE_TYPE_EXERCISE_CLASS = 26; // 0x1a
     field public static final int EXERCISE_TYPE_FENCING = 27; // 0x1b
     field public static final int EXERCISE_TYPE_FOOTBALL_AMERICAN = 28; // 0x1c
     field public static final int EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 29; // 0x1d
-    field public static final int EXERCISE_TYPE_FORWARD_TWIST = 30; // 0x1e
     field public static final int EXERCISE_TYPE_FRISBEE_DISC = 31; // 0x1f
     field public static final int EXERCISE_TYPE_GOLF = 32; // 0x20
     field public static final int EXERCISE_TYPE_GUIDED_BREATHING = 33; // 0x21
@@ -466,16 +463,11 @@
     field public static final int EXERCISE_TYPE_HIKING = 37; // 0x25
     field public static final int EXERCISE_TYPE_ICE_HOCKEY = 38; // 0x26
     field public static final int EXERCISE_TYPE_ICE_SKATING = 39; // 0x27
-    field public static final int EXERCISE_TYPE_JUMPING_JACK = 40; // 0x28
-    field public static final int EXERCISE_TYPE_JUMP_ROPE = 41; // 0x29
-    field public static final int EXERCISE_TYPE_LAT_PULL_DOWN = 42; // 0x2a
-    field public static final int EXERCISE_TYPE_LUNGE = 43; // 0x2b
     field public static final int EXERCISE_TYPE_MARTIAL_ARTS = 44; // 0x2c
     field public static final int EXERCISE_TYPE_OTHER_WORKOUT = 0; // 0x0
     field public static final int EXERCISE_TYPE_PADDLING = 46; // 0x2e
     field public static final int EXERCISE_TYPE_PARAGLIDING = 47; // 0x2f
     field public static final int EXERCISE_TYPE_PILATES = 48; // 0x30
-    field public static final int EXERCISE_TYPE_PLANK = 49; // 0x31
     field public static final int EXERCISE_TYPE_RACQUETBALL = 50; // 0x32
     field public static final int EXERCISE_TYPE_ROCK_CLIMBING = 51; // 0x33
     field public static final int EXERCISE_TYPE_ROLLER_HOCKEY = 52; // 0x34
@@ -493,7 +485,6 @@
     field public static final int EXERCISE_TYPE_SOCCER = 64; // 0x40
     field public static final int EXERCISE_TYPE_SOFTBALL = 65; // 0x41
     field public static final int EXERCISE_TYPE_SQUASH = 66; // 0x42
-    field public static final int EXERCISE_TYPE_SQUAT = 67; // 0x43
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING = 68; // 0x44
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING_MACHINE = 69; // 0x45
     field public static final int EXERCISE_TYPE_STRENGTH_TRAINING = 70; // 0x46
@@ -503,7 +494,6 @@
     field public static final int EXERCISE_TYPE_SWIMMING_POOL = 74; // 0x4a
     field public static final int EXERCISE_TYPE_TABLE_TENNIS = 75; // 0x4b
     field public static final int EXERCISE_TYPE_TENNIS = 76; // 0x4c
-    field public static final int EXERCISE_TYPE_UPPER_TWIST = 77; // 0x4d
     field public static final int EXERCISE_TYPE_VOLLEYBALL = 78; // 0x4e
     field public static final int EXERCISE_TYPE_WALKING = 79; // 0x4f
     field public static final int EXERCISE_TYPE_WATER_POLO = 80; // 0x50
@@ -1341,9 +1331,6 @@
     method public androidx.health.connect.client.units.Energy kilojoules(double value);
   }
 
-  public final class EnergyKt {
-  }
-
   public final class Length implements java.lang.Comparable<androidx.health.connect.client.units.Length> {
     method public int compareTo(androidx.health.connect.client.units.Length other);
     method public static androidx.health.connect.client.units.Length feet(double value);
@@ -1372,9 +1359,6 @@
     method public androidx.health.connect.client.units.Length miles(double value);
   }
 
-  public final class LengthKt {
-  }
-
   public final class Mass implements java.lang.Comparable<androidx.health.connect.client.units.Mass> {
     method public int compareTo(androidx.health.connect.client.units.Mass other);
     method public double getGrams();
@@ -1407,9 +1391,6 @@
     method public androidx.health.connect.client.units.Mass pounds(double value);
   }
 
-  public final class MassKt {
-  }
-
   public final class Percentage implements java.lang.Comparable<androidx.health.connect.client.units.Percentage> {
     ctor public Percentage(double value);
     method public int compareTo(androidx.health.connect.client.units.Percentage other);
@@ -1417,9 +1398,6 @@
     property public final double value;
   }
 
-  public final class PercentageKt {
-  }
-
   public final class Power implements java.lang.Comparable<androidx.health.connect.client.units.Power> {
     method public int compareTo(androidx.health.connect.client.units.Power other);
     method public double getKilocaloriesPerDay();
@@ -1436,9 +1414,6 @@
     method public androidx.health.connect.client.units.Power watts(double value);
   }
 
-  public final class PowerKt {
-  }
-
   public final class Pressure implements java.lang.Comparable<androidx.health.connect.client.units.Pressure> {
     method public int compareTo(androidx.health.connect.client.units.Pressure other);
     method public double getMillimetersOfMercury();
@@ -1451,9 +1426,6 @@
     method public androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
   }
 
-  public final class PressureKt {
-  }
-
   public final class Temperature implements java.lang.Comparable<androidx.health.connect.client.units.Temperature> {
     method public static androidx.health.connect.client.units.Temperature celsius(double value);
     method public int compareTo(androidx.health.connect.client.units.Temperature other);
@@ -1470,9 +1442,6 @@
     method public androidx.health.connect.client.units.Temperature fahrenheit(double value);
   }
 
-  public final class TemperatureKt {
-  }
-
   public final class Velocity implements java.lang.Comparable<androidx.health.connect.client.units.Velocity> {
     method public int compareTo(androidx.health.connect.client.units.Velocity other);
     method public double getKilometersPerHour();
@@ -1493,9 +1462,6 @@
     method public androidx.health.connect.client.units.Velocity milesPerHour(double value);
   }
 
-  public final class VelocityKt {
-  }
-
   public final class Volume implements java.lang.Comparable<androidx.health.connect.client.units.Volume> {
     method public int compareTo(androidx.health.connect.client.units.Volume other);
     method public static androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
@@ -1516,8 +1482,5 @@
     method public androidx.health.connect.client.units.Volume milliliters(double value);
   }
 
-  public final class VolumeKt {
-  }
-
 }
 
diff --git a/health/connect/connect-client/api/public_plus_experimental_current.txt b/health/connect/connect-client/api/public_plus_experimental_current.txt
index b0febf5..e5fb7f2 100644
--- a/health/connect/connect-client/api/public_plus_experimental_current.txt
+++ b/health/connect/connect-client/api/public_plus_experimental_current.txt
@@ -13,22 +13,34 @@
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
     method public androidx.health.connect.client.PermissionController getPermissionController();
     method public suspend Object? insertRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.InsertRecordsResponse>);
-    method public default static boolean isApiSupported();
-    method public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public default static boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public default static boolean isApiSupported();
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String recordId, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordResponse<T>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecords(androidx.health.connect.client.request.ReadRecordsRequest<T> request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordsResponse<T>>);
+    method public default static int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public default static int sdkStatus(android.content.Context context);
     method public suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
     field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   public static final class HealthConnectClient.Companion {
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isApiSupported();
-    method public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public boolean isApiSupported();
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context);
+    method public int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public int sdkStatus(android.content.Context context);
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   @kotlin.jvm.JvmDefaultWithCompatibility public interface PermissionController {
@@ -427,36 +439,21 @@
     property public final String? title;
     field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
     field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> EXERCISE_DURATION_TOTAL;
-    field public static final int EXERCISE_TYPE_BACK_EXTENSION = 1; // 0x1
     field public static final int EXERCISE_TYPE_BADMINTON = 2; // 0x2
-    field public static final int EXERCISE_TYPE_BARBELL_SHOULDER_PRESS = 3; // 0x3
     field public static final int EXERCISE_TYPE_BASEBALL = 4; // 0x4
     field public static final int EXERCISE_TYPE_BASKETBALL = 5; // 0x5
-    field public static final int EXERCISE_TYPE_BENCH_PRESS = 6; // 0x6
-    field public static final int EXERCISE_TYPE_BENCH_SIT_UP = 7; // 0x7
     field public static final int EXERCISE_TYPE_BIKING = 8; // 0x8
     field public static final int EXERCISE_TYPE_BIKING_STATIONARY = 9; // 0x9
     field public static final int EXERCISE_TYPE_BOOT_CAMP = 10; // 0xa
     field public static final int EXERCISE_TYPE_BOXING = 11; // 0xb
-    field public static final int EXERCISE_TYPE_BURPEE = 12; // 0xc
     field public static final int EXERCISE_TYPE_CALISTHENICS = 13; // 0xd
     field public static final int EXERCISE_TYPE_CRICKET = 14; // 0xe
-    field public static final int EXERCISE_TYPE_CRUNCH = 15; // 0xf
     field public static final int EXERCISE_TYPE_DANCING = 16; // 0x10
-    field public static final int EXERCISE_TYPE_DEADLIFT = 17; // 0x11
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM = 18; // 0x12
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM = 19; // 0x13
-    field public static final int EXERCISE_TYPE_DUMBBELL_FRONT_RAISE = 20; // 0x14
-    field public static final int EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE = 21; // 0x15
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = 22; // 0x16
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = 23; // 0x17
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = 24; // 0x18
     field public static final int EXERCISE_TYPE_ELLIPTICAL = 25; // 0x19
     field public static final int EXERCISE_TYPE_EXERCISE_CLASS = 26; // 0x1a
     field public static final int EXERCISE_TYPE_FENCING = 27; // 0x1b
     field public static final int EXERCISE_TYPE_FOOTBALL_AMERICAN = 28; // 0x1c
     field public static final int EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 29; // 0x1d
-    field public static final int EXERCISE_TYPE_FORWARD_TWIST = 30; // 0x1e
     field public static final int EXERCISE_TYPE_FRISBEE_DISC = 31; // 0x1f
     field public static final int EXERCISE_TYPE_GOLF = 32; // 0x20
     field public static final int EXERCISE_TYPE_GUIDED_BREATHING = 33; // 0x21
@@ -466,16 +463,11 @@
     field public static final int EXERCISE_TYPE_HIKING = 37; // 0x25
     field public static final int EXERCISE_TYPE_ICE_HOCKEY = 38; // 0x26
     field public static final int EXERCISE_TYPE_ICE_SKATING = 39; // 0x27
-    field public static final int EXERCISE_TYPE_JUMPING_JACK = 40; // 0x28
-    field public static final int EXERCISE_TYPE_JUMP_ROPE = 41; // 0x29
-    field public static final int EXERCISE_TYPE_LAT_PULL_DOWN = 42; // 0x2a
-    field public static final int EXERCISE_TYPE_LUNGE = 43; // 0x2b
     field public static final int EXERCISE_TYPE_MARTIAL_ARTS = 44; // 0x2c
     field public static final int EXERCISE_TYPE_OTHER_WORKOUT = 0; // 0x0
     field public static final int EXERCISE_TYPE_PADDLING = 46; // 0x2e
     field public static final int EXERCISE_TYPE_PARAGLIDING = 47; // 0x2f
     field public static final int EXERCISE_TYPE_PILATES = 48; // 0x30
-    field public static final int EXERCISE_TYPE_PLANK = 49; // 0x31
     field public static final int EXERCISE_TYPE_RACQUETBALL = 50; // 0x32
     field public static final int EXERCISE_TYPE_ROCK_CLIMBING = 51; // 0x33
     field public static final int EXERCISE_TYPE_ROLLER_HOCKEY = 52; // 0x34
@@ -493,7 +485,6 @@
     field public static final int EXERCISE_TYPE_SOCCER = 64; // 0x40
     field public static final int EXERCISE_TYPE_SOFTBALL = 65; // 0x41
     field public static final int EXERCISE_TYPE_SQUASH = 66; // 0x42
-    field public static final int EXERCISE_TYPE_SQUAT = 67; // 0x43
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING = 68; // 0x44
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING_MACHINE = 69; // 0x45
     field public static final int EXERCISE_TYPE_STRENGTH_TRAINING = 70; // 0x46
@@ -503,7 +494,6 @@
     field public static final int EXERCISE_TYPE_SWIMMING_POOL = 74; // 0x4a
     field public static final int EXERCISE_TYPE_TABLE_TENNIS = 75; // 0x4b
     field public static final int EXERCISE_TYPE_TENNIS = 76; // 0x4c
-    field public static final int EXERCISE_TYPE_UPPER_TWIST = 77; // 0x4d
     field public static final int EXERCISE_TYPE_VOLLEYBALL = 78; // 0x4e
     field public static final int EXERCISE_TYPE_WALKING = 79; // 0x4f
     field public static final int EXERCISE_TYPE_WATER_POLO = 80; // 0x50
@@ -1341,9 +1331,6 @@
     method public androidx.health.connect.client.units.Energy kilojoules(double value);
   }
 
-  public final class EnergyKt {
-  }
-
   public final class Length implements java.lang.Comparable<androidx.health.connect.client.units.Length> {
     method public int compareTo(androidx.health.connect.client.units.Length other);
     method public static androidx.health.connect.client.units.Length feet(double value);
@@ -1372,9 +1359,6 @@
     method public androidx.health.connect.client.units.Length miles(double value);
   }
 
-  public final class LengthKt {
-  }
-
   public final class Mass implements java.lang.Comparable<androidx.health.connect.client.units.Mass> {
     method public int compareTo(androidx.health.connect.client.units.Mass other);
     method public double getGrams();
@@ -1407,9 +1391,6 @@
     method public androidx.health.connect.client.units.Mass pounds(double value);
   }
 
-  public final class MassKt {
-  }
-
   public final class Percentage implements java.lang.Comparable<androidx.health.connect.client.units.Percentage> {
     ctor public Percentage(double value);
     method public int compareTo(androidx.health.connect.client.units.Percentage other);
@@ -1417,9 +1398,6 @@
     property public final double value;
   }
 
-  public final class PercentageKt {
-  }
-
   public final class Power implements java.lang.Comparable<androidx.health.connect.client.units.Power> {
     method public int compareTo(androidx.health.connect.client.units.Power other);
     method public double getKilocaloriesPerDay();
@@ -1436,9 +1414,6 @@
     method public androidx.health.connect.client.units.Power watts(double value);
   }
 
-  public final class PowerKt {
-  }
-
   public final class Pressure implements java.lang.Comparable<androidx.health.connect.client.units.Pressure> {
     method public int compareTo(androidx.health.connect.client.units.Pressure other);
     method public double getMillimetersOfMercury();
@@ -1451,9 +1426,6 @@
     method public androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
   }
 
-  public final class PressureKt {
-  }
-
   public final class Temperature implements java.lang.Comparable<androidx.health.connect.client.units.Temperature> {
     method public static androidx.health.connect.client.units.Temperature celsius(double value);
     method public int compareTo(androidx.health.connect.client.units.Temperature other);
@@ -1470,9 +1442,6 @@
     method public androidx.health.connect.client.units.Temperature fahrenheit(double value);
   }
 
-  public final class TemperatureKt {
-  }
-
   public final class Velocity implements java.lang.Comparable<androidx.health.connect.client.units.Velocity> {
     method public int compareTo(androidx.health.connect.client.units.Velocity other);
     method public double getKilometersPerHour();
@@ -1493,9 +1462,6 @@
     method public androidx.health.connect.client.units.Velocity milesPerHour(double value);
   }
 
-  public final class VelocityKt {
-  }
-
   public final class Volume implements java.lang.Comparable<androidx.health.connect.client.units.Volume> {
     method public int compareTo(androidx.health.connect.client.units.Volume other);
     method public static androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
@@ -1516,8 +1482,5 @@
     method public androidx.health.connect.client.units.Volume milliliters(double value);
   }
 
-  public final class VolumeKt {
-  }
-
 }
 
diff --git a/health/connect/connect-client/api/restricted_current.txt b/health/connect/connect-client/api/restricted_current.txt
index 3df3d9d..e3916eb 100644
--- a/health/connect/connect-client/api/restricted_current.txt
+++ b/health/connect/connect-client/api/restricted_current.txt
@@ -13,22 +13,34 @@
     method public default static androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
     method public androidx.health.connect.client.PermissionController getPermissionController();
     method public suspend Object? insertRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.InsertRecordsResponse>);
-    method public default static boolean isApiSupported();
-    method public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public default static boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public default static boolean isApiSupported();
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public default static boolean isProviderAvailable(android.content.Context context);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecord(kotlin.reflect.KClass<T> recordType, String recordId, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordResponse<T>>);
     method public suspend <T extends androidx.health.connect.client.records.Record> Object? readRecords(androidx.health.connect.client.request.ReadRecordsRequest<T> request, kotlin.coroutines.Continuation<? super androidx.health.connect.client.response.ReadRecordsResponse<T>>);
+    method public default static int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public default static int sdkStatus(android.content.Context context);
     method public suspend Object? updateRecords(java.util.List<? extends androidx.health.connect.client.records.Record> records, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     property public abstract androidx.health.connect.client.PermissionController permissionController;
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
     field public static final androidx.health.connect.client.HealthConnectClient.Companion Companion;
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   public static final class HealthConnectClient.Companion {
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context, optional String providerPackageName);
     method public androidx.health.connect.client.HealthConnectClient getOrCreate(android.content.Context context);
-    method public boolean isApiSupported();
-    method public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
-    method public boolean isProviderAvailable(android.content.Context context);
+    method @Deprecated public boolean isApiSupported();
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context, optional String providerPackageName);
+    method @Deprecated public boolean isProviderAvailable(android.content.Context context);
+    method public int sdkStatus(android.content.Context context, optional String providerPackageName);
+    method public int sdkStatus(android.content.Context context);
+    field public static final String ACTION_HEALTH_CONNECT_SETTINGS = "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS";
+    field public static final int SDK_AVAILABLE = 3; // 0x3
+    field public static final int SDK_UNAVAILABLE = 1; // 0x1
+    field public static final int SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2; // 0x2
   }
 
   @kotlin.jvm.JvmDefaultWithCompatibility public interface PermissionController {
@@ -427,36 +439,21 @@
     property public final String? title;
     field public static final androidx.health.connect.client.records.ExerciseSessionRecord.Companion Companion;
     field public static final androidx.health.connect.client.aggregate.AggregateMetric<java.time.Duration> EXERCISE_DURATION_TOTAL;
-    field public static final int EXERCISE_TYPE_BACK_EXTENSION = 1; // 0x1
     field public static final int EXERCISE_TYPE_BADMINTON = 2; // 0x2
-    field public static final int EXERCISE_TYPE_BARBELL_SHOULDER_PRESS = 3; // 0x3
     field public static final int EXERCISE_TYPE_BASEBALL = 4; // 0x4
     field public static final int EXERCISE_TYPE_BASKETBALL = 5; // 0x5
-    field public static final int EXERCISE_TYPE_BENCH_PRESS = 6; // 0x6
-    field public static final int EXERCISE_TYPE_BENCH_SIT_UP = 7; // 0x7
     field public static final int EXERCISE_TYPE_BIKING = 8; // 0x8
     field public static final int EXERCISE_TYPE_BIKING_STATIONARY = 9; // 0x9
     field public static final int EXERCISE_TYPE_BOOT_CAMP = 10; // 0xa
     field public static final int EXERCISE_TYPE_BOXING = 11; // 0xb
-    field public static final int EXERCISE_TYPE_BURPEE = 12; // 0xc
     field public static final int EXERCISE_TYPE_CALISTHENICS = 13; // 0xd
     field public static final int EXERCISE_TYPE_CRICKET = 14; // 0xe
-    field public static final int EXERCISE_TYPE_CRUNCH = 15; // 0xf
     field public static final int EXERCISE_TYPE_DANCING = 16; // 0x10
-    field public static final int EXERCISE_TYPE_DEADLIFT = 17; // 0x11
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM = 18; // 0x12
-    field public static final int EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM = 19; // 0x13
-    field public static final int EXERCISE_TYPE_DUMBBELL_FRONT_RAISE = 20; // 0x14
-    field public static final int EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE = 21; // 0x15
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = 22; // 0x16
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = 23; // 0x17
-    field public static final int EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = 24; // 0x18
     field public static final int EXERCISE_TYPE_ELLIPTICAL = 25; // 0x19
     field public static final int EXERCISE_TYPE_EXERCISE_CLASS = 26; // 0x1a
     field public static final int EXERCISE_TYPE_FENCING = 27; // 0x1b
     field public static final int EXERCISE_TYPE_FOOTBALL_AMERICAN = 28; // 0x1c
     field public static final int EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 29; // 0x1d
-    field public static final int EXERCISE_TYPE_FORWARD_TWIST = 30; // 0x1e
     field public static final int EXERCISE_TYPE_FRISBEE_DISC = 31; // 0x1f
     field public static final int EXERCISE_TYPE_GOLF = 32; // 0x20
     field public static final int EXERCISE_TYPE_GUIDED_BREATHING = 33; // 0x21
@@ -466,16 +463,11 @@
     field public static final int EXERCISE_TYPE_HIKING = 37; // 0x25
     field public static final int EXERCISE_TYPE_ICE_HOCKEY = 38; // 0x26
     field public static final int EXERCISE_TYPE_ICE_SKATING = 39; // 0x27
-    field public static final int EXERCISE_TYPE_JUMPING_JACK = 40; // 0x28
-    field public static final int EXERCISE_TYPE_JUMP_ROPE = 41; // 0x29
-    field public static final int EXERCISE_TYPE_LAT_PULL_DOWN = 42; // 0x2a
-    field public static final int EXERCISE_TYPE_LUNGE = 43; // 0x2b
     field public static final int EXERCISE_TYPE_MARTIAL_ARTS = 44; // 0x2c
     field public static final int EXERCISE_TYPE_OTHER_WORKOUT = 0; // 0x0
     field public static final int EXERCISE_TYPE_PADDLING = 46; // 0x2e
     field public static final int EXERCISE_TYPE_PARAGLIDING = 47; // 0x2f
     field public static final int EXERCISE_TYPE_PILATES = 48; // 0x30
-    field public static final int EXERCISE_TYPE_PLANK = 49; // 0x31
     field public static final int EXERCISE_TYPE_RACQUETBALL = 50; // 0x32
     field public static final int EXERCISE_TYPE_ROCK_CLIMBING = 51; // 0x33
     field public static final int EXERCISE_TYPE_ROLLER_HOCKEY = 52; // 0x34
@@ -493,7 +485,6 @@
     field public static final int EXERCISE_TYPE_SOCCER = 64; // 0x40
     field public static final int EXERCISE_TYPE_SOFTBALL = 65; // 0x41
     field public static final int EXERCISE_TYPE_SQUASH = 66; // 0x42
-    field public static final int EXERCISE_TYPE_SQUAT = 67; // 0x43
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING = 68; // 0x44
     field public static final int EXERCISE_TYPE_STAIR_CLIMBING_MACHINE = 69; // 0x45
     field public static final int EXERCISE_TYPE_STRENGTH_TRAINING = 70; // 0x46
@@ -503,7 +494,6 @@
     field public static final int EXERCISE_TYPE_SWIMMING_POOL = 74; // 0x4a
     field public static final int EXERCISE_TYPE_TABLE_TENNIS = 75; // 0x4b
     field public static final int EXERCISE_TYPE_TENNIS = 76; // 0x4c
-    field public static final int EXERCISE_TYPE_UPPER_TWIST = 77; // 0x4d
     field public static final int EXERCISE_TYPE_VOLLEYBALL = 78; // 0x4e
     field public static final int EXERCISE_TYPE_WALKING = 79; // 0x4f
     field public static final int EXERCISE_TYPE_WATER_POLO = 80; // 0x50
@@ -1364,9 +1354,6 @@
     method public androidx.health.connect.client.units.Energy kilojoules(double value);
   }
 
-  public final class EnergyKt {
-  }
-
   public final class Length implements java.lang.Comparable<androidx.health.connect.client.units.Length> {
     method public int compareTo(androidx.health.connect.client.units.Length other);
     method public static androidx.health.connect.client.units.Length feet(double value);
@@ -1395,9 +1382,6 @@
     method public androidx.health.connect.client.units.Length miles(double value);
   }
 
-  public final class LengthKt {
-  }
-
   public final class Mass implements java.lang.Comparable<androidx.health.connect.client.units.Mass> {
     method public int compareTo(androidx.health.connect.client.units.Mass other);
     method public double getGrams();
@@ -1430,9 +1414,6 @@
     method public androidx.health.connect.client.units.Mass pounds(double value);
   }
 
-  public final class MassKt {
-  }
-
   public final class Percentage implements java.lang.Comparable<androidx.health.connect.client.units.Percentage> {
     ctor public Percentage(double value);
     method public int compareTo(androidx.health.connect.client.units.Percentage other);
@@ -1440,9 +1421,6 @@
     property public final double value;
   }
 
-  public final class PercentageKt {
-  }
-
   public final class Power implements java.lang.Comparable<androidx.health.connect.client.units.Power> {
     method public int compareTo(androidx.health.connect.client.units.Power other);
     method public double getKilocaloriesPerDay();
@@ -1459,9 +1437,6 @@
     method public androidx.health.connect.client.units.Power watts(double value);
   }
 
-  public final class PowerKt {
-  }
-
   public final class Pressure implements java.lang.Comparable<androidx.health.connect.client.units.Pressure> {
     method public int compareTo(androidx.health.connect.client.units.Pressure other);
     method public double getMillimetersOfMercury();
@@ -1474,9 +1449,6 @@
     method public androidx.health.connect.client.units.Pressure millimetersOfMercury(double value);
   }
 
-  public final class PressureKt {
-  }
-
   public final class Temperature implements java.lang.Comparable<androidx.health.connect.client.units.Temperature> {
     method public static androidx.health.connect.client.units.Temperature celsius(double value);
     method public int compareTo(androidx.health.connect.client.units.Temperature other);
@@ -1493,9 +1465,6 @@
     method public androidx.health.connect.client.units.Temperature fahrenheit(double value);
   }
 
-  public final class TemperatureKt {
-  }
-
   public final class Velocity implements java.lang.Comparable<androidx.health.connect.client.units.Velocity> {
     method public int compareTo(androidx.health.connect.client.units.Velocity other);
     method public double getKilometersPerHour();
@@ -1516,9 +1485,6 @@
     method public androidx.health.connect.client.units.Velocity milesPerHour(double value);
   }
 
-  public final class VelocityKt {
-  }
-
   public final class Volume implements java.lang.Comparable<androidx.health.connect.client.units.Volume> {
     method public int compareTo(androidx.health.connect.client.units.Volume other);
     method public static androidx.health.connect.client.units.Volume fluidOuncesUs(double value);
@@ -1539,8 +1505,5 @@
     method public androidx.health.connect.client.units.Volume milliliters(double value);
   }
 
-  public final class VolumeKt {
-  }
-
 }
 
diff --git a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AvailabilitySamples.kt b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AvailabilitySamples.kt
index 6bff47b..f14f83c 100644
--- a/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AvailabilitySamples.kt
+++ b/health/connect/connect-client/samples/src/main/java/androidx/health/connect/client/samples/AvailabilitySamples.kt
@@ -26,10 +26,11 @@
 
 @Sampled
 suspend fun AvailabilityCheckSamples(context: Context, providerPackageName: String) {
-    if (!HealthConnectClient.isApiSupported()) {
+    val availabilityStatus = HealthConnectClient.sdkStatus(context, providerPackageName)
+    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
         return // early return as there is no viable integration
     }
-    if (!HealthConnectClient.isProviderAvailable(context)) {
+    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
         // Optionally redirect to package installer to find a provider, for example:
         val uriString =
             "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
index 09ad6fa..8e942a9 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
@@ -22,6 +22,7 @@
 import android.os.Build
 import android.os.RemoteException
 import androidx.annotation.ChecksSdkIntAtLeast
+import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
 import androidx.core.content.pm.PackageInfoCompat
 import androidx.health.connect.client.aggregate.AggregateMetric
@@ -362,11 +363,75 @@
         @RestrictTo(RestrictTo.Scope.LIBRARY)
         internal const val DEFAULT_PROVIDER_MIN_VERSION_CODE = 35000
 
-        @RestrictTo(RestrictTo.Scope.LIBRARY) // To be released after testing
-        const val HEALTH_CONNECT_SETTING_INTENT_ACTION =
+        /**
+         * Intent action to open Health Connect settings on this phone. Developers should use this
+         * if they want to re-direct the user to Health Connect.
+         */
+        const val ACTION_HEALTH_CONNECT_SETTINGS =
             "androidx.health.ACTION_HEALTH_CONNECT_SETTINGS"
 
         /**
+         * The Health Connect SDK is not unavailable on this device at the time. This can be due to
+         * the device running a lower than required Android Version.
+         *
+         * Apps should hide any integration points to Health Connect in this case.
+         */
+        const val SDK_UNAVAILABLE = 1
+        /**
+         * The Health Connect SDK APIs are currently unavailable, the provider is either not
+         * installed or needs to be updated.
+         *
+         * Apps may choose to redirect to package installers to find a suitable APK.
+         */
+        const val SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED = 2
+        /**
+         * The Health Connect SDK APIs are available.
+         *
+         * Apps can subsequently call [getOrCreate] to get an instance of [HealthConnectClient].
+         */
+        const val SDK_AVAILABLE = 3
+
+        /** Availability Status. */
+        @Retention(AnnotationRetention.SOURCE)
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        @IntDef(
+            value =
+            [
+                SDK_UNAVAILABLE,
+                SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED,
+                SDK_AVAILABLE,
+            ]
+        )
+        annotation class AvailabilityStatus
+
+        /**
+         * Determines whether the Health Connect SDK is available on this device at the moment.
+         *
+         * @param context the context
+         * @param providerPackageName optional package provider to choose for backend implementation
+         * @return One of [SDK_UNAVAILABLE], [SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED]
+         * or [SDK_AVAILABLE]
+         * @sample androidx.health.connect.client.samples.AvailabilityCheckSamples
+         */
+        @JvmOverloads
+        @JvmStatic
+        @AvailabilityStatus
+        fun sdkStatus(
+            context: Context,
+            providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME,
+        ): Int {
+            @Suppress("Deprecation")
+            if (!isApiSupported()) {
+                return SDK_UNAVAILABLE
+            }
+            @Suppress("Deprecation")
+            if (!isProviderAvailable(context, providerPackageName)) {
+                return SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED
+            }
+            return SDK_AVAILABLE
+        }
+
+        /**
          * Determines whether the current Health Connect SDK is supported on this device. If it is
          * not supported, then installing any provider will not help - instead disable the
          * integration.
@@ -374,6 +439,7 @@
          * @return whether the api is supported on the device.
          */
         @JvmStatic
+        @Deprecated("use sdkStatus()", ReplaceWith("sdkStatus(context)"))
         public fun isApiSupported(): Boolean {
             return isSdkVersionSufficient()
         }
@@ -383,18 +449,18 @@
          * at the moment. If none is available, apps may choose to redirect to package installers to
          * find suitable providers.
          *
-         * @sample androidx.health.connect.client.samples.AvailabilityCheckSamples
-         *
          * @param context the context
          * @param providerPackageName optional package provider to choose for backend implementation
          * @return whether the api is available
          */
         @JvmOverloads
         @JvmStatic
+        @Deprecated("use sdkStatus()", ReplaceWith("sdkStatus(context)"))
         public fun isProviderAvailable(
             context: Context,
             providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME,
         ): Boolean {
+            @Suppress("Deprecation")
             if (!isApiSupported()) {
                 return false
             }
@@ -420,9 +486,11 @@
             context: Context,
             providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME,
         ): HealthConnectClient {
+            @Suppress("Deprecation")
             if (!isApiSupported()) {
                 throw UnsupportedOperationException("SDK version too low")
             }
+            @Suppress("Deprecation")
             if (!isProviderAvailable(context, providerPackageName)) {
                 throw IllegalStateException("Service not available")
             }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt
index c82bdd1..1be95806 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/PermissionController.kt
@@ -16,9 +16,7 @@
 package androidx.health.connect.client
 
 import androidx.activity.result.contract.ActivityResultContract
-import androidx.annotation.RestrictTo
 import androidx.health.connect.client.HealthConnectClient.Companion.DEFAULT_PROVIDER_PACKAGE_NAME
-import androidx.health.connect.client.permission.HealthDataRequestPermissions
 import androidx.health.connect.client.permission.HealthDataRequestPermissionsInternal
 import androidx.health.connect.client.permission.HealthPermission
 
@@ -27,21 +25,6 @@
 interface PermissionController {
 
     /**
-     * Returns a set of [HealthPermission] granted by the user to the calling app, out of the input
-     * [permissions] set.
-     *
-     * @param permissions set of permissions interested to check if granted or not
-     * @return set of granted permissions.
-     * @throws android.os.RemoteException For any IPC transportation failures.
-     * @throws java.io.IOException For any disk I/O issues.
-     * @throws IllegalStateException If service is not available.
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY) // To be deleted once internal clients have migrated.
-    suspend fun getGrantedPermissionsLegacy(
-        permissions: Set<HealthPermission>
-    ): Set<HealthPermission>
-
-    /**
      * Returns a set of all health permissions granted by the user to the calling app.
      *
      * @return set of granted permissions.
@@ -67,22 +50,6 @@
          *
          * @param providerPackageName Optional provider package name to request health permissions
          *   from.
-         * @see androidx.activity.ComponentActivity.registerForActivityResult
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY) // To be deleted once internal clients have migrated.
-        @JvmStatic
-        @JvmOverloads
-        fun createRequestPermissionResultContractLegacy(
-            providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME
-        ): ActivityResultContract<Set<HealthPermission>, Set<HealthPermission>> {
-            return HealthDataRequestPermissions(providerPackageName = providerPackageName)
-        }
-
-        /**
-         * Creates an [ActivityResultContract] to request Health permissions.
-         *
-         * @param providerPackageName Optional provider package name to request health permissions
-         *   from.
          * @sample androidx.health.connect.client.samples.RequestPermission
          * @see androidx.activity.ComponentActivity.registerForActivityResult
          */
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
index 6006964..680ab63 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
@@ -26,8 +26,6 @@
 import androidx.health.connect.client.impl.converters.aggregate.toAggregateDataRowGroupByPeriod
 import androidx.health.connect.client.impl.converters.datatype.toDataType
 import androidx.health.connect.client.impl.converters.datatype.toDataTypeIdPairProtoList
-import androidx.health.connect.client.impl.converters.permission.toJetpackPermission
-import androidx.health.connect.client.impl.converters.permission.toProtoPermission
 import androidx.health.connect.client.impl.converters.records.toProto
 import androidx.health.connect.client.impl.converters.records.toRecord
 import androidx.health.connect.client.impl.converters.request.toDeleteDataRangeRequestProto
@@ -74,22 +72,6 @@
         },
 ) : HealthConnectClient, PermissionController {
 
-    override suspend fun getGrantedPermissionsLegacy(
-        permissions: Set<HealthPermission>
-    ): Set<HealthPermission> {
-        val grantedPermissions =
-            delegate
-                .getGrantedPermissions(permissions.map { it.toProtoPermission() }.toSet())
-                .await()
-                .map { it.toJetpackPermission() }
-                .toSet()
-        Logger.debug(
-            HEALTH_CONNECT_CLIENT_TAG,
-            "Granted ${grantedPermissions.size} out of ${permissions.size} permissions."
-        )
-        return grantedPermissions
-    }
-
     override suspend fun getGrantedPermissions(): Set<String> {
         val grantedPermissions =
             delegate
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
deleted file mode 100644
index a33d9af..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.health.connect.client.permission
-
-import android.content.Context
-import android.content.Intent
-import androidx.activity.result.contract.ActivityResultContract
-import androidx.health.connect.client.HealthConnectClient.Companion.DEFAULT_PROVIDER_PACKAGE_NAME
-import androidx.health.connect.client.HealthConnectClient.Companion.HEALTH_CONNECT_CLIENT_TAG
-import androidx.health.connect.client.impl.converters.permission.toJetpackPermission
-import androidx.health.connect.client.impl.converters.permission.toProtoPermission
-import androidx.health.platform.client.impl.logger.Logger
-import androidx.health.platform.client.permission.Permission as ParcelablePermission
-import androidx.health.platform.client.service.HealthDataServiceConstants.ACTION_REQUEST_PERMISSIONS
-import androidx.health.platform.client.service.HealthDataServiceConstants.KEY_GRANTED_PERMISSIONS_JETPACK
-import androidx.health.platform.client.service.HealthDataServiceConstants.KEY_REQUESTED_PERMISSIONS_JETPACK
-
-/**
- * An [ActivityResultContract] to request Health Connect permissions.
- *
- * @param providerPackageName Optional provider package name for the backing implementation of
- * choice.
- *
- * @see androidx.activity.ComponentActivity.registerForActivityResult
- */
-internal class HealthDataRequestPermissions(
-    private val providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME,
-) : ActivityResultContract<Set<HealthPermission>, Set<HealthPermission>>() {
-
-    override fun createIntent(context: Context, input: Set<HealthPermission>): Intent {
-        require(input.isNotEmpty()) { "At least one permission is required!" }
-
-        val protoPermissionList =
-            input
-                .asSequence()
-                .map { ParcelablePermission(it.toProtoPermission()) }
-                .toCollection(ArrayList())
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Requesting ${input.size} permissions.")
-        return Intent(ACTION_REQUEST_PERMISSIONS).apply {
-            putParcelableArrayListExtra(KEY_REQUESTED_PERMISSIONS_JETPACK, protoPermissionList)
-            if (providerPackageName.isNotEmpty()) {
-                setPackage(providerPackageName)
-            }
-        }
-    }
-
-    @Suppress("Deprecation")
-    override fun parseResult(resultCode: Int, intent: Intent?): Set<HealthPermission> {
-        val grantedPermissions =
-            intent
-                ?.getParcelableArrayListExtra<ParcelablePermission>(KEY_GRANTED_PERMISSIONS_JETPACK)
-                ?.asSequence()
-                ?.map { it.proto.toJetpackPermission() }
-                ?.toSet()
-                ?: emptySet()
-        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Granted ${grantedPermissions.size} permissions.")
-        return grantedPermissions
-    }
-
-    override fun getSynchronousResult(
-        context: Context,
-        input: Set<HealthPermission>,
-    ): SynchronousResult<Set<HealthPermission>>? {
-        return null
-    }
-}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt
index 3f0b24d..f2b31a1 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/records/ExerciseSessionRecord.kt
@@ -31,6 +31,7 @@
  * after each other, there can be gaps in between.
  *
  * Example code demonstrate how to read exercise session:
+ *
  * @sample androidx.health.connect.client.samples.ReadExerciseSessions
  */
 public class ExerciseSessionRecord(
@@ -98,38 +99,25 @@
          * Can be used to represent any generic workout that does not fall into a specific category.
          * Any unknown new value definition will also fall automatically into
          * [EXERCISE_TYPE_OTHER_WORKOUT].
+         *
+         * Next Id: 84.
          */
         const val EXERCISE_TYPE_OTHER_WORKOUT = 0
-        const val EXERCISE_TYPE_BACK_EXTENSION = 1
         const val EXERCISE_TYPE_BADMINTON = 2
-        const val EXERCISE_TYPE_BARBELL_SHOULDER_PRESS = 3
         const val EXERCISE_TYPE_BASEBALL = 4
         const val EXERCISE_TYPE_BASKETBALL = 5
-        const val EXERCISE_TYPE_BENCH_PRESS = 6
-        const val EXERCISE_TYPE_BENCH_SIT_UP = 7
         const val EXERCISE_TYPE_BIKING = 8
         const val EXERCISE_TYPE_BIKING_STATIONARY = 9
         const val EXERCISE_TYPE_BOOT_CAMP = 10
         const val EXERCISE_TYPE_BOXING = 11
-        const val EXERCISE_TYPE_BURPEE = 12
         const val EXERCISE_TYPE_CALISTHENICS = 13
         const val EXERCISE_TYPE_CRICKET = 14
-        const val EXERCISE_TYPE_CRUNCH = 15
         const val EXERCISE_TYPE_DANCING = 16
-        const val EXERCISE_TYPE_DEADLIFT = 17
-        const val EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM = 18
-        const val EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM = 19
-        const val EXERCISE_TYPE_DUMBBELL_FRONT_RAISE = 20
-        const val EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE = 21
-        const val EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = 22
-        const val EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = 23
-        const val EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = 24
         const val EXERCISE_TYPE_ELLIPTICAL = 25
         const val EXERCISE_TYPE_EXERCISE_CLASS = 26
         const val EXERCISE_TYPE_FENCING = 27
         const val EXERCISE_TYPE_FOOTBALL_AMERICAN = 28
         const val EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 29
-        const val EXERCISE_TYPE_FORWARD_TWIST = 30
         const val EXERCISE_TYPE_FRISBEE_DISC = 31
         const val EXERCISE_TYPE_GOLF = 32
         const val EXERCISE_TYPE_GUIDED_BREATHING = 33
@@ -139,15 +127,10 @@
         const val EXERCISE_TYPE_HIKING = 37
         const val EXERCISE_TYPE_ICE_HOCKEY = 38
         const val EXERCISE_TYPE_ICE_SKATING = 39
-        const val EXERCISE_TYPE_JUMPING_JACK = 40
-        const val EXERCISE_TYPE_JUMP_ROPE = 41
-        const val EXERCISE_TYPE_LAT_PULL_DOWN = 42
-        const val EXERCISE_TYPE_LUNGE = 43
         const val EXERCISE_TYPE_MARTIAL_ARTS = 44
         const val EXERCISE_TYPE_PADDLING = 46
         const val EXERCISE_TYPE_PARAGLIDING = 47
         const val EXERCISE_TYPE_PILATES = 48
-        const val EXERCISE_TYPE_PLANK = 49
         const val EXERCISE_TYPE_RACQUETBALL = 50
         const val EXERCISE_TYPE_ROCK_CLIMBING = 51
         const val EXERCISE_TYPE_ROLLER_HOCKEY = 52
@@ -165,7 +148,6 @@
         const val EXERCISE_TYPE_SOCCER = 64
         const val EXERCISE_TYPE_SOFTBALL = 65
         const val EXERCISE_TYPE_SQUASH = 66
-        const val EXERCISE_TYPE_SQUAT = 67
         const val EXERCISE_TYPE_STAIR_CLIMBING = 68
         const val EXERCISE_TYPE_STAIR_CLIMBING_MACHINE = 69
         const val EXERCISE_TYPE_STRENGTH_TRAINING = 70
@@ -175,7 +157,6 @@
         const val EXERCISE_TYPE_SWIMMING_POOL = 74
         const val EXERCISE_TYPE_TABLE_TENNIS = 75
         const val EXERCISE_TYPE_TENNIS = 76
-        const val EXERCISE_TYPE_UPPER_TWIST = 77
         const val EXERCISE_TYPE_VOLLEYBALL = 78
         const val EXERCISE_TYPE_WALKING = 79
         const val EXERCISE_TYPE_WATER_POLO = 80
@@ -187,59 +168,53 @@
         @JvmField
         val EXERCISE_TYPE_STRING_TO_INT_MAP: Map<String, Int> =
             mapOf(
-                "back_extension" to EXERCISE_TYPE_BACK_EXTENSION,
+                "back_extension" to EXERCISE_TYPE_CALISTHENICS,
                 "badminton" to EXERCISE_TYPE_BADMINTON,
-                "barbell_shoulder_press" to EXERCISE_TYPE_BARBELL_SHOULDER_PRESS,
+                "barbell_shoulder_press" to EXERCISE_TYPE_STRENGTH_TRAINING,
                 "baseball" to EXERCISE_TYPE_BASEBALL,
                 "basketball" to EXERCISE_TYPE_BASKETBALL,
-                "bench_press" to EXERCISE_TYPE_BENCH_PRESS,
-                "bench_sit_up" to EXERCISE_TYPE_BENCH_SIT_UP,
+                "bench_press" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "bench_sit_up" to EXERCISE_TYPE_CALISTHENICS,
                 "biking" to EXERCISE_TYPE_BIKING,
                 "biking_stationary" to EXERCISE_TYPE_BIKING_STATIONARY,
                 "boot_camp" to EXERCISE_TYPE_BOOT_CAMP,
                 "boxing" to EXERCISE_TYPE_BOXING,
-                "burpee" to EXERCISE_TYPE_BURPEE,
-                "calisthenics" to EXERCISE_TYPE_CALISTHENICS,
+                "burpee" to EXERCISE_TYPE_CALISTHENICS,
                 "cricket" to EXERCISE_TYPE_CRICKET,
-                "crunch" to EXERCISE_TYPE_CRUNCH,
+                "crunch" to EXERCISE_TYPE_CALISTHENICS,
                 "dancing" to EXERCISE_TYPE_DANCING,
-                "deadlift" to EXERCISE_TYPE_DEADLIFT,
-                "dumbbell_curl_left_arm" to EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM,
-                "dumbbell_curl_right_arm" to EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM,
-                "dumbbell_front_raise" to EXERCISE_TYPE_DUMBBELL_FRONT_RAISE,
-                "dumbbell_lateral_raise" to EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE,
-                "dumbbell_triceps_extension_left_arm" to
-                    EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM,
-                "dumbbell_triceps_extension_right_arm" to
-                    EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM,
-                "dumbbell_triceps_extension_two_arm" to
-                    EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM,
+                "deadlift" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_curl_left_arm" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_curl_right_arm" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_front_raise" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_lateral_raise" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_triceps_extension_left_arm" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_triceps_extension_right_arm" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "dumbbell_triceps_extension_two_arm" to EXERCISE_TYPE_STRENGTH_TRAINING,
                 "elliptical" to EXERCISE_TYPE_ELLIPTICAL,
                 "exercise_class" to EXERCISE_TYPE_EXERCISE_CLASS,
                 "fencing" to EXERCISE_TYPE_FENCING,
                 "football_american" to EXERCISE_TYPE_FOOTBALL_AMERICAN,
                 "football_australian" to EXERCISE_TYPE_FOOTBALL_AUSTRALIAN,
-                "forward_twist" to EXERCISE_TYPE_FORWARD_TWIST,
+                "forward_twist" to EXERCISE_TYPE_CALISTHENICS,
                 "frisbee_disc" to EXERCISE_TYPE_FRISBEE_DISC,
                 "golf" to EXERCISE_TYPE_GOLF,
                 "guided_breathing" to EXERCISE_TYPE_GUIDED_BREATHING,
                 "gymnastics" to EXERCISE_TYPE_GYMNASTICS,
                 "handball" to EXERCISE_TYPE_HANDBALL,
-                "high_intensity_interval_training" to
-                    EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING,
                 "hiking" to EXERCISE_TYPE_HIKING,
                 "ice_hockey" to EXERCISE_TYPE_ICE_HOCKEY,
                 "ice_skating" to EXERCISE_TYPE_ICE_SKATING,
-                "jumping_jack" to EXERCISE_TYPE_JUMPING_JACK,
-                "jump_rope" to EXERCISE_TYPE_JUMP_ROPE,
-                "lat_pull_down" to EXERCISE_TYPE_LAT_PULL_DOWN,
-                "lunge" to EXERCISE_TYPE_LUNGE,
+                "jumping_jack" to EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING,
+                "jump_rope" to EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING,
+                "lat_pull_down" to EXERCISE_TYPE_STRENGTH_TRAINING,
+                "lunge" to EXERCISE_TYPE_CALISTHENICS,
                 "martial_arts" to EXERCISE_TYPE_MARTIAL_ARTS,
                 "paddling" to EXERCISE_TYPE_PADDLING,
                 "para_gliding" to
                     EXERCISE_TYPE_PARAGLIDING, // Historic typo in whs with para_gliding
                 "pilates" to EXERCISE_TYPE_PILATES,
-                "plank" to EXERCISE_TYPE_PLANK,
+                "plank" to EXERCISE_TYPE_CALISTHENICS,
                 "racquetball" to EXERCISE_TYPE_RACQUETBALL,
                 "rock_climbing" to EXERCISE_TYPE_ROCK_CLIMBING,
                 "roller_hockey" to EXERCISE_TYPE_ROLLER_HOCKEY,
@@ -257,17 +232,16 @@
                 "soccer" to EXERCISE_TYPE_SOCCER,
                 "softball" to EXERCISE_TYPE_SOFTBALL,
                 "squash" to EXERCISE_TYPE_SQUASH,
-                "squat" to EXERCISE_TYPE_SQUAT,
+                "squat" to EXERCISE_TYPE_CALISTHENICS,
                 "stair_climbing" to EXERCISE_TYPE_STAIR_CLIMBING,
                 "stair_climbing_machine" to EXERCISE_TYPE_STAIR_CLIMBING_MACHINE,
-                "strength_training" to EXERCISE_TYPE_STRENGTH_TRAINING,
                 "stretching" to EXERCISE_TYPE_STRETCHING,
                 "surfing" to EXERCISE_TYPE_SURFING,
                 "swimming_open_water" to EXERCISE_TYPE_SWIMMING_OPEN_WATER,
                 "swimming_pool" to EXERCISE_TYPE_SWIMMING_POOL,
                 "table_tennis" to EXERCISE_TYPE_TABLE_TENNIS,
                 "tennis" to EXERCISE_TYPE_TENNIS,
-                "upper_twist" to EXERCISE_TYPE_UPPER_TWIST,
+                "upper_twist" to EXERCISE_TYPE_CALISTHENICS,
                 "volleyball" to EXERCISE_TYPE_VOLLEYBALL,
                 "walking" to EXERCISE_TYPE_WALKING,
                 "water_polo" to EXERCISE_TYPE_WATER_POLO,
@@ -275,6 +249,12 @@
                 "wheelchair" to EXERCISE_TYPE_WHEELCHAIR,
                 "workout" to EXERCISE_TYPE_OTHER_WORKOUT,
                 "yoga" to EXERCISE_TYPE_YOGA,
+
+                // These should always be at the end so reverse mapping are correct.
+                "calisthenics" to EXERCISE_TYPE_CALISTHENICS,
+                "high_intensity_interval_training" to
+                    EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING,
+                "strength_training" to EXERCISE_TYPE_STRENGTH_TRAINING,
             )
 
         @RestrictTo(RestrictTo.Scope.LIBRARY)
@@ -285,6 +265,7 @@
 
     /**
      * List of supported activities on Health Platform.
+     *
      * @suppress
      */
     @Retention(AnnotationRetention.SOURCE)
@@ -292,36 +273,21 @@
     @IntDef(
         value =
             [
-                EXERCISE_TYPE_BACK_EXTENSION,
                 EXERCISE_TYPE_BADMINTON,
-                EXERCISE_TYPE_BARBELL_SHOULDER_PRESS,
                 EXERCISE_TYPE_BASEBALL,
                 EXERCISE_TYPE_BASKETBALL,
-                EXERCISE_TYPE_BENCH_PRESS,
-                EXERCISE_TYPE_BENCH_SIT_UP,
                 EXERCISE_TYPE_BIKING,
                 EXERCISE_TYPE_BIKING_STATIONARY,
                 EXERCISE_TYPE_BOOT_CAMP,
                 EXERCISE_TYPE_BOXING,
-                EXERCISE_TYPE_BURPEE,
                 EXERCISE_TYPE_CALISTHENICS,
                 EXERCISE_TYPE_CRICKET,
-                EXERCISE_TYPE_CRUNCH,
                 EXERCISE_TYPE_DANCING,
-                EXERCISE_TYPE_DEADLIFT,
-                EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM,
-                EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM,
-                EXERCISE_TYPE_DUMBBELL_FRONT_RAISE,
-                EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE,
-                EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM,
-                EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM,
-                EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM,
                 EXERCISE_TYPE_ELLIPTICAL,
                 EXERCISE_TYPE_EXERCISE_CLASS,
                 EXERCISE_TYPE_FENCING,
                 EXERCISE_TYPE_FOOTBALL_AMERICAN,
                 EXERCISE_TYPE_FOOTBALL_AUSTRALIAN,
-                EXERCISE_TYPE_FORWARD_TWIST,
                 EXERCISE_TYPE_FRISBEE_DISC,
                 EXERCISE_TYPE_GOLF,
                 EXERCISE_TYPE_GUIDED_BREATHING,
@@ -331,15 +297,10 @@
                 EXERCISE_TYPE_HIKING,
                 EXERCISE_TYPE_ICE_HOCKEY,
                 EXERCISE_TYPE_ICE_SKATING,
-                EXERCISE_TYPE_JUMPING_JACK,
-                EXERCISE_TYPE_JUMP_ROPE,
-                EXERCISE_TYPE_LAT_PULL_DOWN,
-                EXERCISE_TYPE_LUNGE,
                 EXERCISE_TYPE_MARTIAL_ARTS,
                 EXERCISE_TYPE_PADDLING,
                 EXERCISE_TYPE_PARAGLIDING,
                 EXERCISE_TYPE_PILATES,
-                EXERCISE_TYPE_PLANK,
                 EXERCISE_TYPE_RACQUETBALL,
                 EXERCISE_TYPE_ROCK_CLIMBING,
                 EXERCISE_TYPE_ROLLER_HOCKEY,
@@ -357,7 +318,6 @@
                 EXERCISE_TYPE_SOCCER,
                 EXERCISE_TYPE_SOFTBALL,
                 EXERCISE_TYPE_SQUASH,
-                EXERCISE_TYPE_SQUAT,
                 EXERCISE_TYPE_STAIR_CLIMBING,
                 EXERCISE_TYPE_STAIR_CLIMBING_MACHINE,
                 EXERCISE_TYPE_STRENGTH_TRAINING,
@@ -367,7 +327,6 @@
                 EXERCISE_TYPE_SWIMMING_POOL,
                 EXERCISE_TYPE_TABLE_TENNIS,
                 EXERCISE_TYPE_TENNIS,
-                EXERCISE_TYPE_UPPER_TWIST,
                 EXERCISE_TYPE_VOLLEYBALL,
                 EXERCISE_TYPE_WALKING,
                 EXERCISE_TYPE_WATER_POLO,
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
index 1ea349b..ca53b37 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
@@ -47,12 +47,15 @@
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
+    @Suppress("Deprecation")
     fun noBackingImplementation_unavailable() {
         val packageManager = context.packageManager
         Shadows.shadowOf(packageManager).removePackage(PROVIDER_PACKAGE_NAME)
         assertThat(HealthConnectClient.isApiSupported()).isTrue()
         assertThat(HealthConnectClient.isProviderAvailable(context, PROVIDER_PACKAGE_NAME))
             .isFalse()
+        assertThat(HealthConnectClient.sdkStatus(context, PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED)
         assertThrows(IllegalStateException::class.java) {
             HealthConnectClient.getOrCreate(context, PROVIDER_PACKAGE_NAME)
         }
@@ -60,10 +63,13 @@
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
+    @Suppress("Deprecation")
     fun backingImplementation_notEnabled_unavailable() {
         installPackage(context, PROVIDER_PACKAGE_NAME, versionCode = 35001, enabled = false)
         assertThat(HealthConnectClient.isProviderAvailable(context, PROVIDER_PACKAGE_NAME))
             .isFalse()
+        assertThat(HealthConnectClient.sdkStatus(context, PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED)
         assertThrows(IllegalStateException::class.java) {
             HealthConnectClient.getOrCreate(context, PROVIDER_PACKAGE_NAME)
         }
@@ -71,10 +77,13 @@
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
+    @Suppress("Deprecation")
     fun backingImplementation_enabledNoService_unavailable() {
         installPackage(context, PROVIDER_PACKAGE_NAME, versionCode = 35001, enabled = true)
         assertThat(HealthConnectClient.isProviderAvailable(context, PROVIDER_PACKAGE_NAME))
             .isFalse()
+        assertThat(HealthConnectClient.sdkStatus(context, PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED)
         assertThrows(IllegalStateException::class.java) {
             HealthConnectClient.getOrCreate(context, PROVIDER_PACKAGE_NAME)
         }
@@ -82,6 +91,7 @@
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
+    @Suppress("Deprecation")
     fun backingImplementation_enabledUnsupportedVersion_unavailable() {
         installPackage(
             context,
@@ -91,6 +101,8 @@
         installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
 
         assertThat(HealthConnectClient.isProviderAvailable(context)).isFalse()
+        assertThat(HealthConnectClient.sdkStatus(context, PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED)
         assertThrows(IllegalStateException::class.java) {
             HealthConnectClient.getOrCreate(context)
         }
@@ -98,6 +110,7 @@
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
+    @Suppress("Deprecation")
     fun backingImplementation_enabledSupportedVersion_isAvailable() {
         installPackage(
             context,
@@ -107,15 +120,21 @@
         installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
 
         assertThat(HealthConnectClient.isProviderAvailable(context)).isTrue()
+        assertThat(HealthConnectClient.sdkStatus(
+            context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_AVAILABLE)
         HealthConnectClient.getOrCreate(context)
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
+    @Suppress("Deprecation")
     fun sdkVersionTooOld_unavailable() {
         assertThat(HealthConnectClient.isApiSupported()).isFalse()
         assertThat(HealthConnectClient.isProviderAvailable(context, PROVIDER_PACKAGE_NAME))
             .isFalse()
+        assertThat(HealthConnectClient.sdkStatus(context, PROVIDER_PACKAGE_NAME))
+            .isEqualTo(HealthConnectClient.SDK_UNAVAILABLE)
         assertThrows(UnsupportedOperationException::class.java) {
             HealthConnectClient.getOrCreate(context, PROVIDER_PACKAGE_NAME)
         }
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/PermissionControllerTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/PermissionControllerTest.kt
index f73d84e..f0d031bc 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/PermissionControllerTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/PermissionControllerTest.kt
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import androidx.health.connect.client.permission.HealthPermission
-import androidx.health.connect.client.records.StepsRecord
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth
@@ -39,20 +38,6 @@
     }
 
     @Test
-    fun createIntentTest() {
-        val requestPermissionContract =
-            PermissionController.createRequestPermissionResultContractLegacy(PROVIDER_PACKAGE_NAME)
-        val intent =
-            requestPermissionContract.createIntent(
-                context,
-                setOf(HealthPermission.createReadPermissionLegacy(StepsRecord::class))
-            )
-
-        Truth.assertThat(intent.action).isEqualTo("androidx.health.ACTION_REQUEST_PERMISSIONS")
-        Truth.assertThat(intent.`package`).isEqualTo(PROVIDER_PACKAGE_NAME)
-    }
-
-    @Test
     fun createIntentTest_permissionStrings() {
         val requestPermissionContract =
             PermissionController.createRequestPermissionResultContract(PROVIDER_PACKAGE_NAME)
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
index 2fc02d2..ef078d3 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/HealthConnectClientImplTest.kt
@@ -25,7 +25,6 @@
 import androidx.health.connect.client.changes.DeletionChange
 import androidx.health.connect.client.changes.UpsertionChange
 import androidx.health.connect.client.impl.converters.datatype.toDataType
-import androidx.health.connect.client.permission.HealthPermission.Companion.createReadPermissionLegacy
 import androidx.health.connect.client.permission.HealthPermission.Companion.getReadPermission
 import androidx.health.connect.client.permission.HealthPermission.Companion.getWritePermission
 import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
@@ -88,7 +87,6 @@
 
 private val API_METHOD_LIST =
     listOf<suspend HealthConnectClientImpl.() -> Unit>(
-        { getGrantedPermissionsLegacy(setOf()) },
         { revokeAllPermissions() },
         { insertRecords(listOf()) },
         { updateRecords(listOf()) },
@@ -190,36 +188,6 @@
     }
 
     @Test
-    fun getGrantedPermissionsLegacy_none() = runTest {
-        val response = testBlocking {
-            healthConnectClient.getGrantedPermissionsLegacy(
-                setOf(createReadPermissionLegacy(StepsRecord::class))
-            )
-        }
-
-        assertThat(response).isEmpty()
-    }
-
-    @Test
-    fun getGrantedPermissionsLegacy_steps() = runTest {
-        fakeAhpServiceStub.addGrantedPermission(
-            androidx.health.platform.client.permission.Permission(
-                PermissionProto.Permission.newBuilder()
-                    .setDataType(DataProto.DataType.newBuilder().setName("Steps"))
-                    .setAccessType(PermissionProto.AccessType.ACCESS_TYPE_READ)
-                    .build()
-            )
-        )
-        val response = testBlocking {
-            healthConnectClient.getGrantedPermissionsLegacy(
-                setOf(createReadPermissionLegacy(StepsRecord::class))
-            )
-        }
-
-        assertThat(response).containsExactly(createReadPermissionLegacy(StepsRecord::class))
-    }
-
-    @Test
     fun getGrantedPermissions_none() = runTest {
         val response = testBlocking { healthConnectClient.getGrantedPermissions() }
 
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
index 8730026..64d6f17 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/records/AllRecordsConverterTest.kt
@@ -31,7 +31,7 @@
 import androidx.health.connect.client.records.DistanceRecord
 import androidx.health.connect.client.records.ElevationGainedRecord
 import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_BACK_EXTENSION
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_BADMINTON
 import androidx.health.connect.client.records.FloorsClimbedRecord
 import androidx.health.connect.client.records.HeartRateRecord
 import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
@@ -579,7 +579,7 @@
     fun testActivitySession() {
         val data =
             ExerciseSessionRecord(
-                exerciseType = EXERCISE_TYPE_BACK_EXTENSION,
+                exerciseType = EXERCISE_TYPE_BADMINTON,
                 title = null,
                 notes = null,
                 startTime = START_TIME,
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt
index 7ef9575..99de1ce 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/permission/HealthDataRequestPermissionsTest.kt
@@ -15,104 +15,4 @@
  */
 package androidx.health.connect.client.permission
 
-import android.content.Context
-import android.content.Intent
-import androidx.health.connect.client.HealthConnectClient
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.platform.client.proto.DataProto
-import androidx.health.platform.client.proto.PermissionProto
-import androidx.health.platform.client.service.HealthDataServiceConstants
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
 private const val TEST_PACKAGE = "com.test.app"
-
-@RunWith(AndroidJUnit4::class)
-class HealthDataRequestPermissionsTest {
-
-    private lateinit var context: Context
-
-    @Before
-    fun setUp() {
-        context = ApplicationProvider.getApplicationContext()
-    }
-
-    @Test
-    fun createIntentTest() {
-        val requestPermissionContract = HealthDataRequestPermissions(TEST_PACKAGE)
-        val intent =
-            requestPermissionContract.createIntent(
-                context,
-                setOf(HealthPermission.createReadPermissionLegacy(StepsRecord::class))
-            )
-
-        assertThat(intent.action).isEqualTo("androidx.health.ACTION_REQUEST_PERMISSIONS")
-        assertThat(intent.`package`).isEqualTo(TEST_PACKAGE)
-    }
-
-    @Test
-    fun createIntent_defaultPackage() {
-        val requestPermissionContract = HealthDataRequestPermissions()
-        val intent =
-            requestPermissionContract.createIntent(
-                context,
-                setOf(HealthPermission.createReadPermissionLegacy(StepsRecord::class))
-            )
-
-        assertThat(intent.action).isEqualTo("androidx.health.ACTION_REQUEST_PERMISSIONS")
-        assertThat(intent.`package`).isEqualTo(HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
-    }
-
-    @Test
-    fun parseIntent_null_fallback() {
-        val requestPermissionContract = HealthDataRequestPermissions(TEST_PACKAGE)
-        val result = requestPermissionContract.parseResult(0, null)
-
-        assertThat(result).isEmpty()
-    }
-
-    @Test
-    fun parseIntent_emptyIntent() {
-        val requestPermissionContract = HealthDataRequestPermissions(TEST_PACKAGE)
-        val result = requestPermissionContract.parseResult(0, Intent())
-
-        assertThat(result).isEmpty()
-    }
-
-    @Test
-    fun parseIntent() {
-        val requestPermissionContract = HealthDataRequestPermissions(TEST_PACKAGE)
-        val intent = Intent()
-        intent.putParcelableArrayListExtra(
-            HealthDataServiceConstants.KEY_GRANTED_PERMISSIONS_JETPACK,
-            arrayListOf(
-                androidx.health.platform.client.permission.Permission(
-                    PermissionProto.Permission.newBuilder()
-                        .setDataType(DataProto.DataType.newBuilder().setName("Steps"))
-                        .setAccessType(PermissionProto.AccessType.ACCESS_TYPE_READ)
-                        .build()
-                )
-            )
-        )
-        val result = requestPermissionContract.parseResult(0, intent)
-
-        assertThat(result)
-            .containsExactly(HealthPermission.createReadPermissionLegacy(StepsRecord::class))
-    }
-
-    @Test
-    fun synchronousResult_null() {
-        val requestPermissionContract = HealthDataRequestPermissions(TEST_PACKAGE)
-        val result =
-            requestPermissionContract.getSynchronousResult(
-                context,
-                setOf(HealthPermission.createReadPermissionLegacy(StepsRecord::class))
-            )
-
-        assertThat(result).isNull()
-    }
-}
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/records/ExerciseSessionRecordTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/records/ExerciseSessionRecordTest.kt
index 26d41ac..7d63ec1 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/records/ExerciseSessionRecordTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/records/ExerciseSessionRecordTest.kt
@@ -16,6 +16,11 @@
 
 package androidx.health.connect.client.records
 
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_CALISTHENICS
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_INT_TO_STRING_MAP
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_STRENGTH_TRAINING
+import androidx.health.connect.client.records.ExerciseSessionRecord.Companion.EXERCISE_TYPE_STRING_TO_INT_MAP
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
 import java.time.Instant
@@ -79,9 +84,20 @@
                 .map { it -> it.call(ExerciseSessionRecord.Companion) }
                 .toHashSet()
 
-        assertThat(ExerciseSessionRecord.EXERCISE_TYPE_STRING_TO_INT_MAP.values)
+        assertThat(EXERCISE_TYPE_STRING_TO_INT_MAP.values.toSet())
             .containsExactlyElementsIn(allEnums)
-        assertThat(ExerciseSessionRecord.EXERCISE_TYPE_INT_TO_STRING_MAP.keys)
-            .containsExactlyElementsIn(allEnums)
+        assertThat(EXERCISE_TYPE_INT_TO_STRING_MAP.keys).containsExactlyElementsIn(allEnums)
+    }
+
+    @Test
+    fun legacyTypesMapToRightValues() {
+        assertThat(EXERCISE_TYPE_INT_TO_STRING_MAP[EXERCISE_TYPE_STRENGTH_TRAINING])
+            .isEqualTo("strength_training")
+
+        assertThat(EXERCISE_TYPE_INT_TO_STRING_MAP[EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING])
+            .isEqualTo("high_intensity_interval_training")
+
+        assertThat(EXERCISE_TYPE_INT_TO_STRING_MAP[EXERCISE_TYPE_CALISTHENICS])
+            .isEqualTo("calisthenics")
     }
 }
diff --git a/health/health-services-client/OWNERS b/health/health-services-client/OWNERS
index 0e8e33f..7079ccb 100644
--- a/health/health-services-client/OWNERS
+++ b/health/health-services-client/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1126127
 aakanksha@google.com
 jlannin@google.com
 shobana@google.com
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/BatchingMode.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/BatchingMode.kt
index 66c4f95..fa9ea16 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/BatchingMode.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/BatchingMode.kt
@@ -42,7 +42,8 @@
          * Note: This mode will cause significantly increased power consumption compared to the
          * default batching mode, while still being more power efficient than streaming when in
          * non-interactive state. The exact power/performance tradeoff of this mode is device
-         * implementation dependent but aims for roughly five second updates.
+         * implementation dependent and batched updates may be aligned with other wake ups but
+         * target five second updates.
          */
         @JvmField public val HEART_RATE_5_SECONDS: BatchingMode = BatchingMode(1)
 
diff --git a/javascriptengine/OWNERS b/javascriptengine/OWNERS
index e3fd7e0..8684df8 100644
--- a/javascriptengine/OWNERS
+++ b/javascriptengine/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1233358
 abhijithnair@google.com
 torne@google.com
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
index 74d74a8..c4b76f7 100644
--- a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JavaScriptSandbox.java
@@ -174,7 +174,15 @@
         @Override
         @SuppressWarnings("NullAway")
         public void onServiceConnected(ComponentName name, IBinder service) {
-            IJsSandboxService jsSandboxService = IJsSandboxService.Stub.asInterface(service);
+            // It's possible for the service to die and already have been restarted before
+            // we've actually observed the original death (b/267864650). If that happens,
+            // onServiceConnected will be called a second time immediately after
+            // onServiceDisconnected even though we already unbound. Just do nothing.
+            if (mCompleter == null) {
+                return;
+            }
+            IJsSandboxService jsSandboxService =
+                    IJsSandboxService.Stub.asInterface(service);
             mJsSandbox = new JavaScriptSandbox(this, jsSandboxService);
             mCompleter.set(mJsSandbox);
             mCompleter = null;
diff --git a/leanback/OWNERS b/leanback/OWNERS
index 063702c..729b9b6 100644
--- a/leanback/OWNERS
+++ b/leanback/OWNERS
@@ -1 +1,2 @@
+# Bug component: 188489
 dake@google.com
\ No newline at end of file
diff --git a/leanback/leanback-preference/OWNERS b/leanback/leanback-preference/OWNERS
index 7a6d834..a485005 100644
--- a/leanback/leanback-preference/OWNERS
+++ b/leanback/leanback-preference/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 188489
 nicoya@google.com
 dake@google.com
 zhizhiliu@google.com
\ No newline at end of file
diff --git a/leanback/leanback/src/main/res/values-or/strings.xml b/leanback/leanback/src/main/res/values-or/strings.xml
index 95cbea3..d5269f5 100644
--- a/leanback/leanback/src/main/res/values-or/strings.xml
+++ b/leanback/leanback/src/main/res/values-or/strings.xml
@@ -18,11 +18,11 @@
 <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="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_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="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_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>
     <string name="lb_control_display_rewind_multiplier" msgid="4597148235912710942">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="7088090604803481121">"ଚଲାନ୍ତୁ"</string>
diff --git a/libraryversions.toml b/libraryversions.toml
index 49c571e..45ddef4 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -1,8 +1,10 @@
 [versions]
-ACTIVITY = "1.7.0-alpha05"
+ACTIVITY = "1.7.0-beta02"
 ADS_IDENTIFIER = "1.0.0-alpha05"
-ANNOTATION = "1.6.0-beta01"
+ANNOTATION = "1.6.0-rc01"
+ANNOTATION_KMP = "1.6.0-dev01"
 ANNOTATION_EXPERIMENTAL = "1.4.0-alpha01"
+ANNOTATION_EXPERIMENTAL_KMP = "1.4.0-dev01"
 APPACTIONS_INTERACTION = "1.0.0-alpha01"
 APPCOMPAT = "1.7.0-alpha02"
 APPSEARCH = "1.1.0-alpha03"
@@ -20,9 +22,9 @@
 CAR_APP = "1.4.0-alpha01"
 COLLECTION = "1.3.0-alpha03"
 COLLECTION_KMP = "1.3.0-dev01"
-COMPOSE = "1.4.0-alpha06"
-COMPOSE_COMPILER = "1.4.1"
-COMPOSE_MATERIAL3 = "1.1.0-alpha05"
+COMPOSE = "1.4.0-beta01"
+COMPOSE_COMPILER = "1.4.2"
+COMPOSE_MATERIAL3 = "1.1.0-alpha06"
 COMPOSE_RUNTIME_TRACING = "1.0.0-alpha02"
 CONSTRAINTLAYOUT = "2.2.0-alpha07"
 CONSTRAINTLAYOUT_COMPOSE = "1.1.0-alpha07"
@@ -49,12 +51,12 @@
 DATASTORE_KMP = "1.1.0-dev01"
 DOCUMENTFILE = "1.1.0-alpha02"
 DRAGANDDROP = "1.1.0-alpha01"
-DRAWERLAYOUT = "1.2.0-beta01"
+DRAWERLAYOUT = "1.2.0-rc01"
 DYNAMICANIMATION = "1.1.0-alpha04"
 DYNAMICANIMATION_KTX = "1.0.0-alpha04"
 EMOJI = "1.2.0-alpha03"
 EMOJI2 = "1.3.0-beta02"
-EMOJI2_QUARANTINE = "1.0.0-alpha01"
+EMOJI2_QUARANTINE = "1.0.0-alpha02"
 ENTERPRISE = "1.1.0-rc01"
 EXIFINTERFACE = "1.4.0-alpha01"
 FRAGMENT = "1.6.0-alpha05"
@@ -80,7 +82,7 @@
 LEANBACK_TAB = "1.1.0-beta01"
 LEGACY = "1.1.0-alpha01"
 LIBYUV = "0.1.0-dev01"
-LIFECYCLE = "2.6.0-alpha06"
+LIFECYCLE = "2.6.0-beta01"
 LIFECYCLE_EXTENSIONS = "2.2.0"
 LOADER = "1.2.0-alpha01"
 MEDIA = "1.7.0-alpha01"
@@ -119,6 +121,7 @@
 SLIDINGPANELAYOUT = "1.3.0-alpha01"
 SQLITE = "2.4.0-alpha01"
 SQLITE_INSPECTOR = "2.1.0-alpha01"
+STABLE_AIDL = "1.0.0-alpha01"
 STARTUP = "1.2.0-alpha03"
 SWIPEREFRESHLAYOUT = "1.2.0-alpha01"
 TESTEXT = "1.0.0-alpha01"
@@ -168,7 +171,8 @@
 BIOMETRIC = { group = "androidx.biometric", atomicGroupVersion = "versions.BIOMETRIC" }
 BLUETOOTH = { group = "androidx.bluetooth", atomicGroupVersion = "versions.BLUETOOTH" }
 BROWSER = { group = "androidx.browser", atomicGroupVersion = "versions.BROWSER" }
-BUILDSRC_TESTS = { group = "androidx.buildSrc-tests", atomicGroupVersion = "versions.BUILDSRC_TESTS", overrideInclude = [ ":buildSrc-tests:max-dep-versions:buildSrc-tests-max-dep-versions-dep", ":buildSrc-tests:max-dep-versions:buildSrc-tests-max-dep-versions-main"] }
+BUILDSRC_TESTS_MAX_DEP_VERSIONS_DEP = { group = "androidx.buildSrc-tests-max-dep-versions-dep", atomicGroupVersion = "versions.BUILDSRC_TESTS", overrideInclude = [ ":buildSrc-tests:max-dep-versions:buildSrc-tests-max-dep-versions-dep" ] }
+BUILDSRC_TESTS_MAX_DEP_VERSIONS_MAIN = { group = "androidx.buildSrc-tests-max-dep-versions-main", atomicGroupVersion = "versions.BUILDSRC_TESTS", overrideInclude = [ ":buildSrc-tests:max-dep-versions:buildSrc-tests-max-dep-versions-main" ] }
 CAMERA = { group = "androidx.camera", atomicGroupVersion = "versions.CAMERA" }
 CARDVIEW = { group = "androidx.cardview", atomicGroupVersion = "versions.CARDVIEW" }
 CAR_APP = { group = "androidx.car.app", atomicGroupVersion = "versions.CAR_APP" }
@@ -246,6 +250,7 @@
 SLICE = { group = "androidx.slice" }
 SLIDINGPANELAYOUT = { group = "androidx.slidingpanelayout", atomicGroupVersion = "versions.SLIDINGPANELAYOUT" }
 SQLITE = { group = "androidx.sqlite", atomicGroupVersion = "versions.SQLITE" }
+STABLE_AIDL = { group = "androidx.stableaidl", atomicGroupVersion = "versions.STABLE_AIDL" }
 STARTUP = { group = "androidx.startup", atomicGroupVersion = "versions.STARTUP" }
 SWIPEREFRESHLAYOUT = { group = "androidx.swiperefreshlayout", atomicGroupVersion = "versions.SWIPEREFRESHLAYOUT" }
 TESTEXT = { group = "androidx.test.ext", atomicGroupVersion = "versions.TESTEXT" }
diff --git a/lifecycle/lifecycle-common-java8/api/2.6.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-common-java8/api/2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-common-java8/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-common-java8/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-common-java8/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-common-java8/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-common/api/2.6.0-beta01.txt b/lifecycle/lifecycle-common/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..f3dc4c9
--- /dev/null
+++ b/lifecycle/lifecycle-common/api/2.6.0-beta01.txt
@@ -0,0 +1,99 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+    method public default void onCreate(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onDestroy(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onPause(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onResume(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStart(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStop(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  public abstract class Lifecycle {
+    ctor public Lifecycle();
+    method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
+    method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    property @MainThread public abstract androidx.lifecycle.Lifecycle.State currentState;
+  }
+
+  public enum Lifecycle.Event {
+    method public static final androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public final androidx.lifecycle.Lifecycle.State getTargetState();
+    method public static final androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.Event valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.Event[] values();
+    property public final androidx.lifecycle.Lifecycle.State targetState;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
+    field public static final androidx.lifecycle.Lifecycle.Event.Companion Companion;
+  }
+
+  public static final class Lifecycle.Event.Companion {
+    method public androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+  }
+
+  public enum Lifecycle.State {
+    method public final boolean isAtLeast(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.State[] values();
+    enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
+  }
+
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
+    method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
+  }
+
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
+  public interface LifecycleObserver {
+  }
+
+  public interface LifecycleOwner {
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public abstract androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
+  @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+    method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
+  }
+
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-common/api/current.txt b/lifecycle/lifecycle-common/api/current.txt
index c802eec..f3dc4c9 100644
--- a/lifecycle/lifecycle-common/api/current.txt
+++ b/lifecycle/lifecycle-common/api/current.txt
@@ -55,10 +55,20 @@
     enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
   }
 
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
   public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
     method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
   }
 
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
   public interface LifecycleObserver {
   }
 
@@ -67,9 +77,23 @@
     property public abstract androidx.lifecycle.Lifecycle lifecycle;
   }
 
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
   @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
     method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
   }
 
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
 }
 
diff --git a/lifecycle/lifecycle-common/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-common/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..f3dc4c9
--- /dev/null
+++ b/lifecycle/lifecycle-common/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,99 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+    method public default void onCreate(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onDestroy(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onPause(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onResume(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStart(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStop(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  public abstract class Lifecycle {
+    ctor public Lifecycle();
+    method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
+    method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    property @MainThread public abstract androidx.lifecycle.Lifecycle.State currentState;
+  }
+
+  public enum Lifecycle.Event {
+    method public static final androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public final androidx.lifecycle.Lifecycle.State getTargetState();
+    method public static final androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.Event valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.Event[] values();
+    property public final androidx.lifecycle.Lifecycle.State targetState;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
+    field public static final androidx.lifecycle.Lifecycle.Event.Companion Companion;
+  }
+
+  public static final class Lifecycle.Event.Companion {
+    method public androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+  }
+
+  public enum Lifecycle.State {
+    method public final boolean isAtLeast(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.State[] values();
+    enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
+  }
+
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
+    method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
+  }
+
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
+  public interface LifecycleObserver {
+  }
+
+  public interface LifecycleOwner {
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public abstract androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
+  @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+    method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
+  }
+
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-common/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-common/api/public_plus_experimental_current.txt
index c802eec..f3dc4c9 100644
--- a/lifecycle/lifecycle-common/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-common/api/public_plus_experimental_current.txt
@@ -55,10 +55,20 @@
     enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
   }
 
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
   public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
     method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
   }
 
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
   public interface LifecycleObserver {
   }
 
@@ -67,9 +77,23 @@
     property public abstract androidx.lifecycle.Lifecycle lifecycle;
   }
 
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
   @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
     method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
   }
 
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
 }
 
diff --git a/lifecycle/lifecycle-common/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-common/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..05b2709
--- /dev/null
+++ b/lifecycle/lifecycle-common/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,116 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+    method public default void onCreate(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onDestroy(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onPause(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onResume(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStart(androidx.lifecycle.LifecycleOwner owner);
+    method public default void onStop(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface GeneratedAdapter {
+    method public void callMethods(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event, boolean onAny, androidx.lifecycle.MethodCallsLogger? logger);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface GenericLifecycleObserver extends androidx.lifecycle.LifecycleEventObserver {
+  }
+
+  public abstract class Lifecycle {
+    ctor public Lifecycle();
+    method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
+    method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    property @MainThread public abstract androidx.lifecycle.Lifecycle.State currentState;
+  }
+
+  public enum Lifecycle.Event {
+    method public static final androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public final androidx.lifecycle.Lifecycle.State getTargetState();
+    method public static final androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public static final androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.Event valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.Event[] values();
+    property public final androidx.lifecycle.Lifecycle.State targetState;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
+    enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
+    field public static final androidx.lifecycle.Lifecycle.Event.Companion Companion;
+  }
+
+  public static final class Lifecycle.Event.Companion {
+    method public androidx.lifecycle.Lifecycle.Event? downFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? downTo(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upFrom(androidx.lifecycle.Lifecycle.State state);
+    method public androidx.lifecycle.Lifecycle.Event? upTo(androidx.lifecycle.Lifecycle.State state);
+  }
+
+  public enum Lifecycle.State {
+    method public final boolean isAtLeast(androidx.lifecycle.Lifecycle.State state);
+    method public static androidx.lifecycle.Lifecycle.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.lifecycle.Lifecycle.State[] values();
+    enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
+    enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
+  }
+
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
+    method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
+  }
+
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
+  public interface LifecycleObserver {
+  }
+
+  public interface LifecycleOwner {
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public abstract androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Lifecycling {
+    method public static String getAdapterName(String className);
+    method public static androidx.lifecycle.LifecycleEventObserver lifecycleEventObserver(Object object);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MethodCallsLogger {
+    ctor public MethodCallsLogger();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean approveCall(String name, int type);
+  }
+
+  @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+    method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
+  }
+
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-common/api/restricted_current.txt b/lifecycle/lifecycle-common/api/restricted_current.txt
index 2c8958d..05b2709 100644
--- a/lifecycle/lifecycle-common/api/restricted_current.txt
+++ b/lifecycle/lifecycle-common/api/restricted_current.txt
@@ -62,10 +62,20 @@
     enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
   }
 
+  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
   public fun interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
     method public void onStateChanged(androidx.lifecycle.LifecycleOwner source, androidx.lifecycle.Lifecycle.Event event);
   }
 
+  public final class LifecycleKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
+  }
+
   public interface LifecycleObserver {
   }
 
@@ -74,6 +84,10 @@
     property public abstract androidx.lifecycle.Lifecycle lifecycle;
   }
 
+  public final class LifecycleOwnerKt {
+    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
+  }
+
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Lifecycling {
     method public static String getAdapterName(String className);
     method public static androidx.lifecycle.LifecycleEventObserver lifecycleEventObserver(Object object);
@@ -88,5 +102,15 @@
     method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
   }
 
+  public final class PausingDispatcherKt {
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
+  }
+
 }
 
diff --git a/lifecycle/lifecycle-common/build.gradle b/lifecycle/lifecycle-common/build.gradle
index 1f9a9f6..2747d00 100644
--- a/lifecycle/lifecycle-common/build.gradle
+++ b/lifecycle/lifecycle-common/build.gradle
@@ -26,6 +26,10 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesAndroid) {
+        exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
+        exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
+    }
 
     testImplementation(libs.junit)
     testImplementation(libs.mockitoCore4)
diff --git a/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DispatchQueue.kt b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DispatchQueue.kt
new file mode 100644
index 0000000..1f51438
--- /dev/null
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DispatchQueue.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.lifecycle
+
+import androidx.annotation.AnyThread
+import androidx.annotation.MainThread
+import kotlinx.coroutines.Dispatchers
+import java.util.ArrayDeque
+import java.util.Queue
+import kotlin.coroutines.CoroutineContext
+
+/**
+ * Helper class for [PausingDispatcher] that tracks runnables which are enqueued to the dispatcher
+ * and also calls back the [PausingDispatcher] when the runnable should run.
+ */
+internal class DispatchQueue {
+    // handler thread
+    private var paused: Boolean = true
+    // handler thread
+    private var finished: Boolean = false
+    private var isDraining: Boolean = false
+
+    private val queue: Queue<Runnable> = ArrayDeque<Runnable>()
+
+    @MainThread
+    fun pause() {
+        paused = true
+    }
+
+    @MainThread
+    fun resume() {
+        if (!paused) {
+            return
+        }
+        check(!finished) {
+            "Cannot resume a finished dispatcher"
+        }
+        paused = false
+        drainQueue()
+    }
+
+    @MainThread
+    fun finish() {
+        finished = true
+        drainQueue()
+    }
+
+    @MainThread
+    fun drainQueue() {
+        if (isDraining) {
+            // Block re-entrant calls to avoid deep stacks
+            return
+        }
+        try {
+            isDraining = true
+            while (queue.isNotEmpty()) {
+                if (!canRun()) {
+                    break
+                }
+                queue.poll()?.run()
+            }
+        } finally {
+            isDraining = false
+        }
+    }
+
+    @MainThread
+    fun canRun() = finished || !paused
+
+    @AnyThread
+    @Suppress("WrongThread") // false negative, we are checking the thread
+    fun dispatchAndEnqueue(context: CoroutineContext, runnable: Runnable) {
+        with(Dispatchers.Main.immediate) {
+            // This check is here to handle a special but important case. If for example
+            // launchWhenCreated is used while not created it's expected that it will run
+            // synchronously when the lifecycle is created. If we called `dispatch` here
+            // it launches made before the required state is reached would always be deferred
+            // which is not the intended behavior.
+            //
+            // This means that calling `yield()` while paused and then receiving `resume` right
+            // after leads to the runnable being run immediately but that is indeed intended.
+            // This could be solved by implementing `dispatchYield` in the dispatcher but it's
+            // marked as internal API.
+            if (isDispatchNeeded(context) || canRun()) {
+                dispatch(context, Runnable { enqueue(runnable) })
+            } else {
+                enqueue(runnable)
+            }
+        }
+    }
+
+    @MainThread
+    private fun enqueue(runnable: Runnable) {
+        check(queue.offer(runnable)) {
+            "cannot enqueue any more runnables"
+        }
+        drainQueue()
+    }
+}
diff --git a/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.kt b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.kt
index a0e6648..f11ba28 100644
--- a/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.kt
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.kt
@@ -19,6 +19,13 @@
 import androidx.annotation.RestrictTo
 import androidx.lifecycle.Lifecycle.Event
 import java.util.concurrent.atomic.AtomicReference
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.launch
 
 /**
  * Defines an object that has an Android Lifecycle. [Fragment][androidx.fragment.app.Fragment]
@@ -271,4 +278,131 @@
             return compareTo(state) >= 0
         }
     }
-}
\ No newline at end of file
+}
+
+/**
+ * [CoroutineScope] tied to this [Lifecycle].
+ *
+ * This scope will be cancelled when the [Lifecycle] is destroyed.
+ *
+ * This scope is bound to
+ * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate]
+ */
+public val Lifecycle.coroutineScope: LifecycleCoroutineScope
+    get() {
+        while (true) {
+            val existing = internalScopeRef.get() as LifecycleCoroutineScopeImpl?
+            if (existing != null) {
+                return existing
+            }
+            val newScope = LifecycleCoroutineScopeImpl(
+                this,
+                SupervisorJob() + Dispatchers.Main.immediate
+            )
+            if (internalScopeRef.compareAndSet(null, newScope)) {
+                newScope.register()
+                return newScope
+            }
+        }
+    }
+
+/**
+ * [CoroutineScope] tied to a [Lifecycle] and
+ * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate]
+ *
+ * This scope will be cancelled when the [Lifecycle] is destroyed.
+ *
+ * This scope provides specialised versions of `launch`: [launchWhenCreated], [launchWhenStarted],
+ * [launchWhenResumed]
+ */
+public abstract class LifecycleCoroutineScope internal constructor() : CoroutineScope {
+    internal abstract val lifecycle: Lifecycle
+
+    /**
+     * Launches and runs the given block when the [Lifecycle] controlling this
+     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.CREATED] state.
+     *
+     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
+     *
+     * @see Lifecycle.whenCreated
+     * @see Lifecycle.coroutineScope
+     */
+    @Deprecated(
+        message = "launchWhenCreated is deprecated as it can lead to wasted resources " +
+            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
+            "the Lifecycle state is at least Lifecycle.State.CREATED."
+    )
+    @Suppress("DEPRECATION")
+    public fun launchWhenCreated(block: suspend CoroutineScope.() -> Unit): Job = launch {
+        lifecycle.whenCreated(block)
+    }
+
+    /**
+     * Launches and runs the given block when the [Lifecycle] controlling this
+     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.STARTED] state.
+     *
+     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
+     *
+     * @see Lifecycle.whenStarted
+     * @see Lifecycle.coroutineScope
+     */
+    @Deprecated(
+        message = "launchWhenStarted is deprecated as it can lead to wasted resources " +
+            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
+            "the Lifecycle state is at least Lifecycle.State.STARTED."
+    )
+    @Suppress("DEPRECATION")
+    public fun launchWhenStarted(block: suspend CoroutineScope.() -> Unit): Job = launch {
+        lifecycle.whenStarted(block)
+    }
+
+    /**
+     * Launches and runs the given block when the [Lifecycle] controlling this
+     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.RESUMED] state.
+     *
+     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
+     *
+     * @see Lifecycle.whenResumed
+     * @see Lifecycle.coroutineScope
+     */
+    @Deprecated(
+        message = "launchWhenResumed is deprecated as it can lead to wasted resources " +
+            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
+            "the Lifecycle state is at least Lifecycle.State.RESUMED."
+    )
+    @Suppress("DEPRECATION")
+    public fun launchWhenResumed(block: suspend CoroutineScope.() -> Unit): Job = launch {
+        lifecycle.whenResumed(block)
+    }
+}
+
+internal class LifecycleCoroutineScopeImpl(
+    override val lifecycle: Lifecycle,
+    override val coroutineContext: CoroutineContext
+) : LifecycleCoroutineScope(), LifecycleEventObserver {
+    init {
+        // in case we are initialized on a non-main thread, make a best effort check before
+        // we return the scope. This is not sync but if developer is launching on a non-main
+        // dispatcher, they cannot be 100% sure anyways.
+        if (lifecycle.currentState == Lifecycle.State.DESTROYED) {
+            coroutineContext.cancel()
+        }
+    }
+
+    fun register() {
+        launch(Dispatchers.Main.immediate) {
+            if (lifecycle.currentState >= Lifecycle.State.INITIALIZED) {
+                lifecycle.addObserver(this@LifecycleCoroutineScopeImpl)
+            } else {
+                coroutineContext.cancel()
+            }
+        }
+    }
+
+    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+        if (lifecycle.currentState <= Lifecycle.State.DESTROYED) {
+            lifecycle.removeObserver(this)
+            coroutineContext.cancel()
+        }
+    }
+}
diff --git a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleController.kt
similarity index 100%
rename from lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleController.kt
diff --git a/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.kt b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.kt
index cdc18d4..c8ddcb7 100644
--- a/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.kt
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.kt
@@ -15,6 +15,8 @@
  */
 package androidx.lifecycle
 
+import kotlinx.coroutines.CoroutineScope
+
 /**
  * A class that has an Android lifecycle. These events can be used by custom components to
  * handle lifecycle changes without implementing any code inside the Activity or the Fragment.
@@ -29,4 +31,15 @@
      * @return The lifecycle of the provider.
      */
     public val lifecycle: Lifecycle
-}
\ No newline at end of file
+}
+
+/**
+ * [CoroutineScope] tied to this [LifecycleOwner]'s [Lifecycle].
+ *
+ * This scope will be cancelled when the [Lifecycle] is destroyed.
+ *
+ * This scope is bound to
+ * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate].
+ */
+public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
+    get() = lifecycle.coroutineScope
\ No newline at end of file
diff --git a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/PausingDispatcher.kt
similarity index 100%
rename from lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/PausingDispatcher.kt
diff --git a/lifecycle/lifecycle-extensions/api/2.6.0-beta01.txt b/lifecycle/lifecycle-extensions/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..88798d8
--- /dev/null
+++ b/lifecycle/lifecycle-extensions/api/2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  @Deprecated public class ViewModelProviders {
+    ctor @Deprecated public ViewModelProviders();
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment, androidx.lifecycle.ViewModelProvider.Factory?);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity, androidx.lifecycle.ViewModelProvider.Factory?);
+  }
+
+  @Deprecated public static class ViewModelProviders.DefaultFactory extends androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory {
+    ctor @Deprecated public ViewModelProviders.DefaultFactory(android.app.Application);
+  }
+
+  @Deprecated public class ViewModelStores {
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.Fragment);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-extensions/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-extensions/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..88798d8
--- /dev/null
+++ b/lifecycle/lifecycle-extensions/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  @Deprecated public class ViewModelProviders {
+    ctor @Deprecated public ViewModelProviders();
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment, androidx.lifecycle.ViewModelProvider.Factory?);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity, androidx.lifecycle.ViewModelProvider.Factory?);
+  }
+
+  @Deprecated public static class ViewModelProviders.DefaultFactory extends androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory {
+    ctor @Deprecated public ViewModelProviders.DefaultFactory(android.app.Application);
+  }
+
+  @Deprecated public class ViewModelStores {
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.Fragment);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-extensions/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-extensions/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-extensions/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-extensions/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-extensions/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..88798d8
--- /dev/null
+++ b/lifecycle/lifecycle-extensions/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  @Deprecated public class ViewModelProviders {
+    ctor @Deprecated public ViewModelProviders();
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment, androidx.lifecycle.ViewModelProvider.Factory?);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity, androidx.lifecycle.ViewModelProvider.Factory?);
+  }
+
+  @Deprecated public static class ViewModelProviders.DefaultFactory extends androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory {
+    ctor @Deprecated public ViewModelProviders.DefaultFactory(android.app.Application);
+  }
+
+  @Deprecated public class ViewModelStores {
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.FragmentActivity);
+    method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.Fragment);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/OWNERS b/lifecycle/lifecycle-livedata-core-ktx-lint/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/LiveDataCoreIssueRegistry.kt b/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/LiveDataCoreIssueRegistry.kt
index b0aab4e..0b251e7 100644
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/LiveDataCoreIssueRegistry.kt
+++ b/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/LiveDataCoreIssueRegistry.kt
@@ -23,7 +23,7 @@
 @Suppress("UnstableApiUsage")
 class LiveDataCoreIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues get() = listOf(NonNullableMutableLiveDataDetector.ISSUE)
     override val vendor = Vendor(
         feedbackUrl = "https://issuetracker.google.com/issues/new?component=413132",
diff --git a/lifecycle/lifecycle-livedata-core-ktx/api/2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..daac648
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core-ktx/api/2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataKt {
+    method @Deprecated @MainThread public static inline <T> androidx.lifecycle.Observer<T> observe(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner owner, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onChanged);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core-ktx/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..daac648
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core-ktx/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataKt {
+    method @Deprecated @MainThread public static inline <T> androidx.lifecycle.Observer<T> observe(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner owner, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onChanged);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core-ktx/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..daac648
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataKt {
+    method @Deprecated @MainThread public static inline <T> androidx.lifecycle.Observer<T> observe(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner owner, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onChanged);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core-truth/OWNERS b/lifecycle/lifecycle-livedata-core-truth/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/lifecycle/lifecycle-livedata-core-truth/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
diff --git a/lifecycle/lifecycle-livedata-core/api/2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..f528b4e
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core/api/2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class LiveData<T> {
+    ctor public LiveData(T!);
+    ctor public LiveData();
+    method public T? getValue();
+    method public boolean hasActiveObservers();
+    method public boolean hasObservers();
+    method public boolean isInitialized();
+    method @MainThread public void observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void observeForever(androidx.lifecycle.Observer<? super T>);
+    method protected void onActive();
+    method protected void onInactive();
+    method protected void postValue(T!);
+    method @MainThread public void removeObserver(androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void removeObservers(androidx.lifecycle.LifecycleOwner);
+    method @MainThread protected void setValue(T!);
+  }
+
+  public class MutableLiveData<T> extends androidx.lifecycle.LiveData<T> {
+    ctor public MutableLiveData(T!);
+    ctor public MutableLiveData();
+    method public void postValue(T!);
+    method public void setValue(T!);
+  }
+
+  public fun interface Observer<T> {
+    method public void onChanged(T? value);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..f528b4e
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class LiveData<T> {
+    ctor public LiveData(T!);
+    ctor public LiveData();
+    method public T? getValue();
+    method public boolean hasActiveObservers();
+    method public boolean hasObservers();
+    method public boolean isInitialized();
+    method @MainThread public void observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void observeForever(androidx.lifecycle.Observer<? super T>);
+    method protected void onActive();
+    method protected void onInactive();
+    method protected void postValue(T!);
+    method @MainThread public void removeObserver(androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void removeObservers(androidx.lifecycle.LifecycleOwner);
+    method @MainThread protected void setValue(T!);
+  }
+
+  public class MutableLiveData<T> extends androidx.lifecycle.LiveData<T> {
+    ctor public MutableLiveData(T!);
+    ctor public MutableLiveData();
+    method public void postValue(T!);
+    method public void setValue(T!);
+  }
+
+  public fun interface Observer<T> {
+    method public void onChanged(T? value);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-core/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-livedata-core/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..f528b4e
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class LiveData<T> {
+    ctor public LiveData(T!);
+    ctor public LiveData();
+    method public T? getValue();
+    method public boolean hasActiveObservers();
+    method public boolean hasObservers();
+    method public boolean isInitialized();
+    method @MainThread public void observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void observeForever(androidx.lifecycle.Observer<? super T>);
+    method protected void onActive();
+    method protected void onInactive();
+    method protected void postValue(T!);
+    method @MainThread public void removeObserver(androidx.lifecycle.Observer<? super T>);
+    method @MainThread public void removeObservers(androidx.lifecycle.LifecycleOwner);
+    method @MainThread protected void setValue(T!);
+  }
+
+  public class MutableLiveData<T> extends androidx.lifecycle.LiveData<T> {
+    ctor public MutableLiveData(T!);
+    ctor public MutableLiveData();
+    method public void postValue(T!);
+    method public void setValue(T!);
+  }
+
+  public fun interface Observer<T> {
+    method public void onChanged(T? value);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-ktx/api/2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..bae0928
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-ktx/api/2.6.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class CoroutineLiveDataKt {
+    method public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public final class FlowLiveDataConversions {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> asFlow(androidx.lifecycle.LiveData<T>);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout);
+  }
+
+  public interface LiveDataScope<T> {
+    method public suspend Object? emit(T? value, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? emitSource(androidx.lifecycle.LiveData<T> source, kotlin.coroutines.Continuation<? super kotlinx.coroutines.DisposableHandle>);
+    method public T? getLatestValue();
+    property public abstract T? latestValue;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-ktx/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..bae0928
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-ktx/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class CoroutineLiveDataKt {
+    method public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public final class FlowLiveDataConversions {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> asFlow(androidx.lifecycle.LiveData<T>);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout);
+  }
+
+  public interface LiveDataScope<T> {
+    method public suspend Object? emit(T? value, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? emitSource(androidx.lifecycle.LiveData<T> source, kotlin.coroutines.Continuation<? super kotlinx.coroutines.DisposableHandle>);
+    method public T? getLatestValue();
+    property public abstract T? latestValue;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata-ktx/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-ktx/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-livedata-ktx/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..bae0928
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class CoroutineLiveDataKt {
+    method public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> liveData(optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+  public final class FlowLiveDataConversions {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> asFlow(androidx.lifecycle.LiveData<T>);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, optional long timeoutInMs);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static <T> androidx.lifecycle.LiveData<T> asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, optional kotlin.coroutines.CoroutineContext context, java.time.Duration timeout);
+  }
+
+  public interface LiveDataScope<T> {
+    method public suspend Object? emit(T? value, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public suspend Object? emitSource(androidx.lifecycle.LiveData<T> source, kotlin.coroutines.Continuation<? super kotlinx.coroutines.DisposableHandle>);
+    method public T? getLatestValue();
+    property public abstract T? latestValue;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata/api/2.6.0-beta01.txt b/lifecycle/lifecycle-livedata/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..9b1bf6c
--- /dev/null
+++ b/lifecycle/lifecycle-livedata/api/2.6.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
+    ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
+    method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
+    method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
+  }
+
+  public final class Transformations {
+    method @CheckResult @MainThread public static <X> androidx.lifecycle.LiveData<X> distinctUntilChanged(androidx.lifecycle.LiveData<X>);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,Y> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,Y> mapFunction);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,androidx.lifecycle.LiveData<Y>> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,androidx.lifecycle.LiveData<Y>> switchMapFunction);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..9b1bf6c
--- /dev/null
+++ b/lifecycle/lifecycle-livedata/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
+    ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
+    method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
+    method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
+  }
+
+  public final class Transformations {
+    method @CheckResult @MainThread public static <X> androidx.lifecycle.LiveData<X> distinctUntilChanged(androidx.lifecycle.LiveData<X>);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,Y> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,Y> mapFunction);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,androidx.lifecycle.LiveData<Y>> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,androidx.lifecycle.LiveData<Y>> switchMapFunction);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-livedata/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-livedata/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-livedata/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-livedata/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-livedata/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..bb61b39
--- /dev/null
+++ b/lifecycle/lifecycle-livedata/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ComputableLiveData<T> {
+    ctor public ComputableLiveData(optional java.util.concurrent.Executor executor);
+    ctor public ComputableLiveData();
+    method @WorkerThread protected abstract T! compute();
+    method public androidx.lifecycle.LiveData<T> getLiveData();
+    method public void invalidate();
+    property public androidx.lifecycle.LiveData<T> liveData;
+  }
+
+  public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
+    ctor public MediatorLiveData();
+    ctor public MediatorLiveData(T!);
+    method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S!>, androidx.lifecycle.Observer<? super S>);
+    method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S!>);
+  }
+
+  public final class Transformations {
+    method @CheckResult @MainThread public static <X> androidx.lifecycle.LiveData<X> distinctUntilChanged(androidx.lifecycle.LiveData<X>);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,Y> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,Y> mapFunction);
+    method @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<X,androidx.lifecycle.LiveData<Y>> transform);
+    method @Deprecated @CheckResult @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,androidx.lifecycle.LiveData<Y>> switchMapFunction);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-process/api/2.6.0-beta01.txt b/lifecycle/lifecycle-process/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..891c9c6
--- /dev/null
+++ b/lifecycle/lifecycle-process/api/2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ProcessLifecycleInitializer implements androidx.startup.Initializer<androidx.lifecycle.LifecycleOwner> {
+    ctor public ProcessLifecycleInitializer();
+    method public androidx.lifecycle.LifecycleOwner create(android.content.Context context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>> dependencies();
+  }
+
+  public final class ProcessLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner get();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    field public static final androidx.lifecycle.ProcessLifecycleOwner.Companion Companion;
+  }
+
+  public static final class ProcessLifecycleOwner.Companion {
+    method public androidx.lifecycle.LifecycleOwner get();
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-process/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-process/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..891c9c6
--- /dev/null
+++ b/lifecycle/lifecycle-process/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ProcessLifecycleInitializer implements androidx.startup.Initializer<androidx.lifecycle.LifecycleOwner> {
+    ctor public ProcessLifecycleInitializer();
+    method public androidx.lifecycle.LifecycleOwner create(android.content.Context context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>> dependencies();
+  }
+
+  public final class ProcessLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner get();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    field public static final androidx.lifecycle.ProcessLifecycleOwner.Companion Companion;
+  }
+
+  public static final class ProcessLifecycleOwner.Companion {
+    method public androidx.lifecycle.LifecycleOwner get();
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-process/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-process/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-process/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-process/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-process/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..891c9c6
--- /dev/null
+++ b/lifecycle/lifecycle-process/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ProcessLifecycleInitializer implements androidx.startup.Initializer<androidx.lifecycle.LifecycleOwner> {
+    ctor public ProcessLifecycleInitializer();
+    method public androidx.lifecycle.LifecycleOwner create(android.content.Context context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>> dependencies();
+  }
+
+  public final class ProcessLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner get();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+    field public static final androidx.lifecycle.ProcessLifecycleOwner.Companion Companion;
+  }
+
+  public static final class ProcessLifecycleOwner.Companion {
+    method public androidx.lifecycle.LifecycleOwner get();
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/api/2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams-ktx/api/2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams-ktx/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/lifecycle/lifecycle-reactivestreams/api/2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..138dd3e
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams/api/2.6.0-beta01.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataReactiveStreams {
+    method public static <T> androidx.lifecycle.LiveData<T> fromPublisher(org.reactivestreams.Publisher<T>);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LifecycleOwner lifecycle, androidx.lifecycle.LiveData<T> liveData);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner lifecycle);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-reactivestreams/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..138dd3e
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataReactiveStreams {
+    method public static <T> androidx.lifecycle.LiveData<T> fromPublisher(org.reactivestreams.Publisher<T>);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LifecycleOwner lifecycle, androidx.lifecycle.LiveData<T> liveData);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner lifecycle);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-reactivestreams/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-reactivestreams/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..138dd3e
--- /dev/null
+++ b/lifecycle/lifecycle-reactivestreams/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class LiveDataReactiveStreams {
+    method public static <T> androidx.lifecycle.LiveData<T> fromPublisher(org.reactivestreams.Publisher<T>);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LifecycleOwner lifecycle, androidx.lifecycle.LiveData<T> liveData);
+    method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner lifecycle);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-compose/api/2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-compose/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..c80fa83
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-compose/api/2.6.0-beta01.txt
@@ -0,0 +1,12 @@
+// Signature format: 4.0
+package androidx.lifecycle.compose {
+
+  public final class FlowExtKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..c80fa83
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-compose/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,12 @@
+// Signature format: 4.0
+package androidx.lifecycle.compose {
+
+  public final class FlowExtKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-compose/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-compose/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-compose/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-runtime-compose/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-compose/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..c80fa83
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-compose/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,12 @@
+// Signature format: 4.0
+package androidx.lifecycle.compose {
+
+  public final class FlowExtKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.StateFlow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, optional androidx.lifecycle.LifecycleOwner lifecycleOwner, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsStateWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, T? initialValue, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState, optional kotlin.coroutines.CoroutineContext context);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
index b655be5..ca0bb57 100644
--- a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
@@ -23,7 +23,7 @@
 @Suppress("UnstableApiUsage")
 class LifecycleRuntimeIssueRegistry : IssueRegistry() {
     // tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         LifecycleWhenChecks.ISSUE,
diff --git a/lifecycle/lifecycle-runtime-ktx/api/2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-ktx/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..2ee0d85
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class FlowExtKt {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
+  }
+
+  public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
+    ctor public LifecycleDestroyedException();
+  }
+
+  public final class RepeatOnLifecycleKt {
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class ViewKt {
+    method @Deprecated public static androidx.lifecycle.LifecycleOwner? findViewTreeLifecycleOwner(android.view.View);
+  }
+
+  public final class WithLifecycleStateKt {
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-ktx/api/current.ignore b/lifecycle/lifecycle-runtime-ktx/api/current.ignore
new file mode 100644
index 0000000..ca42321
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.lifecycle.LifecycleCoroutineScope:
+    Removed class androidx.lifecycle.LifecycleCoroutineScope
+RemovedClass: androidx.lifecycle.LifecycleKt:
+    Removed class androidx.lifecycle.LifecycleKt
+RemovedClass: androidx.lifecycle.LifecycleOwnerKt:
+    Removed class androidx.lifecycle.LifecycleOwnerKt
+RemovedClass: androidx.lifecycle.PausingDispatcherKt:
+    Removed class androidx.lifecycle.PausingDispatcherKt
diff --git a/lifecycle/lifecycle-runtime-ktx/api/current.txt b/lifecycle/lifecycle-runtime-ktx/api/current.txt
index 5314a73..2ee0d85 100644
--- a/lifecycle/lifecycle-runtime-ktx/api/current.txt
+++ b/lifecycle/lifecycle-runtime-ktx/api/current.txt
@@ -5,34 +5,10 @@
     method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
   }
 
-  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-  }
-
   public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
     ctor public LifecycleDestroyedException();
   }
 
-  public final class LifecycleKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
-  }
-
-  public final class LifecycleOwnerKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
-  }
-
-  public final class PausingDispatcherKt {
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-  }
-
   public final class RepeatOnLifecycleKt {
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
diff --git a/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..2ee0d85
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class FlowExtKt {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
+  }
+
+  public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
+    ctor public LifecycleDestroyedException();
+  }
+
+  public final class RepeatOnLifecycleKt {
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class ViewKt {
+    method @Deprecated public static androidx.lifecycle.LifecycleOwner? findViewTreeLifecycleOwner(android.view.View);
+  }
+
+  public final class WithLifecycleStateKt {
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_current.txt
index 5314a73..2ee0d85 100644
--- a/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-runtime-ktx/api/public_plus_experimental_current.txt
@@ -5,34 +5,10 @@
     method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
   }
 
-  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-  }
-
   public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
     ctor public LifecycleDestroyedException();
   }
 
-  public final class LifecycleKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
-  }
-
-  public final class LifecycleOwnerKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
-  }
-
-  public final class PausingDispatcherKt {
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-  }
-
   public final class RepeatOnLifecycleKt {
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
diff --git a/lifecycle/lifecycle-runtime-ktx/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-ktx/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-runtime-ktx/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..a998f6e
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class FlowExtKt {
+    method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
+  }
+
+  public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
+    ctor public LifecycleDestroyedException();
+  }
+
+  public final class RepeatOnLifecycleKt {
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+  }
+
+  public final class ViewKt {
+    method @Deprecated public static androidx.lifecycle.LifecycleOwner? findViewTreeLifecycleOwner(android.view.View);
+  }
+
+  public final class WithLifecycleStateKt {
+    method @kotlin.PublishedApi internal static suspend <R> Object? suspendWithStateAtLeastUnchecked(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, boolean dispatchNeeded, kotlinx.coroutines.CoroutineDispatcher lifecycleDispatcher, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend inline <R> Object? withStateAtLeast(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+    method @kotlin.PublishedApi internal static suspend inline <R> Object? withStateAtLeastUnchecked(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function0<? extends R> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-ktx/api/restricted_current.ignore b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.ignore
new file mode 100644
index 0000000..ca42321
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.lifecycle.LifecycleCoroutineScope:
+    Removed class androidx.lifecycle.LifecycleCoroutineScope
+RemovedClass: androidx.lifecycle.LifecycleKt:
+    Removed class androidx.lifecycle.LifecycleKt
+RemovedClass: androidx.lifecycle.LifecycleOwnerKt:
+    Removed class androidx.lifecycle.LifecycleOwnerKt
+RemovedClass: androidx.lifecycle.PausingDispatcherKt:
+    Removed class androidx.lifecycle.PausingDispatcherKt
diff --git a/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
index e76786a..a998f6e 100644
--- a/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
+++ b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
@@ -5,34 +5,10 @@
     method public static <T> kotlinx.coroutines.flow.Flow<T> flowWithLifecycle(kotlinx.coroutines.flow.Flow<? extends T>, androidx.lifecycle.Lifecycle lifecycle, optional androidx.lifecycle.Lifecycle.State minActiveState);
   }
 
-  public abstract class LifecycleCoroutineScope implements kotlinx.coroutines.CoroutineScope {
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenCreated(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenResumed(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-    method @Deprecated public final kotlinx.coroutines.Job launchWhenStarted(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
-  }
-
   public final class LifecycleDestroyedException extends java.util.concurrent.CancellationException {
     ctor public LifecycleDestroyedException();
   }
 
-  public final class LifecycleKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getCoroutineScope(androidx.lifecycle.Lifecycle);
-  }
-
-  public final class LifecycleOwnerKt {
-    method public static androidx.lifecycle.LifecycleCoroutineScope getLifecycleScope(androidx.lifecycle.LifecycleOwner);
-  }
-
-  public final class PausingDispatcherKt {
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenCreated(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenResumed(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.LifecycleOwner, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStarted(androidx.lifecycle.Lifecycle, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-    method @Deprecated public static suspend <T> Object? whenStateAtLeast(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State minState, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
-  }
-
   public final class RepeatOnLifecycleKt {
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.Lifecycle, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public static suspend Object? repeatOnLifecycle(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State state, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
diff --git a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
deleted file mode 100644
index dc00740..0000000
--- a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
+++ /dev/null
@@ -1,114 +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.lifecycle
-
-import android.annotation.SuppressLint
-import androidx.annotation.AnyThread
-import androidx.annotation.MainThread
-import kotlinx.coroutines.Dispatchers
-import java.util.ArrayDeque
-import java.util.Queue
-import kotlin.coroutines.CoroutineContext
-
-/**
- * Helper class for [PausingDispatcher] that tracks runnables which are enqueued to the dispatcher
- * and also calls back the [PausingDispatcher] when the runnable should run.
- */
-internal class DispatchQueue {
-    // handler thread
-    private var paused: Boolean = true
-    // handler thread
-    private var finished: Boolean = false
-    private var isDraining: Boolean = false
-
-    private val queue: Queue<Runnable> = ArrayDeque<Runnable>()
-
-    @MainThread
-    fun pause() {
-        paused = true
-    }
-
-    @MainThread
-    fun resume() {
-        if (!paused) {
-            return
-        }
-        check(!finished) {
-            "Cannot resume a finished dispatcher"
-        }
-        paused = false
-        drainQueue()
-    }
-
-    @MainThread
-    fun finish() {
-        finished = true
-        drainQueue()
-    }
-
-    @MainThread
-    fun drainQueue() {
-        if (isDraining) {
-            // Block re-entrant calls to avoid deep stacks
-            return
-        }
-        try {
-            isDraining = true
-            while (queue.isNotEmpty()) {
-                if (!canRun()) {
-                    break
-                }
-                queue.poll()?.run()
-            }
-        } finally {
-            isDraining = false
-        }
-    }
-
-    @MainThread
-    fun canRun() = finished || !paused
-
-    @AnyThread
-    @SuppressLint("WrongThread") // false negative, we are checking the thread
-    fun dispatchAndEnqueue(context: CoroutineContext, runnable: Runnable) {
-        with(Dispatchers.Main.immediate) {
-            // This check is here to handle a special but important case. If for example
-            // launchWhenCreated is used while not created it's expected that it will run
-            // synchronously when the lifecycle is created. If we called `dispatch` here
-            // it launches made before the required state is reached would always be deferred
-            // which is not the intended behavior.
-            //
-            // This means that calling `yield()` while paused and then receiving `resume` right
-            // after leads to the runnable being run immediately but that is indeed intended.
-            // This could be solved by implementing `dispatchYield` in the dispatcher but it's
-            // marked as internal API.
-            if (isDispatchNeeded(context) || canRun()) {
-                dispatch(context, Runnable { enqueue(runnable) })
-            } else {
-                enqueue(runnable)
-            }
-        }
-    }
-
-    @MainThread
-    private fun enqueue(runnable: Runnable) {
-        check(queue.offer(runnable)) {
-            "cannot enqueue any more runnables"
-        }
-        drainQueue()
-    }
-}
diff --git a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
deleted file mode 100644
index f69b39e..0000000
--- a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
+++ /dev/null
@@ -1,152 +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.lifecycle
-
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-import kotlin.coroutines.CoroutineContext
-
-/**
- * [CoroutineScope] tied to this [Lifecycle].
- *
- * This scope will be cancelled when the [Lifecycle] is destroyed.
- *
- * This scope is bound to
- * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate]
- */
-public val Lifecycle.coroutineScope: LifecycleCoroutineScope
-    get() {
-        while (true) {
-            val existing = internalScopeRef.get() as LifecycleCoroutineScopeImpl?
-            if (existing != null) {
-                return existing
-            }
-            val newScope = LifecycleCoroutineScopeImpl(
-                this,
-                SupervisorJob() + Dispatchers.Main.immediate
-            )
-            if (internalScopeRef.compareAndSet(null, newScope)) {
-                newScope.register()
-                return newScope
-            }
-        }
-    }
-
-/**
- * [CoroutineScope] tied to a [Lifecycle] and
- * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate]
- *
- * This scope will be cancelled when the [Lifecycle] is destroyed.
- *
- * This scope provides specialised versions of `launch`: [launchWhenCreated], [launchWhenStarted],
- * [launchWhenResumed]
- */
-public abstract class LifecycleCoroutineScope internal constructor() : CoroutineScope {
-    internal abstract val lifecycle: Lifecycle
-
-    /**
-     * Launches and runs the given block when the [Lifecycle] controlling this
-     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.CREATED] state.
-     *
-     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
-     *
-     * @see Lifecycle.whenCreated
-     * @see Lifecycle.coroutineScope
-     */
-    @Deprecated(
-        message = "launchWhenCreated is deprecated as it can lead to wasted resources " +
-            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
-            "the Lifecycle state is at least Lifecycle.State.CREATED."
-    )
-    @Suppress("DEPRECATION")
-    public fun launchWhenCreated(block: suspend CoroutineScope.() -> Unit): Job = launch {
-        lifecycle.whenCreated(block)
-    }
-
-    /**
-     * Launches and runs the given block when the [Lifecycle] controlling this
-     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.STARTED] state.
-     *
-     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
-     *
-     * @see Lifecycle.whenStarted
-     * @see Lifecycle.coroutineScope
-     */
-    @Deprecated(
-        message = "launchWhenStarted is deprecated as it can lead to wasted resources " +
-            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
-            "the Lifecycle state is at least Lifecycle.State.STARTED."
-    )
-    @Suppress("DEPRECATION")
-    public fun launchWhenStarted(block: suspend CoroutineScope.() -> Unit): Job = launch {
-        lifecycle.whenStarted(block)
-    }
-
-    /**
-     * Launches and runs the given block when the [Lifecycle] controlling this
-     * [LifecycleCoroutineScope] is at least in [Lifecycle.State.RESUMED] state.
-     *
-     * The returned [Job] will be cancelled when the [Lifecycle] is destroyed.
-     *
-     * @see Lifecycle.whenResumed
-     * @see Lifecycle.coroutineScope
-     */
-    @Deprecated(
-        message = "launchWhenResumed is deprecated as it can lead to wasted resources " +
-            "in some cases. Replace with suspending repeatOnLifecycle to run the block whenever " +
-            "the Lifecycle state is at least Lifecycle.State.RESUMED."
-    )
-    @Suppress("DEPRECATION")
-    public fun launchWhenResumed(block: suspend CoroutineScope.() -> Unit): Job = launch {
-        lifecycle.whenResumed(block)
-    }
-}
-
-internal class LifecycleCoroutineScopeImpl(
-    override val lifecycle: Lifecycle,
-    override val coroutineContext: CoroutineContext
-) : LifecycleCoroutineScope(), LifecycleEventObserver {
-    init {
-        // in case we are initialized on a non-main thread, make a best effort check before
-        // we return the scope. This is not sync but if developer is launching on a non-main
-        // dispatcher, they cannot be 100% sure anyways.
-        if (lifecycle.currentState == Lifecycle.State.DESTROYED) {
-            coroutineContext.cancel()
-        }
-    }
-
-    fun register() {
-        launch(Dispatchers.Main.immediate) {
-            if (lifecycle.currentState >= Lifecycle.State.INITIALIZED) {
-                lifecycle.addObserver(this@LifecycleCoroutineScopeImpl)
-            } else {
-                coroutineContext.cancel()
-            }
-        }
-    }
-
-    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
-        if (lifecycle.currentState <= Lifecycle.State.DESTROYED) {
-            lifecycle.removeObserver(this)
-            coroutineContext.cancel()
-        }
-    }
-}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
deleted file mode 100644
index 8578f4d..0000000
--- a/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.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.lifecycle
-
-import kotlinx.coroutines.CoroutineScope
-
-/**
- * [CoroutineScope] tied to this [LifecycleOwner]'s [Lifecycle].
- *
- * This scope will be cancelled when the [Lifecycle] is destroyed.
- *
- * This scope is bound to
- * [Dispatchers.Main.immediate][kotlinx.coroutines.MainCoroutineDispatcher.immediate].
- */
-public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
-    get() = lifecycle.coroutineScope
diff --git a/lifecycle/lifecycle-runtime-testing/api/2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-testing/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..47a819e
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-testing/api/2.6.0-beta01.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.lifecycle.testing {
+
+  public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public androidx.lifecycle.LifecycleRegistry getLifecycle();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public final androidx.lifecycle.Lifecycle.State currentState;
+    property public androidx.lifecycle.LifecycleRegistry lifecycle;
+    property public final int observerCount;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..47a819e
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.lifecycle.testing {
+
+  public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public androidx.lifecycle.LifecycleRegistry getLifecycle();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public final androidx.lifecycle.Lifecycle.State currentState;
+    property public androidx.lifecycle.LifecycleRegistry lifecycle;
+    property public final int observerCount;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime-testing/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-testing/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-testing/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-runtime-testing/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime-testing/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..47a819e
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-testing/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.lifecycle.testing {
+
+  public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public androidx.lifecycle.LifecycleRegistry getLifecycle();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public final androidx.lifecycle.Lifecycle.State currentState;
+    property public androidx.lifecycle.LifecycleRegistry lifecycle;
+    property public final int observerCount;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime/api/2.6.0-beta01.txt b/lifecycle/lifecycle-runtime/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..e72bd60
--- /dev/null
+++ b/lifecycle/lifecycle-runtime/api/2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleRegistry extends androidx.lifecycle.Lifecycle {
+    ctor public LifecycleRegistry(androidx.lifecycle.LifecycleOwner provider);
+    method public void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @VisibleForTesting public static final androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method @Deprecated @MainThread public void markState(androidx.lifecycle.Lifecycle.State state);
+    method public void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public androidx.lifecycle.Lifecycle.State currentState;
+    property public int observerCount;
+    field public static final androidx.lifecycle.LifecycleRegistry.Companion Companion;
+  }
+
+  public static final class LifecycleRegistry.Companion {
+    method @VisibleForTesting public androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  @Deprecated public interface LifecycleRegistryOwner extends androidx.lifecycle.LifecycleOwner {
+    method @Deprecated public androidx.lifecycle.LifecycleRegistry getLifecycle();
+  }
+
+  public final class ViewTreeLifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.LifecycleOwner? lifecycleOwner);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..e72bd60
--- /dev/null
+++ b/lifecycle/lifecycle-runtime/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleRegistry extends androidx.lifecycle.Lifecycle {
+    ctor public LifecycleRegistry(androidx.lifecycle.LifecycleOwner provider);
+    method public void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @VisibleForTesting public static final androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method @Deprecated @MainThread public void markState(androidx.lifecycle.Lifecycle.State state);
+    method public void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public androidx.lifecycle.Lifecycle.State currentState;
+    property public int observerCount;
+    field public static final androidx.lifecycle.LifecycleRegistry.Companion Companion;
+  }
+
+  public static final class LifecycleRegistry.Companion {
+    method @VisibleForTesting public androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  @Deprecated public interface LifecycleRegistryOwner extends androidx.lifecycle.LifecycleOwner {
+    method @Deprecated public androidx.lifecycle.LifecycleRegistry getLifecycle();
+  }
+
+  public final class ViewTreeLifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.LifecycleOwner? lifecycleOwner);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-runtime/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-runtime/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-runtime/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-runtime/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..704cdb4
--- /dev/null
+++ b/lifecycle/lifecycle-runtime/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleRegistry extends androidx.lifecycle.Lifecycle {
+    ctor public LifecycleRegistry(androidx.lifecycle.LifecycleOwner provider);
+    method public void addObserver(androidx.lifecycle.LifecycleObserver observer);
+    method @VisibleForTesting public static final androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+    method public androidx.lifecycle.Lifecycle.State getCurrentState();
+    method public int getObserverCount();
+    method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method @Deprecated @MainThread public void markState(androidx.lifecycle.Lifecycle.State state);
+    method public void removeObserver(androidx.lifecycle.LifecycleObserver observer);
+    method public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+    property public androidx.lifecycle.Lifecycle.State currentState;
+    property public int observerCount;
+    field public static final androidx.lifecycle.LifecycleRegistry.Companion Companion;
+  }
+
+  public static final class LifecycleRegistry.Companion {
+    method @VisibleForTesting public androidx.lifecycle.LifecycleRegistry createUnsafe(androidx.lifecycle.LifecycleOwner owner);
+  }
+
+  @Deprecated public interface LifecycleRegistryOwner extends androidx.lifecycle.LifecycleOwner {
+    method @Deprecated public androidx.lifecycle.LifecycleRegistry getLifecycle();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ReportFragment extends android.app.Fragment {
+    ctor public ReportFragment();
+    method public static final androidx.lifecycle.ReportFragment get(android.app.Activity);
+    method public static final void injectIfNeededIn(android.app.Activity activity);
+    method public void onActivityCreated(android.os.Bundle? savedInstanceState);
+    method public void onDestroy();
+    method public void onPause();
+    method public void onResume();
+    method public void onStart();
+    method public void onStop();
+    method public final void setProcessListener(androidx.lifecycle.ReportFragment.ActivityInitializationListener? processListener);
+    field public static final androidx.lifecycle.ReportFragment.Companion Companion;
+  }
+
+  public static interface ReportFragment.ActivityInitializationListener {
+    method public void onCreate();
+    method public void onResume();
+    method public void onStart();
+  }
+
+  public static final class ReportFragment.Companion {
+    method public androidx.lifecycle.ReportFragment get(android.app.Activity);
+    method public void injectIfNeededIn(android.app.Activity activity);
+  }
+
+  public final class ViewTreeLifecycleOwner {
+    method public static androidx.lifecycle.LifecycleOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.LifecycleOwner? lifecycleOwner);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index ccdd9ae..1f23cf2 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -17,10 +17,10 @@
     api(libs.kotlinStdlib)
     api(project(":lifecycle:lifecycle-common"))
 
-    api(projectOrArtifact(":arch:core:core-common"))
+    api("androidx.arch.core:core-common:2.2.0-rc01")
     // necessary for IJ to resolve dependencies.
     api("androidx.annotation:annotation:1.1.0")
-    implementation(projectOrArtifact(":arch:core:core-runtime"))
+    implementation("androidx.arch.core:core-runtime:2.2.0-rc01")
 
     testImplementation(libs.junit)
     testImplementation(libs.mockitoCore4)
diff --git a/lifecycle/lifecycle-service/api/2.6.0-beta01.txt b/lifecycle/lifecycle-service/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..bebcd93
--- /dev/null
+++ b/lifecycle/lifecycle-service/api/2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleService extends android.app.Service implements androidx.lifecycle.LifecycleOwner {
+    ctor public LifecycleService();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @CallSuper public android.os.IBinder? onBind(android.content.Intent intent);
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public class ServiceLifecycleDispatcher {
+    ctor public ServiceLifecycleDispatcher(androidx.lifecycle.LifecycleOwner provider);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onServicePreSuperOnBind();
+    method public void onServicePreSuperOnCreate();
+    method public void onServicePreSuperOnDestroy();
+    method public void onServicePreSuperOnStart();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-service/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-service/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..bebcd93
--- /dev/null
+++ b/lifecycle/lifecycle-service/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleService extends android.app.Service implements androidx.lifecycle.LifecycleOwner {
+    ctor public LifecycleService();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @CallSuper public android.os.IBinder? onBind(android.content.Intent intent);
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public class ServiceLifecycleDispatcher {
+    ctor public ServiceLifecycleDispatcher(androidx.lifecycle.LifecycleOwner provider);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onServicePreSuperOnBind();
+    method public void onServicePreSuperOnCreate();
+    method public void onServicePreSuperOnDestroy();
+    method public void onServicePreSuperOnStart();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-service/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-service/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-service/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-service/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-service/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..bebcd93
--- /dev/null
+++ b/lifecycle/lifecycle-service/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class LifecycleService extends android.app.Service implements androidx.lifecycle.LifecycleOwner {
+    ctor public LifecycleService();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @CallSuper public android.os.IBinder? onBind(android.content.Intent intent);
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+  public class ServiceLifecycleDispatcher {
+    ctor public ServiceLifecycleDispatcher(androidx.lifecycle.LifecycleOwner provider);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onServicePreSuperOnBind();
+    method public void onServicePreSuperOnCreate();
+    method public void onServicePreSuperOnDestroy();
+    method public void onServicePreSuperOnStart();
+    property public androidx.lifecycle.Lifecycle lifecycle;
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..33d89fc
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/2.6.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.lifecycle.viewmodel.compose {
+
+  public final class LocalViewModelStoreOwner {
+    method @androidx.compose.runtime.Composable public androidx.lifecycle.ViewModelStoreOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.lifecycle.ViewModelStoreOwner> provides(androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
+    property @androidx.compose.runtime.Composable public final androidx.lifecycle.ViewModelStoreOwner? current;
+    field public static final androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner INSTANCE;
+  }
+
+  public final class ViewModelKt {
+    method @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/current.ignore b/lifecycle/lifecycle-viewmodel-compose/api/current.ignore
new file mode 100644
index 0000000..0a5b8ff
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.lifecycle.viewmodel.compose.SavedStateHandleSaverKt:
+    Removed class androidx.lifecycle.viewmodel.compose.SavedStateHandleSaverKt
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/current.txt b/lifecycle/lifecycle-viewmodel-compose/api/current.txt
index 05b6910..33d89fc 100644
--- a/lifecycle/lifecycle-viewmodel-compose/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel-compose/api/current.txt
@@ -8,9 +8,6 @@
     field public static final androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner INSTANCE;
   }
 
-  public final class SavedStateHandleSaverKt {
-  }
-
   public final class ViewModelKt {
     method @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
     method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..188b922
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,30 @@
+// Signature format: 4.0
+package androidx.lifecycle.viewmodel.compose {
+
+  public final class LocalViewModelStoreOwner {
+    method @androidx.compose.runtime.Composable public androidx.lifecycle.ViewModelStoreOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.lifecycle.ViewModelStoreOwner> provides(androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
+    property @androidx.compose.runtime.Composable public final androidx.lifecycle.ViewModelStoreOwner? current;
+    field public static final androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner INSTANCE;
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level.WARNING) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface SavedStateHandleSaveableApi {
+  }
+
+  public final class SavedStateHandleSaverKt {
+    method @androidx.lifecycle.viewmodel.compose.SavedStateHandleSaveableApi public static <T> T saveable(androidx.lifecycle.SavedStateHandle, String key, optional androidx.compose.runtime.saveable.Saver<T,?> saver, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.lifecycle.viewmodel.compose.SavedStateHandleSaveableApi public static <T> androidx.compose.runtime.MutableState<T> saveable(androidx.lifecycle.SavedStateHandle, String key, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+    method @androidx.lifecycle.viewmodel.compose.SavedStateHandleSaveableApi public static <T> kotlin.properties.PropertyDelegateProvider<java.lang.Object,kotlin.properties.ReadOnlyProperty<java.lang.Object,T>> saveable(androidx.lifecycle.SavedStateHandle, optional androidx.compose.runtime.saveable.Saver<T,?> saver, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.lifecycle.viewmodel.compose.SavedStateHandleSaveableApi public static <T, M extends androidx.compose.runtime.MutableState<T>> kotlin.properties.PropertyDelegateProvider<java.lang.Object,kotlin.properties.ReadWriteProperty<java.lang.Object,T>> saveableMutableState(androidx.lifecycle.SavedStateHandle, optional androidx.compose.runtime.saveable.Saver<T,?> stateSaver, kotlin.jvm.functions.Function0<? extends M> init);
+  }
+
+  public final class ViewModelKt {
+    method @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..33d89fc
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.lifecycle.viewmodel.compose {
+
+  public final class LocalViewModelStoreOwner {
+    method @androidx.compose.runtime.Composable public androidx.lifecycle.ViewModelStoreOwner? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.lifecycle.ViewModelStoreOwner> provides(androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
+    property @androidx.compose.runtime.Composable public final androidx.lifecycle.ViewModelStoreOwner? current;
+    field public static final androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner INSTANCE;
+  }
+
+  public final class ViewModelKt {
+    method @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
+    method @Deprecated @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.ignore b/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.ignore
new file mode 100644
index 0000000..0a5b8ff
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.lifecycle.viewmodel.compose.SavedStateHandleSaverKt:
+    Removed class androidx.lifecycle.viewmodel.compose.SavedStateHandleSaverKt
diff --git a/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.txt
index 05b6910..33d89fc 100644
--- a/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel-compose/api/restricted_current.txt
@@ -8,9 +8,6 @@
     field public static final androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner INSTANCE;
   }
 
-  public final class SavedStateHandleSaverKt {
-  }
-
   public final class ViewModelKt {
     method @androidx.compose.runtime.Composable public static <VM extends androidx.lifecycle.ViewModel> VM viewModel(Class<VM> modelClass, optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory, optional androidx.lifecycle.viewmodel.CreationExtras extras);
     method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM viewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner, optional String? key, optional androidx.lifecycle.ViewModelProvider.Factory? factory);
diff --git a/lifecycle/lifecycle-viewmodel-ktx/api/2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..1d1d247
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-ktx/api/2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ViewModelKt {
+    method public static kotlinx.coroutines.CoroutineScope getViewModelScope(androidx.lifecycle.ViewModel);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-ktx/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..1d1d247
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-ktx/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ViewModelKt {
+    method public static kotlinx.coroutines.CoroutineScope getViewModelScope(androidx.lifecycle.ViewModel);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-ktx/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..1d1d247
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public final class ViewModelKt {
+    method public static kotlinx.coroutines.CoroutineScope getViewModelScope(androidx.lifecycle.ViewModel);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..c030c8a
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/2.6.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
+    ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method protected abstract <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass, androidx.lifecycle.SavedStateHandle handle);
+  }
+
+  public final class SavedStateHandle {
+    ctor public SavedStateHandle(java.util.Map<java.lang.String,?> initialState);
+    ctor public SavedStateHandle();
+    method @MainThread public void clearSavedStateProvider(String key);
+    method @MainThread public operator boolean contains(String key);
+    method @MainThread public operator <T> T? get(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key, T? initialValue);
+    method @MainThread public <T> kotlinx.coroutines.flow.StateFlow<T> getStateFlow(String key, T? initialValue);
+    method @MainThread public java.util.Set<java.lang.String> keys();
+    method @MainThread public <T> T? remove(String key);
+    method @MainThread public operator <T> void set(String key, T? value);
+    method @MainThread public void setSavedStateProvider(String key, androidx.savedstate.SavedStateRegistry.SavedStateProvider provider);
+    field public static final androidx.lifecycle.SavedStateHandle.Companion Companion;
+  }
+
+  public static final class SavedStateHandle.Companion {
+  }
+
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
+  public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner);
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method public <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..c030c8a
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
+    ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method protected abstract <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass, androidx.lifecycle.SavedStateHandle handle);
+  }
+
+  public final class SavedStateHandle {
+    ctor public SavedStateHandle(java.util.Map<java.lang.String,?> initialState);
+    ctor public SavedStateHandle();
+    method @MainThread public void clearSavedStateProvider(String key);
+    method @MainThread public operator boolean contains(String key);
+    method @MainThread public operator <T> T? get(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key, T? initialValue);
+    method @MainThread public <T> kotlinx.coroutines.flow.StateFlow<T> getStateFlow(String key, T? initialValue);
+    method @MainThread public java.util.Set<java.lang.String> keys();
+    method @MainThread public <T> T? remove(String key);
+    method @MainThread public operator <T> void set(String key, T? value);
+    method @MainThread public void setSavedStateProvider(String key, androidx.savedstate.SavedStateRegistry.SavedStateProvider provider);
+    field public static final androidx.lifecycle.SavedStateHandle.Companion Companion;
+  }
+
+  public static final class SavedStateHandle.Companion {
+  }
+
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
+  public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner);
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method public <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..c030c8a
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
+    ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method protected abstract <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass, androidx.lifecycle.SavedStateHandle handle);
+  }
+
+  public final class SavedStateHandle {
+    ctor public SavedStateHandle(java.util.Map<java.lang.String,?> initialState);
+    ctor public SavedStateHandle();
+    method @MainThread public void clearSavedStateProvider(String key);
+    method @MainThread public operator boolean contains(String key);
+    method @MainThread public operator <T> T? get(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key);
+    method @MainThread public <T> androidx.lifecycle.MutableLiveData<T> getLiveData(String key, T? initialValue);
+    method @MainThread public <T> kotlinx.coroutines.flow.StateFlow<T> getStateFlow(String key, T? initialValue);
+    method @MainThread public java.util.Set<java.lang.String> keys();
+    method @MainThread public <T> T? remove(String key);
+    method @MainThread public operator <T> void set(String key, T? value);
+    method @MainThread public void setSavedStateProvider(String key, androidx.savedstate.SavedStateRegistry.SavedStateProvider provider);
+    field public static final androidx.lifecycle.SavedStateHandle.Companion Companion;
+  }
+
+  public static final class SavedStateHandle.Companion {
+  }
+
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
+  public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner);
+    ctor public SavedStateViewModelFactory(android.app.Application? application, androidx.savedstate.SavedStateRegistryOwner owner, android.os.Bundle? defaultArgs);
+    method public <T extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/api/2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/2.6.0-beta01.txt
new file mode 100644
index 0000000..f8457f6
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/api/2.6.0-beta01.txt
@@ -0,0 +1,136 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class AndroidViewModel extends androidx.lifecycle.ViewModel {
+    ctor public AndroidViewModel(android.app.Application application);
+    method public <T extends android.app.Application> T getApplication();
+  }
+
+  public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    property public default androidx.lifecycle.viewmodel.CreationExtras defaultViewModelCreationExtras;
+    property public abstract androidx.lifecycle.ViewModelProvider.Factory defaultViewModelProviderFactory;
+  }
+
+  public abstract class ViewModel {
+    ctor public ViewModel();
+    ctor public ViewModel(java.io.Closeable!...);
+    method public void addCloseable(java.io.Closeable);
+    method protected void onCleared();
+  }
+
+  public final class ViewModelLazy<VM extends androidx.lifecycle.ViewModel> implements kotlin.Lazy<VM> {
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras> extrasProducer);
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer);
+    method public VM getValue();
+    method public boolean isInitialized();
+    property public VM value;
+  }
+
+  public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> modelClass);
+  }
+
+  public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
+    ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
+    method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
+    field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.AndroidViewModelFactory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+  }
+
+  public static interface ViewModelProvider.Factory {
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
+    method public default static androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+    field public static final androidx.lifecycle.ViewModelProvider.Factory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.Factory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+  }
+
+  public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public ViewModelProvider.NewInstanceFactory();
+    field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
+  }
+
+  public static final class ViewModelProvider.NewInstanceFactory.Companion {
+  }
+
+  public final class ViewModelProviderGetKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> VM get(androidx.lifecycle.ViewModelProvider);
+  }
+
+  public class ViewModelStore {
+    ctor public ViewModelStore();
+    method public final void clear();
+  }
+
+  public interface ViewModelStoreOwner {
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public abstract androidx.lifecycle.ViewModelStore viewModelStore;
+  }
+
+  public final class ViewTreeViewModelKt {
+    method @Deprecated public static androidx.lifecycle.ViewModelStoreOwner? findViewTreeViewModelStoreOwner(android.view.View view);
+  }
+
+  public final class ViewTreeViewModelStoreOwner {
+    method public static androidx.lifecycle.ViewModelStoreOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.ViewModelStoreOwner? viewModelStoreOwner);
+  }
+
+}
+
+package androidx.lifecycle.viewmodel {
+
+  public abstract class CreationExtras {
+    method public abstract operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+  }
+
+  public static final class CreationExtras.Empty extends androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
+  public static interface CreationExtras.Key<T> {
+  }
+
+  @androidx.lifecycle.viewmodel.ViewModelFactoryDsl public final class InitializerViewModelFactoryBuilder {
+    ctor public InitializerViewModelFactoryBuilder();
+    method public <T extends androidx.lifecycle.ViewModel> void addInitializer(kotlin.reflect.KClass<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+    method public androidx.lifecycle.ViewModelProvider.Factory build();
+  }
+
+  public final class InitializerViewModelFactoryKt {
+    method public static inline <reified VM extends androidx.lifecycle.ViewModel> void initializer(androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+    method public static inline androidx.lifecycle.ViewModelProvider.Factory viewModelFactory(kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder,kotlin.Unit> builder);
+  }
+
+  public final class MutableCreationExtras extends androidx.lifecycle.viewmodel.CreationExtras {
+    ctor public MutableCreationExtras(optional androidx.lifecycle.viewmodel.CreationExtras initialExtras);
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+  }
+
+  @kotlin.DslMarker public @interface ViewModelFactoryDsl {
+  }
+
+  public final class ViewModelInitializer<T extends androidx.lifecycle.ViewModel> {
+    ctor public ViewModelInitializer(Class<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_2.6.0-beta01.txt
new file mode 100644
index 0000000..f8457f6
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_2.6.0-beta01.txt
@@ -0,0 +1,136 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class AndroidViewModel extends androidx.lifecycle.ViewModel {
+    ctor public AndroidViewModel(android.app.Application application);
+    method public <T extends android.app.Application> T getApplication();
+  }
+
+  public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    property public default androidx.lifecycle.viewmodel.CreationExtras defaultViewModelCreationExtras;
+    property public abstract androidx.lifecycle.ViewModelProvider.Factory defaultViewModelProviderFactory;
+  }
+
+  public abstract class ViewModel {
+    ctor public ViewModel();
+    ctor public ViewModel(java.io.Closeable!...);
+    method public void addCloseable(java.io.Closeable);
+    method protected void onCleared();
+  }
+
+  public final class ViewModelLazy<VM extends androidx.lifecycle.ViewModel> implements kotlin.Lazy<VM> {
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras> extrasProducer);
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer);
+    method public VM getValue();
+    method public boolean isInitialized();
+    property public VM value;
+  }
+
+  public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> modelClass);
+  }
+
+  public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
+    ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
+    method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
+    field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.AndroidViewModelFactory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+  }
+
+  public static interface ViewModelProvider.Factory {
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
+    method public default static androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+    field public static final androidx.lifecycle.ViewModelProvider.Factory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.Factory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+  }
+
+  public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public ViewModelProvider.NewInstanceFactory();
+    field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
+  }
+
+  public static final class ViewModelProvider.NewInstanceFactory.Companion {
+  }
+
+  public final class ViewModelProviderGetKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> VM get(androidx.lifecycle.ViewModelProvider);
+  }
+
+  public class ViewModelStore {
+    ctor public ViewModelStore();
+    method public final void clear();
+  }
+
+  public interface ViewModelStoreOwner {
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public abstract androidx.lifecycle.ViewModelStore viewModelStore;
+  }
+
+  public final class ViewTreeViewModelKt {
+    method @Deprecated public static androidx.lifecycle.ViewModelStoreOwner? findViewTreeViewModelStoreOwner(android.view.View view);
+  }
+
+  public final class ViewTreeViewModelStoreOwner {
+    method public static androidx.lifecycle.ViewModelStoreOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.ViewModelStoreOwner? viewModelStoreOwner);
+  }
+
+}
+
+package androidx.lifecycle.viewmodel {
+
+  public abstract class CreationExtras {
+    method public abstract operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+  }
+
+  public static final class CreationExtras.Empty extends androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
+  public static interface CreationExtras.Key<T> {
+  }
+
+  @androidx.lifecycle.viewmodel.ViewModelFactoryDsl public final class InitializerViewModelFactoryBuilder {
+    ctor public InitializerViewModelFactoryBuilder();
+    method public <T extends androidx.lifecycle.ViewModel> void addInitializer(kotlin.reflect.KClass<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+    method public androidx.lifecycle.ViewModelProvider.Factory build();
+  }
+
+  public final class InitializerViewModelFactoryKt {
+    method public static inline <reified VM extends androidx.lifecycle.ViewModel> void initializer(androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+    method public static inline androidx.lifecycle.ViewModelProvider.Factory viewModelFactory(kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder,kotlin.Unit> builder);
+  }
+
+  public final class MutableCreationExtras extends androidx.lifecycle.viewmodel.CreationExtras {
+    ctor public MutableCreationExtras(optional androidx.lifecycle.viewmodel.CreationExtras initialExtras);
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+  }
+
+  @kotlin.DslMarker public @interface ViewModelFactoryDsl {
+  }
+
+  public final class ViewModelInitializer<T extends androidx.lifecycle.ViewModel> {
+    ctor public ViewModelInitializer(Class<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+  }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/api/res-2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/api/res-2.6.0-beta01.txt
diff --git a/lifecycle/lifecycle-viewmodel/api/restricted_2.6.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.6.0-beta01.txt
new file mode 100644
index 0000000..f8457f6
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/api/restricted_2.6.0-beta01.txt
@@ -0,0 +1,136 @@
+// Signature format: 4.0
+package androidx.lifecycle {
+
+  public class AndroidViewModel extends androidx.lifecycle.ViewModel {
+    ctor public AndroidViewModel(android.app.Application application);
+    method public <T extends android.app.Application> T getApplication();
+  }
+
+  public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    property public default androidx.lifecycle.viewmodel.CreationExtras defaultViewModelCreationExtras;
+    property public abstract androidx.lifecycle.ViewModelProvider.Factory defaultViewModelProviderFactory;
+  }
+
+  public abstract class ViewModel {
+    ctor public ViewModel();
+    ctor public ViewModel(java.io.Closeable!...);
+    method public void addCloseable(java.io.Closeable);
+    method protected void onCleared();
+  }
+
+  public final class ViewModelLazy<VM extends androidx.lifecycle.ViewModel> implements kotlin.Lazy<VM> {
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras> extrasProducer);
+    ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer);
+    method public VM getValue();
+    method public boolean isInitialized();
+    property public VM value;
+  }
+
+  public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+    method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> modelClass);
+  }
+
+  public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
+    ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
+    method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
+    field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.AndroidViewModelFactory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+  }
+
+  public static interface ViewModelProvider.Factory {
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+    method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
+    method public default static androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+    field public static final androidx.lifecycle.ViewModelProvider.Factory.Companion Companion;
+  }
+
+  public static final class ViewModelProvider.Factory.Companion {
+    method public androidx.lifecycle.ViewModelProvider.Factory from(androidx.lifecycle.viewmodel.ViewModelInitializer<?>... initializers);
+  }
+
+  public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public ViewModelProvider.NewInstanceFactory();
+    field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
+  }
+
+  public static final class ViewModelProvider.NewInstanceFactory.Companion {
+  }
+
+  public final class ViewModelProviderGetKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> VM get(androidx.lifecycle.ViewModelProvider);
+  }
+
+  public class ViewModelStore {
+    ctor public ViewModelStore();
+    method public final void clear();
+  }
+
+  public interface ViewModelStoreOwner {
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public abstract androidx.lifecycle.ViewModelStore viewModelStore;
+  }
+
+  public final class ViewTreeViewModelKt {
+    method @Deprecated public static androidx.lifecycle.ViewModelStoreOwner? findViewTreeViewModelStoreOwner(android.view.View view);
+  }
+
+  public final class ViewTreeViewModelStoreOwner {
+    method public static androidx.lifecycle.ViewModelStoreOwner? get(android.view.View);
+    method public static void set(android.view.View, androidx.lifecycle.ViewModelStoreOwner? viewModelStoreOwner);
+  }
+
+}
+
+package androidx.lifecycle.viewmodel {
+
+  public abstract class CreationExtras {
+    method public abstract operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+  }
+
+  public static final class CreationExtras.Empty extends androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
+  public static interface CreationExtras.Key<T> {
+  }
+
+  @androidx.lifecycle.viewmodel.ViewModelFactoryDsl public final class InitializerViewModelFactoryBuilder {
+    ctor public InitializerViewModelFactoryBuilder();
+    method public <T extends androidx.lifecycle.ViewModel> void addInitializer(kotlin.reflect.KClass<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+    method public androidx.lifecycle.ViewModelProvider.Factory build();
+  }
+
+  public final class InitializerViewModelFactoryKt {
+    method public static inline <reified VM extends androidx.lifecycle.ViewModel> void initializer(androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends VM> initializer);
+    method public static inline androidx.lifecycle.ViewModelProvider.Factory viewModelFactory(kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.InitializerViewModelFactoryBuilder,kotlin.Unit> builder);
+  }
+
+  public final class MutableCreationExtras extends androidx.lifecycle.viewmodel.CreationExtras {
+    ctor public MutableCreationExtras(optional androidx.lifecycle.viewmodel.CreationExtras initialExtras);
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+  }
+
+  @kotlin.DslMarker public @interface ViewModelFactoryDsl {
+  }
+
+  public final class ViewModelInitializer<T extends androidx.lifecycle.ViewModel> {
+    ctor public ViewModelInitializer(Class<T> clazz, kotlin.jvm.functions.Function1<? super androidx.lifecycle.viewmodel.CreationExtras,? extends T> initializer);
+  }
+
+}
+
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 312cadd..a4f7ce8 100644
--- a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
@@ -25,7 +25,7 @@
 
 class AndroidXIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues get(): List<Issue> {
         return Issues
     }
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 ab2b60d..7bab6f3 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt
@@ -17,17 +17,19 @@
 
 package androidx.build.lint
 
+import com.android.sdklib.SdkVersionInfo.HIGHEST_KNOWN_API
+import com.android.tools.lint.detector.api.ApiConstraint
 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.Incident
 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.sdklib.SdkVersionInfo.HIGHEST_KNOWN_API
-import com.android.tools.lint.detector.api.Incident
 import com.android.tools.lint.detector.api.Severity
 import com.android.tools.lint.detector.api.SourceCodeScanner
-import com.android.tools.lint.detector.api.VersionChecks
+import com.android.tools.lint.detector.api.VersionChecks.Companion.isPrecededByVersionCheckExit
+import com.android.tools.lint.detector.api.VersionChecks.Companion.isWithinVersionCheckConditional
 import com.intellij.psi.PsiAnnotation
 import com.intellij.psi.PsiMethod
 import org.jetbrains.uast.UCallExpression
@@ -55,15 +57,14 @@
         if (!context.evaluator.isMemberInClass(method, METHOD_REFLECTION_CLASS)) return
 
         // Flag if the call isn't inside or preceded by an SDK_INT check.
-        if (!VersionChecks.isWithinVersionCheckConditional(
+        if (!isWithinVersionCheckConditional(
                 context,
                 node,
-                HIGHEST_KNOWN_API,
-                false
+                ApiConstraint.get(HIGHEST_KNOWN_API), false
             ) &&
-            !VersionChecks.isWithinVersionCheckConditional(context, node, 1, true) &&
-            !VersionChecks.isPrecededByVersionCheckExit(context, node, HIGHEST_KNOWN_API) &&
-            !VersionChecks.isPrecededByVersionCheckExit(context, node, 1) &&
+            !isWithinVersionCheckConditional(context, node, ApiConstraint.get(1), true) &&
+            !isPrecededByVersionCheckExit(context, node, ApiConstraint.get(HIGHEST_KNOWN_API)) &&
+            !isPrecededByVersionCheckExit(context, node, ApiConstraint.get(1)) &&
             !isWithinDeprecatedSinceApiMethod(node) &&
             !isWithinDeprecatedSinceApiClass(node)
         ) {
diff --git a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
index f8d3070..62d19a0 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -202,7 +202,7 @@
                 ?: return
 
             // Change: Removed SimpleDateFormat and Animator checks
-
+            @Suppress("DEPRECATION") // b/262915628
             var api = apiDatabase.getMethodVersion(owner, name, desc)
             if (api == -1) {
                 return
@@ -260,6 +260,7 @@
                             for (type in inheritanceChain) {
                                 val expressionOwner = evaluator.getQualifiedName(type)
                                 if (expressionOwner != null && expressionOwner != owner) {
+                                    @Suppress("DEPRECATION") // b/262915628
                                     val specificApi = apiDatabase.getMethodVersion(
                                         expressionOwner, name, desc
                                     )
@@ -339,6 +340,7 @@
                         ) {
                             break
                         }
+                        @Suppress("DEPRECATION") // b/262915628
                         val specificApi =
                             apiDatabase.getMethodVersion(expressionOwner, name, desc)
                         if (specificApi == -1) {
@@ -385,6 +387,7 @@
                                 if (provider != null) {
                                     val methodOwner = evaluator.getQualifiedName(provider)
                                     if (methodOwner != null) {
+                                        @Suppress("DEPRECATION") // b/262915628
                                         val methodApi = apiDatabase.getMethodVersion(
                                             methodOwner, name, desc
                                         )
@@ -853,6 +856,7 @@
         private fun classAvailableAtMinSdk(className: String): Boolean {
             val apiDatabase = apiDatabase ?: return false
             val minSdk = getMinSdk(context)
+            @Suppress("DEPRECATION") // b/262915628
             val version = apiDatabase.getClassVersion(className)
             return version <= minSdk
         }
diff --git a/loader/OWNERS b/loader/OWNERS
index ac839ec..daa5f64 100644
--- a/loader/OWNERS
+++ b/loader/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461381
 ilake@google.com
 mount@google.com
 adamp@google.com
diff --git a/media/version-compat-tests/OWNERS b/media/version-compat-tests/OWNERS
index 96d29ab..362a1a8 100644
--- a/media/version-compat-tests/OWNERS
+++ b/media/version-compat-tests/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 188488
 hdmoon@google.com
 sungsoo@google.com
 dwkang@google.com
diff --git a/media2/integration-tests/testapp/OWNERS b/media2/integration-tests/testapp/OWNERS
index b2c39ea..8050f58 100644
--- a/media2/integration-tests/testapp/OWNERS
+++ b/media2/integration-tests/testapp/OWNERS
@@ -1,8 +1,6 @@
-akersten@google.com
+# Bug component: 188488
 dwkang@google.com
 gyumin@google.com
 hdmoon@google.com
-insun@google.com
 jaewan@google.com
-jinpark@google.com
 sungsoo@google.com
diff --git a/media2/media2-widget/src/main/res/values-az/strings.xml b/media2/media2-widget/src/main/res/values-az/strings.xml
index ca8698b..cb3d949 100644
--- a/media2/media2-widget/src/main/res/values-az/strings.xml
+++ b/media2/media2-widget/src/main/res/values-az/strings.xml
@@ -19,7 +19,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Deaktiv"</string>
     <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Audio trek"</string>
-    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Heç bir"</string>
+    <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Heç biri"</string>
     <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Oxutma sürəti"</string>
     <string name="MediaControlView_playback_speed_normal" msgid="2029510260288453183">"Normal"</string>
     <string name="MediaControlView_time_placeholder" msgid="6734584158942500617">"00:00:00"</string>
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
index 34f191f..ed033e1 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
@@ -602,10 +602,6 @@
          *                   the route controller.
          * @param dynamicRoutes The dynamic route descriptors for published routes.
          *                      At least a selected or selecting route should be included.
-         *
-         * @throws IllegalArgumentException Thrown when no dynamic route descriptors are {@link
-         * DynamicRouteDescriptor#SELECTED SELECTED} or {@link DynamicRouteDescriptor#SELECTING
-         * SELECTING}.
          */
         public final void notifyDynamicRoutesChanged(
                 @NonNull MediaRouteDescriptor groupRoute,
@@ -616,23 +612,6 @@
             if (dynamicRoutes == null) {
                 throw new NullPointerException("dynamicRoutes must not be null");
             }
-
-            boolean hasSelectedRoute = false;
-            for (DynamicRouteDescriptor route: dynamicRoutes) {
-                int state = route.getSelectionState();
-                if (state == DynamicRouteDescriptor.SELECTED
-                        || state == DynamicRouteDescriptor.SELECTING) {
-                    hasSelectedRoute = true;
-                    break;
-                }
-            }
-
-            if (!hasSelectedRoute) {
-                throw new IllegalArgumentException("dynamicRoutes must have at least one selected"
-                        + " or selecting route.");
-
-            }
-
             synchronized (mLock) {
                 if (mExecutor != null) {
                     final OnDynamicRoutesChangedListener listener = mListener;
diff --git a/metrics/OWNERS b/metrics/OWNERS
index e28a4db..e5530811 100644
--- a/metrics/OWNERS
+++ b/metrics/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1109742
 chet@google.com
 ccraik@google.com
\ No newline at end of file
diff --git a/navigation/navigation-common-lint/src/main/java/androidx/navigation/common/lint/NavigationCommonIssueRegistry.kt b/navigation/navigation-common-lint/src/main/java/androidx/navigation/common/lint/NavigationCommonIssueRegistry.kt
index ff861cd..f5a5d52 100644
--- a/navigation/navigation-common-lint/src/main/java/androidx/navigation/common/lint/NavigationCommonIssueRegistry.kt
+++ b/navigation/navigation-common-lint/src/main/java/androidx/navigation/common/lint/NavigationCommonIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class NavigationCommonIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         EmptyNavDeepLinkDetector.EmptyNavDeepLink
diff --git a/navigation/navigation-common/api/current.ignore b/navigation/navigation-common/api/current.ignore
new file mode 100644
index 0000000..a8fe9ea
--- /dev/null
+++ b/navigation/navigation-common/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.navigation.NavArgsLazyKt:
+    Removed class androidx.navigation.NavArgsLazyKt
diff --git a/navigation/navigation-common/api/current.txt b/navigation/navigation-common/api/current.txt
index feb3c32..de2b551 100644
--- a/navigation/navigation-common/api/current.txt
+++ b/navigation/navigation-common/api/current.txt
@@ -77,9 +77,6 @@
     property public Args value;
   }
 
-  public final class NavArgsLazyKt {
-  }
-
   public final class NavArgument {
     method public Object? getDefaultValue();
     method public androidx.navigation.NavType<java.lang.Object> getType();
@@ -512,6 +509,7 @@
     method @CallSuper public void onLaunchSingleTopWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
     method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method @CallSuper public void prepareForTransition(androidx.navigation.NavBackStackEntry entry);
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index feb3c32..de2b551 100644
--- a/navigation/navigation-common/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_current.txt
@@ -77,9 +77,6 @@
     property public Args value;
   }
 
-  public final class NavArgsLazyKt {
-  }
-
   public final class NavArgument {
     method public Object? getDefaultValue();
     method public androidx.navigation.NavType<java.lang.Object> getType();
@@ -512,6 +509,7 @@
     method @CallSuper public void onLaunchSingleTopWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
     method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method @CallSuper public void prepareForTransition(androidx.navigation.NavBackStackEntry entry);
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
diff --git a/navigation/navigation-common/api/restricted_current.ignore b/navigation/navigation-common/api/restricted_current.ignore
new file mode 100644
index 0000000..a8fe9ea
--- /dev/null
+++ b/navigation/navigation-common/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.navigation.NavArgsLazyKt:
+    Removed class androidx.navigation.NavArgsLazyKt
diff --git a/navigation/navigation-common/api/restricted_current.txt b/navigation/navigation-common/api/restricted_current.txt
index feb3c32..de2b551 100644
--- a/navigation/navigation-common/api/restricted_current.txt
+++ b/navigation/navigation-common/api/restricted_current.txt
@@ -77,9 +77,6 @@
     property public Args value;
   }
 
-  public final class NavArgsLazyKt {
-  }
-
   public final class NavArgument {
     method public Object? getDefaultValue();
     method public androidx.navigation.NavType<java.lang.Object> getType();
@@ -512,6 +509,7 @@
     method @CallSuper public void onLaunchSingleTopWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
     method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method @CallSuper public void prepareForTransition(androidx.navigation.NavBackStackEntry entry);
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
index aa18277..5577ac2 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
@@ -202,6 +202,9 @@
      * [pushWithTransition] and [popWithTransition] as those call are responsible for adding
      * entries to [transitionsInProgress].
      *
+     * This should also always be called in conjunction with [prepareForTransition] to ensure all
+     * [NavBackStackEntries][NavBackStackEntry] settle into the proper state.
+     *
      * Failing to call this method could result in entries being prevented from reaching their
      * final [Lifecycle.State]}.
      *
@@ -211,4 +214,16 @@
     public open fun markTransitionComplete(entry: NavBackStackEntry) {
         _transitionsInProgress.value = _transitionsInProgress.value - entry
     }
+
+    /**
+     * This prepares the given [NavBackStackEntry] for transition. This should be called in
+     * conjunction with [markTransitionComplete] as that is responsible for settling the
+     * [NavBackStackEntry] into its final state.
+     *
+     * @see markTransitionComplete
+     */
+    @CallSuper
+    public open fun prepareForTransition(entry: NavBackStackEntry) {
+        _transitionsInProgress.value = _transitionsInProgress.value + entry
+    }
 }
diff --git a/navigation/navigation-compose-lint/src/main/java/androidx/navigation/compose/lint/NavigationComposeIssueRegistry.kt b/navigation/navigation-compose-lint/src/main/java/androidx/navigation/compose/lint/NavigationComposeIssueRegistry.kt
index 402db3be..b6b5d155 100644
--- a/navigation/navigation-compose-lint/src/main/java/androidx/navigation/compose/lint/NavigationComposeIssueRegistry.kt
+++ b/navigation/navigation-compose-lint/src/main/java/androidx/navigation/compose/lint/NavigationComposeIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class NavigationComposeIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         ComposableDestinationInComposeScopeDetector.ComposableDestinationInComposeScope,
diff --git a/navigation/navigation-compose/build.gradle b/navigation/navigation-compose/build.gradle
index 4cdcea4..57e32a3 100644
--- a/navigation/navigation-compose/build.gradle
+++ b/navigation/navigation-compose/build.gradle
@@ -44,6 +44,7 @@
 
     androidTestImplementation(projectOrArtifact(":compose:material:material"))
     androidTestImplementation projectOrArtifact(":compose:test-utils")
+    androidTestImplementation projectOrArtifact(":compose:ui:ui-tooling")
     androidTestImplementation(projectOrArtifact(":navigation:navigation-testing"))
     androidTestImplementation(projectOrArtifact(":internal-testutils-navigation"), {
         exclude group: "androidx.navigation", module: "navigation-common"
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostPreviewTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostPreviewTest.kt
new file mode 100644
index 0000000..7fe9a67
--- /dev/null
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostPreviewTest.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalInspectionMode
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.tooling.PreviewActivity
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import org.junit.Rule
+import org.junit.Test
+
+class NavHostPreviewTest {
+
+    @get:Rule
+    val composeTestRule = createAndroidComposeRule<PreviewActivity>()
+
+    @Test
+    fun navHostPreviewTest() {
+        // prevent auto synchronization so it doesn't actually animate the composable
+        composeTestRule.mainClock.autoAdvance = false
+        composeTestRule.setContent {
+            NavHostPreview()
+        }
+
+        val text = composeTestRule.onNodeWithTag("text").assertExists()
+        text.assertIsDisplayed()
+    }
+
+    @Test
+    fun navHostWithDialogPreviewTest() {
+        // prevent auto synchronization so it doesn't actually animate the composable
+        composeTestRule.mainClock.autoAdvance = false
+        composeTestRule.setContent {
+            NavHostWithDialogPreview()
+        }
+
+        val text = composeTestRule.onNodeWithTag("text").assertExists()
+        text.assertIsDisplayed()
+
+        // dialogs that are shown by default on startDestination should also be shown
+        // on preview
+        val dialog = composeTestRule.onNodeWithTag("dialog").assertExists()
+        dialog.assertIsDisplayed()
+
+        val dialogText = composeTestRule.onNodeWithTag("dialog_text").assertExists()
+        dialogText.assertIsDisplayed()
+    }
+}
+
+@Preview
+@Composable
+fun NavHostPreview() {
+    CompositionLocalProvider(
+        LocalInspectionMode provides true,
+    ) {
+        Box(Modifier.fillMaxSize().background(Color.Red)) {
+            NavHost(
+                navController = rememberNavController(),
+                startDestination = "home"
+            ) {
+                composable("home") {
+                    Box(Modifier.fillMaxSize().background(Color.Blue)) {
+                        Text(text = "test", modifier = Modifier.testTag("text"))
+                    }
+                }
+            }
+        }
+    }
+}
+
+@Preview
+@Composable
+fun NavHostWithDialogPreview() {
+    CompositionLocalProvider(
+        LocalInspectionMode provides true,
+    ) {
+        val navController = rememberNavController()
+        Box(Modifier.fillMaxSize().background(Color.Red)) {
+            NavHost(
+                navController = navController,
+                startDestination = "home"
+            ) {
+                composable("home") {
+                    Box(Modifier.fillMaxSize().background(Color.Blue)) {
+                        Text(text = "test", modifier = Modifier.testTag("text"))
+                    }
+                    // show dialog
+                    navController.navigate("dialog")
+                }
+                dialog("dialog") {
+                    Box(
+                        Modifier.height(200.dp).background(Color.Gray).testTag("dialog")
+                    ) {
+                        Text(text = "test", modifier = Modifier.testTag("dialog_text"))
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/DialogHost.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/DialogHost.kt
index c174b99..7b34328 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/DialogHost.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/DialogHost.kt
@@ -23,6 +23,8 @@
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
+import androidx.compose.runtime.snapshots.SnapshotStateList
+import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.window.Dialog
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
@@ -66,9 +68,14 @@
 internal fun MutableList<NavBackStackEntry>.PopulateVisibleList(
     transitionsInProgress: Collection<NavBackStackEntry>
 ) {
+    val isInspecting = LocalInspectionMode.current
     transitionsInProgress.forEach { entry ->
         DisposableEffect(entry.lifecycle) {
             val observer = LifecycleEventObserver { _, event ->
+                // show dialog in preview
+                if (isInspecting && !contains(entry)) {
+                    add(entry)
+                }
                 // ON_START -> add to visibleBackStack, ON_STOP -> remove from visibleBackStack
                 if (event == Lifecycle.Event.ON_START) {
                     // We want to treat the visible lists as Sets but we want to keep
@@ -91,13 +98,22 @@
 }
 
 @Composable
-internal fun rememberVisibleList(transitionsInProgress: Collection<NavBackStackEntry>) =
-    remember(transitionsInProgress) {
+internal fun rememberVisibleList(
+    transitionsInProgress: Collection<NavBackStackEntry>
+): SnapshotStateList<NavBackStackEntry> {
+    // show dialog in preview
+    val isInspecting = LocalInspectionMode.current
+    return remember(transitionsInProgress) {
         mutableStateListOf<NavBackStackEntry>().also {
             it.addAll(
                 transitionsInProgress.filter { entry ->
-                    entry.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
+                    if (isInspecting) {
+                        true
+                    } else {
+                        entry.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
+                    }
                 }
             )
         }
     }
+}
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 259e89b..bcd0f6a 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
@@ -27,8 +27,10 @@
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphBuilder
@@ -36,7 +38,6 @@
 import androidx.navigation.Navigator
 import androidx.navigation.createGraph
 import androidx.navigation.get
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
 
 /**
@@ -132,14 +133,23 @@
         }
     }.collectAsState(emptyList())
 
-    val backStackEntry = visibleEntries.lastOrNull()
+    val backStackEntry: NavBackStackEntry? = if (LocalInspectionMode.current) {
+        composeNavigator.backStack.value.lastOrNull()
+    } else {
+        visibleEntries.lastOrNull()
+    }
 
     var initialCrossfade by remember { mutableStateOf(true) }
     if (backStackEntry != null) {
         // while in the scope of the composable, we provide the navBackStackEntry as the
         // ViewModelStoreOwner and LifecycleOwner
         Crossfade(backStackEntry.id, modifier) {
-            val lastEntry = visibleEntries.lastOrNull { entry ->
+            val lastEntry = if (LocalInspectionMode.current) {
+                // show startDestination if inspecting (preview)
+                composeNavigator.backStack.value
+            } else {
+                visibleEntries
+            }.lastOrNull { entry ->
                 it == entry.id
             }
             // We are disposing on a Unit as we only want to dispose when the CrossFade completes
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 6a5302c..0aadd2e 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -23,7 +23,7 @@
 }
 
 dependencies {
-    api("androidx.fragment:fragment-ktx:1.5.4")
+    api(project(":fragment:fragment-ktx"))
     api(project(":navigation:navigation-runtime"))
     api("androidx.slidingpanelayout:slidingpanelayout:1.2.0")
     api(libs.kotlinStdlib)
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 21fa390..989e166 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
@@ -16,27 +16,34 @@
 
 package androidx.navigation.fragment
 
+import android.os.Build
 import android.os.Bundle
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentFactory
 import androidx.fragment.app.FragmentManager
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavOptions
 import androidx.navigation.fragment.test.EmptyFragment
 import androidx.navigation.fragment.test.R
+import androidx.navigation.navOptions
 import androidx.navigation.testing.TestNavigatorState
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import kotlin.reflect.KClass
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import kotlin.reflect.KClass
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -530,6 +537,277 @@
             .containsExactly(entry)
     }
 
+    @LargeTest
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+    fun testNavigateNavigateInterrupt() {
+        val entry1 = createBackStackEntry()
+        var entry2Started = false
+        var entry2Resumed = false
+        val entry2 = createBackStackEntry(SECOND_FRAGMENT)
+        // Add observer to entry to verify lifecycle events.
+        activityRule.runOnUiThread {
+            entry2.lifecycle.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_START) {
+                        entry2Started = true
+                    }
+                    if (event == Lifecycle.Event.ON_RESUME) {
+                        entry2Resumed = true
+                    }
+                }
+            })
+        }
+
+        val entry3 = createBackStackEntry(THIRD_FRAGMENT)
+
+        val options = navOptions {
+            anim {
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
+            }
+        }
+
+        // navigate to first entry and verify it executed correctly
+        fragmentNavigator.navigate(listOf(entry1), options, null)
+        assertThat(navigatorState.backStack.value).containsExactly(entry1)
+        activityRule.runOnUiThread {
+            fragmentManager.executePendingTransactions()
+        }
+        val fragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment)
+            .isNotNull()
+
+        // navigate to both the second and third entry back to back.
+        fragmentNavigator.navigate(listOf(entry2), options, null)
+        fragmentNavigator.navigate(listOf(entry3), options, null)
+        assertThat(navigatorState.backStack.value).containsExactly(entry1, entry2, entry3)
+        activityRule.runOnUiThread {
+            fragmentManager.executePendingTransactions()
+        }
+        val fragment3 = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment3)
+            .isNotNull()
+
+        // Verify that both entries on the back stack are in a CREATED state
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+        assertThat(entry2.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+
+        // Add an observer to ensure that we don't attempt to verify the state until animations
+        // are complete and the viewLifecycle has been RESUMED.
+        val countDownLatch = CountDownLatch(1)
+        activityRule.runOnUiThread {
+            fragment3?.viewLifecycleOwner?.lifecycle?.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_RESUME) {
+                        countDownLatch.countDown()
+                    }
+                }
+            })
+        }
+        assertThat(countDownLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(entry3.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+
+        // verify that the second entry made it to STARTED but not RESUMED since it was interrupted
+        assertWithMessage("Entry2 should have been started").that(entry2Started).isTrue()
+        assertWithMessage("Entry2 should never be resumed").that(entry2Resumed).isFalse()
+    }
+
+    @LargeTest
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+    fun testNavigatePopInterrupt() {
+        val entry1 = createBackStackEntry()
+        var entry1Stopped = false
+
+        // Add observer to entry to verify lifecycle events.
+        activityRule.runOnUiThread {
+            entry1.lifecycle.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_STOP) {
+                        entry1Stopped = true
+                    }
+                }
+            })
+        }
+
+        val entry2 = createBackStackEntry(SECOND_FRAGMENT)
+
+        val options = navOptions {
+            anim {
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
+            }
+        }
+
+        // navigate to first entry and verify it executed correctly
+        fragmentNavigator.navigate(listOf(entry1), options, null)
+        assertThat(navigatorState.backStack.value).containsExactly(entry1)
+        activityRule.runOnUiThread {
+            fragmentManager.executePendingTransactions()
+        }
+        val fragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment)
+            .isNotNull()
+
+        // navigate to both the second and third entry back to back.
+        fragmentNavigator.navigate(listOf(entry2), options, null)
+        fragmentNavigator.popBackStack(entry2, false)
+        assertThat(navigatorState.backStack.value).containsExactly(entry1)
+        activityRule.runOnUiThread {
+            fragmentManager.executePendingTransactions()
+        }
+        val fragment1 = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment1)
+            .isNotNull()
+
+        // middle of transition
+
+        // Entry 1 should move back to STARTED
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+        // Entry 2 should be DESTROYED since it was popped
+        assertThat(entry2.lifecycle.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+
+        // Add an observer to ensure that we don't attempt to verify the state until animations
+        // are complete and the viewLifecycle has been RESUMED.
+        val countDownLatch = CountDownLatch(1)
+        activityRule.runOnUiThread {
+            fragment1?.viewLifecycleOwner?.lifecycle?.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_RESUME) {
+                        countDownLatch.countDown()
+                    }
+                }
+            })
+        }
+        assertThat(countDownLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        // Entry 1 should move back to RESUMED
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+
+        // verify that the first entry made it down to CREATED
+        assertWithMessage("Entry2 should have been stopped").that(entry1Stopped).isTrue()
+    }
+
+    @LargeTest
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
+    fun testPopPopInterrupt() {
+        val entry1 = createBackStackEntry()
+        val entry2 = createBackStackEntry(SECOND_FRAGMENT)
+        val entry3 = createBackStackEntry(THIRD_FRAGMENT)
+
+        val options = navOptions {
+            anim {
+                enter = R.animator.fade_enter
+                exit = R.animator.fade_exit
+                popEnter = R.animator.fade_enter
+                popExit = R.animator.fade_exit
+            }
+        }
+        activityRule.runOnUiThread {
+            // navigate to first entry and verify it executed correctly
+            fragmentNavigator.navigate(listOf(entry1), options, null)
+            assertThat(navigatorState.backStack.value).containsExactly(entry1)
+
+            fragmentManager.executePendingTransactions()
+
+            // navigate to both the second and third entry back to back.
+            fragmentNavigator.navigate(listOf(entry2), options, null)
+            fragmentNavigator.navigate(listOf(entry3), options, null)
+
+            assertThat(navigatorState.backStack.value).containsExactly(entry1, entry2, entry3)
+
+            fragmentManager.executePendingTransactions()
+        }
+
+        val fragment3 = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment3)
+            .isNotNull()
+
+        // Verify that both entries on the back stack are in a CREATED state
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+        assertThat(entry2.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+
+        // Add an observer to ensure that we don't attempt to verify the state until animations
+        // are complete and the viewLifecycle has been RESUMED.
+        val countDownLatch1 = CountDownLatch(1)
+        activityRule.runOnUiThread {
+            fragment3?.viewLifecycleOwner?.lifecycle?.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_RESUME) {
+                        countDownLatch1.countDown()
+                    }
+                }
+            })
+        }
+        assertThat(countDownLatch1.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        // Entry 3 should be RESUMED
+        assertThat(entry3.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+
+        var entry2Started = false
+
+        // Add observer to entry to verify lifecycle events.
+        activityRule.runOnUiThread {
+            entry2.lifecycle.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_START) {
+                        entry2Started = true
+                    }
+                }
+            })
+        }
+
+        fragmentNavigator.popBackStack(entry3, false)
+        fragmentNavigator.popBackStack(entry2, false)
+        assertThat(navigatorState.backStack.value).containsExactly(entry1)
+        activityRule.runOnUiThread {
+            fragmentManager.executePendingTransactions()
+        }
+        val fragment1 = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment1)
+            .isNotNull()
+
+        // middle of transition
+
+        // Entry 1 should move back to STARTED
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
+
+        assertThat(entry2.lifecycle.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+        assertThat(entry3.lifecycle.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+
+        // Add an observer to ensure that we don't attempt to verify the state until animations
+        // are complete and the viewLifecycle has been RESUMED.
+        val countDownLatch2 = CountDownLatch(1)
+        activityRule.runOnUiThread {
+            fragment1?.viewLifecycleOwner?.lifecycle?.addObserver(object : LifecycleEventObserver {
+                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                    if (event == Lifecycle.Event.ON_RESUME) {
+                        countDownLatch2.countDown()
+                    }
+                }
+            })
+        }
+        assertThat(countDownLatch2.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+
+        // Entry 1 should move back to RESUMED
+        assertThat(entry1.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+        // Entry 2 should be DESTROYED
+        assertThat(entry2.lifecycle.currentState).isEqualTo(Lifecycle.State.DESTROYED)
+
+        // verify that the second entry moved to started
+        assertWithMessage("Entry2 should have been started").that(entry2Started).isTrue()
+    }
+
     @UiThreadTest
     @Test
     fun testSaveRestoreState() {
diff --git a/navigation/navigation-fragment/src/androidTest/res/animator/fade_enter.xml b/navigation/navigation-fragment/src/androidTest/res/animator/fade_enter.xml
new file mode 100644
index 0000000..07c1b79
--- /dev/null
+++ b/navigation/navigation-fragment/src/androidTest/res/animator/fade_enter.xml
@@ -0,0 +1,21 @@
+<?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.
+  -->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/linear_interpolator"
+    android:propertyName="alpha"
+    android:valueFrom="0.0" android:valueTo="1.0"
+    android:duration="500" />
diff --git a/navigation/navigation-fragment/src/androidTest/res/animator/fade_exit.xml b/navigation/navigation-fragment/src/androidTest/res/animator/fade_exit.xml
new file mode 100644
index 0000000..77c3df7
--- /dev/null
+++ b/navigation/navigation-fragment/src/androidTest/res/animator/fade_exit.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/linear_interpolator"
+    android:propertyName="alpha"
+    android:valueFrom="1.0" android:valueTo="0.0"
+    android:duration="500" />
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 b4a0567..a503d03 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
@@ -25,7 +25,11 @@
 import androidx.core.os.bundleOf
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentManager.OnBackStackChangedListener
 import androidx.fragment.app.FragmentTransaction
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
@@ -53,6 +57,67 @@
     private val containerId: Int
 ) : Navigator<Destination>() {
     private val savedIds = mutableSetOf<String>()
+    private val entriesToPop = mutableSetOf<String>()
+
+    init {
+        fragmentManager.addOnBackStackChangedListener(object : OnBackStackChangedListener {
+            override fun onBackStackChanged() { }
+
+            override fun onBackStackChangeStarted(fragment: Fragment, pop: Boolean) {
+                // We only care about the pop case here since in the navigate case by the time
+                // we get here the fragment will have already been moved to STARTED.
+                // In the case of a pop, we move the top most entry from RESUMED to STARTED by
+                // calling prepareForTransition.
+                if (pop) {
+                    val entry = state.backStack.value.lastOrNull {
+                        it.id == fragment.tag &&
+                            it.lifecycle.currentState == Lifecycle.State.RESUMED
+                    }
+                    entry?.let { state.prepareForTransition(it) }
+                }
+            }
+
+            override fun onBackStackChangeCommitted(fragment: Fragment, pop: Boolean) {
+                val entry = (state.backStack.value + state.transitionsInProgress.value).lastOrNull {
+                    it.id == fragment.tag
+                }
+                if (fragment.view != null && entry != null) {
+                    val viewLifecycle = fragment.viewLifecycleOwner.lifecycle
+                    val currentState = viewLifecycle.currentState
+                    // We only need to add observers while the viewLifecycle has not reached a final
+                    // state
+                    if (currentState == Lifecycle.State.STARTED ||
+                        currentState == Lifecycle.State.CREATED
+                    ) {
+                        viewLifecycle.addObserver(object : LifecycleEventObserver {
+                            override fun onStateChanged(
+                                source: LifecycleOwner,
+                                event: Lifecycle.Event
+                            ) {
+                                // Once the lifecycle reaches RESUMED, we can mark the transition
+                                // complete
+                                if (event == Lifecycle.Event.ON_RESUME) {
+                                    state.markTransitionComplete(entry)
+                                }
+                                // Once the lifecycle reaches DESTROYED, we can mark the transition
+                                // complete and remove the observer.
+                                if (event == Lifecycle.Event.ON_DESTROY) {
+                                    state.markTransitionComplete(entry)
+                                    viewLifecycle.removeObserver(this)
+                                }
+                            }
+                        })
+                    }
+                    entriesToPop.remove(entry.id)
+                } else if (pop && entriesToPop.isEmpty() && fragment.tag == null) {
+                    // This is the case of system back where we will need to make the call to
+                    // popBackStack. Otherwise, popBackStack was called directly and this should
+                    // end up being a no-op.
+                    popBackStack(state.backStack.value.last(), false)
+                }
+            }
+        })
+    }
 
     /**
      * {@inheritDoc}
@@ -100,7 +165,8 @@
                 FragmentManager.POP_BACK_STACK_INCLUSIVE
             )
         }
-        state.pop(popUpTo, savedState)
+        entriesToPop.add(popUpTo.id)
+        state.popWithTransition(popUpTo, savedState)
     }
 
     public override fun createDestination(): Destination {
@@ -179,7 +245,7 @@
         if (restoreState) {
             // Restore back stack does all the work to restore the entry
             fragmentManager.restoreBackStack(entry.id)
-            state.push(entry)
+            state.pushWithTransition(entry)
             return
         }
         val ft = createFragmentTransaction(entry, navOptions)
@@ -195,7 +261,7 @@
         }
         ft.commit()
         // The commit succeeded, update our view of the world
-        state.push(entry)
+        state.pushWithTransition(entry)
     }
 
     /**
@@ -261,7 +327,7 @@
             popExitAnim = if (popExitAnim != -1) popExitAnim else 0
             ft.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim)
         }
-        ft.replace(containerId, frag)
+        ft.replace(containerId, frag, entry.id)
         ft.setPrimaryNavigationFragment(frag)
         ft.setReorderingAllowed(true)
         return ft
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 081ef29..27fa1185 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
@@ -16,13 +16,11 @@
 package androidx.navigation.fragment
 
 import android.content.Context
-import android.content.ContextWrapper
 import android.os.Bundle
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.activity.OnBackPressedDispatcherOwner
 import androidx.annotation.CallSuper
 import androidx.annotation.NavigationRes
 import androidx.annotation.RestrictTo
@@ -113,20 +111,9 @@
 
     @CallSuper
     public override fun onCreate(savedInstanceState: Bundle?) {
-        var context = requireContext()
+        val context = requireContext()
         navHostController = NavHostController(context)
         navHostController!!.setLifecycleOwner(this)
-        while (context is ContextWrapper) {
-            if (context is OnBackPressedDispatcherOwner) {
-                navHostController!!.setOnBackPressedDispatcher(
-                    (context as OnBackPressedDispatcherOwner).onBackPressedDispatcher
-                )
-                // Otherwise, caller must register a dispatcher on the controller explicitly
-                // by overriding onCreateNavHostController()
-                break
-            }
-            context = context.baseContext
-        }
         // Set the default state - this will be updated whenever
         // onPrimaryNavigationFragmentChanged() is called
         navHostController!!.enableOnBackPressed(
diff --git a/navigation/navigation-runtime-lint/src/main/java/androidx/navigation/runtime/lint/NavigationRuntimeIssueRegistry.kt b/navigation/navigation-runtime-lint/src/main/java/androidx/navigation/runtime/lint/NavigationRuntimeIssueRegistry.kt
index b4d90ba..48b846a 100644
--- a/navigation/navigation-runtime-lint/src/main/java/androidx/navigation/runtime/lint/NavigationRuntimeIssueRegistry.kt
+++ b/navigation/navigation-runtime-lint/src/main/java/androidx/navigation/runtime/lint/NavigationRuntimeIssueRegistry.kt
@@ -27,7 +27,7 @@
  */
 class NavigationRuntimeIssueRegistry : IssueRegistry() {
     // Tests are run with this version. We ensure that with ApiLintVersionsTest
-    override val api = 13
+    override val api = 14
     override val minApi = CURRENT_API
     override val issues get() = listOf(
         DeepLinkInActivityDestinationDetector.DeepLinkInActivityDestination
diff --git a/navigation/navigation-runtime-truth/OWNERS b/navigation/navigation-runtime-truth/OWNERS
deleted file mode 100644
index 80569a3..0000000
--- a/navigation/navigation-runtime-truth/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-fraschilla@google.com
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 a36a849..5256f92 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -372,6 +372,15 @@
             // else, updateBackStackLifecycle() will be called after any ongoing navigate() call
             // completes
         }
+
+        override fun prepareForTransition(entry: NavBackStackEntry) {
+            super.prepareForTransition(entry)
+            if (backQueue.contains(entry)) {
+                entry.maxLifecycle = Lifecycle.State.STARTED
+            } else {
+                throw IllegalStateException("Cannot transition entry that is not in the back stack")
+            }
+        }
     }
 
     /**
diff --git a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
index 12f81ba..09f10d7 100644
--- a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
+++ b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
@@ -17,8 +17,11 @@
 package androidx.navigation.testing
 
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.navigation.FloatingWindow
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
@@ -303,6 +306,73 @@
             .isEqualTo(Lifecycle.State.RESUMED)
     }
 
+    @Test
+    fun testPrepareForTransition() {
+        val navigator = TestTransitionNavigator()
+        navigator.onAttach(state)
+        val firstEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.INITIALIZED)
+
+        navigator.navigate(listOf(firstEntry), null, null)
+        navigator.testLifecycle.addObserver(object : LifecycleEventObserver {
+            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                when (event) {
+                    Lifecycle.Event.ON_STOP -> {
+                        // this is okay since the first entry will not be DESTROYED in this test.
+                        state.markTransitionComplete(firstEntry)
+                    }
+                    Lifecycle.Event.ON_PAUSE -> state.prepareForTransition(firstEntry)
+                    Lifecycle.Event.ON_START -> state.prepareForTransition(firstEntry)
+                    Lifecycle.Event.ON_RESUME -> state.markTransitionComplete(firstEntry)
+                    else -> {}
+                }
+            }
+        })
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.STARTED)
+
+        navigator.testLifecycle.currentState = Lifecycle.State.RESUMED
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        navigator.testLifecycle.currentState = Lifecycle.State.STARTED
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.STARTED)
+
+        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.STARTED)
+        assertThat(state.transitionsInProgress.value.contains(firstEntry)).isTrue()
+
+        // Moving down to reflect a destination being on a back stack and only CREATED
+        navigator.testLifecycle.currentState = Lifecycle.State.CREATED
+
+        state.markTransitionComplete(secondEntry)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.CREATED)
+
+        navigator.testLifecycle.currentState = Lifecycle.State.STARTED
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.STARTED)
+
+        navigator.popBackStack(secondEntry, true)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.CREATED)
+
+        navigator.testLifecycle.currentState = Lifecycle.State.RESUMED
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        state.markTransitionComplete(secondEntry)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.DESTROYED)
+    }
+
     @Navigator.Name("test")
     internal class TestNavigator : Navigator<NavDestination>() {
         override fun createDestination(): NavDestination = NavDestination(this)
@@ -310,6 +380,8 @@
 
     @Navigator.Name("test")
     internal class TestTransitionNavigator : Navigator<NavDestination>() {
+        val testLifecycle = TestLifecycleOwner().lifecycle
+
         override fun createDestination(): NavDestination = NavDestination(this)
 
         override fun navigate(
diff --git a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
index 6099fcf..ef738b6 100644
--- a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
+++ b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
@@ -112,6 +112,18 @@
         }
     }
 
+    override fun prepareForTransition(entry: NavBackStackEntry) {
+        super.prepareForTransition(entry)
+        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) {
+                entry.maxLifecycle = Lifecycle.State.STARTED
+            }
+        }
+    }
+
     private fun updateMaxLifecycle(
         poppedList: List<NavBackStackEntry> = emptyList(),
         saveState: Boolean = false
diff --git a/paging/paging-common/api/current.ignore b/paging/paging-common/api/current.ignore
index 1a78963..1002700 100644
--- a/paging/paging-common/api/current.ignore
+++ b/paging/paging-common/api/current.ignore
@@ -11,5 +11,11 @@
     Removed class androidx.paging.HintHandlerKt
 RemovedClass: androidx.paging.PageFetcherSnapshotKt:
     Removed class androidx.paging.PageFetcherSnapshotKt
+RemovedClass: androidx.paging.PagingSourceKt:
+    Removed class androidx.paging.PagingSourceKt
+RemovedClass: androidx.paging.RemoteMediatorAccessorKt:
+    Removed class androidx.paging.RemoteMediatorAccessorKt
+RemovedClass: androidx.paging.SeparatorsKt:
+    Removed class androidx.paging.SeparatorsKt
 RemovedClass: androidx.paging.SimpleChannelFlowKt:
     Removed class androidx.paging.SimpleChannelFlowKt
diff --git a/paging/paging-common/api/current.txt b/paging/paging-common/api/current.txt
index a62e0be..3fca865 100644
--- a/paging/paging-common/api/current.txt
+++ b/paging/paging-common/api/current.txt
@@ -411,9 +411,6 @@
   public static final class PagingSource.LoadResult.Page.Companion {
   }
 
-  public final class PagingSourceKt {
-  }
-
   public final class PagingState<Key, Value> {
     ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0L) int leadingPlaceholderCount);
     method public Value? closestItemToPosition(int anchorPosition);
@@ -466,12 +463,6 @@
     field @Deprecated public final int startPosition;
   }
 
-  public final class RemoteMediatorAccessorKt {
-  }
-
-  public final class SeparatorsKt {
-  }
-
   public enum TerminalSeparatorType {
     method public static androidx.paging.TerminalSeparatorType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.paging.TerminalSeparatorType[] values();
diff --git a/paging/paging-common/api/public_plus_experimental_current.txt b/paging/paging-common/api/public_plus_experimental_current.txt
index 409ea9f..3db67b4 100644
--- a/paging/paging-common/api/public_plus_experimental_current.txt
+++ b/paging/paging-common/api/public_plus_experimental_current.txt
@@ -415,9 +415,6 @@
   public static final class PagingSource.LoadResult.Page.Companion {
   }
 
-  public final class PagingSourceKt {
-  }
-
   public final class PagingState<Key, Value> {
     ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0L) int leadingPlaceholderCount);
     method public Value? closestItemToPosition(int anchorPosition);
@@ -498,12 +495,6 @@
     property public final boolean endOfPaginationReached;
   }
 
-  public final class RemoteMediatorAccessorKt {
-  }
-
-  public final class SeparatorsKt {
-  }
-
   public enum TerminalSeparatorType {
     method public static androidx.paging.TerminalSeparatorType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.paging.TerminalSeparatorType[] values();
diff --git a/paging/paging-common/api/restricted_current.ignore b/paging/paging-common/api/restricted_current.ignore
index 1a78963..1002700 100644
--- a/paging/paging-common/api/restricted_current.ignore
+++ b/paging/paging-common/api/restricted_current.ignore
@@ -11,5 +11,11 @@
     Removed class androidx.paging.HintHandlerKt
 RemovedClass: androidx.paging.PageFetcherSnapshotKt:
     Removed class androidx.paging.PageFetcherSnapshotKt
+RemovedClass: androidx.paging.PagingSourceKt:
+    Removed class androidx.paging.PagingSourceKt
+RemovedClass: androidx.paging.RemoteMediatorAccessorKt:
+    Removed class androidx.paging.RemoteMediatorAccessorKt
+RemovedClass: androidx.paging.SeparatorsKt:
+    Removed class androidx.paging.SeparatorsKt
 RemovedClass: androidx.paging.SimpleChannelFlowKt:
     Removed class androidx.paging.SimpleChannelFlowKt
diff --git a/paging/paging-common/api/restricted_current.txt b/paging/paging-common/api/restricted_current.txt
index a62e0be..3fca865 100644
--- a/paging/paging-common/api/restricted_current.txt
+++ b/paging/paging-common/api/restricted_current.txt
@@ -411,9 +411,6 @@
   public static final class PagingSource.LoadResult.Page.Companion {
   }
 
-  public final class PagingSourceKt {
-  }
-
   public final class PagingState<Key, Value> {
     ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0L) int leadingPlaceholderCount);
     method public Value? closestItemToPosition(int anchorPosition);
@@ -466,12 +463,6 @@
     field @Deprecated public final int startPosition;
   }
 
-  public final class RemoteMediatorAccessorKt {
-  }
-
-  public final class SeparatorsKt {
-  }
-
   public enum TerminalSeparatorType {
     method public static androidx.paging.TerminalSeparatorType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.paging.TerminalSeparatorType[] values();
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
index 23ff581..61d0718 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
@@ -260,12 +260,14 @@
              */
             val nextKey: Key?,
             /**
-             * Optional count of items before the loaded data.
+             * Count of items before the loaded data. Must be implemented if
+             * [jumping][PagingSource.jumpingSupported] is enabled. Optional otherwise.
              */
             @IntRange(from = COUNT_UNDEFINED.toLong())
             val itemsBefore: Int = COUNT_UNDEFINED,
             /**
-             * Optional count of items after the loaded data.
+             * Count of items after the loaded data. Must be implemented if
+             * [jumping][PagingSource.jumpingSupported] is enabled. Optional otherwise.
              */
             @IntRange(from = COUNT_UNDEFINED.toLong())
             val itemsAfter: Int = COUNT_UNDEFINED
@@ -335,6 +337,10 @@
      * [PagingSource]s that support jumps should override [getRefreshKey] to return a [Key] that
      * would load data fulfilling the viewport given a user's current [PagingState.anchorPosition].
      *
+     * To support jumping, the [LoadResult.Page] returned from this PagingSource must implement
+     * [itemsBefore][LoadResult.Page.itemsBefore] and [itemsAfter][LoadResult.Page.itemsAfter] to
+     * notify Paging the boundaries within which it can jump.
+     *
      * @see [PagingConfig.jumpThreshold]
      */
     public open val jumpingSupported: Boolean
diff --git a/paging/paging-compose/OWNERS b/paging/paging-compose/OWNERS
index 64e60ba..09e4523 100644
--- a/paging/paging-compose/OWNERS
+++ b/paging/paging-compose/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461228
 andreykulikov@google.com
diff --git a/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt b/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
index 9095b67..f6d53233 100644
--- a/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
+++ b/paging/paging-compose/src/androidTest/java/androidx/paging/compose/LazyPagingItemsTest.kt
@@ -98,6 +98,7 @@
         assertThat(loadStates.first()).isEqualTo(expected)
     }
 
+    @Ignore // b/267374463
     @Test
     fun lazyPagingLoadStateAfterRefresh() {
         val pager = createPager()
diff --git a/paging/paging-runtime/api/current.ignore b/paging/paging-runtime/api/current.ignore
index 41c88d3..6c9631d 100644
--- a/paging/paging-runtime/api/current.ignore
+++ b/paging/paging-runtime/api/current.ignore
@@ -5,3 +5,7 @@
     Attempted to remove parameter name from parameter arg1 in androidx.paging.LoadStateAdapter.setLoadState
 ParameterNameChange: androidx.paging.PagingDataAdapter#submitData(androidx.paging.PagingData<T>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
     Attempted to remove parameter name from parameter arg2 in androidx.paging.PagingDataAdapter.submitData
+
+
+RemovedClass: androidx.paging.NullPaddedListDiffHelperKt:
+    Removed class androidx.paging.NullPaddedListDiffHelperKt
diff --git a/paging/paging-runtime/api/current.txt b/paging/paging-runtime/api/current.txt
index a53ce96..b67fc35 100644
--- a/paging/paging-runtime/api/current.txt
+++ b/paging/paging-runtime/api/current.txt
@@ -82,9 +82,6 @@
     property public final androidx.paging.LoadState loadState;
   }
 
-  public final class NullPaddedListDiffHelperKt {
-  }
-
   @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/paging-runtime/api/public_plus_experimental_current.txt b/paging/paging-runtime/api/public_plus_experimental_current.txt
index a53ce96..b67fc35 100644
--- a/paging/paging-runtime/api/public_plus_experimental_current.txt
+++ b/paging/paging-runtime/api/public_plus_experimental_current.txt
@@ -82,9 +82,6 @@
     property public final androidx.paging.LoadState loadState;
   }
 
-  public final class NullPaddedListDiffHelperKt {
-  }
-
   @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/paging-runtime/api/restricted_current.ignore b/paging/paging-runtime/api/restricted_current.ignore
index 41c88d3..6c9631d 100644
--- a/paging/paging-runtime/api/restricted_current.ignore
+++ b/paging/paging-runtime/api/restricted_current.ignore
@@ -5,3 +5,7 @@
     Attempted to remove parameter name from parameter arg1 in androidx.paging.LoadStateAdapter.setLoadState
 ParameterNameChange: androidx.paging.PagingDataAdapter#submitData(androidx.paging.PagingData<T>, kotlin.coroutines.Continuation<? super kotlin.Unit>) parameter #1:
     Attempted to remove parameter name from parameter arg2 in androidx.paging.PagingDataAdapter.submitData
+
+
+RemovedClass: androidx.paging.NullPaddedListDiffHelperKt:
+    Removed class androidx.paging.NullPaddedListDiffHelperKt
diff --git a/paging/paging-runtime/api/restricted_current.txt b/paging/paging-runtime/api/restricted_current.txt
index a53ce96..b67fc35 100644
--- a/paging/paging-runtime/api/restricted_current.txt
+++ b/paging/paging-runtime/api/restricted_current.txt
@@ -82,9 +82,6 @@
     property public final androidx.paging.LoadState loadState;
   }
 
-  public final class NullPaddedListDiffHelperKt {
-  }
-
   @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/paging-testing/api/current.txt b/paging/paging-testing/api/current.txt
index 6f25f9e..33fda40 100644
--- a/paging/paging-testing/api/current.txt
+++ b/paging/paging-testing/api/current.txt
@@ -1,8 +1,20 @@
 // Signature format: 4.0
 package androidx.paging.testing {
 
+  public enum ErrorRecovery {
+    method public static androidx.paging.testing.ErrorRecovery valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.testing.ErrorRecovery[] values();
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETRY;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETURN_CURRENT_SNAPSHOT;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery THROW;
+  }
+
+  public fun interface LoadErrorHandler {
+    method public androidx.paging.testing.ErrorRecovery onError(androidx.paging.CombinedLoadStates combinedLoadStates);
+  }
+
   public final class PagerFlowSnapshotKt {
-    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
+    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, optional androidx.paging.testing.LoadErrorHandler onError, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
   }
 
   public final class SnapshotLoader<Value> {
diff --git a/paging/paging-testing/api/public_plus_experimental_current.txt b/paging/paging-testing/api/public_plus_experimental_current.txt
index 6f25f9e..33fda40 100644
--- a/paging/paging-testing/api/public_plus_experimental_current.txt
+++ b/paging/paging-testing/api/public_plus_experimental_current.txt
@@ -1,8 +1,20 @@
 // Signature format: 4.0
 package androidx.paging.testing {
 
+  public enum ErrorRecovery {
+    method public static androidx.paging.testing.ErrorRecovery valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.testing.ErrorRecovery[] values();
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETRY;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETURN_CURRENT_SNAPSHOT;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery THROW;
+  }
+
+  public fun interface LoadErrorHandler {
+    method public androidx.paging.testing.ErrorRecovery onError(androidx.paging.CombinedLoadStates combinedLoadStates);
+  }
+
   public final class PagerFlowSnapshotKt {
-    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
+    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, optional androidx.paging.testing.LoadErrorHandler onError, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
   }
 
   public final class SnapshotLoader<Value> {
diff --git a/paging/paging-testing/api/restricted_current.txt b/paging/paging-testing/api/restricted_current.txt
index 6f25f9e..33fda40 100644
--- a/paging/paging-testing/api/restricted_current.txt
+++ b/paging/paging-testing/api/restricted_current.txt
@@ -1,8 +1,20 @@
 // Signature format: 4.0
 package androidx.paging.testing {
 
+  public enum ErrorRecovery {
+    method public static androidx.paging.testing.ErrorRecovery valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.paging.testing.ErrorRecovery[] values();
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETRY;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery RETURN_CURRENT_SNAPSHOT;
+    enum_constant public static final androidx.paging.testing.ErrorRecovery THROW;
+  }
+
+  public fun interface LoadErrorHandler {
+    method public androidx.paging.testing.ErrorRecovery onError(androidx.paging.CombinedLoadStates combinedLoadStates);
+  }
+
   public final class PagerFlowSnapshotKt {
-    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
+    method public static suspend <Value> Object? asSnapshot(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>>, kotlinx.coroutines.CoroutineScope coroutineScope, optional androidx.paging.testing.LoadErrorHandler onError, kotlin.jvm.functions.Function2<? super androidx.paging.testing.SnapshotLoader<Value>,? super kotlin.coroutines.Continuation<kotlin.Unit>,?> loadOperations, kotlin.coroutines.Continuation<java.util.List<Value>>);
   }
 
   public final class SnapshotLoader<Value> {
diff --git a/paging/paging-testing/src/main/java/androidx/paging/testing/LoadErrorHandler.kt b/paging/paging-testing/src/main/java/androidx/paging/testing/LoadErrorHandler.kt
new file mode 100644
index 0000000..4651e95
--- /dev/null
+++ b/paging/paging-testing/src/main/java/androidx/paging/testing/LoadErrorHandler.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.testing
+
+import androidx.paging.CombinedLoadStates
+import androidx.paging.PagingDataDiffer
+import androidx.paging.PagingSource
+import androidx.paging.PagingSource.LoadResult
+import androidx.paging.LoadState
+
+/**
+ * An interface to implement the error recovery strategy when [PagingSource]
+ * returns a [LoadResult.Error].
+ */
+public fun interface LoadErrorHandler {
+    /**
+     * The lambda that should return an [ErrorRecovery] given the [CombinedLoadStates]
+     * indicating which [LoadState] contains the [LoadState.Error].
+     *
+     * Sample use case:
+     * val onError = LoadErrorHandler { combinedLoadStates ->
+     *     if (combinedLoadStates.refresh is LoadResult.Error) {
+     *         ErrorRecovery.RETRY
+     *     } else {
+     *         ErrorRecovery.THROW
+     *     }
+     * }
+     */
+    public fun onError(combinedLoadStates: CombinedLoadStates): ErrorRecovery
+}
+
+/**
+ * The method of recovery when [PagingSource] returns [LoadResult.Error]. The error
+ * is indicated when [PagingDataDiffer.loadStateFlow] emits a [CombinedLoadStates] where one or
+ * more of the [LoadState] is [LoadState.Error].
+ */
+public enum class ErrorRecovery {
+    /**
+     * Rethrow the original [Throwable][LoadState.Error.error] that was caught when loading from
+     * the data source.
+     */
+    THROW,
+
+    /**
+     * Retry the failed load. This does not guarantee a successful load as the data source
+     * may still return an error.
+     */
+    RETRY,
+
+    /**
+     * Returns a snapshot with any data that has been loaded up till the point of error.
+     */
+    RETURN_CURRENT_SNAPSHOT,
+}
\ No newline at end of file
diff --git a/paging/paging-testing/src/main/java/androidx/paging/testing/PagerFlowSnapshot.kt b/paging/paging-testing/src/main/java/androidx/paging/testing/PagerFlowSnapshot.kt
index 8b8daf7..cc18526 100644
--- a/paging/paging-testing/src/main/java/androidx/paging/testing/PagerFlowSnapshot.kt
+++ b/paging/paging-testing/src/main/java/androidx/paging/testing/PagerFlowSnapshot.kt
@@ -25,6 +25,9 @@
 import androidx.paging.Pager
 import androidx.paging.PagingData
 import androidx.paging.PagingDataDiffer
+import androidx.paging.testing.ErrorRecovery.THROW
+import androidx.paging.testing.ErrorRecovery.RETRY
+import androidx.paging.testing.ErrorRecovery.RETURN_CURRENT_SNAPSHOT
 import androidx.paging.testing.LoaderCallback.CallbackType.ON_CHANGED
 import androidx.paging.testing.LoaderCallback.CallbackType.ON_INSERTED
 import androidx.paging.testing.LoaderCallback.CallbackType.ON_REMOVED
@@ -46,10 +49,14 @@
  * @param coroutineScope The [CoroutineScope] to collect from this Flow<PagingData> and contains
  * the [CoroutineScope.coroutineContext] to load data from.
  *
+ * @param onError The error recovery strategy when PagingSource returns LoadResult.Error. A lambda
+ * that returns an [ErrorRecovery] value. The default strategy is [ErrorRecovery.THROW].
+ *
  * @param loadOperations The block containing [SnapshotLoader] load operations.
  */
 public suspend fun <Value : Any> Flow<PagingData<Value>>.asSnapshot(
     coroutineScope: CoroutineScope,
+    onError: LoadErrorHandler = LoadErrorHandler { THROW },
     loadOperations: suspend SnapshotLoader<Value>.() -> @JvmSuppressWildcards Unit
 ): @JvmSuppressWildcards List<Value> {
 
@@ -104,7 +111,7 @@
         }
     }
 
-    loader = SnapshotLoader(differ)
+    loader = SnapshotLoader(differ, onError)
 
     /**
      * Launches collection on this [Pager.flow].
@@ -128,11 +135,17 @@
      * Returns a List of loaded data.
      */
     return withContext(coroutineScope.coroutineContext) {
-        differ.awaitNotLoading()
-        loader.loadOperations()
-        differ.awaitNotLoading()
-
-        collectPagingData.cancelAndJoin()
+        try {
+            differ.awaitNotLoading(onError)
+            loader.loadOperations()
+            differ.awaitNotLoading(onError)
+        } catch (stub: ReturnSnapshotStub) {
+            // we just want to stub and return snapshot early
+        } catch (throwable: Throwable) {
+            throw throwable
+        } finally {
+            collectPagingData.cancelAndJoin()
+        }
 
         differ.snapshot().items
     }
@@ -149,12 +162,31 @@
  * incoming `Loading` state.
  */
 @OptIn(kotlinx.coroutines.FlowPreview::class)
-internal suspend fun <Value : Any> PagingDataDiffer<Value>.awaitNotLoading() {
-    loadStateFlow.filterNotNull().debounce(1).filter {
-        it.isIdle()
+internal suspend fun <Value : Any> PagingDataDiffer<Value>.awaitNotLoading(
+    errorHandler: LoadErrorHandler
+) {
+    val state = loadStateFlow.filterNotNull().debounce(1).filter {
+        it.isIdle() || it.hasError()
     }.firstOrNull()
+
+    if (state != null && state.hasError()) {
+        handleLoadError(state, errorHandler)
+    }
 }
 
+internal fun <Value : Any> PagingDataDiffer<Value>.handleLoadError(
+    state: CombinedLoadStates,
+    errorHandler: LoadErrorHandler
+) {
+    val recovery = errorHandler.onError(state)
+    when (recovery) {
+        THROW -> throw (state.getErrorState()).error
+        RETRY -> retry()
+        RETURN_CURRENT_SNAPSHOT -> throw ReturnSnapshotStub()
+    }
+}
+private class ReturnSnapshotStub : Exception()
+
 private fun CombinedLoadStates?.isIdle(): Boolean {
     if (this == null) return false
     return source.isIdle() && mediator?.isIdle() ?: true
@@ -165,6 +197,26 @@
         prepend is LoadState.NotLoading
 }
 
+private fun CombinedLoadStates?.hasError(): Boolean {
+    if (this == null) return false
+    return source.hasError() || mediator?.hasError() ?: false
+}
+
+private fun LoadStates.hasError(): Boolean {
+    return refresh is LoadState.Error || append is LoadState.Error ||
+        prepend is LoadState.Error
+}
+
+private fun CombinedLoadStates.getErrorState(): LoadState.Error {
+    return if (refresh is LoadState.Error) {
+        refresh as LoadState.Error
+    } else if (append is LoadState.Error) {
+        append as LoadState.Error
+    } else {
+        prepend as LoadState.Error
+    }
+}
+
 private fun <Value : Any> incrementGeneration(loader: SnapshotLoader<Value>) {
     val currGen = loader.generations.value
     if (currGen.id == loader.generations.value.id) {
diff --git a/paging/paging-testing/src/main/java/androidx/paging/testing/SnapshotLoader.kt b/paging/paging-testing/src/main/java/androidx/paging/testing/SnapshotLoader.kt
index fbb8cde..f58f866 100644
--- a/paging/paging-testing/src/main/java/androidx/paging/testing/SnapshotLoader.kt
+++ b/paging/paging-testing/src/main/java/androidx/paging/testing/SnapshotLoader.kt
@@ -39,7 +39,8 @@
  * [PagingDataDiffer] operations.
  */
 public class SnapshotLoader<Value : Any> internal constructor(
-    private val differ: PagingDataDiffer<Value>
+    private val differ: PagingDataDiffer<Value>,
+    private val errorHandler: LoadErrorHandler,
 ) {
     internal val generations = MutableStateFlow(Generation())
 
@@ -52,9 +53,9 @@
      * This fake paging operation mimics UI-driven refresh signals such as swipe-to-refresh.
      */
     public suspend fun refresh(): @JvmSuppressWildcards Unit {
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         differ.refresh()
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
     }
 
     /**
@@ -79,9 +80,9 @@
     public suspend fun appendScrollWhile(
         predicate: (item: @JvmSuppressWildcards Value) -> @JvmSuppressWildcards Boolean
     ): @JvmSuppressWildcards Unit {
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         appendOrPrependScrollWhile(LoadType.APPEND, predicate)
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
     }
 
     /**
@@ -106,9 +107,9 @@
     public suspend fun prependScrollWhile(
         predicate: (item: @JvmSuppressWildcards Value) -> @JvmSuppressWildcards Boolean
     ): @JvmSuppressWildcards Unit {
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         appendOrPrependScrollWhile(LoadType.PREPEND, predicate)
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
     }
 
     private suspend fun appendOrPrependScrollWhile(
@@ -160,9 +161,9 @@
      * be loaded in. Supports jumping.
      */
     public suspend fun scrollTo(index: Int): @JvmSuppressWildcards Unit {
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         appendOrPrependScrollTo(index)
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
     }
 
     /**
@@ -223,9 +224,9 @@
      * to scroll.
      */
     public suspend fun flingTo(index: Int): @JvmSuppressWildcards Unit {
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         appendOrPrependFlingTo(index)
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
     }
 
     /**
@@ -365,7 +366,7 @@
     @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
     private suspend fun awaitLoad(index: Int): Pair<Value, Int> {
         differ[index]
-        differ.awaitNotLoading()
+        differ.awaitNotLoading(errorHandler)
         var offsetIndex = index
 
         // awaits for the item to be loaded
diff --git a/paging/paging-testing/src/test/kotlin/androidx/paging/testing/PagerFlowSnapshotTest.kt b/paging/paging-testing/src/test/kotlin/androidx/paging/testing/PagerFlowSnapshotTest.kt
index 8150e6f..d04d7f9 100644
--- a/paging/paging-testing/src/test/kotlin/androidx/paging/testing/PagerFlowSnapshotTest.kt
+++ b/paging/paging-testing/src/test/kotlin/androidx/paging/testing/PagerFlowSnapshotTest.kt
@@ -19,10 +19,12 @@
 import androidx.paging.Pager
 import androidx.paging.PagingConfig
 import androidx.paging.PagingSource
+import androidx.paging.PagingSource.LoadParams
 import androidx.paging.PagingState
 import androidx.paging.cachedIn
 import androidx.paging.insertSeparators
 import com.google.common.truth.Truth.assertThat
+import kotlin.test.assertFailsWith
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
@@ -2139,6 +2141,143 @@
         }
     }
 
+    @Test
+    fun errorHandler_throw() {
+        val dataFlow = flowOf(List(30) { it })
+        val factory = createFactory(dataFlow)
+        val pagingSources = mutableListOf<TestPagingSource>()
+        val pager = Pager(
+            config = PagingConfig(pageSize = 3, initialLoadSize = 5),
+            pagingSourceFactory = {
+                factory.invoke().also { pagingSources.add(it as TestPagingSource) }
+            },
+        ).flow
+        testScope.runTest {
+            val error = assertFailsWith(IllegalArgumentException::class) {
+                pager.asSnapshot(
+                    coroutineScope = this,
+                    onError = { ErrorRecovery.THROW }
+                ) {
+                    val source = pagingSources.first()
+                    source.errorOnNextLoad = true
+                    scrollTo(12)
+                }
+            }
+            assertThat(error.message).isEqualTo("PagingSource load error")
+        }
+    }
+
+    @Test
+    fun errorHandler_retry() {
+        val dataFlow = flowOf(List(30) { it })
+        val factory = createFactory(dataFlow)
+        val pagingSources = mutableListOf<TestPagingSource>()
+        val pager = Pager(
+            config = PagingConfig(pageSize = 3, initialLoadSize = 5),
+            pagingSourceFactory = {
+                factory.invoke().also { pagingSources.add(it as TestPagingSource) }
+            },
+        ).flow
+        testScope.runTest {
+            val snapshot = pager.asSnapshot(
+                coroutineScope = this,
+                onError = { ErrorRecovery.RETRY }
+            ) {
+                val source = pagingSources.first()
+                // should have two loads to far - refresh and append(prefetch)
+                assertThat(source.loads.size).isEqualTo(2)
+
+                // throw error on next load, should trigger a retry
+                source.errorOnNextLoad = true
+                scrollTo(7)
+
+                // make sure it did retry
+                assertThat(source.loads.size).isEqualTo(4)
+                // failed load
+                val failedLoad = source.loads[2]
+                assertThat(failedLoad is LoadParams.Append).isTrue()
+                assertThat(failedLoad.key).isEqualTo(8)
+                // retry load
+                val retryLoad = source.loads[3]
+                assertThat(retryLoad is LoadParams.Append).isTrue()
+                assertThat(retryLoad.key).isEqualTo(8)
+            }
+            // retry success
+            assertThat(snapshot).containsExactlyElementsIn(
+                listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+            )
+        }
+    }
+
+    @Test
+    fun errorHandler_retryFails() {
+        val dataFlow = flowOf(List(30) { it })
+        val factory = createFactory(dataFlow)
+        val pagingSources = mutableListOf<TestPagingSource>()
+        val pager = Pager(
+            config = PagingConfig(pageSize = 3, initialLoadSize = 5),
+            pagingSourceFactory = {
+                factory.invoke().also { pagingSources.add(it as TestPagingSource) }
+            },
+        ).flow
+        var retryCount = 0
+        testScope.runTest {
+            val snapshot = pager.asSnapshot(
+                coroutineScope = this,
+                onError = {
+                    // retry twice
+                    if (retryCount < 2) {
+                        retryCount++
+                        ErrorRecovery.RETRY
+                    } else {
+                        ErrorRecovery.RETURN_CURRENT_SNAPSHOT
+                    }
+                }
+            ) {
+                val source = pagingSources.first()
+                // should have two loads to far - refresh and append(prefetch)
+                assertThat(source.loads.size).isEqualTo(2)
+
+                source.errorOnLoads = true
+                scrollTo(8)
+
+                // additional failed load + two retries
+                assertThat(source.loads.size).isEqualTo(5)
+            }
+            // retry failed, returned existing snapshot
+            assertThat(snapshot).containsExactlyElementsIn(
+                listOf(0, 1, 2, 3, 4, 5, 6, 7)
+            )
+        }
+    }
+
+    @Test
+    fun errorHandler_returnSnapshot() {
+        val dataFlow = flowOf(List(30) { it })
+        val factory = createFactory(dataFlow)
+        val pagingSources = mutableListOf<TestPagingSource>()
+        val pager = Pager(
+            config = PagingConfig(pageSize = 3, initialLoadSize = 5),
+            pagingSourceFactory = {
+                factory.invoke().also { pagingSources.add(it as TestPagingSource) }
+            },
+        ).flow
+        testScope.runTest {
+            val snapshot = pager.asSnapshot(
+                coroutineScope = this,
+                onError = { ErrorRecovery.RETURN_CURRENT_SNAPSHOT }
+            ) {
+                val source = pagingSources.first()
+                source.errorOnNextLoad = true
+                scrollTo(12)
+            }
+            // snapshot items before scrollTo
+            assertThat(snapshot).containsExactlyElementsIn(
+                listOf(0, 1, 2, 3, 4, 5, 6, 7)
+            )
+        }
+    }
+
     private fun createPager(dataFlow: Flow<List<Int>>, initialKey: Int = 0) =
         createPager(
             dataFlow,
@@ -2200,6 +2339,13 @@
     private val originalSource: PagingSource<Int, Int>,
     private val loadDelay: Long,
 ) : PagingSource<Int, Int>() {
+
+    var errorOnNextLoad = false
+    var errorOnLoads = false
+    private val _loads = mutableListOf<LoadParams<Int>>()
+    val loads: List<LoadParams<Int>>
+        get() = _loads.toList()
+
     init {
         originalSource.registerInvalidatedCallback {
             invalidate()
@@ -2207,6 +2353,14 @@
     }
     override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Int> {
         delay(loadDelay)
+        _loads.add(params)
+        if (errorOnNextLoad) {
+            errorOnNextLoad = false
+            return LoadResult.Error(IllegalArgumentException("PagingSource load error"))
+        }
+        if (errorOnLoads) {
+            return LoadResult.Error(IllegalArgumentException("PagingSource load error"))
+        }
         return originalSource.load(params)
     }
 
diff --git a/percentlayout/OWNERS b/percentlayout/OWNERS
index 20eea7c..c49ddc7 100644
--- a/percentlayout/OWNERS
+++ b/percentlayout/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461485
 alanv@google.com
diff --git a/playground-common/README.md b/playground-common/README.md
index af45e5a..0f8c038 100644
--- a/playground-common/README.md
+++ b/playground-common/README.md
@@ -23,7 +23,7 @@
 To share as much common configuration as possible, it is also recommended
 to symlink some common files like `gradle` and `.idea` configuration.
 
-To do that, execute "setup-playground.sh" comamnd in your playground directory.
+To do that, execute "setup-playground.sh" command in your playground directory.
 ```
 cd room;
 ../playground-common/setup-playground.sh
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 597d61c..9438697 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -25,7 +25,7 @@
 kotlin.code.style=official
 # Disable docs
 androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=9519019
+androidx.playground.snapshotBuildId=9534496
 androidx.playground.metalavaBuildId=9508658
 androidx.playground.dokkaBuildId=7472101
 androidx.studio.type=playground
diff --git a/print/OWNERS b/print/OWNERS
deleted file mode 100644
index a9a2145..0000000
--- a/print/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-moltmann@google.com
-svetoslavganov@google.com
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkTest.kt
index 4d334f8..a2fcfc5 100644
--- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkTest.kt
+++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkTest.kt
@@ -45,6 +45,7 @@
             "com/mysdk/IMySdk.java",
             "com/mysdk/IMySecondInterface.java",
             "com/mysdk/IMyUiInterface.java",
+            "com/mysdk/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java",
             "com/mysdk/IMySecondInterfaceTransactionCallback.java",
             "com/mysdk/IResponseTransactionCallback.java",
             "com/mysdk/IStringTransactionCallback.java",
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorTest.kt
index dea1e4a..29664ab 100644
--- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorTest.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorTest.kt
@@ -29,6 +29,8 @@
         "com/sdk/IMyInterface.java",
         "com/sdk/IMySecondInterface.java",
         "com/sdk/IMyInterfaceTransactionCallback.java",
+        "com/sdk/IMySecondInterfaceTransactionCallback.java",
+        "com/sdk/IMySecondInterfaceCoreLibInfoAndBinderWrapper.java",
         "com/sdk/IIntTransactionCallback.java",
         "com/sdk/ICancellationSignal.java",
         "com/sdk/ParcelableStackFrame.java",
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/input/com/sdk/MySdk.kt b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/input/com/sdk/MySdk.kt
index b64faf5..74b3e78 100644
--- a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/input/com/sdk/MySdk.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/input/com/sdk/MySdk.kt
@@ -1,5 +1,6 @@
 package com.sdk
 
+import androidx.privacysandbox.tools.PrivacySandboxValue
 import androidx.privacysandbox.tools.PrivacySandboxInterface
 import androidx.privacysandbox.tools.PrivacySandboxService
 import androidx.privacysandbox.ui.core.SandboxedUiAdapter
@@ -9,6 +10,8 @@
     suspend fun getInterface(): MyInterface
 
     suspend fun maybeGetInterface(): MyInterface?
+
+    suspend fun getUiInterface(): MySecondInterface
 }
 
 @PrivacySandboxInterface
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdk.kt b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdk.kt
index 8b3e16e..df137b4 100644
--- a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdk.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdk.kt
@@ -3,5 +3,7 @@
 public interface MySdk {
     public suspend fun getInterface(): MyInterface
 
+    public suspend fun getUiInterface(): MySecondInterface
+
     public suspend fun maybeGetInterface(): MyInterface?
 }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdkClientProxy.kt b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdkClientProxy.kt
index f898c9c..19a398a 100644
--- a/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdkClientProxy.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/test/test-data/interfaces/output/com/sdk/MySdkClientProxy.kt
@@ -1,5 +1,6 @@
 package com.sdk
 
+import androidx.privacysandbox.ui.client.SandboxedUiAdapterFactory
 import com.sdk.PrivacySandboxThrowableParcelConverter
 import com.sdk.PrivacySandboxThrowableParcelConverter.fromThrowableParcel
 import kotlin.coroutines.resumeWithException
@@ -30,6 +31,29 @@
         }
     }
 
+    public override suspend fun getUiInterface(): MySecondInterface = suspendCancellableCoroutine {
+        var mCancellationSignal: ICancellationSignal? = null
+        val transactionCallback = object: IMySecondInterfaceTransactionCallback.Stub() {
+            override fun onCancellable(cancellationSignal: ICancellationSignal) {
+                if (it.isCancelled) {
+                    cancellationSignal.cancel()
+                }
+                mCancellationSignal = cancellationSignal
+            }
+            override fun onSuccess(result: IMySecondInterfaceCoreLibInfoAndBinderWrapper) {
+                it.resumeWith(Result.success(MySecondInterfaceClientProxy(result.binder,
+                        SandboxedUiAdapterFactory.createFromCoreLibInfo(result.coreLibInfo))))
+            }
+            override fun onFailure(throwableParcel: PrivacySandboxThrowableParcel) {
+                it.resumeWithException(fromThrowableParcel(throwableParcel))
+            }
+        }
+        remote.getUiInterface(transactionCallback)
+        it.invokeOnCancellation {
+            mCancellationSignal?.cancel()
+        }
+    }
+
     public override suspend fun maybeGetInterface(): MyInterface? = suspendCancellableCoroutine {
         var mCancellationSignal: ICancellationSignal? = null
         val transactionCallback = object: IMyInterfaceTransactionCallback.Stub() {
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt
index 5b7307c..27091fa 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt
@@ -21,6 +21,7 @@
 import androidx.privacysandbox.tools.core.generator.poet.AidlInterfaceSpec.Companion.aidlInterface
 import androidx.privacysandbox.tools.core.generator.poet.AidlMethodSpec
 import androidx.privacysandbox.tools.core.generator.poet.AidlParcelableSpec.Companion.aidlParcelable
+import androidx.privacysandbox.tools.core.generator.poet.AidlTypeKind
 import androidx.privacysandbox.tools.core.generator.poet.AidlTypeSpec
 import androidx.privacysandbox.tools.core.model.AnnotatedInterface
 import androidx.privacysandbox.tools.core.model.AnnotatedValue
@@ -32,6 +33,7 @@
 import androidx.privacysandbox.tools.core.model.Types.asNonNull
 import androidx.privacysandbox.tools.core.model.getOnlyService
 import androidx.privacysandbox.tools.core.model.hasSuspendFunctions
+import androidx.privacysandbox.tools.core.model.hasUiInterfaces
 import java.io.File
 import java.nio.file.Path
 import java.nio.file.Paths
@@ -78,12 +80,17 @@
 
     private fun compileAidlInterfaces(aidlSources: List<GeneratedSource>): List<GeneratedSource> {
         aidlCompiler.compile(workingDir, aidlSources.map { it.file.toPath() })
-        val javaSources = aidlSources.map {
-            GeneratedSource(
-                packageName = it.packageName,
-                interfaceName = it.interfaceName,
-                file = getJavaFileForAidlFile(it.file)
-            )
+        val javaSources = aidlSources.mapNotNull {
+            if (it.packageName == bundleType().packageName) {
+                // TODO(b/265266769): use framework stubs so we can stop special Bundle treatment
+                null
+            } else {
+                GeneratedSource(
+                    packageName = it.packageName,
+                    interfaceName = it.interfaceName,
+                    file = getJavaFileForAidlFile(it.file)
+                )
+            }
         }
         javaSources.forEach {
             check(it.file.exists()) {
@@ -96,21 +103,40 @@
     private fun generateAidlContent(): List<AidlFileSpec> {
         val values = api.values.map(::generateValue)
         val service = aidlInterface(api.getOnlyService())
-        val customCallbacks = api.callbacks.map(::aidlInterface)
-        val interfaces = api.interfaces.map(::aidlInterface)
+        val customCallbacks = api.callbacks.flatMap(::aidlInterface)
+        val interfaces = api.interfaces.flatMap(::aidlInterface)
         val suspendFunctionUtilities = generateSuspendFunctionUtilities()
+        val fakeBundle = generateFakeBundle()
         return suspendFunctionUtilities +
             service +
             values +
             customCallbacks +
-            interfaces
+            interfaces +
+            fakeBundle
     }
 
-    private fun aidlInterface(annotatedInterface: AnnotatedInterface) =
-        aidlInterface(Type(annotatedInterface.type.packageName, annotatedInterface.aidlName())) {
+    private fun aidlInterface(annotatedInterface: AnnotatedInterface): List<AidlFileSpec> {
+        val interfaceFile = aidlInterface(
+            Type(annotatedInterface.type.packageName, annotatedInterface.aidlName())
+        ) {
             annotatedInterface.methods.forEach { addMethod(it) }
         }
 
+        return buildList {
+            if (annotatedInterface.inheritsSandboxedUiAdapter) {
+                val uiWrapper = aidlParcelable(annotatedInterface.uiAdapterAidlWrapper()) {
+                    addProperty(
+                        "coreLibInfo",
+                        AidlTypeSpec(bundleType(), kind = AidlTypeKind.PARCELABLE)
+                    )
+                    addProperty("binder", annotatedInterface.aidlType())
+                }
+                add(uiWrapper)
+            }
+            add(interfaceFile)
+        }
+    }
+
     private fun AidlInterfaceSpec.Builder.addMethod(method: Method) {
         addMethod(method.name) {
             method.parameters.forEach { addParameter(it) }
@@ -128,11 +154,14 @@
             "Void cannot be a parameter type."
         }
         val aidlType = getAidlTypeDeclaration(parameter.type)
-        addParameter(
-            parameter.name,
-            aidlType,
-            isIn = api.valueMap.containsKey(parameter.type.asNonNull()) || aidlType.isList
-        )
+
+        addParameter(parameter.name, aidlType)
+    }
+
+    // TODO(b/265266769): Use framework stubs for Bundle
+    private fun generateFakeBundle(): List<AidlFileSpec> {
+        if (!api.hasUiInterfaces()) return emptyList()
+        return listOf(aidlParcelable(bundleType()))
     }
 
     private fun generateSuspendFunctionUtilities(): List<AidlFileSpec> {
@@ -158,10 +187,26 @@
                 addParameter("cancellationSignal", cancellationSignalType())
             }
             addMethod("onSuccess") {
-                if (type != Types.unit) addParameter(Parameter("result", type))
+                val interfaceType = api.interfaceMap[type]
+                if (interfaceType != null && interfaceType.inheritsSandboxedUiAdapter) {
+                    // Bypass getAidlTypeDeclaration, since we want to specify the UI wrapper
+                    // parcelable rather than the interface.
+                    addParameter(
+                        "result",
+                        AidlTypeSpec(
+                            interfaceType.uiAdapterAidlWrapper(),
+                            kind = AidlTypeKind.PARCELABLE
+                        )
+                    )
+                } else if (type != Types.unit) {
+                    addParameter(Parameter("result", type))
+                }
             }
             addMethod("onFailure") {
-                addParameter("throwableParcel", AidlTypeSpec(throwableParcelType()), isIn = true)
+                addParameter(
+                    "throwableParcel",
+                    AidlTypeSpec(throwableParcelType(), kind = AidlTypeKind.PARCELABLE)
+                )
             }
         }
     }
@@ -174,10 +219,21 @@
         return aidlParcelable(throwableParcelType()) {
             addProperty("exceptionClass", primitive("String"))
             addProperty("errorMessage", primitive("String"))
-            addProperty("stackTrace", AidlTypeSpec(parcelableStackFrameType(), isList = true))
-            addProperty("cause", AidlTypeSpec(throwableParcelType(), isList = true))
             addProperty(
-                "suppressedExceptions", AidlTypeSpec(throwableParcelType(), isList = true)
+                "stackTrace",
+                AidlTypeSpec(
+                    parcelableStackFrameType(),
+                    isList = true,
+                    kind = AidlTypeKind.PARCELABLE
+                )
+            )
+            addProperty(
+                "cause",
+                AidlTypeSpec(throwableParcelType(), isList = true, kind = AidlTypeKind.PARCELABLE)
+            )
+            addProperty(
+                "suppressedExceptions",
+                AidlTypeSpec(throwableParcelType(), isList = true, kind = AidlTypeKind.PARCELABLE)
             )
         }
     }
@@ -213,11 +269,18 @@
     }
 
     private fun packageName() = api.getOnlyService().type.packageName
-    private fun cancellationSignalType() = AidlTypeSpec(Type(packageName(), cancellationSignalName))
+    private fun cancellationSignalType() =
+        AidlTypeSpec(Type(packageName(), cancellationSignalName), kind = AidlTypeKind.INTERFACE)
+
     private fun throwableParcelType() = Type(packageName(), throwableParcelName)
     private fun parcelableStackFrameType() = Type(packageName(), parcelableStackFrameName)
+    private fun bundleType() = Type("android.os", "Bundle")
+
     private fun transactionCallback(type: Type) =
-        AidlTypeSpec(Type(api.getOnlyService().type.packageName, type.transactionCallbackName()))
+        AidlTypeSpec(
+            Type(api.getOnlyService().type.packageName, type.transactionCallbackName()),
+            kind = AidlTypeKind.INTERFACE
+        )
 
     private fun getAidlTypeDeclaration(rawType: Type): AidlTypeSpec {
         val type = wrapWithListIfNeeded(rawType)
@@ -254,18 +317,31 @@
     }
 }
 
-fun AnnotatedInterface.aidlName() = "I${type.simpleName}"
+fun AnnotatedInterface.aidlName(): String = "I${type.simpleName}"
 
 fun Type.transactionCallbackName() =
     "I${simpleName}${typeParameters.joinToString("") { it.simpleName }}TransactionCallback"
 
 internal fun AnnotatedValue.aidlType() =
-    AidlTypeSpec(Type(type.packageName, "Parcelable${type.simpleName}"))
+    AidlTypeSpec(
+        Type(type.packageName, "Parcelable${type.simpleName}"),
+        kind = AidlTypeKind.PARCELABLE
+    )
 
-internal fun AnnotatedInterface.aidlType() = AidlTypeSpec(Type(type.packageName, aidlName()))
+internal fun AnnotatedInterface.aidlType() =
+    AidlTypeSpec(Type(type.packageName, aidlName()), kind = AidlTypeKind.INTERFACE)
+
+internal fun AnnotatedInterface.uiAdapterAidlWrapper(): Type {
+    if (!inheritsSandboxedUiAdapter) {
+        throw IllegalArgumentException(
+            "Cannot get UI adapter AIDL wrapper type of non-UI interface"
+        )
+    }
+    return Type(type.packageName, "I${type.simpleName}CoreLibInfoAndBinderWrapper")
+}
 
 internal fun primitive(name: String, isList: Boolean = false) =
-    AidlTypeSpec(Type("", name), requiresImport = false, isList = isList)
+    AidlTypeSpec(Type("", name), isList = isList, kind = AidlTypeKind.PRIMITIVE)
 
 /**
  * Removes nullability from a type, and applies necessary changes to represent it in AIDL.
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt
index ec1cb96..33d8ebf 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt
@@ -190,6 +190,9 @@
         }
         val sandboxInterface = api.interfaceMap[type]
         if (sandboxInterface != null) {
+            if (sandboxInterface.inheritsSandboxedUiAdapter) {
+                return sandboxInterface.uiAdapterAidlWrapper().poetTypeName()
+            }
             return sandboxInterface.aidlType().innerType.poetTypeName()
         }
         if (type.qualifiedName == List::class.qualifiedName)
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt
index 679197d..a63fbf1 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt
@@ -18,13 +18,30 @@
 
 import androidx.privacysandbox.tools.core.model.AnnotatedInterface
 import androidx.privacysandbox.tools.core.model.ParsedApi
+import com.squareup.kotlinpoet.ClassName
 import com.squareup.kotlinpoet.CodeBlock
 
 class ClientBinderCodeConverter(api: ParsedApi) : BinderCodeConverter(api) {
+    companion object {
+        val sandboxedUiAdapterFactoryClass =
+            ClassName("androidx.privacysandbox.ui.client", "SandboxedUiAdapterFactory")
+    }
+
     override fun convertToInterfaceModelCode(
         annotatedInterface: AnnotatedInterface,
         expression: String
-    ): CodeBlock = CodeBlock.of("%T(%L)", annotatedInterface.clientProxyNameSpec(), expression)
+    ): CodeBlock {
+        if (annotatedInterface.inheritsSandboxedUiAdapter) {
+            return CodeBlock.of(
+                "%T(%L.binder, %T.createFromCoreLibInfo(%L.coreLibInfo))",
+                annotatedInterface.clientProxyNameSpec(),
+                expression,
+                sandboxedUiAdapterFactoryClass,
+                expression,
+            )
+        }
+        return CodeBlock.of("%T(%L)", annotatedInterface.clientProxyNameSpec(), expression)
+    }
 
     override fun convertToInterfaceBinderCode(
         annotatedInterface: AnnotatedInterface,
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt
index db27169..ce117d6 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt
@@ -26,8 +26,8 @@
             parameters.add(parameter)
         }
 
-        fun addParameter(name: String, type: AidlTypeSpec, isIn: Boolean = false) {
-            addParameter(AidlParameterSpec(name, type, isIn))
+        fun addParameter(name: String, type: AidlTypeSpec) {
+            addParameter(AidlParameterSpec(name, type, isIn = type.isList || type.isParcelable))
         }
 
         fun build() = AidlMethodSpec(name, parameters)
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlTypeSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlTypeSpec.kt
index f87cf6d..4aeb180 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlTypeSpec.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlTypeSpec.kt
@@ -18,9 +18,15 @@
 
 import androidx.privacysandbox.tools.core.model.Type
 
+internal enum class AidlTypeKind {
+    PRIMITIVE,
+    PARCELABLE,
+    INTERFACE,
+}
+
 internal data class AidlTypeSpec(
     val innerType: Type,
-    val requiresImport: Boolean = true,
+    val kind: AidlTypeKind,
     val isList: Boolean = false,
 ) {
     override fun toString() = buildString {
@@ -31,6 +37,9 @@
     /** Returns a new type spec representing a list of this type. */
     fun listSpec(): AidlTypeSpec {
         require(!isList) { "Nested lists are not supported." }
-        return AidlTypeSpec(innerType, requiresImport, isList = true)
+        return copy(isList = true)
     }
+
+    val requiresImport = kind != AidlTypeKind.PRIMITIVE
+    val isParcelable = kind == AidlTypeKind.PARCELABLE
 }
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/AnnotatedInterface.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/AnnotatedInterface.kt
index 070df87..dc289c6 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/AnnotatedInterface.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/AnnotatedInterface.kt
@@ -26,4 +26,6 @@
      */
     val superTypes: List<Type> = emptyList(),
     val methods: List<Method> = emptyList(),
-)
\ No newline at end of file
+) {
+    val inheritsSandboxedUiAdapter = superTypes.contains(Types.sandboxedUiAdapter)
+}
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt
index 88245e9..7b61ecc 100644
--- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt
+++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt
@@ -30,6 +30,10 @@
         .any(Method::isSuspend)
 }
 
+fun ParsedApi.hasUiInterfaces(): Boolean {
+    return interfaces.any { it.inheritsSandboxedUiAdapter }
+}
+
 object Types {
     val unit = Type(packageName = "kotlin", simpleName = "Unit")
     val boolean = Type(packageName = "kotlin", simpleName = "Boolean")
diff --git a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/LibraryStubs.kt b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/LibraryStubs.kt
index b51203a..b73cc1f 100644
--- a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/LibraryStubs.kt
+++ b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/LibraryStubs.kt
@@ -111,6 +111,43 @@
         |}
         |""".trimMargin()
     ),
+    Source.kotlin(
+        "androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt", """
+        |package androidx.privacysandbox.ui.client
+        |import android.content.Context
+        |import android.hardware.display.DisplayManager
+        |import android.os.Binder
+        |import android.os.Build
+        |import android.os.Bundle
+        |import android.view.Display
+        |import android.view.SurfaceControlViewHost
+        |import android.view.SurfaceView
+        |import android.view.View
+        |import androidx.annotation.NonNull
+        |import androidx.annotation.RequiresApi
+        |import androidx.privacysandbox.ui.core.SandboxedUiAdapter
+        |import java.util.concurrent.Executor
+        |@RequiresApi(Build.VERSION_CODES.TIRAMISU)
+        |object SandboxedUiAdapterFactory {
+        |    fun createFromCoreLibInfo(coreLibInfo: Bundle): SandboxedUiAdapter {
+        |        return RemoteAdapter(coreLibInfo)
+        |    }
+        |    private class RemoteAdapter(private val coreLibInfo: Bundle) :
+        |        SandboxedUiAdapter {
+        |        override fun openSession(
+        |            context: Context,
+        |            initialWidth: Int,
+        |            initialHeight: Int,
+        |            isZOrderOnTop: Boolean,
+        |            clientExecutor: Executor,
+        |            client: SandboxedUiAdapter.SessionClient
+        |        ) {
+        |            // This space intentionally left blank
+        |        }
+        |    }
+        |}
+        |""".trimMargin()
+    ),
 )
 
 val allTestLibraryStubs = syntheticSdkRuntimeLibraryStubs + syntheticUiLibraryStubs
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
index c0b0036..9dc8728 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
@@ -224,8 +224,8 @@
     @DiagnosticCode public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4;
 
     /**
-     * Indicates that the profile is compressed and a newer version of bundletool needs to be used
-     * to build the app.
+     * Indicates that the profile is compressed and a version of bundletool newer than 1.13.2
+     * needs to be used to build the app.
      */
     @DiagnosticCode public static final int DIAGNOSTIC_PROFILE_IS_COMPRESSED = 5;
 
diff --git a/recommendation/OWNERS b/recommendation/OWNERS
index 063702c..25b28ca 100644
--- a/recommendation/OWNERS
+++ b/recommendation/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461462
 dake@google.com
\ No newline at end of file
diff --git a/recyclerview/recyclerview-lint/src/main/java/androidx/recyclerview/lint/RecyclerViewIssueRegistry.kt b/recyclerview/recyclerview-lint/src/main/java/androidx/recyclerview/lint/RecyclerViewIssueRegistry.kt
index 4e2d8ab..877177f 100644
--- a/recyclerview/recyclerview-lint/src/main/java/androidx/recyclerview/lint/RecyclerViewIssueRegistry.kt
+++ b/recyclerview/recyclerview-lint/src/main/java/androidx/recyclerview/lint/RecyclerViewIssueRegistry.kt
@@ -25,7 +25,7 @@
 
 class RecyclerViewIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues: List<Issue>
         get() = listOf(
             InvalidSetHasFixedSizeDetector.ISSUE
diff --git a/recyclerview/recyclerview-selection/OWNERS b/recyclerview/recyclerview-selection/OWNERS
deleted file mode 100644
index 779e918..0000000
--- a/recyclerview/recyclerview-selection/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-smckay@google.com
\ No newline at end of file
diff --git a/remotecallback/OWNERS b/remotecallback/OWNERS
index 3c245e9..7622b0d 100644
--- a/remotecallback/OWNERS
+++ b/remotecallback/OWNERS
@@ -1,3 +1,2 @@
-jmonk@android.com
-jmonk@google.com
+# Bug component: 606975
 madym@google.com
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index bc91f86..664b125 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -130,8 +130,13 @@
 ksp {
     arg("room.schemaLocation","$projectDir/schemas-ksp".toString())
 }
+
+// Commented out as workaround suggested by KSP team due to bug in KSP 1.8.10-1.0.9
+// TODO: Tracking as b/267692813
+/*
 tasks.withType(KspTask).configureEach { kspTask ->
     if (kspTask.name.contains("GenKotlin")) {
         kspTask.apOptions.put("room.generateKotlin", "true")
     }
 }
+*/
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BoxedNonNullTypesTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BoxedNonNullTypesTest.kt
index ad51bc4..4e010f3 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BoxedNonNullTypesTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/BoxedNonNullTypesTest.kt
@@ -212,6 +212,7 @@
         @Query("SELECT value FROM MyEntity")
         fun getAsList(): List<Long>
 
+        @Suppress("ROOM_UNNECESSARY_NULLABILITY_IN_DAO_RETURN_TYPE")
         @Query("SELECT value FROM MyNullableEntity")
         fun getAsNullableList(): List<Long?>
 
diff --git a/room/room-compiler-processing/OWNERS b/room/room-compiler-processing/OWNERS
index 23a1553..0a4616b 100644
--- a/room/room-compiler-processing/OWNERS
+++ b/room/room-compiler-processing/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461382
 kuanyingchou@google.com
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
index 158a455..dfd1e17 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
@@ -35,7 +35,7 @@
 import com.google.auto.common.MoreTypes
 import com.google.common.truth.Truth.assertThat
 import com.google.devtools.ksp.getDeclaredFunctions
-import com.google.devtools.ksp.symbol.impl.kotlin.KSNameImpl
+import com.google.devtools.ksp.processing.impl.KSNameImpl
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.JavaFile
 import com.squareup.javapoet.TypeSpec
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
index 8895edf..0312a38 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
@@ -75,6 +75,16 @@
     val RELATION_UTIL = XClassName.get("androidx.room.util", "RelationUtil")
 }
 
+object RoomAnnotationTypeNames {
+    val QUERY = XClassName.get(ROOM_PACKAGE, "Query")
+    val DAO = XClassName.get(ROOM_PACKAGE, "Dao")
+    val DATABASE = XClassName.get(ROOM_PACKAGE, "Database")
+    val PRIMARY_KEY = XClassName.get(ROOM_PACKAGE, "PrimaryKey")
+    val TYPE_CONVERTERS = XClassName.get(ROOM_PACKAGE, "TypeConverters")
+    val TYPE_CONVERTER = XClassName.get(ROOM_PACKAGE, "TypeConverter")
+    val ENTITY = XClassName.get(ROOM_PACKAGE, "Entity")
+}
+
 object PagingTypeNames {
     val DATA_SOURCE = XClassName.get(PAGING_PACKAGE, "DataSource")
     val POSITIONAL_DATA_SOURCE = XClassName.get(PAGING_PACKAGE, "PositionalDataSource")
@@ -116,20 +126,32 @@
 object CommonTypeNames {
     val VOID = Void::class.asClassName()
     val COLLECTION = Collection::class.asClassName()
+    val COLLECTIONS = XClassName.get("java.util", "Collections")
+    val ARRAYS = XClassName.get("java.util", "Arrays")
     val LIST = List::class.asClassName()
     val MUTABLE_LIST = List::class.asMutableClassName()
     val ARRAY_LIST = XClassName.get("java.util", "ArrayList")
     val MAP = Map::class.asClassName()
     val MUTABLE_MAP = Map::class.asMutableClassName()
     val HASH_MAP = XClassName.get("java.util", "HashMap")
+    val QUEUE = XClassName.get("java.util", "Queue")
+    val LINKED_HASH_MAP = LinkedHashMap::class.asClassName()
     val SET = Set::class.asClassName()
     val MUTABLE_SET = Set::class.asMutableClassName()
     val HASH_SET = XClassName.get("java.util", "HashSet")
     val STRING = String::class.asClassName()
+    val STRING_BUILDER = XClassName.get("java.lang", "StringBuilder")
     val OPTIONAL = XClassName.get("java.util", "Optional")
     val UUID = XClassName.get("java.util", "UUID")
     val BYTE_BUFFER = XClassName.get("java.nio", "ByteBuffer")
     val JAVA_CLASS = XClassName.get("java.lang", "Class")
+    val CALLABLE = Callable::class.asClassName()
+    val DATE = XClassName.get("java.util", "Date")
+}
+
+object ExceptionTypeNames {
+    val ILLEGAL_STATE_EXCEPTION = IllegalStateException::class.asClassName()
+    val ILLEGAL_ARG_EXCEPTION = IllegalArgumentException::class.asClassName()
 }
 
 object GuavaTypeNames {
@@ -305,7 +327,7 @@
     parameterTypeName: XTypeName,
     callBody: XFunSpec.Builder.() -> Unit
 ) = XTypeSpec.anonymousClassBuilder(language, "").apply {
-    addSuperinterface(Callable::class.asClassName().parametrizedBy(parameterTypeName))
+    addSuperinterface(CommonTypeNames.CALLABLE.parametrizedBy(parameterTypeName))
     addFunction(
         XFunSpec.builder(
             language = language,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/MapQueryResultAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/MapQueryResultAdapter.kt
index fd8d8f1..821523c 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/MapQueryResultAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/MapQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XCodeBlock
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
 import androidx.room.ext.CommonTypeNames
@@ -71,7 +70,7 @@
     private val implMapTypeName = when (mapType) {
         MapType.DEFAULT ->
             // LinkedHashMap is used as impl to preserve key ordering for ordered query results.
-            LinkedHashMap::class.asClassName().parametrizedBy(
+            CommonTypeNames.LINKED_HASH_MAP.parametrizedBy(
                 keyTypeArg.asTypeName(), valueTypeName
             )
         MapType.ARRAY_MAP ->
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
index 682c533..e5a111b 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertOrUpsertMethodAdapter.kt
@@ -34,7 +34,9 @@
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
 
-class InsertOrUpsertMethodAdapter private constructor(private val methodType: MethodType) {
+class InsertOrUpsertMethodAdapter private constructor(
+    private val methodInfo: MethodInfo
+) {
     companion object {
         fun createInsert(
             context: Context,
@@ -45,7 +47,7 @@
                 context = context,
                 returnType = returnType,
                 params = params,
-                methodTypeClass = ::InsertMethodType,
+                methodInfoClass = ::InsertMethodInfo,
                 multiParamSingleReturnError =
                     ProcessorErrors.INSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH,
                 singleParamMultiReturnError =
@@ -62,7 +64,7 @@
                 context = context,
                 returnType = returnType,
                 params = params,
-                methodTypeClass = ::UpsertMethodType,
+                methodInfoClass = ::UpsertMethodInfo,
                 multiParamSingleReturnError =
                     ProcessorErrors.UPSERT_MULTI_PARAM_SINGLE_RETURN_MISMATCH,
                 singleParamMultiReturnError =
@@ -74,7 +76,7 @@
             context: Context,
             returnType: XType,
             params: List<ShortcutQueryParameter>,
-            methodTypeClass: (returnType: ReturnType) -> MethodType,
+            methodInfoClass: (returnInfo: ReturnInfo, returnType: XType) -> MethodInfo,
             multiParamSingleReturnError: String,
             singleParamMultiReturnError: String
         ): InsertOrUpsertMethodAdapter? {
@@ -88,33 +90,37 @@
                     singleParamMultiReturnError
                 )
             ) {
-                val methodType = methodTypeClass(methodReturnType)
-                return InsertOrUpsertMethodAdapter(methodType)
+                val methodInfo = methodInfoClass(methodReturnType, returnType)
+                return InsertOrUpsertMethodAdapter(
+                    methodInfo = methodInfo
+                )
             }
             return null
         }
 
         private fun isReturnValid(
             context: Context,
-            returnType: ReturnType,
+            returnInfo: ReturnInfo,
             params: List<ShortcutQueryParameter>,
             multiParamSingleReturnError: String,
             singleParamMultiReturnError: String
         ): Boolean {
             if (params.isEmpty() || params.size > 1) {
-                return returnType == ReturnType.VOID || returnType == ReturnType.UNIT
+                return returnInfo == ReturnInfo.VOID ||
+                    returnInfo == ReturnInfo.UNIT ||
+                    returnInfo == ReturnInfo.VOID_OBJECT
             }
             if (params.first().isMultiple) {
-                val isValid = returnType in MULTIPLE_ITEM_SET
+                val isValid = returnInfo in MULTIPLE_ITEM_SET
                 if (!isValid) {
                     context.logger.e(multiParamSingleReturnError)
                 }
                 return isValid
             } else {
-                val isValid = (returnType == ReturnType.VOID ||
-                    returnType == ReturnType.VOID_OBJECT ||
-                    returnType == ReturnType.UNIT ||
-                    returnType == ReturnType.SINGLE_ID)
+                val isValid = (returnInfo == ReturnInfo.VOID ||
+                    returnInfo == ReturnInfo.VOID_OBJECT ||
+                    returnInfo == ReturnInfo.UNIT ||
+                    returnInfo == ReturnInfo.SINGLE_ID)
                 if (!isValid) {
                     context.logger.e(singleParamMultiReturnError)
                 }
@@ -124,29 +130,29 @@
 
         private val MULTIPLE_ITEM_SET by lazy {
             setOf(
-                ReturnType.VOID,
-                ReturnType.VOID_OBJECT,
-                ReturnType.UNIT,
-                ReturnType.ID_ARRAY,
-                ReturnType.ID_ARRAY_BOX,
-                ReturnType.ID_LIST
+                ReturnInfo.VOID,
+                ReturnInfo.VOID_OBJECT,
+                ReturnInfo.UNIT,
+                ReturnInfo.ID_ARRAY,
+                ReturnInfo.ID_ARRAY_BOX,
+                ReturnInfo.ID_LIST
             )
         }
 
-        private fun getReturnType(returnType: XType): ReturnType? {
+        private fun getReturnType(returnType: XType): ReturnInfo? {
             return if (returnType.isVoid()) {
-                ReturnType.VOID
+                ReturnInfo.VOID
             } else if (returnType.isVoidObject()) {
-                ReturnType.VOID_OBJECT
+                ReturnInfo.VOID_OBJECT
             } else if (returnType.isKotlinUnit()) {
-                ReturnType.UNIT
+                ReturnInfo.UNIT
             } else if (returnType.isArray()) {
                 val param = returnType.componentType
                 if (param.isLong()) {
                     if (param.asTypeName() == XTypeName.PRIMITIVE_LONG) {
-                        ReturnType.ID_ARRAY
+                        ReturnInfo.ID_ARRAY
                     } else {
-                        ReturnType.ID_ARRAY_BOX
+                        ReturnInfo.ID_ARRAY_BOX
                     }
                 } else {
                     null
@@ -154,12 +160,12 @@
             } else if (returnType.isList()) {
                 val param = returnType.typeArguments.first()
                 if (param.isLong()) {
-                    ReturnType.ID_LIST
+                    ReturnInfo.ID_LIST
                 } else {
                     null
                 }
             } else if (returnType.isLong()) {
-                ReturnType.SINGLE_ID
+                ReturnInfo.SINGLE_ID
             } else {
                 null
             }
@@ -173,49 +179,62 @@
         scope: CodeGenScope
     ) {
         scope.builder.apply {
-            val methodName = methodType.methodName
-            val methodReturnType = methodType.returnType
+            val methodName = methodInfo.methodName
+            val methodReturnInfo = methodInfo.returnInfo
 
             // TODO assert thread
             // TODO collect results
             addStatement("%N.beginTransaction()", dbProperty)
-            val resultVar = when (methodReturnType) {
-                ReturnType.VOID, ReturnType.VOID_OBJECT, ReturnType.UNIT -> null
+            val resultVar = when (methodReturnInfo) {
+                ReturnInfo.VOID, ReturnInfo.VOID_OBJECT, ReturnInfo.UNIT -> null
                 else -> scope.getTmpVar("_result")
             }
 
             beginControlFlow("try").apply {
                 parameters.forEach { param ->
                     val upsertionAdapter = adapters.getValue(param.name).first
+                    // We want to keep the e.g. Array<out Long> generic type function signature, so
+                    // need to do a cast.
+                    val resultFormat = XCodeBlock.of(
+                        language,
+                        "%L.%L(%L)",
+                        upsertionAdapter.name,
+                        methodName,
+                        param.name
+                    ).let {
+                        if (
+                            language == CodeLanguage.KOTLIN &&
+                            methodReturnInfo == ReturnInfo.ID_ARRAY_BOX &&
+                            methodInfo.returnType.asTypeName() == methodReturnInfo.typeName
+                        ) {
+                            XCodeBlock.ofCast(
+                                language = language,
+                                typeName = methodReturnInfo.typeName,
+                                expressionBlock = it
+                            )
+                        } else {
+                            it
+                        }
+                    }
+
                     if (resultVar != null) {
                         // if it has more than 1 parameter, we would've already printed the error
                         // so we don't care about re-declaring the variable here
                         addLocalVariable(
                             name = resultVar,
-                            typeName = methodReturnType.returnTypeName,
-                            assignExpr = XCodeBlock.of(
-                                language,
-                                "%L.%L(%L)",
-                                upsertionAdapter.name,
-                                methodName,
-                                param.name
-                            )
+                            typeName = methodInfo.returnType.asTypeName(),
+                            assignExpr = resultFormat
                         )
                     } else {
-                        addStatement(
-                            "%L.%L(%L)",
-                            upsertionAdapter.name,
-                            methodName,
-                            param.name
-                        )
+                        addStatement("%L", resultFormat)
                     }
                 }
                 addStatement("%N.setTransactionSuccessful()", dbProperty)
                 if (resultVar != null) {
                     addStatement("return %L", resultVar)
-                } else if (methodReturnType == ReturnType.VOID_OBJECT) {
+                } else if (methodReturnInfo == ReturnInfo.VOID_OBJECT) {
                     addStatement("return null")
-                } else if (methodReturnType == ReturnType.UNIT && language == CodeLanguage.JAVA) {
+                } else if (methodReturnInfo == ReturnInfo.UNIT && language == CodeLanguage.JAVA) {
                     addStatement("return %T.INSTANCE", KotlinTypeNames.UNIT)
                 }
             }
@@ -226,23 +245,30 @@
         }
     }
 
-    sealed class MethodType(
-        val returnType: ReturnType
+    sealed class MethodInfo(
+        val returnInfo: ReturnInfo,
+        val returnType: XType
     ) {
         abstract val methodName: String
     }
 
-    class InsertMethodType(returnType: ReturnType) : MethodType(returnType) {
-        override val methodName = "insert" + returnType.methodSuffix
+    class InsertMethodInfo(
+        returnInfo: ReturnInfo,
+        returnType: XType
+    ) : MethodInfo(returnInfo, returnType) {
+        override val methodName = "insert" + returnInfo.methodSuffix
     }
 
-    class UpsertMethodType(returnType: ReturnType) : MethodType(returnType) {
-        override val methodName = "upsert" + returnType.methodSuffix
+    class UpsertMethodInfo(
+        returnInfo: ReturnInfo,
+        returnType: XType
+    ) : MethodInfo(returnInfo, returnType) {
+        override val methodName = "upsert" + returnInfo.methodSuffix
     }
 
-    enum class ReturnType(
+    enum class ReturnInfo(
         val methodSuffix: String,
-        val returnTypeName: XTypeName
+        val typeName: XTypeName
     ) {
         VOID("", XTypeName.UNIT_VOID), // return void
         VOID_OBJECT("", CommonTypeNames.VOID), // return Void
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
index 3da739d..7255e20 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
@@ -19,11 +19,11 @@
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XEnumTypeElement
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
 import androidx.room.ext.CommonTypeNames
+import androidx.room.ext.ExceptionTypeNames
 import androidx.room.parser.SQLTypeAffinity.TEXT
 import androidx.room.solver.CodeGenScope
 import androidx.room.writer.TypeWriter
@@ -119,7 +119,7 @@
                             }
                             addStatement(
                                 "default: throw new %T(%S + %L)",
-                                ILLEGAL_ARG_EXCEPTION,
+                                ExceptionTypeNames.ILLEGAL_ARG_EXCEPTION,
                                 ENUM_TO_STRING_ERROR_MSG,
                                 paramName
                             )
@@ -184,7 +184,7 @@
                             }
                             addStatement(
                                 "default: throw new %T(%S + %L)",
-                                ILLEGAL_ARG_EXCEPTION,
+                                ExceptionTypeNames.ILLEGAL_ARG_EXCEPTION,
                                 STRING_TO_ENUM_ERROR_MSG,
                                 paramName
                             )
@@ -203,7 +203,7 @@
                             }
                             addStatement(
                                 "else -> throw %T(%S + %L)",
-                                ILLEGAL_ARG_EXCEPTION,
+                                ExceptionTypeNames.ILLEGAL_ARG_EXCEPTION,
                                 STRING_TO_ENUM_ERROR_MSG,
                                 paramName
                             )
@@ -225,7 +225,6 @@
     }
 
     companion object {
-        private val ILLEGAL_ARG_EXCEPTION = IllegalArgumentException::class.asClassName()
         private const val ENUM_TO_STRING_ERROR_MSG =
             "Can't convert enum to string, unknown enum value: "
         private const val STRING_TO_ENUM_ERROR_MSG =
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/NullAwareTypeConverters.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/NullAwareTypeConverters.kt
index 815fe8d..4bf5397 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/NullAwareTypeConverters.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/NullAwareTypeConverters.kt
@@ -18,9 +18,9 @@
 
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XCodeBlock
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.ExceptionTypeNames
 import androidx.room.solver.CodeGenScope
 
 /**
@@ -100,7 +100,7 @@
                     "throw %L",
                     XCodeBlock.ofNewInstance(
                         language,
-                        ILLEGAL_STATE_EXCEPTION,
+                        ExceptionTypeNames.ILLEGAL_STATE_EXCEPTION,
                         "%S",
                         message
                     )
@@ -111,8 +111,4 @@
             }
         }
     }
-
-    companion object {
-        private val ILLEGAL_STATE_EXCEPTION = IllegalStateException::class.asClassName()
-    }
 }
\ No newline at end of file
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
index d453f00..24cad40 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
@@ -108,11 +108,11 @@
         ).apply {
             addParameter(
                 typeName = SupportDbTypeNames.DB,
-                name = "database",
+                name = "db",
             )
             addMigrationStatements(this)
             if (autoMigration.specClassName != null) {
-                addStatement("callback.onPostMigrate(database)")
+                addStatement("callback.onPostMigrate(db)")
             }
         }
         return migrateFunctionBuilder.build()
@@ -375,7 +375,7 @@
         migrateBuilder: XFunSpec.Builder
     ) {
         migrateBuilder.addStatement(
-            "%T.foreignKeyCheck(database, %S)",
+            "%T.foreignKeyCheck(db, %S)",
             RoomTypeNames.DB_UTIL,
             tableName
         )
@@ -477,7 +477,7 @@
         sql: String
     ) {
         migrateBuilder.addStatement(
-            "database.execSQL(%S)",
+            "db.execSQL(%S)",
             sql
         )
     }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
index 3f89a53..a8d7731 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
@@ -27,7 +27,6 @@
 import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.addOriginatingElement
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMethodElement
 import androidx.room.compiler.processing.XType
@@ -59,8 +58,6 @@
 import androidx.room.vo.UpdateMethod
 import androidx.room.vo.UpsertionMethod
 import androidx.room.vo.WriteQueryMethod
-import java.util.Arrays
-import java.util.Collections
 import java.util.Locale
 
 /**
@@ -198,7 +195,7 @@
             if (requiredTypeConverters.isEmpty()) {
                 when (language) {
                     CodeLanguage.JAVA ->
-                        addStatement("return %T.emptyList()", Collections::class.asClassName())
+                        addStatement("return %T.emptyList()", CommonTypeNames.COLLECTIONS)
                     CodeLanguage.KOTLIN ->
                         addStatement("return emptyList()")
                 }
@@ -210,7 +207,7 @@
                 when (language) {
                     CodeLanguage.JAVA ->
                         addStatement("return %T.asList($placeholders)",
-                            Arrays::class.asClassName(),
+                            CommonTypeNames.ARRAYS,
                             *requiredTypeConvertersLiterals
                         )
                     CodeLanguage.KOTLIN ->
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
index c170531..bfc0817 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
@@ -20,7 +20,6 @@
 import androidx.room.compiler.codegen.XCodeBlock.Builder.Companion.addLocalVal
 import androidx.room.compiler.codegen.XMemberName.Companion.packageMember
 import androidx.room.compiler.codegen.XTypeName
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.RoomMemberNames
 import androidx.room.ext.RoomTypeNames
@@ -77,7 +76,7 @@
                 val stringBuilderVar = scope.getTmpVar("_stringBuilder")
                 addLocalVal(
                     stringBuilderVar,
-                    StringBuilder::class.asClassName(),
+                    CommonTypeNames.STRING_BUILDER,
                     "%M()",
                     RoomTypeNames.STRING_UTIL.packageMember("newStringBuilder")
                 )
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
index c7c18fd..8ca0c7a 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
@@ -19,7 +19,6 @@
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XCodeBlock.Builder.Companion.addLocalVal
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.RoomMemberNames
 import androidx.room.ext.RoomTypeNames
@@ -28,14 +27,12 @@
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.Entity
 import androidx.room.vo.columnNames
-import java.util.Arrays
 import java.util.Locale
 
 class TableInfoValidationWriter(val entity: Entity) : ValidationWriter() {
 
     companion object {
         const val CREATED_FROM_ENTITY = "CREATED_FROM_ENTITY"
-        val ARRAY_TYPE_NAME = Arrays::class.asClassName()
     }
 
     override fun write(dbParamName: String, scope: CountingCodeGenScope) {
@@ -180,7 +177,7 @@
     private fun CodeBlockWrapper.listOfStrings(strings: List<String>): XCodeBlock {
         val placeholders = List(strings.size) { "%S" }.joinToString()
         val function: Any = when (language) {
-            CodeLanguage.JAVA -> XCodeBlock.of(language, "%T.asList", ARRAY_TYPE_NAME)
+            CodeLanguage.JAVA -> XCodeBlock.of(language, "%T.asList", CommonTypeNames.ARRAYS)
             CodeLanguage.KOTLIN -> "listOf"
         }
         return XCodeBlock.of(
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
index 4b9437c..a4da24b 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.TypeConverter
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.VisibilityModifier
 import androidx.room.compiler.codegen.XAnnotationSpec
@@ -26,13 +25,13 @@
 import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.apply
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.CommonTypeNames.MUTABLE_LIST
 import androidx.room.ext.CommonTypeNames.STRING
+import androidx.room.ext.RoomAnnotationTypeNames
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_EMPTY_CLASS
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MUST_BE_PUBLIC
@@ -41,7 +40,6 @@
 import androidx.room.vo.CustomTypeConverter
 import com.google.common.truth.Truth.assertThat
 import com.squareup.javapoet.TypeVariableName
-import java.util.Date
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -117,7 +115,7 @@
 
     @Test
     fun nonNullButNotBoxed() {
-        val date = Date::class.asClassName()
+        val date = CommonTypeNames.DATE
         singleClass(createConverter(STRING, date)) { converter, _ ->
             assertThat(converter?.fromTypeName).isEqualTo(STRING)
             assertThat(converter?.toTypeName).isEqualTo(date)
@@ -143,7 +141,7 @@
 
     @Test
     fun parametrizedTypeSpecific() {
-        val date = Date::class.asClassName()
+        val date = CommonTypeNames.DATE
         val list = CommonTypeNames.MUTABLE_LIST.parametrizedBy(STRING)
         val map = CommonTypeNames.MUTABLE_MAP.parametrizedBy(STRING, date)
         singleClass(createConverter(list, map)) { converter, _ ->
@@ -387,7 +385,7 @@
                 addAnnotation(
                     XAnnotationSpec.builder(
                         CodeLanguage.JAVA,
-                        TypeConverter::class.asClassName()
+                        RoomAnnotationTypeNames.TYPE_CONVERTER
                     ).build()
                 )
                 returns(to)
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
index bce40fb..de9625c 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/InsertOrUpsertShortcutMethodProcessorTest.kt
@@ -21,7 +21,6 @@
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XTypeName
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.codegen.asMutableClassName
 import androidx.room.compiler.processing.XMethodElement
 import androidx.room.compiler.processing.XType
@@ -350,7 +349,7 @@
             val param = insertionUpsertion.parameters.first()
             assertThat(param.type.asTypeName())
                 .isEqualTo(
-                    java.util.Queue::class.asClassName().parametrizedBy(USER_TYPE_NAME)
+                    CommonTypeNames.QUEUE.parametrizedBy(USER_TYPE_NAME)
                 )
 
             assertThat(insertionUpsertion.entities.size).isEqualTo(1)
@@ -466,6 +465,23 @@
     }
 
     @Test
+    fun multipleParamCompletable() {
+        listOf(
+            RxJava2TypeNames.COMPLETABLE.canonicalName,
+            RxJava3TypeNames.COMPLETABLE.canonicalName
+        ).forEach { type ->
+            singleInsertUpsertShortcutMethodKotlin(
+                """
+                @${annotation.java.canonicalName}
+                abstract fun bookUserCompletable(user: User, book: Book): $type
+                """
+            ) { insertionUpsertion, _ ->
+                assertThat(insertionUpsertion.parameters.size).isEqualTo(2)
+            }
+        }
+    }
+
+    @Test
     fun twoNullableDifferentParamError() {
         singleInsertUpsertShortcutMethodKotlin(
             """
@@ -582,56 +598,56 @@
     @Test
     fun validReturnTypes() {
         listOf(
-            Pair("void", InsertOrUpsertMethodAdapter.ReturnType.VOID),
-            Pair("long", InsertOrUpsertMethodAdapter.ReturnType.SINGLE_ID),
-            Pair("long[]", InsertOrUpsertMethodAdapter.ReturnType.ID_ARRAY),
-            Pair("Long[]", InsertOrUpsertMethodAdapter.ReturnType.ID_ARRAY_BOX),
-            Pair("List<Long>", InsertOrUpsertMethodAdapter.ReturnType.ID_LIST),
+            Pair("void", InsertOrUpsertMethodAdapter.ReturnInfo.VOID),
+            Pair("long", InsertOrUpsertMethodAdapter.ReturnInfo.SINGLE_ID),
+            Pair("long[]", InsertOrUpsertMethodAdapter.ReturnInfo.ID_ARRAY),
+            Pair("Long[]", InsertOrUpsertMethodAdapter.ReturnInfo.ID_ARRAY_BOX),
+            Pair("List<Long>", InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST),
             Pair(
                 RxJava2TypeNames.COMPLETABLE.canonicalName,
-                InsertOrUpsertMethodAdapter.ReturnType.VOID_OBJECT
+                InsertOrUpsertMethodAdapter.ReturnInfo.VOID_OBJECT
             ),
             Pair(
                 "${RxJava2TypeNames.SINGLE.canonicalName}<Long>",
-                InsertOrUpsertMethodAdapter.ReturnType.SINGLE_ID
+                InsertOrUpsertMethodAdapter.ReturnInfo.SINGLE_ID
             ),
             Pair(
                 "${RxJava2TypeNames.SINGLE.canonicalName}<List<Long>>",
-                InsertOrUpsertMethodAdapter.ReturnType.ID_LIST
+                InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST
             ),
             Pair(
                 "${RxJava2TypeNames.MAYBE.canonicalName}<Long>",
-                InsertOrUpsertMethodAdapter.ReturnType.SINGLE_ID
+                InsertOrUpsertMethodAdapter.ReturnInfo.SINGLE_ID
             ),
             Pair(
                 "${RxJava2TypeNames.MAYBE.canonicalName}<List<Long>>",
-                InsertOrUpsertMethodAdapter.ReturnType.ID_LIST
+                InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST
             ),
             Pair(
                 RxJava3TypeNames.COMPLETABLE.canonicalName,
-                InsertOrUpsertMethodAdapter.ReturnType.VOID_OBJECT
+                InsertOrUpsertMethodAdapter.ReturnInfo.VOID_OBJECT
             ),
             Pair(
                 "${RxJava3TypeNames.SINGLE.canonicalName}<Long>",
-                InsertOrUpsertMethodAdapter.ReturnType.SINGLE_ID
+                InsertOrUpsertMethodAdapter.ReturnInfo.SINGLE_ID
             ),
             Pair(
                 "${RxJava3TypeNames.SINGLE.canonicalName}<List<Long>>",
-                InsertOrUpsertMethodAdapter.ReturnType.ID_LIST
+                InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST
             ),
             Pair(
                 "${RxJava3TypeNames.MAYBE.canonicalName}<Long>",
-                InsertOrUpsertMethodAdapter.ReturnType.SINGLE_ID
+                InsertOrUpsertMethodAdapter.ReturnInfo.SINGLE_ID
             ),
             Pair(
                 "${RxJava3TypeNames.MAYBE.canonicalName}<List<Long>>",
-                InsertOrUpsertMethodAdapter.ReturnType.ID_LIST
+                InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST
             )
         ).forEach { pair ->
             val dots = if (pair.second in setOf(
-                    InsertOrUpsertMethodAdapter.ReturnType.ID_LIST,
-                    InsertOrUpsertMethodAdapter.ReturnType.ID_ARRAY,
-                    InsertOrUpsertMethodAdapter.ReturnType.ID_ARRAY_BOX
+                    InsertOrUpsertMethodAdapter.ReturnInfo.ID_LIST,
+                    InsertOrUpsertMethodAdapter.ReturnInfo.ID_ARRAY,
+                    InsertOrUpsertMethodAdapter.ReturnInfo.ID_ARRAY_BOX
                 )
             ) {
                 "..."
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
index 768c1a1..51f7c99 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
@@ -22,7 +22,6 @@
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XTypeName
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.util.Source
@@ -1539,7 +1538,7 @@
         ) { _, invocation ->
             invocation.assertCompilationResult {
                 hasErrorContaining(
-                    valueMayNeedMapInfo(String::class.asClassName().canonicalName)
+                    valueMayNeedMapInfo(CommonTypeNames.STRING.canonicalName)
                 )
             }
         }
@@ -1556,7 +1555,7 @@
         ) { _, invocation ->
             invocation.assertCompilationResult {
                 hasErrorContaining(
-                    valueMayNeedMapInfo(String::class.asClassName().canonicalName)
+                    valueMayNeedMapInfo(CommonTypeNames.STRING.canonicalName)
                 )
             }
         }
@@ -1572,7 +1571,7 @@
         ) { _, invocation ->
             invocation.assertCompilationResult {
                 hasErrorContaining(
-                    valueMayNeedMapInfo(String::class.asClassName().canonicalName)
+                    valueMayNeedMapInfo(CommonTypeNames.STRING.canonicalName)
                 )
             }
         }
@@ -1588,7 +1587,7 @@
         ) { _, invocation ->
             invocation.assertCompilationResult {
                 hasErrorContaining(
-                    valueMayNeedMapInfo(String::class.asClassName().canonicalName)
+                    valueMayNeedMapInfo(CommonTypeNames.STRING.canonicalName)
                 )
             }
         }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
index d6d58c9..b8d94b3 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
@@ -21,11 +21,11 @@
 import androidx.room.RawQuery
 import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XTypeName
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.runProcessorTest
+import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.LifecyclesTypeNames
@@ -424,7 +424,7 @@
             invocation.assertCompilationResult {
                 hasErrorContaining(
                     ProcessorErrors.valueMayNeedMapInfo(
-                        String::class.asClassName().canonicalName
+                        CommonTypeNames.STRING.canonicalName
                     )
                 )
             }
@@ -442,7 +442,7 @@
             invocation.assertCompilationResult {
                 hasErrorContaining(
                     ProcessorErrors.valueMayNeedMapInfo(
-                        String::class.asClassName().canonicalName
+                        CommonTypeNames.STRING.canonicalName
                     )
                 )
             }
@@ -460,7 +460,7 @@
             invocation.assertCompilationResult {
                 hasErrorContaining(
                     ProcessorErrors.valueMayNeedMapInfo(
-                        String::class.asClassName().canonicalName
+                        CommonTypeNames.STRING.canonicalName
                     )
                 )
             }
@@ -561,7 +561,7 @@
             invocation.assertCompilationResult {
                 hasErrorContaining(
                     ProcessorErrors.valueMayNeedMapInfo(
-                        String::class.asClassName().canonicalName
+                        CommonTypeNames.STRING.canonicalName
                     )
                 )
             }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
index e582e54..d36dbcc 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
@@ -23,12 +23,12 @@
 import androidx.room.compiler.codegen.XPropertySpec
 import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.compiler.processing.writeTo
 import androidx.room.ext.AndroidTypeNames
+import androidx.room.ext.CommonTypeNames
 import androidx.room.processor.Context
 import androidx.room.vo.BuiltInConverterFlags
 import org.hamcrest.CoreMatchers.`is`
@@ -86,7 +86,7 @@
                     "out = crs.getDouble(9);"
                 ),
                 arrayOf(
-                    String::class.asClassName(),
+                    CommonTypeNames.STRING,
                     "st.bindString(6, inp);",
                     "out = crs.getString(9);"
                 ),
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
index 5033e65..f4ade0b 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/CustomTypeConverterResolutionTest.kt
@@ -18,14 +18,8 @@
 
 package androidx.room.solver
 
-import androidx.room.Dao
-import androidx.room.Database
 import androidx.room.DatabaseProcessingStep
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import androidx.room.Query
 import androidx.room.TypeConverter
-import androidx.room.TypeConverters
 import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.VisibilityModifier
 import androidx.room.compiler.codegen.XAnnotationSpec
@@ -35,11 +29,11 @@
 import androidx.room.compiler.codegen.XPropertySpec
 import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.util.CompilationResultSubject
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.ext.CommonTypeNames
+import androidx.room.ext.RoomAnnotationTypeNames
 import androidx.room.ext.RoomTypeNames.ROOM_DB
 import androidx.room.processor.ProcessorErrors.CANNOT_BIND_QUERY_PARAMETER_INTO_STMT
 import org.junit.Test
@@ -288,7 +282,7 @@
         }
         return XTypeSpec.classBuilder(CodeLanguage.JAVA, ENTITY).apply {
             addAnnotation(
-                XAnnotationSpec.builder(CodeLanguage.JAVA, Entity::class.asClassName()).build()
+                XAnnotationSpec.builder(CodeLanguage.JAVA, RoomAnnotationTypeNames.ENTITY).build()
             )
             setVisibility(VisibilityModifier.PUBLIC)
             if (hasCustomField) {
@@ -319,7 +313,7 @@
                 ).addAnnotation(
                     XAnnotationSpec.builder(
                         CodeLanguage.JAVA,
-                        PrimaryKey::class.asClassName()
+                        RoomAnnotationTypeNames.PRIMARY_KEY
                     ).build()
                 ).build()
             )
@@ -348,7 +342,7 @@
                 ).addAnnotation(
                     XAnnotationSpec.builder(
                         CodeLanguage.JAVA,
-                        PrimaryKey::class.asClassName()
+                        RoomAnnotationTypeNames.PRIMARY_KEY
                     ).build()
                 ).build()
             )
@@ -367,7 +361,7 @@
             addAnnotation(
                 XAnnotationSpec.builder(
                     CodeLanguage.JAVA,
-                    Database::class.asClassName()
+                    RoomAnnotationTypeNames.DATABASE
                 ).apply {
                     addMember(
                         "entities",
@@ -420,7 +414,7 @@
             addAbstractModifier()
             addAnnotation(XAnnotationSpec.builder(
                 CodeLanguage.JAVA,
-                Dao::class.asClassName()
+                RoomAnnotationTypeNames.DAO
             ).build())
             setVisibility(VisibilityModifier.PUBLIC)
             if (hasConverters) {
@@ -436,7 +430,7 @@
                         addAbstractModifier()
                         addAnnotation(XAnnotationSpec.builder(
                             CodeLanguage.JAVA,
-                            Query::class.asClassName()
+                            RoomAnnotationTypeNames.QUERY
                         ).addMember(
                             "value",
                             XCodeBlock.of(
@@ -464,7 +458,7 @@
                         addAbstractModifier()
                         addAnnotation(XAnnotationSpec.builder(
                             CodeLanguage.JAVA,
-                            Query::class.asClassName()
+                            RoomAnnotationTypeNames.QUERY
                         ).addMember(
                             "value",
                             XCodeBlock.of(
@@ -500,7 +494,7 @@
         } else {
             CUSTOM_TYPE_CONVERTER
         }
-        return XAnnotationSpec.builder(CodeLanguage.JAVA, TypeConverters::class.asClassName())
+        return XAnnotationSpec.builder(CodeLanguage.JAVA, RoomAnnotationTypeNames.TYPE_CONVERTERS)
             .addMember("value", XCodeBlock.of(CodeLanguage.JAVA, "%T.class", converter)).build()
     }
 }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index 84d9666..558e6c0 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -22,7 +22,6 @@
 import androidx.room.Dao
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XTypeName
-import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XProcessingEnv
 import androidx.room.compiler.processing.XRawType
 import androidx.room.compiler.processing.isTypeElement
@@ -248,7 +247,7 @@
             )
             val uuid = invocation
                 .processingEnv
-                .requireType(UUID::class.asClassName())
+                .requireType(CommonTypeNames.UUID)
             val adapter = store.findColumnTypeAdapter(
                 out = uuid,
                 affinity = null,
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
index e39639d..f190199 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
@@ -1167,6 +1167,12 @@
 
               @Upsert
               fun upsertEntityListAndReturnRowIds(items: List<MyEntity>): List<Long>
+
+              @Upsert
+              fun upsertEntityListAndReturnRowIdsArray(items: List<MyEntity>): Array<Long>
+
+              @Upsert
+              fun upsertEntityListAndReturnRowIdsOutArray(items: List<MyEntity>): Array<out Long>
             }
 
             @Entity
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/AutoMigrationWithProvidedSpec.java b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/AutoMigrationWithProvidedSpec.java
index 291dfc9..3b85860 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/AutoMigrationWithProvidedSpec.java
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/AutoMigrationWithProvidedSpec.java
@@ -19,8 +19,8 @@
     }
 
     @Override
-    public void migrate(@NonNull final SupportSQLiteDatabase database) {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL");
-        callback.onPostMigrate(database);
+    public void migrate(@NonNull final SupportSQLiteDatabase db) {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL");
+        callback.onPostMigrate(db);
     }
 }
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithDefault.java b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithDefault.java
index 04f2885..6ea72a6 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithDefault.java
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithDefault.java
@@ -18,8 +18,8 @@
     }
 
     @Override
-    public void migrate(@NonNull final SupportSQLiteDatabase database) {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER NOT NULL DEFAULT 0");
-        callback.onPostMigrate(database);
+    public void migrate(@NonNull final SupportSQLiteDatabase db) {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER NOT NULL DEFAULT 0");
+        callback.onPostMigrate(db);
     }
 }
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithoutDefault.java b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithoutDefault.java
index e1b545d..23b966a 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithoutDefault.java
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/java/ValidAutoMigrationWithoutDefault.java
@@ -18,8 +18,8 @@
     }
 
     @Override
-    public void migrate(@NonNull final SupportSQLiteDatabase database) {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL");
-        callback.onPostMigrate(database);
+    public void migrate(@NonNull final SupportSQLiteDatabase db) {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL");
+        callback.onPostMigrate(db);
     }
 }
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/AutoMigrationWithProvidedSpec.kt b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/AutoMigrationWithProvidedSpec.kt
index 37881af..0aa6850 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/AutoMigrationWithProvidedSpec.kt
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/AutoMigrationWithProvidedSpec.kt
@@ -16,8 +16,8 @@
         this.callback = callback
     }
 
-    public override fun migrate(database: SupportSQLiteDatabase): Unit {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL")
-        callback.onPostMigrate(database)
+    public override fun migrate(db: SupportSQLiteDatabase): Unit {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL")
+        callback.onPostMigrate(db)
     }
 }
\ No newline at end of file
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithDefault.kt b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithDefault.kt
index 0935428..778f927 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithDefault.kt
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithDefault.kt
@@ -14,8 +14,8 @@
 
     public constructor() : super(1, 2)
 
-    public override fun migrate(database: SupportSQLiteDatabase): Unit {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER NOT NULL DEFAULT 0")
-        callback.onPostMigrate(database)
+    public override fun migrate(db: SupportSQLiteDatabase): Unit {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER NOT NULL DEFAULT 0")
+        callback.onPostMigrate(db)
     }
 }
\ No newline at end of file
diff --git a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithoutDefault.kt b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithoutDefault.kt
index e87904e..e253bb2 100644
--- a/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithoutDefault.kt
+++ b/room/room-compiler/src/test/test-data/autoMigrationWriter/output/kotlin/ValidAutoMigrationWithoutDefault.kt
@@ -14,8 +14,8 @@
 
     public constructor() : super(1, 2)
 
-    public override fun migrate(database: SupportSQLiteDatabase): Unit {
-        database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL")
-        callback.onPostMigrate(database)
+    public override fun migrate(db: SupportSQLiteDatabase): Unit {
+        db.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL")
+        callback.onPostMigrate(db)
     }
 }
\ No newline at end of file
diff --git a/room/room-compiler/src/test/test-data/kotlinCodeGen/insertOrUpsertMethodAdapter.kt b/room/room-compiler/src/test/test-data/kotlinCodeGen/insertOrUpsertMethodAdapter.kt
index 4f533d9..5b4ec18 100644
--- a/room/room-compiler/src/test/test-data/kotlinCodeGen/insertOrUpsertMethodAdapter.kt
+++ b/room/room-compiler/src/test/test-data/kotlinCodeGen/insertOrUpsertMethodAdapter.kt
@@ -5,6 +5,7 @@
 import androidx.sqlite.db.SupportSQLiteStatement
 import java.lang.Class
 import javax.`annotation`.processing.Generated
+import kotlin.Array
 import kotlin.Long
 import kotlin.String
 import kotlin.Suppress
@@ -124,6 +125,32 @@
         }
     }
 
+    public override fun upsertEntityListAndReturnRowIdsArray(items: List<MyEntity>): Array<Long> {
+        __db.assertNotSuspendingTransaction()
+        __db.beginTransaction()
+        try {
+            val _result: Array<Long> = (__upsertionAdapterOfMyEntity.upsertAndReturnIdsArrayBox(items)) as
+                Array<Long>
+            __db.setTransactionSuccessful()
+            return _result
+        } finally {
+            __db.endTransaction()
+        }
+    }
+
+    public override fun upsertEntityListAndReturnRowIdsOutArray(items: List<MyEntity>):
+        Array<out Long> {
+        __db.assertNotSuspendingTransaction()
+        __db.beginTransaction()
+        try {
+            val _result: Array<out Long> = __upsertionAdapterOfMyEntity.upsertAndReturnIdsArrayBox(items)
+            __db.setTransactionSuccessful()
+            return _result
+        } finally {
+            __db.endTransaction()
+        }
+    }
+
     public companion object {
         @JvmStatic
         public fun getRequiredConverters(): List<Class<*>> = emptyList()
diff --git a/room/room-ktx/api/current.ignore b/room/room-ktx/api/current.ignore
new file mode 100644
index 0000000..26a7fe6
--- /dev/null
+++ b/room/room-ktx/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.room.CoroutinesRoomKt:
+    Removed class androidx.room.CoroutinesRoomKt
diff --git a/room/room-ktx/api/current.txt b/room/room-ktx/api/current.txt
index 6178ad3..666ad72 100644
--- a/room/room-ktx/api/current.txt
+++ b/room/room-ktx/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.room {
 
-  public final class CoroutinesRoomKt {
-  }
-
   public final class RoomDatabaseKt {
     method public static kotlinx.coroutines.flow.Flow<java.util.Set<java.lang.String>> invalidationTrackerFlow(androidx.room.RoomDatabase, String![] tables, optional boolean emitInitialState);
     method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
diff --git a/room/room-ktx/api/public_plus_experimental_current.txt b/room/room-ktx/api/public_plus_experimental_current.txt
index 6178ad3..666ad72 100644
--- a/room/room-ktx/api/public_plus_experimental_current.txt
+++ b/room/room-ktx/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.room {
 
-  public final class CoroutinesRoomKt {
-  }
-
   public final class RoomDatabaseKt {
     method public static kotlinx.coroutines.flow.Flow<java.util.Set<java.lang.String>> invalidationTrackerFlow(androidx.room.RoomDatabase, String![] tables, optional boolean emitInitialState);
     method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
diff --git a/room/room-ktx/api/restricted_current.ignore b/room/room-ktx/api/restricted_current.ignore
new file mode 100644
index 0000000..26a7fe6
--- /dev/null
+++ b/room/room-ktx/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.room.CoroutinesRoomKt:
+    Removed class androidx.room.CoroutinesRoomKt
diff --git a/room/room-ktx/api/restricted_current.txt b/room/room-ktx/api/restricted_current.txt
index f93c497a9..884fcfe 100644
--- a/room/room-ktx/api/restricted_current.txt
+++ b/room/room-ktx/api/restricted_current.txt
@@ -14,9 +14,6 @@
     method public suspend <R> Object? execute(androidx.room.RoomDatabase db, boolean inTransaction, android.os.CancellationSignal? cancellationSignal, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R>);
   }
 
-  public final class CoroutinesRoomKt {
-  }
-
   public final class RoomDatabaseKt {
     method public static kotlinx.coroutines.flow.Flow<java.util.Set<java.lang.String>> invalidationTrackerFlow(androidx.room.RoomDatabase, String![] tables, optional boolean emitInitialState);
     method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
diff --git a/room/room-runtime-lint/src/main/java/androidx/room/lint/CursorKotlinUseIssueDetector.kt b/room/room-runtime-lint/src/main/java/androidx/room/lint/CursorKotlinUseIssueDetector.kt
index 4ddc81c..57e13f0 100644
--- a/room/room-runtime-lint/src/main/java/androidx/room/lint/CursorKotlinUseIssueDetector.kt
+++ b/room/room-runtime-lint/src/main/java/androidx/room/lint/CursorKotlinUseIssueDetector.kt
@@ -64,7 +64,9 @@
         }
         // If the call is within an SDK_INT check, then its OK
         if (
+            @Suppress("DEPRECATION") // b/262915639
             VersionChecks.isWithinVersionCheckConditional(context, node, 16) ||
+            @Suppress("DEPRECATION") // b/262915639
             VersionChecks.isPrecededByVersionCheckExit(context, node, 16)
         ) {
             return
diff --git a/room/room-runtime-lint/src/main/java/androidx/room/lint/RoomIssueRegistry.kt b/room/room-runtime-lint/src/main/java/androidx/room/lint/RoomIssueRegistry.kt
index 577b802..daedba0 100644
--- a/room/room-runtime-lint/src/main/java/androidx/room/lint/RoomIssueRegistry.kt
+++ b/room/room-runtime-lint/src/main/java/androidx/room/lint/RoomIssueRegistry.kt
@@ -23,7 +23,7 @@
 
 class RoomIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues: List<Issue> = listOf(
         CursorKotlinUseIssueDetector.ISSUE,
     )
diff --git a/room/room-runtime/api/current.ignore b/room/room-runtime/api/current.ignore
new file mode 100644
index 0000000..5d12b05
--- /dev/null
+++ b/room/room-runtime/api/current.ignore
@@ -0,0 +1,7 @@
+// Baseline format: 1.0
+RemovedClass: androidx.room.EntityUpsertionAdapterKt:
+    Removed class androidx.room.EntityUpsertionAdapterKt
+
+
+RemovedPackage: androidx.room.util:
+    Removed package androidx.room.util
diff --git a/room/room-runtime/api/current.txt b/room/room-runtime/api/current.txt
index 33f9ae3..ccae897 100644
--- a/room/room-runtime/api/current.txt
+++ b/room/room-runtime/api/current.txt
@@ -24,9 +24,6 @@
     field public final java.util.List<java.lang.Object> typeConverters;
   }
 
-  public final class EntityUpsertionAdapterKt {
-  }
-
   public class InvalidationTracker {
     method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer observer);
     method public void refreshVersionsAsync();
@@ -160,10 +157,3 @@
 
 }
 
-package androidx.room.util {
-
-  public final class TableInfoKt {
-  }
-
-}
-
diff --git a/room/room-runtime/api/public_plus_experimental_current.txt b/room/room-runtime/api/public_plus_experimental_current.txt
index a7b3c40..55492e7 100644
--- a/room/room-runtime/api/public_plus_experimental_current.txt
+++ b/room/room-runtime/api/public_plus_experimental_current.txt
@@ -24,9 +24,6 @@
     field public final java.util.List<java.lang.Object> typeConverters;
   }
 
-  public final class EntityUpsertionAdapterKt {
-  }
-
   @RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalRoomApi {
   }
 
@@ -170,10 +167,3 @@
 
 }
 
-package androidx.room.util {
-
-  public final class TableInfoKt {
-  }
-
-}
-
diff --git a/room/room-runtime/api/restricted_current.ignore b/room/room-runtime/api/restricted_current.ignore
index eb7e8ba..cf34024 100644
--- a/room/room-runtime/api/restricted_current.ignore
+++ b/room/room-runtime/api/restricted_current.ignore
@@ -15,3 +15,9 @@
     Attempted to change parameter name from database to db in method androidx.room.RoomOpenHelper.Delegate.onPostMigrate
 ParameterNameChange: androidx.room.RoomOpenHelper.Delegate#onPreMigrate(androidx.sqlite.db.SupportSQLiteDatabase) parameter #0:
     Attempted to change parameter name from database to db in method androidx.room.RoomOpenHelper.Delegate.onPreMigrate
+
+
+RemovedClass: androidx.room.EntityUpsertionAdapterKt:
+    Removed class androidx.room.EntityUpsertionAdapterKt
+RemovedClass: androidx.room.util.TableInfoKt:
+    Removed class androidx.room.util.TableInfoKt
diff --git a/room/room-runtime/api/restricted_current.txt b/room/room-runtime/api/restricted_current.txt
index 3f55e9d..5416940 100644
--- a/room/room-runtime/api/restricted_current.txt
+++ b/room/room-runtime/api/restricted_current.txt
@@ -70,9 +70,6 @@
     method public java.util.List<java.lang.Long> upsertAndReturnIdsList(java.util.Collection<? extends T> entities);
   }
 
-  public final class EntityUpsertionAdapterKt {
-  }
-
   public class InvalidationTracker {
     ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase database, java.util.Map<java.lang.String,java.lang.String> shadowTablesMap, java.util.Map<java.lang.String,java.util.Set<java.lang.String>> viewTables, java.lang.String... tableNames);
     ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase database, java.lang.String... tableNames);
@@ -416,9 +413,6 @@
   public static final class TableInfo.Index.Companion {
   }
 
-  public final class TableInfoKt {
-  }
-
   @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class UUIDUtil {
     method public static java.util.UUID convertByteToUUID(byte[] bytes);
     method public static byte[] convertUUIDToByte(java.util.UUID uuid);
diff --git a/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt b/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
index 15ca43c9..d8f36a4a 100644
--- a/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
+++ b/room/room-runtime/src/androidTest/java/androidx/room/AutoClosingRoomOpenHelperTest.kt
@@ -30,6 +30,7 @@
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Test
 import java.io.IOException
 import java.util.concurrent.Executors
@@ -175,6 +176,7 @@
         assertThat(countingCallback.onCreateCalls).isEqualTo(1)
     }
 
+    @Ignore // b/266993269
     @RequiresApi(Build.VERSION_CODES.N)
     @Test
     fun testStatementReturnedByCompileStatement_doesntKeepDatabaseOpen() {
diff --git a/samples/MediaRoutingDemo/OWNERS b/samples/MediaRoutingDemo/OWNERS
index 834477b..d9e85fa 100644
--- a/samples/MediaRoutingDemo/OWNERS
+++ b/samples/MediaRoutingDemo/OWNERS
@@ -1 +1,2 @@
+# Bug component: 188488
 file: ../../mediarouter/OWNERS
diff --git a/samples/MediaRoutingDemo/build.gradle b/samples/MediaRoutingDemo/build.gradle
index 5ec869d..a40ccba 100644
--- a/samples/MediaRoutingDemo/build.gradle
+++ b/samples/MediaRoutingDemo/build.gradle
@@ -4,11 +4,14 @@
 }
 
 dependencies {
-    implementation(project(":appcompat:appcompat"))
+    implementation("androidx.appcompat:appcompat:1.6.0")
     implementation(project(":mediarouter:mediarouter"))
-    implementation(project(":recyclerview:recyclerview"))
+    implementation("androidx.recyclerview:recyclerview:1.2.1")
     implementation("androidx.concurrent:concurrent-futures:1.1.0")
     implementation(libs.material)
+
+    implementation ("androidx.multidex:multidex:2.0.1")
+    implementation("com.google.guava:guava:31.1-android")
 }
 
 android {
@@ -20,6 +23,7 @@
     }
     defaultConfig {
         vectorDrawables.useSupportLibrary = true
+        multiDexEnabled true
     }
     lint {
         baseline = file("lint-baseline.xml")
diff --git a/samples/MediaRoutingDemo/src/main/AndroidManifest.xml b/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
index bc93b71..b56a49f 100644
--- a/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
+++ b/samples/MediaRoutingDemo/src/main/AndroidManifest.xml
@@ -27,7 +27,8 @@
         android:icon="@drawable/app_sample_code"
         android:label="@string/media_router_app_name"
         android:supportsRtl="true"
-        android:theme="@style/Theme.SampleMediaRouter">
+        android:theme="@style/Theme.SampleMediaRouter"
+        android:name="androidx.multidex.MultiDexApplication">
 
         <activity
             android:name=".activities.MainActivity"
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
index 86feee7..700e126 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
@@ -78,6 +78,7 @@
 import com.example.androidx.mediarouting.session.SessionManager;
 import com.example.androidx.mediarouting.ui.LibraryAdapter;
 import com.example.androidx.mediarouting.ui.PlaylistAdapter;
+import com.google.common.util.concurrent.ListenableFuture;
 
 import java.io.File;
 
@@ -103,103 +104,8 @@
             };
     private final SessionManager mSessionManager = new SessionManager("app");
     private final MediaRouter.OnPrepareTransferListener mOnPrepareTransferListener =
-            (fromRoute, toRoute) -> {
-                Log.d(TAG, "onPrepareTransfer: from=" + fromRoute.getId()
-                        + ", to=" + toRoute.getId());
-                return CallbackToFutureAdapter.getFuture(completer -> {
-                    mHandler.postDelayed(() -> completer.set(null), 3000);
-                    return "onPrepareTransfer";
-                });
-            };
-    private final MediaRouter.Callback mMediaRouterCB = new MediaRouter.Callback() {
-        // Return a custom callback that will simply log all of the route events
-        // for demonstration purposes.
-        @Override
-        public void onRouteAdded(@NonNull MediaRouter router, @NonNull RouteInfo route) {
-            Log.d(TAG, "onRouteAdded: route=" + route);
-        }
-
-        @Override
-        public void onRouteChanged(@NonNull MediaRouter router, @NonNull RouteInfo route) {
-            Log.d(TAG, "onRouteChanged: route=" + route);
-        }
-
-        @Override
-        public void onRouteRemoved(@NonNull MediaRouter router, @NonNull RouteInfo route) {
-            Log.d(TAG, "onRouteRemoved: route=" + route);
-        }
-
-        @Override
-        public void onRouteSelected(@NonNull MediaRouter router,
-                @NonNull RouteInfo selectedRoute, int reason, @NonNull RouteInfo requestedRoute) {
-            Log.d(TAG, "onRouteSelected: requestedRoute=" + requestedRoute
-                    + ", route=" + selectedRoute + ", reason=" + reason);
-
-            mPlayer = Player.create(MainActivity.this, selectedRoute, mMediaSession);
-            if (isPresentationApiSupported()) {
-                mPlayer.updatePresentation();
-            }
-            mSessionManager.setPlayer(mPlayer);
-            if (reason != MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
-                mSessionManager.stop();
-            } else {
-                mSessionManager.unsuspend();
-            }
-
-            updateUi();
-        }
-
-        @Override
-        public void onRouteUnselected(@NonNull MediaRouter router, @NonNull RouteInfo route,
-                int reason) {
-            Log.d(TAG, "onRouteUnselected: route=" + route);
-            mMediaSession.setActive(false);
-
-            PlaylistItem item = getCheckedPlaylistItem();
-            if (item != null) {
-                long pos = item.getPosition() + (mSessionManager.isPaused()
-                        ? 0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
-                mSessionManager.suspend(pos);
-            }
-            if (isPresentationApiSupported()) {
-                mPlayer.updatePresentation();
-            }
-            mPlayer.release();
-        }
-
-        @Override
-        public void onRouteVolumeChanged(@NonNull MediaRouter router, @NonNull RouteInfo route) {
-            Log.d(TAG, "onRouteVolumeChanged: route=" + route);
-        }
-
-        @Override
-        public void onRoutePresentationDisplayChanged(
-                @NonNull MediaRouter router, @NonNull RouteInfo route) {
-            Log.d(TAG, "onRoutePresentationDisplayChanged: route=" + route);
-            if (isPresentationApiSupported()) {
-                mPlayer.updatePresentation();
-            }
-        }
-
-        @Override
-        public void onProviderAdded(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
-            Log.d(TAG, "onRouteProviderAdded: provider=" + provider);
-        }
-
-        @Override
-        public void onProviderRemoved(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
-            Log.d(TAG, "onRouteProviderRemoved: provider=" + provider);
-        }
-
-        @Override
-        public void onProviderChanged(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
-            Log.d(TAG, "onRouteProviderChanged: provider=" + provider);
-        }
-
-        private boolean isPresentationApiSupported() {
-            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
-        }
-    };
+            new TransferListener();
+    private final MediaRouter.Callback mMediaRouterCB = new SampleMediaRouterCallback();
 
     private MediaRouter mMediaRouter;
     private MediaRouteSelector mSelector;
@@ -333,27 +239,7 @@
         stopButton.setOnClickListener(v -> mSessionManager.stop());
 
         mSeekBar = findViewById(R.id.seekbar);
-        mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
-            @Override
-            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                PlaylistItem item = getCheckedPlaylistItem();
-                if (fromUser && item != null && item.getDuration() > 0) {
-                    long pos = progress * item.getDuration() / 100;
-                    mSessionManager.seek(item.getItemId(), pos);
-                    item.setPosition(pos);
-                    item.setTimestamp(SystemClock.elapsedRealtime());
-                }
-            }
-
-            @Override
-            public void onStartTrackingTouch(SeekBar seekBar) {
-            }
-
-            @Override
-            public void onStopTrackingTouch(SeekBar seekBar) {
-                updateUi();
-            }
-        });
+        mSeekBar.setOnSeekBarChangeListener(new SampleOnSeekBarChangeListener());
 
         // Schedule Ui update
         mHandler.postDelayed(mUpdateSeekRunnable, 1000);
@@ -379,16 +265,7 @@
                 mMediaRouter.getSelectedRoute(), mMediaSession);
 
         mSessionManager.setPlayer(mPlayer);
-        mSessionManager.setCallback(new SessionManager.Callback() {
-            @Override
-            public void onStatusChanged() {
-                updateUi();
-            }
-
-            @Override
-            public void onItemChanged(@NonNull PlaylistItem item) {
-            }
-        });
+        mSessionManager.setCallback(new SampleSessionManagerCallback());
 
         updateUi();
     }
@@ -486,27 +363,7 @@
         // Create the MediaSession
         mMediaSession = new MediaSessionCompat(this, "SampleMediaRouter", mEventReceiver,
                 mMediaPendingIntent);
-        mMediaSession.setCallback(new MediaSessionCompat.Callback() {
-            @Override
-            public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
-                if (mediaButtonEvent != null) {
-                    return handleMediaKey(
-                            mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
-                }
-                return super.onMediaButtonEvent(null);
-            }
-
-            @Override
-            public void onPlay() {
-                mSessionManager.resume();
-            }
-
-            @Override
-            public void onPause() {
-                mSessionManager.pause();
-            }
-        });
-
+        mMediaSession.setCallback(new SampleMediaSessionCompatCallback());
         SampleMediaButtonReceiver.setActivity(MainActivity.this);
     }
 
@@ -647,6 +504,11 @@
         return null;
     }
 
+    private long getCurrentEstimatedPosition(@NonNull PlaylistItem item) {
+        return item.getPosition() + (mSessionManager.isPaused()
+                ? 0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
+    }
+
     @NonNull
     private MediaRouterParams getRouterParams() {
         return new MediaRouterParams.Builder()
@@ -677,6 +539,149 @@
         }
     }
 
+    private final class SampleOnSeekBarChangeListener implements OnSeekBarChangeListener {
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+            PlaylistItem item = getCheckedPlaylistItem();
+            if (fromUser && item != null && item.getDuration() > 0) {
+                long pos = progress * item.getDuration() / 100;
+                mSessionManager.seek(item.getItemId(), pos);
+                item.setPosition(pos);
+                item.setTimestamp(SystemClock.elapsedRealtime());
+            }
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) {
+        }
+
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar) {
+            updateUi();
+        }
+    }
+
+    private final class SampleSessionManagerCallback implements SessionManager.Callback {
+        @Override
+        public void onStatusChanged() {
+            updateUi();
+        }
+
+        @Override
+        public void onItemChanged(@NonNull PlaylistItem item) {
+        }
+    }
+
+    private final class SampleMediaSessionCompatCallback extends MediaSessionCompat.Callback {
+        @Override
+        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
+            if (mediaButtonEvent != null) {
+                return handleMediaKey(
+                        mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
+            }
+            return super.onMediaButtonEvent(null);
+        }
+
+        @Override
+        public void onPlay() {
+            mSessionManager.resume();
+        }
+
+        @Override
+        public void onPause() {
+            mSessionManager.pause();
+        }
+    };
+
+    private final class SampleMediaRouterCallback extends MediaRouter.Callback {
+        // Return a custom callback that will simply log all of the route events
+        // for demonstration purposes.
+        @Override
+        public void onRouteAdded(@NonNull MediaRouter router, @NonNull RouteInfo route) {
+            Log.d(TAG, "onRouteAdded: route=" + route);
+        }
+
+        @Override
+        public void onRouteChanged(@NonNull MediaRouter router, @NonNull RouteInfo route) {
+            Log.d(TAG, "onRouteChanged: route=" + route);
+        }
+
+        @Override
+        public void onRouteRemoved(@NonNull MediaRouter router, @NonNull RouteInfo route) {
+            Log.d(TAG, "onRouteRemoved: route=" + route);
+        }
+
+        @Override
+        public void onRouteSelected(@NonNull MediaRouter router,
+                @NonNull RouteInfo selectedRoute, int reason, @NonNull RouteInfo requestedRoute) {
+            Log.d(TAG, "onRouteSelected: requestedRoute=" + requestedRoute
+                    + ", route=" + selectedRoute + ", reason=" + reason);
+
+            mPlayer = Player.create(MainActivity.this, selectedRoute, mMediaSession);
+            if (isPresentationApiSupported()) {
+                mPlayer.updatePresentation();
+            }
+            mSessionManager.setPlayer(mPlayer);
+            if (reason != MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
+                mSessionManager.stop();
+            } else {
+                mSessionManager.unsuspend();
+            }
+
+            updateUi();
+        }
+
+        @Override
+        public void onRouteUnselected(@NonNull MediaRouter router, @NonNull RouteInfo route,
+                int reason) {
+            Log.d(TAG, "onRouteUnselected: route=" + route);
+            mMediaSession.setActive(false);
+
+            PlaylistItem item = getCheckedPlaylistItem();
+            if (item != null) {
+                long pos = getCurrentEstimatedPosition(item);
+                mSessionManager.suspend(pos);
+            }
+            if (isPresentationApiSupported()) {
+                mPlayer.updatePresentation();
+            }
+            mPlayer.release();
+        }
+
+        @Override
+        public void onRouteVolumeChanged(@NonNull MediaRouter router, @NonNull RouteInfo route) {
+            Log.d(TAG, "onRouteVolumeChanged: route=" + route);
+        }
+
+        @Override
+        public void onRoutePresentationDisplayChanged(
+                @NonNull MediaRouter router, @NonNull RouteInfo route) {
+            Log.d(TAG, "onRoutePresentationDisplayChanged: route=" + route);
+            if (isPresentationApiSupported()) {
+                mPlayer.updatePresentation();
+            }
+        }
+
+        @Override
+        public void onProviderAdded(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderAdded: provider=" + provider);
+        }
+
+        @Override
+        public void onProviderRemoved(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderRemoved: provider=" + provider);
+        }
+
+        @Override
+        public void onProviderChanged(@NonNull MediaRouter router, @NonNull ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderChanged: provider=" + provider);
+        }
+
+        private boolean isPresentationApiSupported() {
+            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
+        }
+    }
+
     /**
      * Controller Dialog Fragment for the media router dialog.
      */
@@ -716,7 +721,7 @@
      * remote route volume in lock screen. It routes media key events back
      * to main app activity.
      */
-    public static class SampleMediaButtonReceiver extends BroadcastReceiver {
+    private static class SampleMediaButtonReceiver extends BroadcastReceiver {
         private static MainActivity sActivity;
 
         public static void setActivity(@NonNull MainActivity activity) {
@@ -732,7 +737,7 @@
     }
 
     @RequiresApi(23)
-    static class Api23Impl {
+    private static class Api23Impl {
         private Api23Impl() {
             // This class is not instantiable.
         }
@@ -752,4 +757,19 @@
             activity.requestPermissions(permissions, requestCode);
         }
     }
+
+    private class TransferListener implements
+            MediaRouter.OnPrepareTransferListener {
+        @Nullable
+        @Override
+        public ListenableFuture<Void> onPrepareTransfer(@NonNull RouteInfo fromRoute,
+                @NonNull RouteInfo toRoute) {
+            Log.d(TAG, "onPrepareTransfer: from=" + fromRoute.getId()
+                    + ", to=" + toRoute.getId());
+            return CallbackToFutureAdapter.getFuture(completer -> {
+                mHandler.postDelayed(() -> completer.set(null), 3000);
+                return "onPrepareTransfer";
+            });
+        }
+    }
 }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
index ff82614..dbb7d71 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
@@ -150,7 +150,8 @@
     }
 
     @Override
-    public void getStatus(@NonNull final PlaylistItem item, final boolean shouldUpdate) {
+    public void getPlaylistItemStatus(
+            @NonNull final PlaylistItem item, final boolean shouldUpdate) {
         if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
             item.setDuration(mMediaPlayer.getDuration());
             item.setPosition(getCurrentPosition());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
index 3a5d154..38a18bd 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
@@ -128,10 +128,11 @@
 
     /**
      * Get player status of an item.
+     *
      * @param item
      * @param shouldUpdate
      */
-    public abstract void getStatus(@NonNull PlaylistItem item, boolean shouldUpdate);
+    public abstract void getPlaylistItemStatus(@NonNull PlaylistItem item, boolean shouldUpdate);
 
     /**
      * Player pause operation.
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
index cc2ded3..8da024a 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
@@ -23,6 +23,8 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.mediarouter.media.MediaItemStatus;
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
@@ -34,6 +36,9 @@
 
 import com.example.androidx.mediarouting.data.PlaylistItem;
 import com.example.androidx.mediarouting.providers.SampleMediaRouteProvider;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -161,7 +166,8 @@
     }
 
     @Override
-    public void getStatus(final @NonNull PlaylistItem item, final boolean shouldUpdate) {
+    public void getPlaylistItemStatus(
+            final @NonNull PlaylistItem item, final boolean shouldUpdate) {
         if (!mClient.hasSession() || item.getRemoteItemId() == null) {
             // if session is not valid or item id not assigend yet.
             // just return, it's not fatal
@@ -175,12 +181,11 @@
     }
 
     private void updateStatus(@NonNull PlaylistItem item, boolean shouldUpdate) {
-        mClient.getStatus(item.getRemoteItemId(), null, new ItemActionCallback() {
+
+        ListenableFuture<MediaItemStatus> remoteStatusFuture = getRemoteItemStatus(item);
+        Futures.addCallback(remoteStatusFuture, new FutureCallback<MediaItemStatus>() {
             @Override
-            public void onResult(@NonNull Bundle data, @NonNull String sessionId,
-                    MediaSessionStatus sessionStatus, @NonNull String itemId,
-                    @NonNull MediaItemStatus itemStatus) {
-                logStatus("getStatus: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+            public void onSuccess(MediaItemStatus itemStatus) {
                 int state = itemStatus.getPlaybackState();
                 if (state == MediaItemStatus.PLAYBACK_STATE_PLAYING
                         || state == MediaItemStatus.PLAYBACK_STATE_PAUSED
@@ -196,13 +201,12 @@
             }
 
             @Override
-            public void onError(String error, int code, Bundle data) {
-                logError("getStatus: failed", error, code);
+            public void onFailure(@NonNull Throwable t) {
                 if (shouldUpdate && mCallback != null) {
                     mCallback.onPlaylistReady();
                 }
             }
-        });
+        }, Runnable::run);
     }
 
     @Override
@@ -412,6 +416,30 @@
         });
     }
 
+    private ListenableFuture<MediaItemStatus> getRemoteItemStatus(
+            @NonNull PlaylistItem playlistItem) {
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            mClient.getStatus(playlistItem.getRemoteItemId(), null, new ItemActionCallback() {
+                @Override
+                public void onError(@Nullable String error, int code, @Nullable Bundle data) {
+                    logError("getStatus: failed", error, code);
+                    completer.setException(new RuntimeException(error));
+                }
+
+                @Override
+                public void onResult(@NonNull Bundle data, @NonNull String sessionId,
+                        @Nullable MediaSessionStatus sessionStatus, @NonNull String itemId,
+                        @NonNull MediaItemStatus itemStatus) {
+                    logStatus("getStatus: succeeded", sessionId, sessionStatus, itemId,
+                            itemStatus);
+                    completer.set(itemStatus);
+                }
+            });
+
+            return "RemotePlayer.getRemoteItemStatus()";
+        });
+    }
+
     private void seekInternal(final PlaylistItem item) {
         throwIfNoSession();
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
index e21264e..4b68110 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
@@ -106,12 +106,12 @@
             // (update=1 requires player to callback onPlaylistReady())
             for (int i = 0; i < mPlaylist.size(); i++) {
                 PlaylistItem item = mPlaylist.get(i);
-                mPlayer.getStatus(item, (i == mPlaylist.size() - 1) /* update */);
+                mPlayer.getPlaylistItemStatus(item, (i == mPlaylist.size() - 1) /* update */);
             }
         } else {
             // Otherwise, only need to get status for current item. Player is
             // responsible to call onPlaylistReady() when finished.
-            mPlayer.getStatus(getCurrentItem(), true /* update */);
+            mPlayer.getPlaylistItemStatus(getCurrentItem(), true /* update */);
         }
     }
 
@@ -203,7 +203,7 @@
         for (PlaylistItem item : mPlaylist) {
             if (item.getItemId().equals(iid)) {
                 if (item == getCurrentItem()) {
-                    mPlayer.getStatus(item, false);
+                    mPlayer.getPlaylistItemStatus(item, false);
                 }
                 return item;
             }
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index cc2a5a6..983ef30 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -18,8 +18,13 @@
     implementation(project(":coordinatorlayout:coordinatorlayout"))
     implementation("com.google.android.material:material:1.6.0")
     implementation(project(":appcompat:appcompat"))
+    implementation(libs.multidex)
 }
 
 android {
     namespace "com.example.android.supportv4"
+
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
diff --git a/samples/SupportEmojiDemos/OWNERS b/samples/SupportEmojiDemos/OWNERS
index a2db8f4..8de29ba 100644
--- a/samples/SupportEmojiDemos/OWNERS
+++ b/samples/SupportEmojiDemos/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461226
 siyamed@google.com
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/OWNERS b/samples/SupportLeanbackDemos/OWNERS
index 063702c..729b9b6 100644
--- a/samples/SupportLeanbackDemos/OWNERS
+++ b/samples/SupportLeanbackDemos/OWNERS
@@ -1 +1,2 @@
+# Bug component: 188489
 dake@google.com
\ No newline at end of file
diff --git a/samples/SupportPreferenceDemos/OWNERS b/samples/SupportPreferenceDemos/OWNERS
index b2c38b4..1a37d70 100644
--- a/samples/SupportPreferenceDemos/OWNERS
+++ b/samples/SupportPreferenceDemos/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461460
 lpf@google.com
\ No newline at end of file
diff --git a/samples/SupportRemoteCallbackDemos/OWNERS b/samples/SupportRemoteCallbackDemos/OWNERS
index 3c245e9..7622b0d 100644
--- a/samples/SupportRemoteCallbackDemos/OWNERS
+++ b/samples/SupportRemoteCallbackDemos/OWNERS
@@ -1,3 +1,2 @@
-jmonk@android.com
-jmonk@google.com
+# Bug component: 606975
 madym@google.com
diff --git a/samples/SupportSliceDemos/OWNERS b/samples/SupportSliceDemos/OWNERS
index 8a9709c..12152c9 100644
--- a/samples/SupportSliceDemos/OWNERS
+++ b/samples/SupportSliceDemos/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461434
 madym@google.com
 pinyaoting@google.com
 sunnygoyal@google.com
diff --git a/samples/SupportWearDemos/OWNERS b/samples/SupportWearDemos/OWNERS
index a317e85..c51a1b8 100644
--- a/samples/SupportWearDemos/OWNERS
+++ b/samples/SupportWearDemos/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1235285
 flerda@google.com
 jnichol@google.com
diff --git a/savedstate/OWNERS b/savedstate/OWNERS
index cf853fe..59b2af3 100644
--- a/savedstate/OWNERS
+++ b/savedstate/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 687593
 ilake@google.com
 jbwoods@google.com
 sanura@google.com
diff --git a/security/security-app-authenticator-testing/OWNERS b/security/security-app-authenticator-testing/OWNERS
index 00fc159..3398f39 100644
--- a/security/security-app-authenticator-testing/OWNERS
+++ b/security/security-app-authenticator-testing/OWNERS
@@ -1 +1,2 @@
+# Bug component: 558417
 mpgroover@google.com
diff --git a/security/security-app-authenticator/OWNERS b/security/security-app-authenticator/OWNERS
index fd24685..3393162 100644
--- a/security/security-app-authenticator/OWNERS
+++ b/security/security-app-authenticator/OWNERS
@@ -1 +1,2 @@
+# Bug component: 558417
 mpgroover@google.com
\ No newline at end of file
diff --git a/security/security-biometric/OWNERS b/security/security-biometric/OWNERS
index 8915a5f..cdda268 100644
--- a/security/security-biometric/OWNERS
+++ b/security/security-biometric/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 558417
 danielangell@google.com
 eranm@google.com
 borrelli@google.com
diff --git a/security/security-crypto-ktx/OWNERS b/security/security-crypto-ktx/OWNERS
index 8915a5f..cdda268 100644
--- a/security/security-crypto-ktx/OWNERS
+++ b/security/security-crypto-ktx/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 558417
 danielangell@google.com
 eranm@google.com
 borrelli@google.com
diff --git a/security/security-crypto/OWNERS b/security/security-crypto/OWNERS
index 48f2be8..8ea4d8e 100644
--- a/security/security-crypto/OWNERS
+++ b/security/security-crypto/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 558417
 danielangell@google.com
 eranm@google.com
diff --git a/security/security-identity-credential/OWNERS b/security/security-identity-credential/OWNERS
index 2cfe0ac..92af54e 100644
--- a/security/security-identity-credential/OWNERS
+++ b/security/security-identity-credential/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 558417
 zeuthen@google.com
 swillden@google.com
diff --git a/settings.gradle b/settings.gradle
index cc816be..2449093 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -366,6 +366,7 @@
 includeProject(":annotation:annotation-experimental-lint-integration-tests", "annotation/annotation-experimental-lint/integration-tests")
 includeProject(":annotation:annotation-sampled")
 includeProject(":appactions:interaction:interaction-capabilities-core", [BuildType.MAIN])
+includeProject(":appactions:interaction:interaction-capabilities-safety", [BuildType.MAIN])
 includeProject(":appactions:interaction:interaction-proto", [BuildType.MAIN])
 includeProject(":appactions:interaction:interaction-service", [BuildType.MAIN])
 includeProject(":appcompat:appcompat", [BuildType.MAIN])
@@ -923,6 +924,7 @@
 includeProject(":wear:protolayout:protolayout", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:protolayout:protolayout-expression", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:protolayout:protolayout-expression-pipeline", [BuildType.MAIN, BuildType.WEAR])
+includeProject(":wear:protolayout:protolayout-material", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:protolayout:protolayout-proto", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:protolayout:protolayout-renderer", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:wear", [BuildType.MAIN, BuildType.WEAR])
@@ -956,6 +958,7 @@
 includeProject(":wear:tiles:tiles-proto", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:tiles:tiles-renderer", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:tiles:tiles-testing", [BuildType.MAIN, BuildType.WEAR])
+includeProject(":wear:tiles:tiles-tooling", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:watchface:watchface", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:watchface:watchface-complications", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:watchface:watchface-complications-permission-dialogs-sample", [BuildType.MAIN, BuildType.WEAR])
@@ -982,17 +985,20 @@
 includeProject(":wear:watchface:watchface-style-old-api-test-stub", "wear/watchface/watchface-style/old-api-test-stub", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":webkit:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":webkit:webkit", [BuildType.MAIN])
-includeProject(":window:window", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:extensions:extensions", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:extensions:core:core", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:integration-tests:configuration-change-tests", [BuildType.MAIN, BuildType.WINDOW])
-includeProject(":window:sidecar:sidecar", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:window-java", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:window-core", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:window-rxjava2", [BuildType.MAIN, BuildType.WINDOW])
-includeProject(":window:window-rxjava3", [BuildType.MAIN, BuildType.WINDOW])
-includeProject(":window:window-samples", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
-includeProject(":window:window-testing", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA, BuildType.WINDOW])
+includeProject(":window:window", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-samples", "window/window/samples", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:extensions:extensions", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:extensions:core:core", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:integration-tests:configuration-change-tests", [BuildType.MAIN])
+includeProject(":window:sidecar:sidecar", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-java", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-core", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-rxjava2", [BuildType.MAIN])
+includeProject(":window:window-rxjava3", [BuildType.MAIN])
+includeProject(":window:window-demos:demo", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-demos:demo-common", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-demos:demo-second-app", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
+includeProject(":window:window-testing", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN, BuildType.CAMERA])
 includeProject(":work:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":work:work-benchmark", [BuildType.MAIN])
 includeProject(":work:work-gcm", [BuildType.MAIN])
@@ -1007,6 +1013,14 @@
 
 /////////////////////////////
 //
+// Plugins
+//
+/////////////////////////////
+
+includeProject(":stableaidl:stableaidl-gradle-plugin", [BuildType.MAIN])
+
+/////////////////////////////
+//
 // Samples
 //
 /////////////////////////////
diff --git a/sharetarget/OWNERS b/sharetarget/OWNERS
index e5d1f0f..faf859a 100644
--- a/sharetarget/OWNERS
+++ b/sharetarget/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 559300
 sunnygoyal@google.com
 pinyaoting@google.com
diff --git a/slice/OWNERS b/slice/OWNERS
index e0582e6..89fc699 100644
--- a/slice/OWNERS
+++ b/slice/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 461434
 timchan@google.com
 sunnygoyal@google.com
 pinyaoting@google.com
diff --git a/slice/slice-builders-ktx/OWNERS b/slice/slice-builders-ktx/OWNERS
index 1706cb06..a211d12 100644
--- a/slice/slice-builders-ktx/OWNERS
+++ b/slice/slice-builders-ktx/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461434
 yboyar@google.com
 madym@google.com
diff --git a/slidingpanelayout/OWNERS b/slidingpanelayout/OWNERS
index 8eb6c00..eadd41a 100644
--- a/slidingpanelayout/OWNERS
+++ b/slidingpanelayout/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461510
 ilake@google.com
 shuanghu@google.com
diff --git a/sqlite/sqlite-ktx/OWNERS b/sqlite/sqlite-ktx/OWNERS
index 6fd8227..bc5e113 100644
--- a/sqlite/sqlite-ktx/OWNERS
+++ b/sqlite/sqlite-ktx/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461409
 yboyar@google.com
diff --git a/stableaidl/stableaidl-gradle-plugin/build.gradle b/stableaidl/stableaidl-gradle-plugin/build.gradle
new file mode 100644
index 0000000..4d56951
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/build.gradle
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.*
+
+plugins {
+    id 'AndroidXPlugin'
+    id 'kotlin'
+    id 'java-gradle-plugin'
+}
+
+apply from: "../../buildSrc/kotlin-dsl-dependency.gradle"
+
+dependencies {
+    implementation(findGradleKotlinDsl())
+    implementation(gradleApi())
+    implementation(libs.androidGradlePluginz)
+    implementation(libs.androidToolsCommon)
+    implementation(libs.androidToolsRepository)
+    implementation(libs.androidToolsSdkCommon)
+    implementation(libs.apacheCommonIo)
+    implementation(libs.guava)
+    implementation(libs.kotlinStdlib)
+
+    testImplementation(gradleTestKit())
+    testImplementation(project(":internal-testutils-gradle-plugin"))
+    testImplementation(libs.androidToolsAnalyticsProtos)
+    testImplementation(libs.gson)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.truth)
+}
+
+SdkResourceGenerator.generateForHostTest(project)
+
+gradlePlugin {
+    plugins {
+        stableAidl {
+            id = "androidx.stableaidl"
+            implementationClass = "androidx.stableaidl.StableAidlPlugin"
+        }
+    }
+}
+
+androidx {
+    name = "Stable AIDL Gradle Plugin"
+    type = LibraryType.GRADLE_PLUGIN
+    inceptionYear = "2022"
+    description = "Stable AIDL Gradle Plugin"
+}
+
+tasks {
+    validatePlugins {
+        failOnWarning.set(true)
+        enableStricterValidation.set(true)
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml b/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml
new file mode 100644
index 0000000..ac07c56
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.0.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-alpha07)" variant="all" version="8.0.0-alpha07">
+
+    <issue
+        id="BanSynchronizedMethods"
+        message="Use of synchronized methods is not recommended"
+        errorLine1="        @Override"
+        errorLine2="        ^">
+        <location
+            file="src/main/java/androidx/stableaidl/internal/LoggerWrapper.java"/>
+    </issue>
+
+</issues>
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlBuildTypeDslExtension.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlBuildTypeDslExtension.kt
new file mode 100644
index 0000000..0597cad
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlBuildTypeDslExtension.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+/**
+ * DSL extension interface for Stable AIDL configuration.
+ *
+ * This is passed to AGP's `DslExtension` to generate a Kotlin DSL for use in build files.
+ */
+interface StableAidlBuildTypeDslExtension {
+    /**
+     * The version of the AIDL interface and parcelable. Must be greater than 0.
+     */
+    var version: Int?
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlPlugin.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlPlugin.kt
new file mode 100644
index 0000000..ea681e8
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlPlugin.kt
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+import androidx.stableaidl.tasks.StableAidlCompile
+import com.android.build.api.variant.AndroidComponentsExtension
+import com.android.build.api.variant.DslExtension
+import com.android.build.gradle.AppExtension
+import com.android.build.gradle.BaseExtension
+import com.android.build.gradle.LibraryExtension
+import com.android.utils.usLocaleCapitalize
+import org.gradle.api.GradleException
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.file.Directory
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.TaskProvider
+
+private const val PLUGIN_DIRNAME = "stable-aidl"
+private const val GENERATED_PATH = "generated/source/$PLUGIN_DIRNAME"
+
+@Suppress("unused", "UnstableApiUsage")
+abstract class StableAidlPlugin : Plugin<Project> {
+
+    override fun apply(project: Project) {
+        val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java)
+            ?: throw GradleException("Stable AIDL plugin requires Android Gradle Plugin")
+        val base = project.extensions.getByType(BaseExtension::class.java)
+            ?: throw GradleException("Stable AIDL plugin requires Android Gradle Plugin")
+
+        // Extend the android sourceSet.
+        androidComponents.registerSourceType(SOURCE_TYPE_STABLE_AIDL)
+        androidComponents.registerSourceType(SOURCE_TYPE_STABLE_AIDL_IMPORTS)
+
+        // Extend AGP's project (e.g. android) and buildType DSLs.
+        androidComponents.registerExtension(
+            DslExtension.Builder("stableAidl")
+                .extendProjectWith(StableAidlProjectDslExtension::class.java)
+                .extendBuildTypeWith(StableAidlBuildTypeDslExtension::class.java)
+                .build()
+        ) { variantExtensionConfig ->
+            // Propagate project and buildType configuration to variant.
+            project.objects.newInstance(
+                StableAidlVariantExtension::class.java
+            ).also { variantExtension ->
+                variantExtension.version.set(
+                    variantExtensionConfig.buildTypeExtension(
+                        StableAidlBuildTypeDslExtension::class.java
+                    ).version
+                        ?: variantExtensionConfig.projectExtension(
+                            StableAidlProjectDslExtension::class.java
+                        ).version
+                )
+            }
+        }
+
+        val variantNameToGeneratingTask =
+            mutableMapOf<String, Pair<TaskProvider<StableAidlCompile>, Provider<Directory>>>()
+
+        androidComponents.onVariants { variant ->
+            val sourceDir = variant.sources.getByName(SOURCE_TYPE_STABLE_AIDL)
+            val importsDir = variant.sources.getByName(SOURCE_TYPE_STABLE_AIDL_IMPORTS)
+            val outputDir = project.layout.buildDirectory.dir("$GENERATED_PATH/${variant.name}")
+            val apiDirName = "$API_DIR/aidl${variant.name.usLocaleCapitalize()}"
+            val builtApiDir = project.layout.buildDirectory.dir(apiDirName)
+            val lastReleasedApiDir =
+                project.layout.projectDirectory.dir("$apiDirName/$RELEASED_API_DIR")
+            val lastCheckedInApiDir =
+                project.layout.projectDirectory.dir("$apiDirName/$CURRENT_API_DIR")
+
+            val compileAidlApiTask = registerCompileAidlApi(
+                project,
+                base,
+                variant,
+                sourceDir,
+                importsDir,
+                outputDir
+            )
+            val generateAidlApiTask = registerGenerateAidlApi(
+                project,
+                base,
+                variant,
+                sourceDir,
+                importsDir,
+                builtApiDir,
+                compileAidlApiTask
+            )
+            val checkAidlApiReleaseTask = registerCheckApiAidlRelease(
+                project,
+                base,
+                variant,
+                importsDir,
+                lastReleasedApiDir,
+                generateAidlApiTask
+            )
+            registerCheckAidlApi(
+                project,
+                base,
+                variant,
+                importsDir,
+                lastCheckedInApiDir,
+                generateAidlApiTask,
+                checkAidlApiReleaseTask
+            )
+            registerUpdateAidlApi(
+                project,
+                variant,
+                lastCheckedInApiDir,
+                generateAidlApiTask
+            )
+
+            variantNameToGeneratingTask[variant.name] = Pair(compileAidlApiTask, outputDir)
+        }
+
+        // AndroidComponentsExtension doesn't expose the APIs we need yet.
+        base.onVariants { variant ->
+            variantNameToGeneratingTask[variant.name]?.let { (compileAidlApiTask, outputDir) ->
+                variant.registerJavaGeneratingTask(compileAidlApiTask, outputDir.get().asFile)
+            }
+        }
+    }
+}
+
+/**
+ * Directory under the project root in which various types of API files are stored.
+ */
+internal const val API_DIR = "api"
+
+/**
+ * Directory under [API_DIR] where the current (work-in-progress) API files are stored.
+ */
+internal const val CURRENT_API_DIR = "current"
+
+/**
+ * Directory under [API_DIR] where the released (frozen) API files are stored.
+ */
+internal const val RELEASED_API_DIR = "released"
+
+/**
+ * Source type for Stable AIDL files.
+ */
+internal const val SOURCE_TYPE_STABLE_AIDL = "stableAidl"
+
+/**
+ * Source type for AIDL files available to Stable AIDL files as imports. This should only be used
+ * for shadowing framework files, and should not be used once the compile SDK has been annotated to
+ * work with Stable ADIL.
+ */
+internal const val SOURCE_TYPE_STABLE_AIDL_IMPORTS = "stableAidlImports"
+
+@Suppress("DEPRECATION") // For BaseVariant should be replaced in later studio versions
+internal fun BaseExtension.onVariants(
+    action: (com.android.build.gradle.api.BaseVariant) -> Unit
+) = when (this) {
+    is AppExtension -> applicationVariants.all(action)
+    is LibraryExtension -> libraryVariants.all(action)
+    else -> throw GradleException(
+        "androidx.stableaidl plugin must be used with Android app, library or feature plugin"
+    )
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlProjectDslExtension.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlProjectDslExtension.kt
new file mode 100644
index 0000000..00af154
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlProjectDslExtension.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+interface StableAidlProjectDslExtension {
+    val version: Int?
+}
\ No newline at end of file
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlTasks.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlTasks.kt
new file mode 100644
index 0000000..ff8b9ee
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlTasks.kt
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+import androidx.stableaidl.tasks.StableAidlCheckApi
+import androidx.stableaidl.tasks.StableAidlCompile
+import androidx.stableaidl.tasks.UpdateStableAidlApiTask
+import com.android.build.api.variant.SourceDirectories
+import com.android.build.api.variant.Variant
+import com.android.build.gradle.BaseExtension
+import com.android.utils.usLocaleCapitalize
+import java.io.File
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.file.Directory
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.TaskProvider
+
+private const val TASK_GROUP_API = "API"
+
+@Suppress("UnstableApiUsage") // SourceDirectories.Flat
+fun registerCompileAidlApi(
+    project: Project,
+    baseExtension: BaseExtension,
+    variant: Variant,
+    sourceDir: SourceDirectories.Flat,
+    importsDir: SourceDirectories.Flat,
+    outputDir: Provider<Directory>
+): TaskProvider<StableAidlCompile> = project.tasks.register(
+    computeTaskName("compile", variant, "AidlApi"),
+    StableAidlCompile::class.java
+) { task ->
+    task.group = TASK_GROUP_API
+    task.description = "Compiles AIDL source code"
+    task.variantName = variant.name
+    task.configureBuildToolsFrom(baseExtension)
+    task.configurePackageDirFrom(project, variant)
+    task.sourceDirs.set(sourceDir.all)
+    task.sourceOutputDir.set(outputDir)
+    task.importDirs.set(importsDir.all)
+    task.extraArgs.set(
+        listOf(
+            "--structured"
+        )
+    )
+}
+
+@Suppress("UnstableApiUsage") // SourceDirectories.Flat
+fun registerGenerateAidlApi(
+    project: Project,
+    baseExtension: BaseExtension,
+    variant: Variant,
+    sourceDir: SourceDirectories.Flat,
+    importsDir: SourceDirectories.Flat,
+    builtApiDir: Provider<Directory>,
+    compileAidlApiTask: Provider<StableAidlCompile>
+): TaskProvider<StableAidlCompile> = project.tasks.register(
+    computeTaskName("generate", variant, "AidlApi"),
+    StableAidlCompile::class.java
+) { task ->
+    task.group = TASK_GROUP_API
+    task.description = "Generates API files from AIDL source code"
+    task.variantName = variant.name
+    task.configureBuildToolsFrom(baseExtension)
+    task.configurePackageDirFrom(project, variant)
+    task.sourceDirs.set(sourceDir.all)
+    task.sourceOutputDir.set(builtApiDir)
+    task.importDirs.set(importsDir.all)
+    task.extraArgs.set(
+        listOf(
+            "--structured",
+            "--dumpapi"
+        )
+    )
+    task.dependsOn(compileAidlApiTask)
+}
+
+// Policy: If the artifact has previously been released, e.g. has a beta or later API file
+// checked in, then we must verify "release compatibility" against the work-in-progress
+// API file.
+@Suppress("UnstableApiUsage") // SourceDirectories.Flat
+fun registerCheckApiAidlRelease(
+    project: Project,
+    baseExtension: BaseExtension,
+    variant: Variant,
+    importsDir: SourceDirectories.Flat,
+    lastReleasedApiDir: Directory,
+    generateAidlTask: Provider<StableAidlCompile>
+): TaskProvider<StableAidlCheckApi> = project.tasks.register(
+    computeTaskName("check", variant, "AidlApiRelease"),
+    StableAidlCheckApi::class.java
+) { task ->
+    task.group = TASK_GROUP_API
+    task.description = "Checks the AIDL source code API surface against the " +
+        "stabilized AIDL API files"
+    task.variantName = variant.name
+    task.configureBuildToolsFrom(baseExtension)
+    task.importDirs.set(importsDir.all)
+    task.checkApiMode.set(StableAidlCheckApi.MODE_COMPATIBLE)
+    task.expectedApiDir.set(lastReleasedApiDir)
+    task.actualApiDir.set(generateAidlTask.flatMap { it.sourceOutputDir })
+    task.failOnMissingExpected.set(false)
+    task.cacheEvenIfNoOutputs()
+}
+
+// Policy: All changes to API surfaces for which compatibility is enforced must be
+// explicitly confirmed by running the updateApi task. To enforce this, the implementation
+// checks the "work-in-progress" built API file against the checked in current API file.
+@Suppress("UnstableApiUsage") // SourceDirectories.Flat
+fun registerCheckAidlApi(
+    project: Project,
+    baseExtension: BaseExtension,
+    variant: Variant,
+    importsDir: SourceDirectories.Flat,
+    lastCheckedInApiFile: Directory,
+    generateAidlTask: Provider<StableAidlCompile>,
+    checkAidlApiReleaseTask: Provider<StableAidlCheckApi>
+): TaskProvider<StableAidlCheckApi> = project.tasks.register(
+    computeTaskName("check", variant, "AidlApi"),
+    StableAidlCheckApi::class.java
+) { task ->
+    task.group = TASK_GROUP_API
+    task.description = "Checks the AIDL source code API surface against the checked-in " +
+        "AIDL API files"
+    task.variantName = variant.name
+    task.configureBuildToolsFrom(baseExtension)
+    task.importDirs.set(importsDir.all)
+    task.checkApiMode.set(StableAidlCheckApi.MODE_EQUAL)
+    task.expectedApiDir.set(lastCheckedInApiFile)
+    task.actualApiDir.set(generateAidlTask.flatMap { it.sourceOutputDir })
+    task.failOnMissingExpected.set(true)
+    task.cacheEvenIfNoOutputs()
+    task.dependsOn(checkAidlApiReleaseTask)
+}
+
+fun registerUpdateAidlApi(
+    project: Project,
+    variant: Variant,
+    lastCheckedInApiFile: Directory,
+    generateAidlTask: Provider<StableAidlCompile>,
+): TaskProvider<UpdateStableAidlApiTask> = project.tasks.register(
+    computeTaskName("update", variant, "AidlApi"),
+    UpdateStableAidlApiTask::class.java
+) { task ->
+    task.group = TASK_GROUP_API
+    task.description = "Updates the checked-in AIDL API files to AIDL match source code " +
+        "API surface"
+    task.apiLocation.set(generateAidlTask.flatMap { it.sourceOutputDir })
+    task.outputApiLocations.set(listOf(lastCheckedInApiFile.asFile))
+    task.forceUpdate.set(project.providers.gradleProperty("force").isPresent)
+}
+
+/**
+ * Tells Gradle to skip running this task, even if this task declares no output files.
+ */
+private fun Task.cacheEvenIfNoOutputs() {
+    this.outputs.file(this.getPlaceholderOutput())
+}
+
+/**
+ * Returns an unused output path that we can pass to Gradle to prevent Gradle from thinking that we
+ * forgot to declare outputs of this task, and instead to skip this task if its inputs are
+ * unchanged.
+ */
+private fun Task.getPlaceholderOutput(): File {
+    return File(this.project.buildDir, "placeholderOutput/" + this.name.replace(":", "-"))
+}
+
+private fun computeTaskName(prefix: String, variant: Variant, suffix: String) =
+    "$prefix${variant.name.usLocaleCapitalize()}$suffix"
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlVariantExtension.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlVariantExtension.kt
new file mode 100644
index 0000000..c251087
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/StableAidlVariantExtension.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+import com.android.build.api.variant.VariantExtension
+import org.gradle.api.provider.Property
+
+/**
+ * Stable AIDL properties scoped to the AGP variant object.
+ */
+interface StableAidlVariantExtension : VariantExtension {
+    val version: Property<Int>
+}
\ No newline at end of file
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/DirectoryWalker.java b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/DirectoryWalker.java
new file mode 100644
index 0000000..313fce4
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/DirectoryWalker.java
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal;
+
+
+import com.android.annotations.NonNull;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+/**
+ * Utility class to ease directory walking and performing actions on files.
+ *
+ * <p>It's expected for you to use either the static initializer methods or the builder class to
+ * create instances of this class.
+ *
+ * <p>Examples:
+ *
+ * <pre class='code'>
+ *     Path root = FileSystems.getDefault().getPath("/");
+ *
+ *     // Print out all files under a given path.
+ *     DirectoryWalker.builder()
+ *         .start(root)
+ *         .action((root, path) -> System.out.println(path))
+ *         .build()
+ *         .walk();
+ *
+ *     // Print out all .java files under a given path.
+ *     DirectoryWalker.builder()
+ *         .start(root)
+ *         .extensions("java")
+ *         .action((root, path) -> System.out.println(path))
+ *         .build()
+ *         .walk();
+ *
+ *     // Defer creation of your action class until it is needed. This is useful if the creation
+ *     // of your action is expensive (e.g. not a lambda like below, but a bonafide class with
+ *     // some non-trivial initialisation), and you expect that no files to be found on the
+ *     // directory walk (e.g. they're all filtered out because they don't match the extension
+ *     // filter).
+ *     DirectoryWalker.builder()
+ *         .start(root)
+ *         .action(() -> (root, path) -> System.out.println(path))
+ *         .build()
+ *         .walk();
+ * </pre>
+ *
+ * Cloned from <code>com.android.builder.internal.compiler.DirectoryWalker</code>.
+ */
+public class DirectoryWalker {
+
+    /** The directory to start walking from. */
+    @NonNull private final Path root;
+
+    /**
+     * A collection of predicates that, together, decide whether a file should be skipped or acted
+     * upon.
+     *
+     * <p>If a predicate's {@code test()} method returns true, that file will be skipped and the
+     * given FileAction will not be run for it.
+     */
+    @NonNull private final Collection<Predicate<Path>> filters;
+
+    /** The callback to invoke on each file. */
+    @NonNull private final FileAction action;
+
+    /**
+     * A FileAction represents a unit of work to perform on a file in a directory tree. The {@code
+     * call()} method will be called for each file in the tree that do not get filtered out by the
+     * list of filters.
+     */
+    @FunctionalInterface
+    public interface FileAction {
+        /**
+         * Perform work on a file.
+         *
+         * @param root the directory that this directory walk started at.
+         * @param file the current file being acted upon.
+         * @throws IOException if anything goes wrong. Implementors of this interface are expected
+         *     to either re-wrap their exceptions as IOExceptions, or handle their exceptions
+         *     appropriately.
+         */
+        void call(@NonNull Path root, @NonNull Path file) throws IOException;
+    }
+
+    /**
+     * A convenience class for creating filters that only allow certain extensions through.
+     *
+     * <p>Instead of using this class directory, instead use the {@code extensions()} method on the
+     * DirectoryWalker.Builder class.
+     */
+    private static class ExtensionSelector implements Predicate<Path> {
+        @NonNull private final Set<String> allowedExtensions;
+
+        /** @param allowedExtensions the extensions that you want to let pass through. */
+        public ExtensionSelector(String... allowedExtensions) {
+            this.allowedExtensions = Sets.newHashSet(allowedExtensions);
+        }
+
+        @Override
+        public boolean test(Path path) {
+            return allowedExtensions.contains(getExtension(path));
+        }
+
+        @NonNull
+        private static String getExtension(Path path) {
+            return com.google.common.io.Files.getFileExtension(path.toAbsolutePath().toString());
+        }
+    }
+
+    public static class Builder {
+        private Path root;
+        @NonNull private final Collection<Predicate<Path>> filters = Lists.newLinkedList();
+        private FileAction action;
+
+        private Builder() {}
+
+        /**
+         * Set the path to start traversal from. If left unset, the {@code build()} method will
+         * throw an exception.
+         *
+         * @param root path to start traversal from.
+         * @return itself.
+         */
+        @NonNull
+        public Builder root(@NonNull Path root) {
+            Preconditions.checkArgument(root != null, "cannot pass in a null root directory");
+            this.root = root;
+            return this;
+        }
+
+        /**
+         * Adds an extension filter to this DirectoryWalker. Any extensions passed in to this method
+         * will be allowed to pass through the filter, so you can use this method to declare what
+         * types of file you are interested in acting on.
+         *
+         * @param extensions the extensions you're interested in.
+         * @return itself.
+         */
+        @NonNull
+        public Builder extensions(String... extensions) {
+            Preconditions.checkArgument(
+                    extensions.length > 0, "cannot pass in an empty array of extensions");
+
+            for (String ext : extensions) {
+                Preconditions.checkArgument(ext != null, "cannot pass in a null extension");
+                Preconditions.checkArgument(ext.length() > 0, "cannot pass in an empty extension");
+            }
+
+            return select(new ExtensionSelector(extensions));
+        }
+
+        /**
+         * Add an arbitrary filter of type {@code Predicate<Path>}. Filters are run for every single
+         * file that is found while doing a walk. If the {@code test()} method in the predicate
+         * returns {@code true}, that file will not be passed to the {@code FileAction}.
+         *
+         * <p>A useful side effect of using filters is that if you filter out all of the encountered
+         * files and you're using a supplied action (see {@code action(Supplier<FileAction>}), the
+         * supplier's {@code get()} method will not be called.
+         *
+         * @return itself.
+         */
+        @NonNull
+        public Builder filter(@NonNull Predicate<Path> filter) {
+            Preconditions.checkArgument(filter != null, "cannot pass in a null filter");
+            filters.add(filter);
+            return this;
+        }
+
+        /**
+         * Adds an arbitrary selector of type {@code Predicate<Path>}. A selector is exactly the
+         * same as a filter, except that the condition is negated. So if a selector's {@code test()}
+         * method returns {@code false}, that file will not be passed to the {@code FileAction}.
+         *
+         * <p>See {@code filter()} for more information.
+         *
+         * @return itself.
+         */
+        @NonNull
+        public Builder select(@NonNull Predicate<Path> selector) {
+            return filter((path) -> !selector.test(path));
+        }
+
+        /**
+         * The action you wish to perform on each file. If left unset, the {@code build()} method
+         * will throw an exception.
+         *
+         * @param action the action you wish to perform.
+         * @return itself.
+         */
+        @NonNull
+        public Builder action(@NonNull FileAction action) {
+            Preconditions.checkArgument(action != null, "cannot pass in a null action");
+            this.action = action;
+            return this;
+        }
+
+        /**
+         * Sometimes it could be quite expensive to initialise a FileAction, and you want to avoid
+         * doing it if there's no actual work to do. Passing a {@code Supplier<FileAction>} instead
+         * of a {@code FileAction} allows you to do this.
+         *
+         * <p>The {@code get()} method on the supplier is guaranteed to be called either 0 (if no
+         * work needs to be done) or 1 time. It cannot return null (doing so will result in a
+         * NullPointerException being thrown).
+         *
+         * <pre class='code'>
+         *     DirectoryWalker.builder()
+         *         .root(Paths.get("/"))
+         *         .action(() -> new MyExpensiveFileAction())
+         *         .build()
+         *         .walk();
+         * </pre>
+         *
+         * @return itself.
+         */
+        @NonNull
+        public Builder action(@NonNull Supplier<? extends FileAction> supplier) {
+            Preconditions.checkArgument(supplier != null, "cannot pass in a null actionSupplier");
+
+            final Supplier<? extends FileAction> action = Suppliers.memoize(supplier::get);
+            this.action =
+                    (root, path) -> {
+                        FileAction fa = action.get();
+                        Preconditions.checkNotNull(fa, "action supplier cannot return null action");
+                        fa.call(root, path);
+                    };
+
+            return this;
+        }
+
+        /**
+         * Build an instance of DirectoryWalker. This method will throw an exception if any of the
+         * given parameters are incorrect.
+         *
+         * @return a DirectoryWalker.
+         */
+        @NonNull
+        public DirectoryWalker build() {
+            Preconditions.checkArgument(action != null, "action cannot be left unset");
+            Preconditions.checkArgument(root != null, "root cannot be left unset");
+            return new DirectoryWalker(action, root, Collections.unmodifiableCollection(filters));
+        }
+    }
+
+    /**
+     * If none of the static initiators work for you (e.g. DirectoryWalker.walk), using the builder
+     * is the expected way to create custom DirectoryWalkers.
+     *
+     * @return a new DirectoryWalker.Builder class that you can use to build an instance of
+     *     DirectoryWalker.
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Triggers a directory walk.
+     *
+     * <p>This can be called multiple times over the lifetime of the object, but note that each walk
+     * will use the same action. If you're modifying state in your action, you need to take this in
+     * to account.
+     *
+     * @throws IOException if anything goes wrong.
+     */
+    public DirectoryWalker walk() throws IOException {
+        // This behaviour is preserved from the previous implementation of this class. Ideally, a
+        // non-existent file passed to this class would raise an exception, but in this case we do
+        // not.
+        if (!Files.exists(root)) {
+            return this;
+        }
+
+        Set<FileVisitOption> options =
+                Sets.newEnumSet(Arrays.asList(FileVisitOption.FOLLOW_LINKS), FileVisitOption.class);
+
+        Files.walkFileTree(
+                root,
+                options,
+                Integer.MAX_VALUE,
+                new SimpleFileVisitor<Path>() {
+                    @Override
+                    public FileVisitResult visitFile(Path path, BasicFileAttributes attrs)
+                            throws IOException {
+                        if (!shouldSkipPath(path)) {
+                            action.call(root, path);
+                        }
+                        return FileVisitResult.CONTINUE;
+                    }
+                });
+
+        return this;
+    }
+
+    private DirectoryWalker(
+            @NonNull FileAction action,
+            @NonNull Path start,
+            @NonNull Collection<Predicate<Path>> filters) {
+        this.action = action;
+        this.root = start;
+        this.filters = filters;
+    }
+
+    private boolean shouldSkipPath(Path path) {
+        return filters.stream().anyMatch(predicate -> predicate.test(path));
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/IGNORE_CHECKSTYLE b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/IGNORE_CHECKSTYLE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/IGNORE_CHECKSTYLE
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/LoggerWrapper.java b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/LoggerWrapper.java
new file mode 100644
index 0000000..c33a42a
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/LoggerWrapper.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.common.resources.MergingException;
+import com.android.utils.ILogger;
+
+import org.gradle.api.logging.LogLevel;
+import org.gradle.api.logging.Logger;
+import org.gradle.api.logging.Logging;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * Implementation of Android's {@link ILogger} over Gradle's {@link Logger}.
+ *
+ * Note that this maps info to the default user-visible lifecycle.
+ *
+ * Cloned from <code>com.android.build.gradle.internal.LoggerWrapper</code>.
+ */
+public class LoggerWrapper implements ILogger {
+
+    // Mapping from ILogger method call to gradle log level.
+    private static final LogLevel ILOGGER_ERROR = LogLevel.ERROR;
+    private static final LogLevel ILOGGER_WARNING = LogLevel.WARN;
+    private static final LogLevel ILOGGER_QUIET = LogLevel.QUIET;
+    private static final LogLevel ILOGGER_LIFECYCLE = LogLevel.LIFECYCLE;
+    private static final LogLevel ILOGGER_INFO = LogLevel.INFO;
+    private static final LogLevel ILOGGER_VERBOSE = LogLevel.INFO;
+
+    private final Logger logger;
+
+    @NonNull
+    public static LoggerWrapper getLogger(@NonNull Class<?> klass) {
+        return new LoggerWrapper(Logging.getLogger(klass));
+    }
+
+    public LoggerWrapper(@NonNull Logger logger) {
+        this.logger = logger;
+    }
+
+    @Override
+    public void error(@Nullable Throwable throwable, @Nullable String s, Object... objects) {
+        if (throwable instanceof MergingException) {
+            // MergingExceptions have a known cause: they aren't internal errors, they
+            // are errors in the user's code, so a full exception is not helpful (and
+            // these exceptions should include a pointer to the user's error right in
+            // the message).
+            //
+            // Furthermore, these exceptions are already caught by the MergeResources
+            // and MergeAsset tasks, so don't duplicate the output
+            return;
+        }
+
+        if (!logger.isEnabled(ILOGGER_ERROR)) {
+            return;
+        }
+
+        if (s == null) {
+            s = "[no message defined]";
+        } else if (objects != null && objects.length > 0) {
+            s = String.format(s, objects);
+        }
+
+        if (throwable == null) {
+            logger.log(ILOGGER_ERROR, s);
+
+        } else {
+            logger.log(ILOGGER_ERROR, s, throwable);
+        }
+    }
+
+    @Override
+    public void warning(@NonNull String s, Object... objects) {
+        log(ILOGGER_WARNING, s, objects);
+    }
+
+    @Override
+    public void quiet(@NonNull String s, Object... objects) {
+        log(ILOGGER_QUIET, s, objects);
+    }
+
+    @Override
+    public void lifecycle(@NonNull String s, Object... objects) {
+        log(ILOGGER_LIFECYCLE, s, objects);
+    }
+
+    @Override
+    public void info(@NonNull String s, Object... objects) {
+        log(ILOGGER_INFO, s, objects);
+    }
+
+    @Override
+    public void verbose(@NonNull String s, Object... objects) {
+        log(ILOGGER_VERBOSE, s, objects);
+    }
+
+    private void log(@NonNull LogLevel logLevel, @NonNull String s, @Nullable Object[] objects){
+        if (!logger.isEnabled(logLevel)) {
+            return;
+        }
+        if (objects == null || objects.length == 0) {
+            logger.log(logLevel, s);
+
+        } else {
+            logger.log(logLevel, String.format(s, objects));
+        }
+    }
+
+    /**
+     * Return a {@link Supplier} for an instance of {@link ILogger} for the given class c.
+     *
+     * @param c the class' used to provide a logger name
+     * @return the {@link Supplier} for a logger instance.
+     */
+    public static Supplier<ILogger> supplierFor(Class<?> c) {
+        return new LoggerSupplier(c);
+    }
+
+    private static class LoggerSupplier implements Supplier<ILogger>, Serializable {
+
+        private final Class<?> clazz;
+        private ILogger logger = null;
+
+        private LoggerSupplier(Class<?> clazz) {
+            this.clazz = clazz;
+        }
+
+        @Override
+        public synchronized ILogger get() {
+            if (logger == null) {
+                logger = new LoggerWrapper(Logging.getLogger(clazz));
+            }
+            return logger;
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessExecutor.java b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessExecutor.java
new file mode 100644
index 0000000..2d86f78
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessExecutor.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal.process;
+
+import com.android.annotations.NonNull;
+import com.android.build.gradle.internal.LoggerWrapper;
+import com.android.ide.common.process.ProcessException;
+import com.android.ide.common.process.ProcessExecutor;
+import com.android.ide.common.process.ProcessInfo;
+import com.android.ide.common.process.ProcessOutput;
+import com.android.ide.common.process.ProcessOutputHandler;
+import com.android.ide.common.process.ProcessResult;
+
+import com.google.common.base.Throwables;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import org.gradle.api.Action;
+import org.gradle.process.ExecResult;
+import org.gradle.process.ExecSpec;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Implementation of ProcessExecutor that uses Gradle's mechanism to execute external processes.
+ *
+ * Cloned from <code>com.android.build.gradle.internal.process.GradleProcessExecutor</code>.
+ */
+public class GradleProcessExecutor implements ProcessExecutor {
+
+    @NonNull private final Function<Action<? super ExecSpec>, ExecResult> execOperations;
+
+    // Lambda is stored but not compared
+    @SuppressWarnings("ImplicitSamInstance")
+    public GradleProcessExecutor(
+            @NonNull Function<Action<? super ExecSpec>, ExecResult> execOperations) {
+        this.execOperations = execOperations;
+    }
+
+    @NonNull
+    @Override
+    public ListenableFuture<ProcessResult> submit(@NonNull final ProcessInfo processInfo,
+            @NonNull final ProcessOutputHandler processOutputHandler) {
+        final SettableFuture<ProcessResult> res = SettableFuture.create();
+        new Thread() {
+            @Override
+            public void run() {
+                try {
+                    ProcessResult result = execute(processInfo, processOutputHandler);
+                    res.set(result);
+                } catch (Throwable e) {
+                    res.setException(e);
+                }
+            }
+        }.start();
+
+        return res;
+    }
+
+    @NonNull
+    @Override
+    public ProcessResult execute(
+            @NonNull ProcessInfo processInfo,
+            @NonNull ProcessOutputHandler processOutputHandler) {
+        ProcessOutput output = processOutputHandler.createOutput();
+
+        ExecResult result;
+        try {
+            result = execOperations.apply(new ExecAction(processInfo, output));
+        } finally {
+            try {
+                output.close();
+            } catch (IOException e) {
+                LoggerWrapper.getLogger(GradleProcessExecutor.class)
+                        .warning(
+                                "Exception while closing sub process streams: "
+                                        + Throwables.getStackTraceAsString(e));
+            }
+        }
+        try {
+            processOutputHandler.handleOutput(output);
+        } catch (final ProcessException e) {
+            return new OutputHandlerFailedGradleProcessResult(e);
+        }
+        return new GradleProcessResult(result, processInfo);
+    }
+
+    private static class ExecAction implements Action<ExecSpec> {
+
+        @NonNull
+        private final ProcessInfo processInfo;
+
+        @NonNull
+        private final ProcessOutput processOutput;
+
+        ExecAction(@NonNull final ProcessInfo processInfo,
+                @NonNull final ProcessOutput processOutput) {
+            this.processInfo = processInfo;
+            this.processOutput = processOutput;
+        }
+
+        @Override
+        public void execute(ExecSpec execSpec) {
+
+            /*
+             * Gradle doesn't work correctly when there are empty args.
+             */
+            List<String> args =
+                    processInfo.getArgs().stream()
+                            .map(a -> a.isEmpty()? "\"\"" : a)
+                            .collect(Collectors.toList());
+            execSpec.setExecutable(processInfo.getExecutable());
+            execSpec.args(args);
+            execSpec.environment(processInfo.getEnvironment());
+            execSpec.setStandardOutput(processOutput.getStandardOutput());
+            execSpec.setErrorOutput(processOutput.getErrorOutput());
+            File directory = processInfo.getWorkingDirectory();
+            if (directory != null) {
+                execSpec.setWorkingDir(directory);
+            }
+
+            // we want the caller to be able to do its own thing.
+            execSpec.setIgnoreExitValue(true);
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessResult.java b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessResult.java
new file mode 100644
index 0000000..a578ef7
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/GradleProcessResult.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal.process;
+
+import com.android.annotations.NonNull;
+import com.android.ide.common.process.ProcessException;
+import com.android.ide.common.process.ProcessInfo;
+import com.android.ide.common.process.ProcessResult;
+
+import com.google.common.base.Joiner;
+
+import org.gradle.process.ExecResult;
+import org.gradle.process.internal.ExecException;
+
+/**
+ * Cloned from <code>com.android.build.gradle.internal.process.GradleProcessResult</code>.
+ */
+class GradleProcessResult implements ProcessResult {
+
+    @NonNull
+    private final ExecResult result;
+
+    @NonNull
+    private final ProcessInfo processInfo;
+
+    GradleProcessResult(@NonNull ExecResult result, @NonNull ProcessInfo processInfo) {
+        this.result = result;
+        this.processInfo = processInfo;
+    }
+
+    @NonNull
+    @Override
+    public ProcessResult assertNormalExitValue() throws ProcessException {
+        try {
+            result.assertNormalExitValue();
+        } catch (ExecException e) {
+            throw buildProcessException(e);
+        }
+
+        return this;
+    }
+
+    @Override
+    public int getExitValue() {
+        return result.getExitValue();
+    }
+
+    @NonNull
+    @Override
+    public ProcessResult rethrowFailure() throws ProcessException {
+        try {
+            result.rethrowFailure();
+        } catch (ExecException e) {
+            throw buildProcessException(e);
+        }
+        return this;
+    }
+
+    @NonNull
+    private ProcessException buildProcessException(@NonNull ExecException e) {
+        return new ProcessException(
+                String.format(
+                        "Error while executing %s with arguments {%s}",
+                        processInfo.getDescription(),
+                        Joiner.on(' ').join(processInfo.getArgs())),
+                e);
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/IGNORE_CHECKSTYLE b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/IGNORE_CHECKSTYLE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/IGNORE_CHECKSTYLE
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/OutputHandlerFailedGradleProcessResult.java b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/OutputHandlerFailedGradleProcessResult.java
new file mode 100644
index 0000000..fe7dc8c
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/internal/process/OutputHandlerFailedGradleProcessResult.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal.process;
+
+import com.android.annotations.NonNull;
+import com.android.ide.common.process.ProcessException;
+import com.android.ide.common.process.ProcessResult;
+
+/**
+ * Cloned from
+ * <code>com.android.build.gradle.internal.process.OutputHandlerFailedGradleProcessResult</code>.
+ */
+public class OutputHandlerFailedGradleProcessResult implements ProcessResult {
+    @NonNull
+    private final ProcessException failure;
+
+    OutputHandlerFailedGradleProcessResult(@NonNull ProcessException failure) {
+        this.failure = failure;
+    }
+
+    @NonNull
+    @Override
+    public ProcessResult assertNormalExitValue() throws ProcessException {
+        throw failure;
+    }
+
+    @Override
+    public int getExitValue() {
+        return -1;
+    }
+
+    @NonNull
+    @Override
+    public ProcessResult rethrowFailure() throws ProcessException {
+        throw failure;
+    }
+}
\ No newline at end of file
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCheckApi.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCheckApi.kt
new file mode 100644
index 0000000..da56750
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCheckApi.kt
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import androidx.stableaidl.internal.LoggerWrapper
+import androidx.stableaidl.internal.process.GradleProcessExecutor
+import com.android.build.gradle.BaseExtension
+import com.android.build.gradle.internal.BuildToolsExecutableInput
+import com.android.build.gradle.internal.services.getBuildService
+import com.android.ide.common.process.LoggedProcessOutputHandler
+import com.google.common.annotations.VisibleForTesting
+import java.io.File
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.Directory
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Internal
+import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.Optional
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.process.ExecOperations
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+/**
+ * Extension of AidlCompile that allows specifying extra command-line arguments.
+ */
+@CacheableTask
+abstract class StableAidlCheckApi : DefaultTask() {
+
+    @get:Internal
+    abstract var variantName: String
+
+    /**
+     * List of directories containing AIDL sources available as imports.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.RELATIVE)
+    abstract val importDirs: ListProperty<Directory>
+
+    @InputFile
+    @PathSensitive(PathSensitivity.NONE)
+    fun getAidlFrameworkProvider(): Provider<File> =
+        buildTools.aidlFrameworkProvider()
+
+    // We cannot use InputDirectory here because the directory may not exist yet.
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NONE)
+    abstract val expectedApiDir: DirectoryProperty
+
+    @get:InputDirectory
+    @get:PathSensitive(PathSensitivity.NONE)
+    abstract val actualApiDir: DirectoryProperty
+
+    @get:Input
+    abstract val checkApiMode: Property<String>
+
+    @get:Nested
+    abstract val buildTools: BuildToolsExecutableInput
+
+    @get:Input
+    @get:Optional
+    abstract val failOnMissingExpected: Property<Boolean>
+
+    @get:Input
+    @get:Optional
+    abstract val extraArgs: ListProperty<String>
+
+    @get:Inject
+    abstract val workerExecutor: WorkerExecutor
+
+    /**
+     * Configures build tools based on AGP's [BaseExtension].
+     */
+    fun configureBuildToolsFrom(baseExtension: BaseExtension) {
+        buildTools.buildToolsRevision.set(baseExtension.buildToolsRevision)
+        buildTools.compileSdkVersion.set(baseExtension.compileSdkVersion)
+        buildTools.sdkBuildService.set(getBuildService(project.gradle.sharedServices))
+    }
+
+    @TaskAction
+    fun checkApi() {
+        val aidlExecutable = buildTools
+            .aidlExecutableProvider()
+            .get()
+            .absoluteFile
+        val frameworkLocation = getAidlFrameworkProvider().get().absoluteFile
+
+        val checkApiMode = checkApiMode.get()
+        val expectedApiDir = expectedApiDir.get()
+        val actualApiDir = actualApiDir.get()
+        val extraArgs = extraArgs.get() + listOf(
+            "--structured",
+            "--checkapi=$checkApiMode",
+            expectedApiDir.asFile.absolutePath,
+            actualApiDir.asFile.absolutePath,
+        )
+
+        if (!expectedApiDir.asFile.exists()) {
+            if (failOnMissingExpected.getOrElse(false)) {
+                throw GradleException("Missing expected API directory: $expectedApiDir")
+            }
+            return
+        }
+
+        aidlCheckApiDelegate(
+            workerExecutor,
+            aidlExecutable,
+            frameworkLocation,
+            extraArgs,
+            importDirs.get()
+        )
+    }
+
+    abstract class StableAidlCheckApiRunnable : WorkAction<StableAidlCheckApiRunnable.Params> {
+
+        abstract class Params : WorkParameters {
+            abstract val aidlExecutable: RegularFileProperty
+            abstract val frameworkLocation: DirectoryProperty
+            abstract val importFolders: ConfigurableFileCollection
+            abstract val extraArgs: ListProperty<String>
+        }
+
+        @get:Inject
+        abstract val execOperations: ExecOperations
+
+        override fun execute() {
+            val executor =
+                GradleProcessExecutor(
+                    execOperations::exec
+                )
+            val logger = LoggedProcessOutputHandler(
+                LoggerWrapper.getLogger(StableAidlCheckApiRunnable::class.java))
+
+            callStableAidlProcessor(
+                parameters.aidlExecutable.get().asFile.canonicalPath,
+                parameters.frameworkLocation.get().asFile.canonicalPath,
+                parameters.importFolders.asIterable(),
+                parameters.extraArgs.get(),
+                executor,
+                logger
+            )
+        }
+    }
+
+    companion object {
+        const val MODE_EQUAL = "equal"
+        const val MODE_COMPATIBLE = "compatible"
+
+        @VisibleForTesting
+        fun aidlCheckApiDelegate(
+            workerExecutor: WorkerExecutor,
+            aidlExecutable: File,
+            frameworkLocation: File,
+            extraArgs: List<String>,
+            fullImportList: Collection<Directory>,
+        ) {
+            workerExecutor.noIsolation().submit(StableAidlCheckApiRunnable::class.java) {
+                it.aidlExecutable.set(aidlExecutable)
+                it.frameworkLocation.set(frameworkLocation)
+                it.importFolders.from(fullImportList)
+                it.extraArgs.set(extraArgs)
+            }
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCompile.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCompile.kt
new file mode 100644
index 0000000..dfc62a9
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlCompile.kt
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import androidx.stableaidl.internal.DirectoryWalker
+import androidx.stableaidl.internal.LoggerWrapper
+import androidx.stableaidl.internal.process.GradleProcessExecutor
+import com.android.build.api.variant.Variant
+import com.android.build.gradle.BaseExtension
+import com.android.build.gradle.internal.BuildToolsExecutableInput
+import com.android.build.gradle.internal.services.getBuildService
+import com.android.build.gradle.tasks.AidlCompile
+import com.android.builder.compiling.DependencyFileProcessor
+import com.android.builder.internal.incremental.DependencyData
+import com.android.ide.common.process.LoggedProcessOutputHandler
+import com.android.utils.FileUtils
+import com.android.utils.usLocaleCapitalize
+import com.google.common.annotations.VisibleForTesting
+import java.io.File
+import java.io.IOException
+import java.io.Serializable
+import java.nio.file.Path
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.Project
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.Directory
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Internal
+import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.Optional
+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.process.ExecOperations
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+/**
+ * Extension of AidlCompile that allows specifying extra command-line arguments.
+ *
+ * This classes relies on a number of internal AGP classes:
+ *
+ * - [BuildToolsExecutableInput] Provides access to Android SDK tools, including the AIDL compiler.
+ *   We can't clone this out because it would pull in other components that we can't clone out.
+ * - [getBuildService] Provides access to AGP's build service registry. We can't clone this out
+ *   because it uses a private, unique constant per class loader.
+ * - [DependencyData] Data object containing dependencies parsed from the AIDL compiler's -d output.
+ *   We can't clone this out because it is used in the API signature of
+ *   [DependencyFileProcessor.processFile].
+ */
+@CacheableTask
+abstract class StableAidlCompile : DefaultTask() {
+
+    @get:Internal
+    abstract var variantName: String
+
+    /**
+     * List of directories containing AIDL sources to be compiled.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.RELATIVE)
+    abstract val sourceDirs: ListProperty<Directory>
+
+    /**
+     * List of directories containing AIDL sources available as imports.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.RELATIVE)
+    abstract val importDirs: ListProperty<Directory>
+
+    @InputFile
+    @PathSensitive(PathSensitivity.NONE)
+    fun getAidlFrameworkProvider(): Provider<File> =
+        buildTools.aidlFrameworkProvider()
+
+    /**
+     * Directory for storing AIDL-generated Java sources.
+     */
+    @get:OutputDirectory
+    abstract val sourceOutputDir: DirectoryProperty
+
+    /**
+     * Directory for storing Parcelable headers for consumers.
+     *
+     * These are copied directly from AIDL sources in [sourceDirs].
+     */
+    @get:OutputDirectory
+    @get:Optional
+    abstract val packagedDir: DirectoryProperty
+
+    @get:Nested
+    abstract val buildTools: BuildToolsExecutableInput
+
+    @get:Input
+    @get:Optional
+    abstract val extraArgs: ListProperty<String>
+
+    @get:Inject
+    abstract val workerExecutor: WorkerExecutor
+
+    private class DepFileProcessor : DependencyFileProcessor {
+        override fun processFile(dependencyFile: File): DependencyData? {
+            return DependencyData.parseDependencyFile(dependencyFile)
+        }
+    }
+
+    /**
+     * Configures packaged output directory based on AGP's [AidlCompile] task for the [variant].
+     */
+    fun configurePackageDirFrom(project: Project, variant: Variant) {
+        val compileAidlTask = project.tasks.named(
+            "compile${variant.name.usLocaleCapitalize()}Aidl", AidlCompile::class.java)
+        // Packaged output directory is configured in AGP using:
+        // if (creationConfig.componentType.isAar) {
+        //   creationConfig.artifacts.setInitialProvider(
+        //     taskProvider,
+        //     aidlCompile::packagedDir
+        //   ).withName("out").on(InternalArtifactType.AIDL_PARCELABLE)
+        // }
+        packagedDir.set(compileAidlTask.flatMap { it.packagedDir })
+    }
+
+    /**
+     * Configures build tools based on AGP's [BaseExtension].
+     */
+    fun configureBuildToolsFrom(baseExtension: BaseExtension) {
+        // These are all required by aidlExecutableProvider().
+        buildTools.buildToolsRevision.set(baseExtension.buildToolsRevision)
+        buildTools.compileSdkVersion.set(baseExtension.compileSdkVersion)
+        buildTools.sdkBuildService.set(getBuildService(project.gradle.sharedServices))
+    }
+
+    @TaskAction
+    fun compile() {
+        // this is full run, clean the previous output'
+        val aidlExecutable = buildTools
+            .aidlExecutableProvider()
+            .get()
+            .absoluteFile
+        val frameworkLocation = getAidlFrameworkProvider().get().absoluteFile
+        val destinationDir = sourceOutputDir.get().asFile
+        FileUtils.cleanOutputDir(destinationDir)
+        if (!destinationDir.exists()) {
+            destinationDir.mkdirs()
+        }
+
+        val parcelableDir = packagedDir.orNull
+        if (parcelableDir != null) {
+            FileUtils.cleanOutputDir(parcelableDir.asFile)
+        }
+
+        val fullImportList = sourceDirs.get() + importDirs.get()
+        val sourceDirsAsFiles = sourceDirs.get().map { it.asFile }
+
+        aidlCompileDelegate(
+            workerExecutor,
+            aidlExecutable,
+            frameworkLocation,
+            destinationDir,
+            parcelableDir?.asFile,
+            extraArgs.get(),
+            sourceDirsAsFiles,
+            fullImportList
+        )
+    }
+
+    internal class ProcessingRequest(val root: File, val file: File) : Serializable
+
+    abstract class StableAidlCompileRunnable : WorkAction<StableAidlCompileRunnable.Params> {
+
+        abstract class Params : WorkParameters {
+            abstract val aidlExecutable: RegularFileProperty
+            abstract val frameworkLocation: DirectoryProperty
+            abstract val importFolders: ConfigurableFileCollection
+            abstract val sourceOutputDir: DirectoryProperty
+            abstract val packagedOutputDir: DirectoryProperty
+            abstract val dir: Property<File>
+            abstract val extraArgs: ListProperty<String>
+        }
+
+        @get:Inject
+        abstract val execOperations: ExecOperations
+
+        override fun execute() {
+            // Collect all aidl files in the directory then process them
+            val processingRequests = mutableListOf<ProcessingRequest>()
+
+            val collector =
+                DirectoryWalker.FileAction { root: Path, file: Path ->
+                    processingRequests.add(ProcessingRequest(root.toFile(), file.toFile()))
+                }
+
+            try {
+                DirectoryWalker.builder()
+                    .root(parameters.dir.get().toPath())
+                    .extensions("aidl")
+                    .action(collector)
+                    .build()
+                    .walk()
+            } catch (e: IOException) {
+                throw RuntimeException(e)
+            }
+
+            val depFileProcessor = DepFileProcessor()
+            val executor =
+                GradleProcessExecutor(
+                    execOperations::exec
+                )
+            val logger = LoggedProcessOutputHandler(
+                LoggerWrapper.getLogger(StableAidlCompileRunnable::class.java))
+
+            for (request in processingRequests) {
+                callStableAidlProcessor(
+                    parameters.aidlExecutable.get().asFile.canonicalPath,
+                    parameters.frameworkLocation.get().asFile.canonicalPath,
+                    parameters.importFolders.asIterable(),
+                    parameters.extraArgs.get(),
+                    executor,
+                    logger,
+                    parameters.sourceOutputDir.get().asFile,
+                    parameters.packagedOutputDir.orNull?.asFile,
+                    depFileProcessor,
+                    request.root.toPath(),
+                    request.file.toPath()
+                )
+            }
+        }
+    }
+
+    companion object {
+        @VisibleForTesting
+        fun aidlCompileDelegate(
+            workerExecutor: WorkerExecutor,
+            aidlExecutable: File,
+            frameworkLocation: File,
+            destinationDir: File,
+            parcelableDir: File?,
+            extraArgs: List<String>,
+            sourceFolders: Collection<File>,
+            fullImportList: Collection<Directory>
+        ) {
+            for (dir in sourceFolders) {
+                workerExecutor.noIsolation().submit(StableAidlCompileRunnable::class.java) {
+                    it.aidlExecutable.set(aidlExecutable)
+                    it.frameworkLocation.set(frameworkLocation)
+                    it.importFolders.from(fullImportList)
+                    it.sourceOutputDir.set(destinationDir)
+                    it.packagedOutputDir.set(parcelableDir)
+                    it.extraArgs.set(extraArgs)
+                    it.dir.set(dir)
+                }
+            }
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlProcessor.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlProcessor.kt
new file mode 100644
index 0000000..1a60c362
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/StableAidlProcessor.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import androidx.stableaidl.internal.process.GradleProcessExecutor
+import com.android.builder.compiling.DependencyFileProcessor
+import com.android.ide.common.process.ProcessException
+import com.android.ide.common.process.ProcessInfoBuilder
+import com.android.ide.common.process.ProcessOutputHandler
+import com.android.repository.io.FileOpUtils
+import com.android.utils.FileUtils
+import com.google.common.io.Files
+import java.io.File
+import java.io.IOException
+import java.nio.charset.StandardCharsets
+import java.nio.file.Path
+
+@Throws(IOException::class)
+fun callStableAidlProcessor(
+    aidlExecutable: String,
+    @Suppress("UNUSED_PARAMETER")
+    frameworkLocation: String, // TODO: Unused until the framework has been fully annotated.
+    importFolders: Iterable<File>,
+    extraArgs: List<String?>,
+    processExecutor: GradleProcessExecutor,
+    processOutputHandler: ProcessOutputHandler,
+    sourceOutputDir: File? = null,
+    packagedOutputDir: File? = null,
+    dependencyFileProcessor: DependencyFileProcessor? = null,
+    startDir: Path? = null,
+    inputFilePath: Path? = null
+) {
+    val builder = ProcessInfoBuilder()
+    builder.setExecutable(aidlExecutable)
+
+    // Specify the base output directory for generated language (e.g. Java) source files.
+    if (sourceOutputDir != null) {
+        builder.addArgs("-o" + sourceOutputDir.absolutePath)
+    }
+
+    // TODO: Remove when the framework has been fully annotated.
+    // Specify the framework as a pre-processed file for use in import statements.
+    // builder.addArgs("-p$frameworkLocation")
+
+    // Specify all library AIDL directories for use in import statements.
+    for (f in importFolders) {
+        builder.addArgs("-I" + f.absolutePath)
+    }
+
+    // Specify the dependency file output as a temporary file. This will contains a list of
+    // generated file paths, some of which will be parcelable headers need to be copied to
+    // packagedOutputDir.
+    val depFile = File.createTempFile("aidl", ".d")
+    builder.addArgs("-d" + depFile.absolutePath)
+
+    // Specify additional arguments, ex. those used for Stable AIDL operations.
+    builder.addArgs(extraArgs)
+
+    // Specify a single input file.
+    if (inputFilePath != null) {
+        builder.addArgs(inputFilePath.toAbsolutePath().toString())
+    }
+
+    val result = processExecutor.execute(builder.createProcess(), processOutputHandler)
+    try {
+        result.rethrowFailure().assertNormalExitValue()
+    } catch (pe: ProcessException) {
+        throw IOException(pe)
+    }
+
+    val relativeInputFile = if (startDir != null && inputFilePath != null) {
+        FileUtils.toSystemIndependentPath(
+            FileOpUtils.makeRelative(startDir.toFile(), inputFilePath.toFile())
+        )
+    } else {
+        null
+    }
+
+    // Process the dependency file by deleting empty generated source files and copying parcelable
+    // headers to secondary output for AAR packaging.
+    val data = dependencyFileProcessor?.processFile(depFile)
+    if (data != null) {
+        // As of build tools 29.0.2, Aidl no longer produces an empty list of output files
+        // so we need to check each file in it for content and delete the empty java files
+        var isParcelable = true
+        val outputFiles = data.outputFiles
+        if (outputFiles.isNotEmpty()) {
+            for (path in outputFiles) {
+                val outputFileContent = Files.readLines(File(path), StandardCharsets.UTF_8)
+                val emptyFileLine = "// This file is intentionally left blank as placeholder for " +
+                    "parcel declaration."
+                if (outputFileContent.size <= 2 && outputFileContent[0].equals(emptyFileLine)) {
+                    FileUtils.delete(File(path))
+                } else {
+                    isParcelable = false
+                }
+            }
+        }
+        if (inputFilePath != null && relativeInputFile != null) {
+            if (packagedOutputDir != null && isParcelable) {
+                // looks like a parcelable or is listed for packaging
+                // Store it in the secondary output of the DependencyData object.
+                val destFile = File(packagedOutputDir, relativeInputFile)
+                destFile.parentFile.mkdirs()
+                Files.copy(inputFilePath.toFile(), destFile)
+                data.addSecondaryOutputFile(destFile.path)
+            }
+        }
+    }
+    FileUtils.delete(depFile)
+}
\ No newline at end of file
diff --git a/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/UpdateStableAidlApiTask.kt b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/UpdateStableAidlApiTask.kt
new file mode 100644
index 0000000..c12b84b
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/main/java/androidx/stableaidl/tasks/UpdateStableAidlApiTask.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import java.io.File
+import java.security.MessageDigest
+import org.gradle.api.GradleException
+import org.gradle.api.logging.Logger
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.OutputDirectories
+import org.apache.commons.io.FileUtils
+import org.gradle.api.file.DirectoryProperty
+
+/**
+ * Task for updating the public Android resource surface, e.g. `public.xml`.
+ */
+@CacheableTask
+abstract class UpdateStableAidlApiTask : DefaultTask() {
+    /** Generated resource API file (in build output). */
+    @get:InputDirectory
+    @get:PathSensitive(PathSensitivity.NONE)
+    abstract val apiLocation: DirectoryProperty
+
+    @get:Input
+    abstract val forceUpdate: Property<Boolean>
+
+    /** AIDL API directories to which APIs should be written (in source control). */
+    @get:OutputDirectories
+    abstract val outputApiLocations: ListProperty<File>
+
+    @TaskAction
+    fun updateAidlApi() {
+        // TODO: Work out policy for allowing Stable AIDL overwrites.
+        // var permitOverwriting = true
+        // for (outputApi in outputApiLocations.get()) {
+        //     val version = outputApi.version()
+        //     if (version != null && version.isFinalApi() &&
+        //         outputApi.publicApiFile.exists() &&
+        //         !forceUpdate.get()
+        //     ) {
+        //         permitOverwriting = false
+        //     }
+        // }
+
+        val inputApi = apiLocation.get()
+
+        for (outputApi in outputApiLocations.get()) {
+            copyDir(
+                inputApi.asFile,
+                outputApi,
+                true,
+                logger
+            )
+        }
+    }
+}
+
+internal fun copyDir(
+    source: File,
+    dest: File,
+    permitOverwriting: Boolean,
+    logger: Logger
+) {
+    val sourceHash = if (source.exists()) {
+        hashDir(source)
+    } else {
+        null
+    }
+    val overwriting = dest.exists() && !sourceHash.contentEquals(hashDir(dest))
+    val changing = overwriting || (dest.exists() != source.exists())
+    if (changing) {
+        if (overwriting && !permitOverwriting) {
+            val message = "Modifying the API definition for a previously released artifact " +
+                "having a final API version (version not ending in '-alpha') is not " +
+                "allowed.\n\n" +
+                "Previously declared definition is $dest\n" +
+                "Current generated   definition is $source\n\n" +
+                "Did you mean to increment the library version first?\n\n" +
+                "If you have reason to overwrite the API files for the previous release " +
+                "anyway, you can run `./gradlew updateApi -Pforce` to ignore this message"
+            throw GradleException(message)
+        }
+        FileUtils.deleteDirectory(dest)
+        if (source.exists()) {
+            FileUtils.copyDirectory(source, dest)
+            logger.lifecycle("Copied $source to $dest")
+        } else {
+            logger.lifecycle("Deleted $dest because $source does not exist")
+        }
+    }
+}
+
+fun hashDir(dir: File): ByteArray {
+    val digest = MessageDigest.getInstance("SHA-256")
+    dir.listFiles()?.forEach { file ->
+        val fileBytes = if (file.isDirectory) {
+            hashDir(file)
+        } else {
+            file.readBytes()
+        }
+        digest.update(fileBytes)
+    }
+    return digest.digest()
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/StableAidlPluginTest.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/StableAidlPluginTest.kt
new file mode 100644
index 0000000..41bf28a
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/StableAidlPluginTest.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl
+
+import androidx.testutils.gradle.ProjectSetupRule
+import kotlin.test.assertFailsWith
+import kotlin.test.assertTrue
+import org.gradle.testkit.runner.GradleRunner
+import org.gradle.testkit.runner.UnexpectedBuildFailure
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StableAidlPluginTest {
+    @get:Rule
+    val projectSetup = ProjectSetupRule()
+    private lateinit var gradleRunner: GradleRunner
+
+    @Before
+    fun setUp() {
+        gradleRunner = GradleRunner.create()
+            .withProjectDir(projectSetup.rootDir)
+            .withPluginClasspath()
+    }
+
+    @Test
+    fun applyPluginAppProject() {
+        projectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id('com.android.application')
+                    id('androidx.stableaidl')
+                }
+            """.trimIndent(),
+            suffix = """
+            android {
+                namespace 'androidx.stableaidl.testapp'
+                buildFeatures {
+                  aidl = true
+                }
+                buildTypes.all {
+                  stableAidl {
+                    version 1
+                  }
+                }
+            }
+            """.trimIndent()
+        )
+
+        // Tasks should contain those defined in StableAidlTasks.
+        val output = gradleRunner.withArguments("tasks", "--stacktrace").build()
+        assertTrue { output.output.contains("compileDebugAidlApi - ") }
+        assertTrue { output.output.contains("checkDebugAidlApiRelease - ") }
+    }
+
+    @Test
+    fun applyPluginAndroidLibProject() {
+        projectSetup.writeDefaultBuildGradle(
+            prefix = """
+                plugins {
+                    id('com.android.library')
+                    id('androidx.stableaidl')
+                }
+            """.trimIndent(),
+            suffix = """
+            android {
+                namespace 'androidx.stableaidl.testapp'
+                buildFeatures {
+                  aidl = true
+                }
+                buildTypes.all {
+                  stableAidl {
+                    version 1
+                  }
+                }
+            }
+            """.trimIndent()
+        )
+
+        // Tasks should contain those defined in StableAidlTasks.
+        val output = gradleRunner.withArguments("tasks", "--stacktrace").build()
+        assertTrue { output.output.contains("compileDebugAidlApi - ") }
+        assertTrue { output.output.contains("checkDebugAidlApiRelease - ") }
+    }
+
+    @Test
+    fun applyPluginNonAndroidProject() {
+        projectSetup.buildFile.writeText(
+            """
+            plugins {
+                id('java')
+                id('androidx.stableaidl')
+            }
+
+            repositories {
+                ${projectSetup.defaultRepoLines}
+            }
+            """.trimIndent()
+        )
+
+        assertFailsWith(UnexpectedBuildFailure::class) {
+            gradleRunner.withArguments("jar").build()
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/internal/fixtures/FakeNoOpWorkAction.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/internal/fixtures/FakeNoOpWorkAction.kt
new file mode 100644
index 0000000..543e2dd
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/internal/fixtures/FakeNoOpWorkAction.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.internal.fixtures
+
+import org.gradle.process.ExecOperations
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+
+abstract class FakeNoOpWorkAction : WorkAction<FakeNoOpWorkAction.Parameters> {
+    abstract val execOperations: ExecOperations
+
+    abstract class Parameters : WorkParameters
+}
\ No newline at end of file
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCheckApiTest.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCheckApiTest.kt
new file mode 100644
index 0000000..74fd01a
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCheckApiTest.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import androidx.stableaidl.internal.fixtures.FakeNoOpWorkAction
+import com.android.build.gradle.internal.fixtures.FakeGradleExecOperations
+import com.android.build.gradle.internal.fixtures.FakeGradleWorkExecutor
+import com.android.build.gradle.internal.fixtures.FakeInjectableService
+import com.google.common.truth.Truth
+import java.io.File
+import kotlin.reflect.jvm.javaMethod
+import org.gradle.api.DefaultTask
+import org.gradle.testfixtures.ProjectBuilder
+import org.gradle.workers.WorkerExecutor
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StableAidlCheckApiTest {
+    @get:Rule
+    val temporaryFolder = TemporaryFolder()
+
+    private val execOperations = FakeGradleExecOperations()
+
+    private lateinit var workers: WorkerExecutor
+    private lateinit var instantiatorTask: DefaultTask
+
+    private fun createFile(name: String, parent: File): File {
+        val newFile = parent.resolve(name)
+        newFile.createNewFile()
+        return newFile
+    }
+
+    @Before
+    fun setup() {
+        with(ProjectBuilder.builder().withProjectDir(temporaryFolder.newFolder()).build()) {
+            workers = FakeGradleWorkExecutor(
+                objects, temporaryFolder.newFolder(), listOf(
+                    FakeInjectableService(
+                        FakeNoOpWorkAction::execOperations.getter.javaMethod!!,
+                        execOperations
+                    )
+                )
+            )
+            instantiatorTask = tasks.create("task", DefaultTask::class.java)
+        }
+    }
+
+    @Test
+    fun testStableAidlCheckApiRunnable() {
+        val expectedApiDir = temporaryFolder.newFolder()
+        createFile("1.aidl", expectedApiDir)
+        createFile("2.aidl", expectedApiDir)
+        createFile("3.aidl", expectedApiDir)
+
+        val actualApiDir = temporaryFolder.newFolder()
+        createFile("1.aidl", actualApiDir)
+
+        val fakeExe = temporaryFolder.newFile("fake.exe")
+
+        val fakeFramework = temporaryFolder.newFolder("fakeFramework")
+
+        StableAidlCheckApi.aidlCheckApiDelegate(
+            workers,
+            fakeExe,
+            fakeFramework,
+            listOf(
+                "--structured",
+                "--checkapi=equal",
+                expectedApiDir.absolutePath,
+                actualApiDir.absolutePath
+            ),
+            listOf()
+        )
+
+        // Check that executable only runs once and arguments are intact.
+        Truth.assertThat(execOperations.capturedExecutions).hasSize(1)
+        for (processInfo in execOperations.capturedExecutions) {
+            Truth.assertThat(processInfo.executable).isEqualTo(fakeExe.canonicalPath)
+
+            Truth.assertThat(processInfo.args).containsAtLeast(
+                // TODO: Remove when the framework has been fully annotated.
+                // "-p" + fakeFramework.canonicalPath,
+                "--structured",
+                "--checkapi=equal",
+                expectedApiDir.absolutePath,
+                actualApiDir.absolutePath
+            )
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCompileTest.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCompileTest.kt
new file mode 100644
index 0000000..25c4133
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/androidx/stableaidl/tasks/StableAidlCompileTest.kt
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.stableaidl.tasks
+
+import androidx.stableaidl.internal.fixtures.FakeNoOpWorkAction
+import androidx.stableaidl.tasks.StableAidlCompile.Companion.aidlCompileDelegate
+import com.android.build.gradle.internal.fixtures.FakeGradleExecOperations
+import com.android.build.gradle.internal.fixtures.FakeGradleWorkExecutor
+import com.android.build.gradle.internal.fixtures.FakeInjectableService
+import com.google.common.truth.Truth
+import java.io.File
+import kotlin.reflect.jvm.javaMethod
+import org.gradle.api.DefaultTask
+import org.gradle.testfixtures.ProjectBuilder
+import org.gradle.workers.WorkerExecutor
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StableAidlCompileTest {
+    @get:Rule
+    val temporaryFolder = TemporaryFolder()
+
+    private val execOperations = FakeGradleExecOperations()
+
+    private lateinit var workers: WorkerExecutor
+    private lateinit var instantiatorTask: DefaultTask
+
+    private fun createFile(name: String, parent: File): File {
+        val newFile = parent.resolve(name)
+        newFile.createNewFile()
+        return newFile
+    }
+
+    @Before
+    fun setup() {
+        with(ProjectBuilder.builder().withProjectDir(temporaryFolder.newFolder()).build()) {
+            workers = FakeGradleWorkExecutor(
+                objects, temporaryFolder.newFolder(), listOf(
+                    FakeInjectableService(
+                        FakeNoOpWorkAction::execOperations.getter.javaMethod!!,
+                        execOperations
+                    )
+                )
+            )
+            instantiatorTask = tasks.create("task", DefaultTask::class.java)
+        }
+    }
+
+    @Test
+    fun testStableAidlCompileRunnable() {
+        val sourceFolder = temporaryFolder.newFolder()
+        val file1 = createFile("1.aidl", sourceFolder)
+        val file2 = createFile("2.aidl", sourceFolder)
+        val file3 = createFile("3.aidl", sourceFolder)
+        val noise = createFile("noise.txt", sourceFolder)
+
+        val outputDir = temporaryFolder.newFolder("outputDir")
+
+        val fakeExe = temporaryFolder.newFile("fake.exe")
+
+        val fakeFramework = temporaryFolder.newFolder("fakeFramework")
+
+        aidlCompileDelegate(
+            workers,
+            fakeExe,
+            fakeFramework,
+            outputDir,
+            null,
+            listOf("-x"),
+            listOf(sourceFolder),
+            listOf()
+        )
+
+        // Check that executable only runs for aidl files, and properly locates the framework
+        // and output dir
+        Truth.assertThat(execOperations.capturedExecutions).hasSize(3)
+        for (processInfo in execOperations.capturedExecutions) {
+            Truth.assertThat(processInfo.executable).isEqualTo(fakeExe.canonicalPath)
+
+            Truth.assertThat(processInfo.args).containsAtLeast(
+                // TODO: Remove when the framework has been fully annotated.
+                // "-p" + fakeFramework.canonicalPath,
+                "-o" + outputDir.absolutePath,
+                "-x"
+            )
+
+            Truth.assertThat(processInfo.args).containsAnyOf(
+                file1.absolutePath,
+                file2.absolutePath,
+                file3.absolutePath
+            )
+
+            Truth.assertThat(processInfo.args).doesNotContain(noise.absolutePath)
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleExecOperations.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleExecOperations.kt
new file mode 100644
index 0000000..a65ad83
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleExecOperations.kt
@@ -0,0 +1,207 @@
+/*
+ * 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.
+ */
+
+package com.android.build.gradle.internal.fixtures
+
+import org.gradle.api.Action
+import org.gradle.process.BaseExecSpec
+import org.gradle.process.CommandLineArgumentProvider
+import org.gradle.process.ExecOperations
+import org.gradle.process.ExecResult
+import org.gradle.process.ExecSpec
+import org.gradle.process.JavaExecSpec
+import org.gradle.process.ProcessForkOptions
+import java.io.File
+import java.io.InputStream
+import java.io.OutputStream
+
+/** This implementation only captures arguments used to launch process, it does not run it. */
+class FakeGradleExecOperations : ExecOperations {
+    var capturedExecutions = mutableListOf<ExecSpec>()
+
+    override fun exec(p0: Action<in ExecSpec>): ExecResult {
+        p0.execute(CapturingExecSpec().also { capturedExecutions.add(it) })
+        return object : ExecResult {
+            override fun getExitValue() = 1
+            override fun assertNormalExitValue() = this
+            override fun rethrowFailure() = this
+        }
+    }
+
+    override fun javaexec(p0: Action<in JavaExecSpec>?): ExecResult {
+        TODO("Not yet implemented")
+    }
+}
+
+class CapturingExecSpec : ExecSpec {
+    private var executable: String? = null
+    private val commandLine: MutableList<String> = mutableListOf()
+    private var environment: MutableMap<String, Any> = mutableMapOf()
+    private val args: MutableList<String> = mutableListOf()
+
+    override fun getExecutable() = executable
+
+    override fun setExecutable(p0: Any) {
+        executable = p0.toString()
+    }
+
+    override fun setExecutable(p0: String) {
+        executable = p0
+    }
+
+    override fun setStandardOutput(p0: OutputStream): BaseExecSpec {
+        // ignore
+        return this
+    }
+
+    override fun setCommandLine(p0: MutableList<String>) {
+        commandLine.clear()
+        commandLine.addAll(p0)
+    }
+
+    override fun setCommandLine(vararg p0: Any) {
+        commandLine.clear()
+        commandLine.add(p0.toString())
+    }
+
+    override fun setCommandLine(p0: MutableIterable<*>) {
+        commandLine.clear()
+        p0.filterNotNull().forEach {
+            commandLine.add(it.toString())
+        }
+    }
+
+    override fun environment(p0: MutableMap<String, *>): ProcessForkOptions {
+        p0.forEach { (t, any) ->
+            environment[t] = any.toString()
+        }
+        return this
+    }
+
+    override fun environment(p0: String, p1: Any): ProcessForkOptions {
+        environment[p0] = p1.toString()
+        return this
+    }
+
+    override fun commandLine(vararg p0: Any): ExecSpec {
+        commandLine.add(p0.toString())
+        return this
+    }
+
+    override fun commandLine(p0: MutableIterable<*>): ExecSpec {
+        commandLine.addAll(p0.filterNotNull().map { it.toString() })
+        return this
+    }
+
+    override fun workingDir(p0: Any?): ProcessForkOptions {
+        TODO("Not yet implemented")
+    }
+
+    override fun setWorkingDir(p0: File?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun setWorkingDir(p0: Any?) {
+        TODO("Not yet implemented")
+    }
+
+    override fun getCommandLine(): MutableList<String> {
+        return commandLine
+    }
+
+    override fun setEnvironment(p0: MutableMap<String, *>) {
+        environment.clear()
+        environment(p0)
+    }
+
+    override fun args(vararg p0: Any): ExecSpec {
+        args.add(p0.toString())
+        return this
+    }
+
+    override fun args(p0: MutableIterable<*>): ExecSpec {
+        args.addAll(p0.filterNotNull().map { it.toString() })
+        return this
+    }
+
+    override fun getArgumentProviders(): MutableList<CommandLineArgumentProvider> {
+        TODO("Not yet implemented")
+    }
+
+    override fun executable(p0: Any): ProcessForkOptions {
+        executable = p0.toString()
+        return this
+    }
+
+    override fun setIgnoreExitValue(p0: Boolean): BaseExecSpec {
+        // ignore
+        return this
+    }
+
+    override fun getStandardInput(): InputStream {
+        TODO("Not yet implemented")
+    }
+
+    override fun setStandardInput(p0: InputStream?): BaseExecSpec {
+        // ignore
+        return this
+    }
+
+    override fun getStandardOutput(): OutputStream {
+        TODO("Not yet implemented")
+    }
+
+    override fun setErrorOutput(p0: OutputStream?): BaseExecSpec {
+        // ignore
+        return this
+    }
+
+    override fun getArgs(): MutableList<String> {
+        return args
+    }
+
+    override fun copyTo(p0: ProcessForkOptions?): ProcessForkOptions {
+        TODO("Not yet implemented")
+    }
+
+    override fun isIgnoreExitValue(): Boolean {
+        TODO("Not yet implemented")
+    }
+
+    override fun getWorkingDir(): File {
+        TODO("Not yet implemented")
+    }
+
+    override fun getEnvironment(): MutableMap<String, Any> {
+        return environment
+    }
+
+    override fun setArgs(p0: MutableList<String>): ExecSpec {
+        args.clear()
+        args.addAll(p0)
+        return this
+    }
+
+    override fun setArgs(p0: MutableIterable<*>): ExecSpec {
+        args.clear()
+        args.addAll(p0.filterNotNull().map { it.toString() })
+        return this
+    }
+
+    override fun getErrorOutput(): OutputStream {
+        TODO("Not yet implemented")
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleProperty.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleProperty.kt
new file mode 100644
index 0000000..f64e355
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleProperty.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal.fixtures
+
+import org.gradle.api.Transformer
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
+import java.util.function.BiFunction
+
+class FakeGradleProperty<T>(private var value: T? = null) : Property<T> {
+
+    private var valueProvider: Provider<out T>? = null
+    private var convention: T? = null
+
+    override fun <S : Any?> flatMap(
+        transformer: Transformer<out Provider<out S>?, in T>
+    ): Provider<S> {
+        throw NotImplementedError()
+    }
+
+    override fun isPresent() = value != null || valueProvider != null
+
+    override fun getOrElse(defaultValue: T) =
+        value ?: valueProvider?.get() ?: convention ?: defaultValue
+
+    override fun <S : Any?> map(transformer: Transformer<out S?, in T>): Provider<S> {
+        throw NotImplementedError()
+    }
+
+    override fun get() =
+        value ?: valueProvider?.get() ?: convention ?: throw IllegalStateException("Value not set")
+
+    override fun getOrNull() = value ?: valueProvider?.get() ?: convention
+
+    override fun value(value: T?): Property<T> {
+        this.value = value
+        return this
+    }
+
+    override fun set(value: T?) {
+        this.value = value
+        this.valueProvider = null
+    }
+
+    override fun set(provider: Provider<out T>) {
+        this.value = null
+        this.valueProvider = provider
+    }
+
+    override fun convention(convention: T?): Property<T> {
+        this.convention = convention
+        return this
+    }
+
+    override fun convention(convention: Provider<out T>): Property<T> {
+        throw NotImplementedError()
+    }
+
+    override fun finalizeValue() {
+        throw NotImplementedError()
+    }
+
+    override fun finalizeValueOnRead() {
+        throw NotImplementedError()
+    }
+
+    override fun value(p0: Provider<out T>): Property<T> {
+        throw NotImplementedError()
+    }
+
+    override fun disallowChanges() {
+        throw NotImplementedError()
+    }
+
+    override fun orElse(p0: T): Provider<T> {
+        throw NotImplementedError()
+    }
+
+    override fun orElse(p0: Provider<out T>): Provider<T> {
+        throw NotImplementedError()
+    }
+
+    override fun disallowUnsafeRead() {
+        throw NotImplementedError()
+    }
+
+    @Deprecated("Deprecated in Java")
+    override fun forUseAtConfigurationTime(): Provider<T> {
+        throw NotImplementedError()
+    }
+
+    override fun <U : Any?, R : Any?> zip(
+        p0: Provider<U>,
+        p1: BiFunction<in T, in U, out R>
+    ): Provider<R> {
+        throw NotImplementedError()
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleWorkExecutor.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleWorkExecutor.kt
new file mode 100644
index 0000000..678696b
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeGradleWorkExecutor.kt
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal.fixtures
+
+import org.gradle.api.Action
+import org.gradle.api.model.ObjectFactory
+import org.gradle.workers.ClassLoaderWorkerSpec
+import org.gradle.workers.ProcessWorkerSpec
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkQueue
+import org.gradle.workers.WorkerExecutionException
+import org.gradle.workers.WorkerExecutor
+import org.gradle.workers.WorkerSpec
+import org.objectweb.asm.ClassReader
+import org.objectweb.asm.ClassVisitor
+import org.objectweb.asm.ClassWriter
+import org.objectweb.asm.FieldVisitor
+import org.objectweb.asm.MethodVisitor
+import org.objectweb.asm.Opcodes
+import java.io.File
+import java.lang.reflect.Method
+import java.lang.reflect.ParameterizedType
+import java.net.URLClassLoader
+
+/**
+ * Fake implementation of [WorkerExecutor]. [ObjectFactory] is used to instantiate parameters,
+ * while [File] is used to output generated decorated classes.
+ */
+open class FakeGradleWorkExecutor(
+    objectFactory: ObjectFactory,
+    tmpDir: File,
+    injectableService: List<FakeInjectableService> = emptyList(),
+    private val executionMode: ExecutionMode = ExecutionMode.RUNNING
+) : WorkerExecutor {
+
+    private val workQueue =
+        FakeGradleWorkQueue(
+            executionMode,
+            objectFactory,
+            tmpDir.resolve("generatedClasses"),
+            injectableService
+        )
+
+    val capturedParameters: List<WorkParameters>
+        get() {
+            check(executionMode == ExecutionMode.CAPTURING) {
+                "Recording params is possible only in capturing mode."
+            }
+            return workQueue.capturedParameters
+        }
+
+    override fun noIsolation(): WorkQueue {
+        return workQueue
+    }
+
+    override fun classLoaderIsolation(): WorkQueue {
+        check(executionMode == ExecutionMode.CAPTURING)
+        return workQueue
+    }
+
+    override fun processIsolation(): WorkQueue {
+        check(executionMode == ExecutionMode.CAPTURING)
+        return workQueue
+    }
+
+    override fun noIsolation(action: Action<in WorkerSpec?>): WorkQueue {
+        throw NotImplementedError()
+    }
+
+    override fun classLoaderIsolation(action: Action<in ClassLoaderWorkerSpec?>): WorkQueue {
+        check(executionMode == ExecutionMode.CAPTURING)
+        return workQueue
+    }
+
+    override fun processIsolation(action: Action<in ProcessWorkerSpec?>): WorkQueue {
+        check(executionMode == ExecutionMode.CAPTURING)
+        return workQueue
+    }
+
+    override fun await() {
+        // do nothing as we execute all actions on submit
+    }
+}
+
+class FakeInjectableService(
+    val methodReference: Method,
+    val implementation: Any
+)
+
+enum class ExecutionMode {
+    // Run work actions
+    RUNNING,
+
+    // Just record parameters used for launching work actions
+    CAPTURING,
+}
+
+/** Runs workers actions by directly instantiating worker actions and worker action parameters. */
+private class FakeGradleWorkQueue(
+    private val executionMode: ExecutionMode,
+    private val objectFactory: ObjectFactory,
+    private val generatedClassesOutput: File,
+    private val injectableService: List<FakeInjectableService>
+) : WorkQueue {
+
+    val capturedParameters = mutableListOf<WorkParameters>()
+
+    override fun <T : WorkParameters> submit(
+        aClass: Class<out WorkAction<T>>,
+        action: Action<in T>
+    ) {
+        val parameterTypeName =
+            (aClass.genericSuperclass as? ParameterizedType
+                ?: aClass.genericInterfaces.single() as ParameterizedType)
+                .actualTypeArguments[0].typeName
+        if (aClass.constructors.single().parameterCount != 0) {
+            // we should just instantiate it and pass in all params + services
+            runWorkAction(parameterTypeName, action, aClass)
+        } else {
+            val workerActionName = aClass.name.replace(".", "/")
+            val bytes =
+                aClass.classLoader.getResourceAsStream("$workerActionName.class")
+                    .use { it!!.readBytes() }
+
+            val reader = ClassReader(bytes)
+            val cw = ClassWriter(0)
+            reader.accept(WorkerActionDecorator(cw, parameterTypeName, injectableService), 0)
+
+            generatedClassesOutput.resolve("$workerActionName$CLASS_SUFFIX.class").also {
+                it.parentFile.mkdirs()
+                it.writeBytes(cw.toByteArray())
+            }
+            URLClassLoader(
+                arrayOf(generatedClassesOutput.toURI().toURL()),
+                aClass.classLoader
+            ).use { classloader ->
+                val actualClass = classloader.loadClass(aClass.name + CLASS_SUFFIX)
+                runWorkAction(parameterTypeName, action, actualClass)
+            }
+        }
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    private fun <T : WorkParameters> runWorkAction(
+        parameterTypeName: String?,
+        action: Action<in T>,
+        actualClass: Class<out Any>
+    ) {
+        // initialize and configure parameters
+        val parametersInstance =
+            objectFactory.newInstance(
+                this::class.java.classLoader.loadClass(parameterTypeName)
+            ) as T
+        action.execute(parametersInstance)
+
+        when (executionMode) {
+            ExecutionMode.CAPTURING -> capturedParameters.add(parametersInstance)
+            ExecutionMode.RUNNING -> {
+                // create and run worker action
+                val allConstructorArgs =
+                    (listOf(parametersInstance) + injectableService.map { it.implementation })
+                        .toTypedArray()
+                val newInstance = objectFactory.newInstance(actualClass, *allConstructorArgs)
+                (newInstance as WorkAction<*>).execute()
+            }
+        }
+    }
+
+    @Throws(WorkerExecutionException::class)
+    override fun await() {
+        // do nothing as we execute all actions on submit
+    }
+}
+
+/**
+ * Generates decorated class for worker action. The generated class does not have abstract
+ * [WorkAction.getParameters] method, and instead it has a constructor which accepts
+ * [parameterDescriptor] as argument.
+ */
+class WorkerActionDecorator(
+    classWriter: ClassWriter,
+    paramsType: String,
+    private val injectableService: List<FakeInjectableService>
+) :
+    ClassVisitor(Opcodes.ASM7, classWriter) {
+
+    private val parameterDescriptor = binaryToDescriptor(paramsType)
+
+    lateinit var generatedClassName: String
+
+    override fun visit(
+        version: Int,
+        access: Int,
+        name: String?,
+        signature: String?,
+        superName: String?,
+        interfaces: Array<out String>?
+    ) {
+        generatedClassName = name + CLASS_SUFFIX
+
+        val fieldAndDescriptors = mutableListOf<Pair<String, String>>()
+        synthesizeFieldAndMethod("getParameters", WorkParameters::class.java.name).also {
+            fieldAndDescriptors.add(it)
+        }
+        injectableService.forEach {
+            fieldAndDescriptors.add(
+                synthesizeFieldAndMethod(
+                    it.methodReference.name,
+                    it.methodReference.returnType.name
+                )
+            )
+        }
+
+        val constructorArgs = fieldAndDescriptors.joinToString(separator = "") { it.second }
+
+        // add new constructor for parameters and all injectable services
+        super.visitMethod(
+            Opcodes.ACC_PUBLIC,
+            "<init>",
+            "($constructorArgs)V",
+            null,
+            null
+        ).apply {
+            visitAnnotation("Ljavax/inject/Inject;", true)
+            visitCode()
+            visitVarInsn(Opcodes.ALOAD, 0)
+            visitMethodInsn(Opcodes.INVOKESPECIAL, name, "<init>", "()V", false)
+
+            fieldAndDescriptors.forEachIndexed { index, fieldAndDescriptor ->
+                visitVarInsn(Opcodes.ALOAD, 0) // load this
+                visitVarInsn(Opcodes.ALOAD, (index + 1)) // load constructor argument
+                visitFieldInsn(
+                    Opcodes.PUTFIELD,
+                    generatedClassName,
+                    fieldAndDescriptor.first,
+                    fieldAndDescriptor.second
+                )
+            }
+            visitInsn(Opcodes.RETURN)
+            visitMaxs(2, 1 + fieldAndDescriptors.size)
+            visitEnd()
+        }
+
+        super.visit(
+            version,
+            access,
+            generatedClassName,
+            signature,
+            name,
+            interfaces
+        )
+    }
+
+    private fun synthesizeFieldAndMethod(
+        methodName: String,
+        returnValueType: String
+    ): Pair<String, String> {
+        val descriptor = binaryToDescriptor(returnValueType)
+        val fieldName = methodName + "_field"
+        super.visitField(Opcodes.ACC_PRIVATE, fieldName, descriptor, null, null)
+
+        super.visitMethod(
+            Opcodes.ACC_PUBLIC,
+            methodName,
+            "()$descriptor",
+            null,
+            null
+        ).apply {
+            visitVarInsn(Opcodes.ALOAD, 0)
+            visitFieldInsn(
+                Opcodes.GETFIELD,
+                generatedClassName,
+                fieldName,
+                descriptor
+            )
+            visitInsn(Opcodes.ARETURN)
+            visitMaxs(1, 1)
+            visitEnd()
+        }
+        return Pair(fieldName, descriptor)
+    }
+
+    private fun binaryToDescriptor(binaryName: String): String =
+        "L" + binaryName.replace(".", "/") + ";"
+
+    override fun visitField(
+        access: Int,
+        name: String?,
+        descriptor: String?,
+        signature: String?,
+        value: Any?
+    ): FieldVisitor? {
+        // do not add any other fields
+        return null
+    }
+
+    override fun visitMethod(
+        access: Int,
+        name: String?,
+        descriptor: String?,
+        signature: String?,
+        exceptions: Array<out String>?
+    ): MethodVisitor? {
+        // do not add any other methods to the generated class
+        return null
+    }
+}
+
+private const val CLASS_SUFFIX = "_WithParams"
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeNoOpAnalyticsService.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeNoOpAnalyticsService.kt
new file mode 100644
index 0000000..fb1c593
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeNoOpAnalyticsService.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal.fixtures
+
+import com.android.build.gradle.internal.profile.AnalyticsService
+import com.android.build.gradle.internal.profile.ProjectData
+import com.android.build.gradle.internal.profile.TaskMetadata
+import com.android.build.gradle.internal.profile.TaskProfilingRecord
+import com.android.builder.profile.NameAnonymizer
+import com.android.builder.profile.NameAnonymizerSerializer
+import com.android.builder.profile.Recorder
+import com.google.wireless.android.sdk.stats.GradleBuildMemorySample
+import com.google.wireless.android.sdk.stats.GradleBuildProfile
+import com.google.wireless.android.sdk.stats.GradleBuildProfileSpan
+import com.google.wireless.android.sdk.stats.GradleBuildProject
+import com.google.wireless.android.sdk.stats.GradleBuildVariant
+import com.google.wireless.android.sdk.stats.GradleTransformExecution
+import org.gradle.api.provider.MapProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.ProviderFactory
+import org.gradle.tooling.events.FinishEvent
+import java.io.File
+import java.util.Base64
+import java.util.concurrent.ConcurrentLinkedQueue
+
+/**
+ * A no-operation implementation of [AnalyticsService] for unit tests.
+ */
+class FakeNoOpAnalyticsService : AnalyticsService() {
+    override val provider: ProviderFactory
+        get() = FakeProviderFactory.factory
+
+    override fun getParameters(): Params {
+        return object : Params {
+            override val profile: Property<String>
+                get() {
+                    val profile = GradleBuildProfile.newBuilder().build().toByteArray()
+                    return FakeGradleProperty(Base64.getEncoder().encodeToString(profile))
+                }
+            override val anonymizer: Property<String>
+                get() = FakeGradleProperty(NameAnonymizerSerializer().toJson(NameAnonymizer()))
+            override val projects: MapProperty<String, ProjectData>
+                get() = FakeObjectFactory.factory.mapProperty(
+                    String::class.java, ProjectData::class.java
+                )
+            override val enableProfileJson: Property<Boolean>
+                get() = FakeGradleProperty(true)
+            override val profileDir: Property<File?>
+                get() = FakeGradleProperty()
+            override val taskMetadata: MapProperty<String, TaskMetadata>
+                get() = FakeObjectFactory.factory.mapProperty(
+                    String::class.java, TaskMetadata::class.java
+                )
+            override val rootProjectPath: Property<String>
+                get() = FakeGradleProperty("/path")
+        }
+    }
+
+    override fun workerAdded(taskPath: String, workerKey: String) {}
+
+    override fun workerStarted(taskPath: String, workerKey: String) {}
+
+    override fun workerFinished(taskPath: String, workerKey: String) {}
+
+    override fun registerSpan(taskPath: String, builder: GradleBuildProfileSpan.Builder) {}
+
+    override fun getProjectBuillder(projectPath: String): GradleBuildProject.Builder {
+        return GradleBuildProject.newBuilder()
+    }
+
+    override fun getVariantBuilder(
+        projectPath: String,
+        variantName: String
+    ): GradleBuildVariant.Builder {
+        return GradleBuildVariant.newBuilder()
+    }
+
+    override fun getTaskRecord(taskPath: String): TaskProfilingRecord? {
+        return null
+    }
+
+    override fun recordBlock(
+        executionType: GradleBuildProfileSpan.ExecutionType,
+        transform: GradleTransformExecution?,
+        projectPath: String,
+        variantName: String,
+        block: Recorder.VoidBlock
+    ) {
+        block.call()
+    }
+
+    override fun setConfigurationSpans(spans: ConcurrentLinkedQueue<GradleBuildProfileSpan>) {}
+
+    override fun setInitialMemorySampleForConfiguration(sample: GradleBuildMemorySample) {}
+
+    override fun close() {}
+
+    override fun onFinish(finishEvent: FinishEvent?) {}
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeObjectFactory.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeObjectFactory.kt
new file mode 100644
index 0000000..580b39d
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeObjectFactory.kt
@@ -0,0 +1,28 @@
+/*
+ * 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 com.android.build.gradle.internal.fixtures
+
+import org.gradle.api.model.ObjectFactory
+
+class FakeObjectFactory {
+    companion object {
+        @JvmStatic
+        val factory: ObjectFactory by lazy {
+            ProjectFactory.project.objects
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeProviderFactory.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeProviderFactory.kt
new file mode 100644
index 0000000..cf740ed
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/FakeProviderFactory.kt
@@ -0,0 +1,41 @@
+/*
+ * 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 com.android.build.gradle.internal.fixtures
+
+import org.gradle.api.provider.Provider
+import org.gradle.api.provider.ProviderFactory
+
+class FakeProviderFactory(
+    private val originalFactory: ProviderFactory,
+    private val gradleProperties: Map<String, Any>
+) : ProviderFactory by originalFactory {
+
+    override fun gradleProperty(propertyName: String): Provider<String> {
+        if (gradleProperties.containsKey(propertyName)) {
+            return originalFactory.provider { gradleProperties.getValue(propertyName).toString() }
+        } else {
+            return originalFactory.provider { null }
+        }
+    }
+
+    companion object {
+        @JvmStatic
+        val factory: ProviderFactory by lazy {
+            ProjectFactory.project.providers
+        }
+    }
+}
diff --git a/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/ProjectFactory.kt b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/ProjectFactory.kt
new file mode 100644
index 0000000..7b2a04a
--- /dev/null
+++ b/stableaidl/stableaidl-gradle-plugin/src/test/java/com/android/build/gradle/internal/fixtures/ProjectFactory.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal.fixtures
+
+import java.nio.file.Files
+import org.gradle.api.Project
+import org.gradle.testfixtures.ProjectBuilder
+
+/**
+ * A provider of [Project] object for running tests.
+ *
+ */
+class ProjectFactory {
+    companion object {
+        @JvmStatic
+        val project: Project by lazy {
+            ProjectBuilder.builder().withProjectDir(
+                Files.createTempDirectory("temp").toFile()
+            ).build()
+        }
+    }
+}
diff --git a/startup/OWNERS b/startup/OWNERS
index 0bef8c9..339001a 100644
--- a/startup/OWNERS
+++ b/startup/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 813805
 rahulrav@google.com
 sumir@google.com
 yboyar@google.com
diff --git a/startup/startup-runtime-lint/src/main/java/androidx/startup/lint/StartupRuntimeIssueRegistry.kt b/startup/startup-runtime-lint/src/main/java/androidx/startup/lint/StartupRuntimeIssueRegistry.kt
index 84f5620..fad6e87 100644
--- a/startup/startup-runtime-lint/src/main/java/androidx/startup/lint/StartupRuntimeIssueRegistry.kt
+++ b/startup/startup-runtime-lint/src/main/java/androidx/startup/lint/StartupRuntimeIssueRegistry.kt
@@ -28,7 +28,7 @@
  */
 class StartupRuntimeIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues: List<Issue>
         get() = listOf(
             InitializerConstructorDetector.ISSUE,
diff --git a/swiperefreshlayout/OWNERS b/swiperefreshlayout/OWNERS
index 8fbda65..f3b3f70 100644
--- a/swiperefreshlayout/OWNERS
+++ b/swiperefreshlayout/OWNERS
@@ -1 +1,2 @@
+# Bug component: 461463
 aelias@google.com
\ No newline at end of file
diff --git a/test/ext/junit-gtest/OWNERS b/test/ext/junit-gtest/OWNERS
index 5cc09b5..4f8127a 100644
--- a/test/ext/junit-gtest/OWNERS
+++ b/test/ext/junit-gtest/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1196313
 fsladkey@google.com
 danalbert@google.com
 asfalcone@google.com
\ No newline at end of file
diff --git a/test/integration-tests/junit-gtest-test/OWNERS b/test/integration-tests/junit-gtest-test/OWNERS
index 5cc09b5..4f8127a 100644
--- a/test/integration-tests/junit-gtest-test/OWNERS
+++ b/test/integration-tests/junit-gtest-test/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 1196313
 fsladkey@google.com
 danalbert@google.com
 asfalcone@google.com
\ No newline at end of file
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BaseTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BaseTest.java
index ca89e89..67decb1 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BaseTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/BaseTest.java
@@ -51,6 +51,7 @@
     public void setUp() throws Exception {
         mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         mDevice.wakeUp();
+        mDevice.pressMenu(); // Try to dismiss the lock screen if necessary.
         mDevice.pressHome();
         mDevice.setOrientationNatural();
     }
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
index 58dab98..693d7bf 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiDeviceTest.java
@@ -24,16 +24,15 @@
 
 import android.app.UiAutomation;
 import android.graphics.Point;
-import android.os.Build;
 import android.os.SystemClock;
 import android.view.KeyEvent;
 import android.widget.TextView;
 
-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.By;
+import androidx.test.uiautomator.BySelector;
 import androidx.test.uiautomator.UiDevice;
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
@@ -279,11 +278,12 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 21) // Quick settings menu might not be present prior to API 21.
     public void testOpenQuickSettings() {
         mDevice.openQuickSettings();
 
-        assertTrue(mDevice.wait(Until.hasObject(By.res(Pattern.compile(".*quick_settings_panel"))),
-                TIMEOUT_MS));
+        BySelector quickSettings = By.res(Pattern.compile(".*quick_settings.*"));
+        assertTrue(mDevice.wait(Until.hasObject(quickSettings), TIMEOUT_MS));
     }
 
     @Test
@@ -445,29 +445,17 @@
         validateMainActivityXml(xml);
     }
 
-
-    @FlakyTest(bugId = 259299647)
     @Test
-    @SdkSuppress(maxSdkVersion = 33) // b/262909049: Failing on SDK 34
     public void testWaitForWindowUpdate() {
-        if (Build.VERSION.SDK_INT == 33 && !"REL".equals(Build.VERSION.CODENAME)) {
-            return; // b/262909049: Do not run this test on pre-release Android U.
-        }
-
         launchTestActivity(WaitTestActivity.class);
 
-        // Returns false when the current window doesn't have the specified package name.
+        // Times out if package mismatch or no content changes detected.
         assertFalse(mDevice.waitForWindowUpdate("non-existent package name", 1_000));
+        assertFalse(mDevice.waitForWindowUpdate(TEST_APP, 1_000));
 
-        UiObject2 text1 = mDevice.findObject(By.res(TEST_APP, "text_1"));
-
-        // Returns true when change happens in the current window within the timeout.
-        text1.click();
-        assertTrue(mDevice.waitForWindowUpdate(PACKAGE_NAME, 5_000));
-
-        // Returns false when no change happens in the current window within the timeout.
-        text1.click();
-        assertFalse(mDevice.waitForWindowUpdate(PACKAGE_NAME, 1_000));
+        // Detects content changes (text updated after click).
+        mDevice.findObject(By.res(TEST_APP, "text_1")).click();
+        assertTrue(mDevice.waitForWindowUpdate(TEST_APP, 5_000));
     }
 
     @Test
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
index bdcf9c0..8890dabf 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Test.java
@@ -31,6 +31,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.uiautomator.By;
+import androidx.test.uiautomator.BySelector;
 import androidx.test.uiautomator.Direction;
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
@@ -56,7 +57,8 @@
         assertEquals("sample_text", object.getText());
         object.clear();
         // Verify the text field does not have txt after clear()
-        assertNull(object.getText());
+        BySelector emptyText = By.res(TEST_APP, "edit_text").text("");
+        assertTrue(mDevice.wait(Until.hasObject(emptyText), TIMEOUT_MS));
     }
 
     @Test
@@ -400,6 +402,7 @@
         UiObject2 checkBox = mDevice.findObject(By.res(TEST_APP, "check_box"));
         assertFalse(checkBox.isChecked());
         checkBox.click();
+        checkBox.wait(Until.checked(true), TIMEOUT_MS);
         assertTrue(checkBox.isChecked());
     }
 
@@ -444,6 +447,7 @@
         assertFalse(textView.isFocused());
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "button"));
         button.click();
+        textView.wait(Until.focused(true), TIMEOUT_MS);
         assertTrue(textView.isFocused());
     }
 
@@ -475,9 +479,11 @@
     public void testIsSelected() {
         launchTestActivity(IsSelectedTestActivity.class);
 
+        UiObject2 textView = mDevice.findObject(By.res(TEST_APP, "selected_target"));
+        assertFalse(textView.isSelected());
         UiObject2 button = mDevice.findObject(By.res(TEST_APP, "selected_button"));
         button.click();
-        UiObject2 textView = mDevice.findObject(By.res(TEST_APP, "selected_target"));
+        textView.wait(Until.selected(true), TIMEOUT_MS);
         assertTrue(textView.isSelected());
     }
 
@@ -751,7 +757,8 @@
         assertEquals("sample_text", object.getText());
         object.setText("new_text");
         // Verify the text field has "new_text" after setText()
-        assertEquals("new_text", object.getText());
+        BySelector updatedText = By.res(TEST_APP, "edit_text").text("new_text");
+        assertTrue(mDevice.wait(Until.hasObject(updatedText), TIMEOUT_MS));
     }
 
     /* Helper method to get a point inside the object. */
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
index d186654..3a5945f 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObjectTest.java
@@ -558,6 +558,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 23) // Bounds include invisible regions prior to API 23.
     public void testGetBounds() throws Exception {
         launchTestActivity(VisibleBoundsTestActivity.class);
 
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java
index 0d7208d..b3248e4 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiScrollableTest.java
@@ -251,25 +251,23 @@
     @Ignore // b/266965027
     @Test
     public void testScrollForward_vertical() throws Exception {
-        launchTestActivity(SwipeTestActivity.class);
+        launchTestActivity(VerticalScrollTestActivity.class);
 
         UiScrollable scrollRegion = new UiScrollable(
-                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsVerticalList();
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout")).setAsVerticalList();
 
-        assertFalse(scrollRegion.scrollForward());
-        assertEquals("swipe_up", scrollRegion.getText());
+        assertTrue(scrollRegion.scrollForward());
     }
 
     @Ignore // b/266965027
     @Test
     public void testScrollForward_horizontal() throws Exception {
-        launchTestActivity(SwipeTestActivity.class);
+        launchTestActivity(HorizontalScrollTestActivity.class);
 
         UiScrollable scrollRegion = new UiScrollable(
-                new UiSelector().resourceId(TEST_APP + ":id/swipe_region")).setAsHorizontalList();
-
-        assertFalse(scrollRegion.scrollForward(50));
-        assertEquals("swipe_left", scrollRegion.getText());
+                new UiSelector().resourceId(TEST_APP + ":id/relative_layout"))
+                .setAsHorizontalList();
+        assertTrue(scrollRegion.scrollForward());
     }
 
     @Ignore // b/266965027
diff --git a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
index e98a704..01557b8 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -92,6 +92,13 @@
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
+        <activity android:name=".HorizontalScrollTestActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.Holo.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
         <activity android:name=".IsEnabledTestActivity"
             android:exported="true"
             android:theme="@android:style/Theme.Holo.NoActionBar">
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/HorizontalScrollTestActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/HorizontalScrollTestActivity.java
new file mode 100644
index 0000000..9623bf6
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/HorizontalScrollTestActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.test.uiautomator.testapp;
+
+import android.app.Activity;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.MotionEvent;
+import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
+
+import androidx.annotation.Nullable;
+
+public class HorizontalScrollTestActivity extends Activity {
+
+    private GestureDetector mGestureDetector;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.horizontal_scroll_test_activity);
+
+        // Get the size of the screen.
+        Display display = getWindowManager().getDefaultDisplay();
+        Point displaySize = new Point();
+        display.getSize(displaySize);
+
+        // Set up the scrolling layout whose width is two times of the screen width.
+        RelativeLayout layout = findViewById(R.id.relative_layout);
+        layout.setLayoutParams(new FrameLayout.LayoutParams(displaySize.x * 2, displaySize.y));
+
+        mGestureDetector = new GestureDetector(this, new SimpleOnGestureListener() {
+            @Override
+            public boolean onDown(MotionEvent event) {
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return mGestureDetector.onTouchEvent(event);
+    }
+}
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/horizontal_scroll_test_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/horizontal_scroll_test_activity.xml
new file mode 100644
index 0000000..e950917
--- /dev/null
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/horizontal_scroll_test_activity.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".HorizontalScrollTestActivity">
+
+    <HorizontalScrollView
+        android:id="@+id/horizontal_scroll_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <ScrollView
+            android:id="@+id/scroll_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+
+            <RelativeLayout
+                android:id="@+id/relative_layout"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content">
+
+            </RelativeLayout>
+
+        </ScrollView>
+    </HorizontalScrollView>
+
+</LinearLayout>
diff --git a/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java b/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
index fc46750..451fc66 100644
--- a/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
+++ b/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
@@ -206,8 +206,8 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
     public void testExecuteShellCommand() throws IOException {
-        String output = mDevice.executeShellCommand("echo hello world");
-        assertEquals("hello world\n", output);
+        String output = mDevice.executeShellCommand("pm list packages");
+        assertTrue(output.contains("package:androidx.test.uiautomator.test"));
     }
 
     @Test
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
index 786de295..a15835f 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiDevice.java
@@ -59,6 +59,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -93,7 +94,7 @@
     private final Map<Integer, Context> mUiContexts = new HashMap<>();
 
     // Track registered UiWatchers, and whether currently in a UiWatcher execution.
-    private final Map<String, UiWatcher> mWatchers = new HashMap<>();
+    private final Map<String, UiWatcher> mWatchers = new LinkedHashMap<>();
     private final List<String> mWatchersTriggers = new ArrayList<>();
     private boolean mInWatcherContext = false;
 
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject2.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject2.java
index 5fa391a..d9816d3 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject2.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/UiObject2.java
@@ -749,7 +749,8 @@
                 // Select the existing text. Expect this to fail if there is no existing text.
                 Bundle args = new Bundle();
                 args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
-                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
+                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT,
+                        currentText == null ? 0 : currentText.length());
                 if (!node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, args) &&
                         currentText != null && currentText.length() > 0) {
                     // TODO: Decide if we should throw here
diff --git a/testutils/testutils-datastore/OWNERS b/testutils/testutils-datastore/OWNERS
index e750dab..6bd3863 100644
--- a/testutils/testutils-datastore/OWNERS
+++ b/testutils/testutils-datastore/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 827162
 dustinlam@google.com
 paulmalolepsy@google.com
 yboyar@google.com
diff --git a/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt b/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt
index f73eaf1..346a81d 100644
--- a/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt
+++ b/testutils/testutils-kmp/src/commonMain/kotlin/androidx/kruth/Subject.kt
@@ -34,6 +34,7 @@
     /**
      *  Fails if the subject is not null.
      */
+    @Suppress("SyntheticAccessor")
     fun isNull() {
         actual.standardIsEqualTo(null)
     }
@@ -58,6 +59,7 @@
      * that will return the same result as long as [equals] is implemented according to the contract
      * for its type.
      */
+    @Suppress("SyntheticAccessor")
     open fun isEqualTo(expected: Any?) {
         actual.standardIsEqualTo(expected)
     }
diff --git a/testutils/testutils-macrobenchmark/OWNERS b/testutils/testutils-macrobenchmark/OWNERS
index bd5d7e4..107710a 100644
--- a/testutils/testutils-macrobenchmark/OWNERS
+++ b/testutils/testutils-macrobenchmark/OWNERS
@@ -1 +1,2 @@
+# Bug component: 1229612
 ccraik@google.com
\ No newline at end of file
diff --git a/testutils/testutils-paging/OWNERS b/testutils/testutils-paging/OWNERS
index a69c988..435b10e 100644
--- a/testutils/testutils-paging/OWNERS
+++ b/testutils/testutils-paging/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461228
 ccraik@google.com
 dustinlam@google.com
diff --git a/text/text/OWNERS b/text/text/OWNERS
index 83c9e6d..0db9610 100644
--- a/text/text/OWNERS
+++ b/text/text/OWNERS
@@ -1,3 +1,4 @@
+# Bug component: 630734
 halilibo@google.com
 haoyuchang@google.com
 justinghan@google.com
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
index 604dd4c..0dbfb5d 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
@@ -18,6 +18,7 @@
 import android.graphics.Canvas
 import android.graphics.Paint.FontMetricsInt
 import android.graphics.Path
+import android.graphics.Rect
 import android.graphics.RectF
 import android.os.Trace
 import android.text.BoringLayout
@@ -230,7 +231,9 @@
      */
     private val lastLineExtra: Int
 
-    val lineHeightSpans: Array<LineHeightStyleSpan>
+    private val lineHeightSpans: Array<LineHeightStyleSpan>
+
+    private val rect: Rect = Rect()
 
     /**
      * Android Canvas object that overrides the `getClipBounds` method and delegates the rest
@@ -716,6 +719,18 @@
     }
 
     fun paint(canvas: Canvas) {
+        // Fix "mDirect" optimization in BoringLayout that directly draws text when it's simple
+        // in the case of an empty canvas, we don't need to do anything (which would typically be
+        // done in Layout.draw), so this skips all work when canvas clips to empty - matching the
+        // behavior in Layout.kt
+        if (!canvas.getClipBounds(rect)) {
+            // this is a pure "no-work" optimization for avoiding work when text is simple enough
+            // to hit BoringLayout mDirect optimization and canvas clips to empty
+
+            // this avoids calling Canvas.drawText on an empty canvas
+            return
+        }
+
         if (topPadding != 0) {
             canvas.translate(0f, topPadding.toFloat())
         }
diff --git a/transition/transition/api/restricted_current.txt b/transition/transition/api/restricted_current.txt
index d380e52..64748fe 100644
--- a/transition/transition/api/restricted_current.txt
+++ b/transition/transition/api/restricted_current.txt
@@ -86,12 +86,12 @@
     method public boolean canHandle(Object);
     method public Object? cloneTransition(Object?);
     method public Object? mergeTransitionsInSequence(Object?, Object?, Object?);
-    method public Object mergeTransitionsTogether(Object, Object, Object?);
+    method public Object mergeTransitionsTogether(Object?, Object?, Object?);
     method public void removeTarget(Object, android.view.View);
     method public void replaceTargets(Object, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
     method public void scheduleHideFragmentView(Object, android.view.View, java.util.ArrayList<android.view.View!>);
     method public void scheduleRemoveTargets(Object, Object?, java.util.ArrayList<android.view.View!>?, Object?, java.util.ArrayList<android.view.View!>?, Object?, java.util.ArrayList<android.view.View!>?);
-    method public void setEpicenter(Object, android.view.View);
+    method public void setEpicenter(Object, android.view.View?);
     method public void setEpicenter(Object, android.graphics.Rect);
     method public void setSharedElementTargets(Object, android.view.View, java.util.ArrayList<android.view.View!>);
     method public void swapSharedElementTargets(Object?, java.util.ArrayList<android.view.View!>?, java.util.ArrayList<android.view.View!>?);
diff --git a/transition/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java b/transition/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
index 07ef593..e04fdbc 100644
--- a/transition/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
+++ b/transition/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public void setEpicenter(@NonNull Object transitionObj, @NonNull View view) {
+    public void setEpicenter(@NonNull Object transitionObj, @Nullable View view) {
         if (view != null) {
             Transition transition = (Transition) transitionObj;
             final Rect epicenter = new Rect();
@@ -135,8 +135,8 @@
 
     @NonNull
     @Override
-    public Object mergeTransitionsTogether(@NonNull Object transition1,
-            @NonNull Object transition2, @Nullable Object transition3) {
+    public Object mergeTransitionsTogether(@Nullable Object transition1,
+            @Nullable Object transition2, @Nullable Object transition3) {
         TransitionSet transitionSet = new TransitionSet();
         if (transition1 != null) {
             transitionSet.addTransition((Transition) transition1);
diff --git a/tv/integration-tests/demos/build.gradle b/tv/integration-tests/demos/build.gradle
index 932571e..5ddfc29 100644
--- a/tv/integration-tests/demos/build.gradle
+++ b/tv/integration-tests/demos/build.gradle
@@ -34,6 +34,7 @@
 
     implementation(project(":tv:tv-foundation"))
     implementation(project(":tv:tv-material"))
+    implementation "androidx.profileinstaller:profileinstaller:1.3.0-alpha03"
 
     implementation("androidx.appcompat:appcompat:1.6.0-alpha05")
 }
@@ -55,6 +56,7 @@
             minifyEnabled true
             shrinkResources true
             proguardFiles getDefaultProguardFile('proguard-android.txt')
+            signingConfig signingConfigs.debug
         }
     }
     namespace "androidx.tv.integration.demos"
diff --git a/tv/integration-tests/demos/src/main/baseline-prof.txt b/tv/integration-tests/demos/src/main/baseline-prof.txt
new file mode 100644
index 0000000..23fe742
--- /dev/null
+++ b/tv/integration-tests/demos/src/main/baseline-prof.txt
@@ -0,0 +1,7782 @@
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$1$1;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/animation/ContentTransform;)V
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$1;-><init>(Landroidx/compose/animation/ContentTransform;)V
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateList;Ljava/lang/Object;Landroidx/compose/animation/AnimatedContentScope;)V
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4;-><init>(Landroidx/compose/animation/AnimatedContentScope;Ljava/lang/Object;Lkotlin/jvm/functions/Function4;ILandroidx/compose/runtime/snapshots/SnapshotStateList;)V
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$8;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;II)V
+HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentKt;->AnimatedContent(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/compose/animation/AnimatedContentKt;->AnimatedContent(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/compose/animation/AnimatedContentKt;->with(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)Landroidx/compose/animation/ContentTransform;
+HPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;-><init>([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/animation/AnimatedContentMeasurePolicy;II)V
+HPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$size$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$size$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedContentScope$SizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1$1;->invoke()Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$2;-><init>(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function3;I)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$8;-><init>(Landroidx/compose/animation/core/MutableTransitionState;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;II)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/AnimatedVisibilityKt;->AnimatedEnterExitImpl(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt;->AnimatedVisibility(Landroidx/compose/animation/core/MutableTransitionState;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt;->AnimatedVisibility(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/compose/animation/AnimatedVisibilityKt;->targetEnterExit(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/EnterExitState;
+HPLandroidx/compose/animation/AnimatedVisibilityScopeImpl;-><init>(Landroidx/compose/animation/core/Transition;)V
+HPLandroidx/compose/animation/ContentTransform;-><init>(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)V
+HPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$alpha$2;-><init>(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)V
+HPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$alpha$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$shrinkExpand$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+HPLandroidx/compose/animation/EnterExitTransitionKt$shrinkExpand$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$slideInHorizontally$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$slideInOut$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+HPLandroidx/compose/animation/EnterExitTransitionKt$slideInOut$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$slideOutHorizontally$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterExitTransitionKt$slideOutHorizontally$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/EnterTransition;->equals(Ljava/lang/Object;)Z
+HPLandroidx/compose/animation/EnterTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData;
+HPLandroidx/compose/animation/ExitTransition;->equals(Ljava/lang/Object;)Z
+HPLandroidx/compose/animation/ExitTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData;
+HPLandroidx/compose/animation/SizeTransformImpl;->createAnimationSpec-TemP2vQ(JJ)Landroidx/compose/animation/core/FiniteAnimationSpec;
+HPLandroidx/compose/animation/SlideModifier$measure$1$slideOffset$1;-><init>(Landroidx/compose/animation/SlideModifier;J)V
+HPLandroidx/compose/animation/SlideModifier$measure$1$slideOffset$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/SlideModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/SlideModifier$transitionSpec$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/SlideModifier;-><init>(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;)V
+HPLandroidx/compose/animation/SlideModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/animation/core/AnimationVector2D;-><init>(FF)V
+HPLandroidx/compose/animation/core/AnimationVector2D;->get$animation_core_release(I)F
+HPLandroidx/compose/animation/core/AnimationVector2D;->getSize$animation_core_release()I
+HPLandroidx/compose/animation/core/AnimationVector2D;->set$animation_core_release(FI)V
+HPLandroidx/compose/animation/core/CubicBezierEasing;->transform(F)F
+HPLandroidx/compose/animation/core/FloatTweenSpec;-><init>(IILandroidx/compose/animation/core/Easing;)V
+HPLandroidx/compose/animation/core/FloatTweenSpec;->clampPlayTime(J)J
+HPLandroidx/compose/animation/core/FloatTweenSpec;->getValueFromNanos(JFFF)F
+HPLandroidx/compose/animation/core/FloatTweenSpec;->getVelocityFromNanos(JFFF)F
+HPLandroidx/compose/animation/core/MutableTransitionState;-><init>(Ljava/lang/Object;)V
+HPLandroidx/compose/animation/core/MutableTransitionState;->isIdle()Z
+HPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getValue()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->updateAnimationStates(Landroidx/compose/animation/core/Transition$Segment;)V
+HPLandroidx/compose/animation/core/Transition$DeferredAnimation;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;)V
+HPLandroidx/compose/animation/core/Transition$DeferredAnimation;->animate(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;
+HPLandroidx/compose/animation/core/Transition$Segment;->isTransitioningTo(Landroidx/compose/animation/EnterExitState;Landroidx/compose/animation/EnterExitState;)Z
+HPLandroidx/compose/animation/core/Transition$SegmentImpl;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HPLandroidx/compose/animation/core/Transition$SegmentImpl;->equals(Ljava/lang/Object;)Z
+HPLandroidx/compose/animation/core/Transition$SegmentImpl;->getInitialState()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$SegmentImpl;->getTargetState()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;-><init>(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;)V
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimation()Landroidx/compose/animation/core/TargetBasedAnimation;
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec;
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getValue()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateAnimation$default(Landroidx/compose/animation/core/Transition$TransitionAnimationState;Ljava/lang/Object;ZI)V
+HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateTargetValue$animation_core_release(Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;)V
+HPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;-><init>(Landroidx/compose/animation/core/Transition;F)V
+HPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$animateTo$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition$animateTo$2;-><init>(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;I)V
+HPLandroidx/compose/animation/core/Transition$updateTarget$2;-><init>(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;I)V
+HPLandroidx/compose/animation/core/Transition;-><init>(Landroidx/compose/animation/core/MutableTransitionState;Ljava/lang/String;)V
+HPLandroidx/compose/animation/core/Transition;->animateTo$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V
+HPLandroidx/compose/animation/core/Transition;->getCurrentState()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition;->getSegment()Landroidx/compose/animation/core/Transition$Segment;
+HPLandroidx/compose/animation/core/Transition;->getTargetState()Ljava/lang/Object;
+HPLandroidx/compose/animation/core/Transition;->isSeeking()Z
+HPLandroidx/compose/animation/core/Transition;->onFrame$animation_core_release(FJ)V
+HPLandroidx/compose/animation/core/Transition;->onTransitionEnd$animation_core_release()V
+HPLandroidx/compose/animation/core/Transition;->updateTarget$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V
+HPLandroidx/compose/animation/core/TransitionKt$createChildTransitionInternal$1$1$invoke$$inlined$onDispose$1;->dispose()V
+HPLandroidx/compose/animation/core/TransitionKt$createChildTransitionInternal$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/TransitionKt$createDeferredAnimation$1$invoke$$inlined$onDispose$1;->dispose()V
+HPLandroidx/compose/animation/core/TransitionKt$createTransitionAnimation$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/TransitionKt;->createDeferredAnimation(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition$DeferredAnimation;
+HPLandroidx/compose/animation/core/TransitionKt;->createTransitionAnimation(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/Transition$TransitionAnimationState;
+HPLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec;
+HPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/animation/core/VectorizedAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HPLandroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J
+HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec;
+HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;-><init>(Landroidx/compose/animation/core/FloatAnimationSpec;)V
+HPLandroidx/compose/animation/core/VectorizedTweenSpec;-><init>(IILandroidx/compose/animation/core/Easing;)V
+HPLandroidx/compose/animation/core/VectorizedTweenSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HPLandroidx/compose/animation/core/VectorizedTweenSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HPLandroidx/compose/foundation/BorderKt$drawRoundRectBorder$1;-><init>(ZLandroidx/compose/ui/graphics/Brush;JFFJJLandroidx/compose/ui/graphics/drawscope/Stroke;)V
+HPLandroidx/compose/foundation/BorderKt$drawRoundRectBorder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/foundation/ClipScrollableContainerKt$VerticalScrollableClipModifier$1;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/Outline;
+HPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$5;-><init>([Landroidx/compose/ui/layout/Placeable;Ljava/util/List;Landroidx/compose/ui/layout/MeasureScope;Lkotlin/jvm/internal/Ref$IntRef;Lkotlin/jvm/internal/Ref$IntRef;Landroidx/compose/ui/Alignment;)V
+HPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/foundation/layout/PaddingValuesModifier$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/foundation/layout/PaddingValuesModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onForgotten()V
+HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;-><init>(ZFLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/material/ripple/RippleContainer;)V
+HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HPLandroidx/compose/material/ripple/PlatformRipple;->rememberUpdatedRippleInstance-942rkJo(Landroidx/compose/foundation/interaction/InteractionSource;ZFLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/Composer;)Landroidx/compose/material/ripple/RippleIndicationInstance;
+HPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material/ripple/Ripple;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance;
+HPLandroidx/compose/material/ripple/RippleIndicationInstance;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V
+HPLandroidx/compose/material3/ButtonElevation$animateElevation$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/ButtonElevation$animateElevation$3;-><init>(Landroidx/compose/animation/core/Animatable;Landroidx/compose/material3/ButtonElevation;FLandroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)V
+HPLandroidx/compose/material3/ButtonElevation$animateElevation$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/ButtonElevation;->animateElevation(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/AnimationState;
+HPLandroidx/compose/material3/ButtonKt$Button$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/ButtonKt$Button$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/ButtonKt$Button$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/ButtonKt$Button$3;-><init>(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;II)V
+HPLandroidx/compose/material3/ButtonKt;->Button(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/compose/material3/ColorSchemeKt;->toColor(ILandroidx/compose/runtime/Composer;)J
+HPLandroidx/compose/material3/MinimumTouchTargetModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/MinimumTouchTargetModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/material3/SurfaceKt$Surface$3;-><init>(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFIFLandroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HPLandroidx/compose/material3/SurfaceKt$Surface$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/material3/TextKt$Text$2;-><init>(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;III)V
+HPLandroidx/compose/material3/TextKt;->ProvideTextStyle(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HPLandroidx/compose/material3/TouchTargetKt$minimumTouchTargetSize$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/AbstractApplier;->clear()V
+HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V
+HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V
+HPLandroidx/compose/runtime/ComposerImpl$endRestartGroup$1$1;-><init>(Landroidx/compose/runtime/RecomposeScopeImpl$end$1$2;Landroidx/compose/runtime/ComposerImpl;)V
+HPLandroidx/compose/runtime/ComposerImpl$endRestartGroup$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/ComposerImpl$realizeMovement$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/ComposerImpl$start$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/ComposerImpl;->dispose$runtime_release()V
+HPLandroidx/compose/runtime/ComposerImpl;->endMovableGroup()V
+HPLandroidx/compose/runtime/ComposerImpl;->startMovableGroup(ILjava/lang/Object;)V
+HPLandroidx/compose/runtime/CompositionImpl;->dispose()V
+HPLandroidx/compose/runtime/JoinedKey;->hashCode()I
+HPLandroidx/compose/runtime/Pending;->nodePositionOf(Landroidx/compose/runtime/KeyInfo;)I
+HPLandroidx/compose/runtime/Pending;->updateNodeCount(II)Z
+HPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;-><init>(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArrayIntMap;)V
+HPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/Recomposer;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V
+HPLandroidx/compose/runtime/SlotWriter;->fixParentAnchorsFor(III)V
+HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder$registry$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;->unregister()V
+HPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->dispose()V
+HPLandroidx/compose/runtime/snapshots/Snapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getModification$runtime_release()I
+HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->listIterator()Ljava/util/ListIterator;
+HPLandroidx/compose/runtime/snapshots/StateListIterator;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateList;I)V
+HPLandroidx/compose/runtime/snapshots/StateListIterator;->hasNext()Z
+HPLandroidx/compose/runtime/snapshots/StateListIterator;->next()Ljava/lang/Object;
+HPLandroidx/compose/runtime/snapshots/StateListIterator;->validateModification()V
+HPLandroidx/compose/ui/focus/FocusRequesterModifierNodeImpl;->onDetach()V
+HPLandroidx/compose/ui/geometry/RoundRectKt;->isSimple(Landroidx/compose/ui/geometry/RoundRect;)Z
+HPLandroidx/compose/ui/graphics/AndroidCanvas;->clipRect-N_I0leg(FFFFI)V
+HPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HPLandroidx/compose/ui/graphics/Canvas;->clipRect-mtrdD-E(Landroidx/compose/ui/geometry/Rect;I)V
+HPLandroidx/compose/ui/graphics/ColorKt;->luminance-8_81llA(J)F
+HPLandroidx/compose/ui/graphics/GraphicsLayerModifierKt$graphicsLayer$$inlined$modifierElementOf$1;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HPLandroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier;
+HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V
+HPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;->dispose()V
+HPLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;->invoke()Ljava/lang/Object;
+HPLandroidx/compose/ui/node/LayoutNode;->detach$ui_release()V
+HPLandroidx/compose/ui/node/LayoutNode;->onChildRemoved(Landroidx/compose/ui/node/LayoutNode;)V
+HPLandroidx/compose/ui/node/LayoutNode;->removeAll$ui_release()V
+HPLandroidx/compose/ui/node/LayoutNode;->removeAt$ui_release(II)V
+HPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayerParams$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayoutModifier$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/compose/ui/node/UiApplier;->onClear()V
+HPLandroidx/compose/ui/platform/AndroidComposeView;->getFocusedRect(Landroid/graphics/Rect;)V
+HPLandroidx/compose/ui/platform/AndroidComposeView;->onDetach(Landroidx/compose/ui/node/LayoutNode;)V
+HPLandroidx/compose/ui/unit/Constraints$Companion;->fixedWidth-OenEA2s(I)J
+HPLandroidx/compose/ui/unit/IntOffset;->equals(Ljava/lang/Object;)Z
+HPLandroidx/compose/ui/unit/IntSize;->equals(Ljava/lang/Object;)Z
+HPLandroidx/tv/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridDslKt$rememberColumnWidthSums$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridDslKt$rememberRowHeightSums$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridIntervalContent;->getKey()Lkotlin/jvm/functions/Function1;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridIntervalContent;->getType()Lkotlin/jvm/functions/Function1;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->Item(ILandroidx/compose/runtime/Composer;I)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getContentType(I)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getHasCustomSpans()Z
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getItemCount()I
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getKey(I)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getKeyToIndexMap()Ljava/util/Map;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->Item(ILandroidx/compose/runtime/Composer;I)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->getContentType(I)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->getItemCount()I
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->getKey(I)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->getKeyToIndexMap()Ljava/util/Map;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;->getSpanLayoutProvider()Landroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$1;-><init>(Landroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;Landroidx/tv/foundation/lazy/grid/LazyMeasuredLineProvider;)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$3;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;JII)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredItemProvider$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;ZZIILandroidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator;J)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredItemProvider$1;->createItem-ejjdvUs(ILjava/lang/Object;IILjava/util/List;)Landroidx/tv/foundation/lazy/grid/LazyMeasuredItem;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredLineProvider$1;-><init>(ZLjava/util/List;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;I)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredLineProvider$1;->createLine-62kVtck(I[Landroidx/tv/foundation/lazy/grid/LazyMeasuredItem;Ljava/util/List;I)Landroidx/tv/foundation/lazy/grid/LazyMeasuredLine;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridKt;->LazyGrid(Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/PaddingValues;ZZZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/tv/foundation/PivotOffsets;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;-><init>(JILjava/lang/Object;IIJIIZLjava/util/List;Landroidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator;JIZ)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;->getAnimationSpec(I)Landroidx/compose/animation/core/FiniteAnimationSpec;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridScrollPosition;->update-cXEmwJU(II)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider$LineConfiguration;-><init>(ILjava/util/List;)V
+HPLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;->getLineConfiguration(I)Landroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider$LineConfiguration;
+HPLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;->getLineIndexOfItem-lRO02eA(I)I
+HPLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;->getTotalSize()I
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredItem;-><init>(ILjava/lang/Object;ZIIZLandroidx/compose/ui/unit/LayoutDirection;IILjava/util/List;Landroidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator;J)V
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredItem;->position(IIIIII)Landroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredItemProvider;-><init>(Landroidx/tv/foundation/lazy/grid/LazyGridItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;ILandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredItemProvider$1;)V
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredItemProvider;->getAndMeasure-ndEz314(IIJ)Landroidx/tv/foundation/lazy/grid/LazyMeasuredItem;
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredLine;-><init>(I[Landroidx/tv/foundation/lazy/grid/LazyMeasuredItem;Ljava/util/List;ZILandroidx/compose/ui/unit/LayoutDirection;II)V
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredLine;->position(III)Ljava/util/ArrayList;
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredLineProvider;-><init>(ZLjava/util/List;IIILandroidx/tv/foundation/lazy/grid/LazyMeasuredItemProvider;Landroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;Landroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1$measuredLineProvider$1;)V
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredLineProvider;->childConstraints-JhjzzOo$tv_foundation_release(II)J
+HPLandroidx/tv/foundation/lazy/grid/LazyMeasuredLineProvider;->getAndMeasure-MDRrEZU(I)Landroidx/tv/foundation/lazy/grid/LazyMeasuredLine;
+HPLandroidx/tv/foundation/lazy/grid/TvGridCells$Fixed;->calculateCrossAxisCellSizes(Landroidx/compose/ui/unit/Density;II)Ljava/util/ArrayList;
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;-><init>(Landroidx/tv/foundation/lazy/grid/LazyMeasuredLine;IZFLandroidx/compose/ui/layout/MeasureResult;Ljava/util/List;ILandroidx/compose/foundation/gestures/Orientation;)V
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridScope$items$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState$scrollableState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState;-><init>(II)V
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->getFirstVisibleItemIndex()I
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->isVertical$tv_foundation_release()Z
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HPLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->updateScrollPositionIfTheFirstItemWasMoved$tv_foundation_release(Landroidx/tv/foundation/lazy/grid/LazyGridItemProvider;)V
+HPLandroidx/tv/foundation/lazy/list/LazyListMeasureKt;->createItemsBeforeList_kVT7Qgw$addItem$4(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/tv/foundation/lazy/list/LazyMeasuredItemProvider;I)V
+HPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$2;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;ILkotlin/jvm/functions/Function2;I)V
+HPLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselDefaults;->IndicatorRow-hGBTI10(IILandroidx/compose/ui/Modifier;FLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/tv/material3/CarouselItemDefaults$OverlayEnterTransition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt$CarouselItem$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt$CarouselItem$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt$CarouselItem$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt$CarouselItem$4$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$2;->invoke()Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselItemKt;->CarouselItem(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;JLandroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/tv/material3/CarouselItemKt;->access$onAnimationCompletion(Landroidx/compose/animation/core/MutableTransitionState;Landroidx/tv/material3/CarouselItemKt$CarouselItem$1$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$Carousel$5$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$Carousel$5$2$1;-><init>(Landroidx/compose/animation/AnimatedVisibilityScope;Landroidx/compose/ui/focus/FocusRequester;Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HPLandroidx/tv/material3/CarouselKt$Carousel$5$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$Carousel$5$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$Carousel$6;-><init>(ILandroidx/compose/ui/Modifier;Landroidx/tv/material3/CarouselState;JLandroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;II)V
+HPLandroidx/tv/material3/CarouselKt$Carousel$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$handleKeyEvents$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt$onAnimationCompletion$2;->invoke()Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselKt;->Carousel(ILandroidx/compose/ui/Modifier;Landroidx/tv/material3/CarouselState;JLandroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HPLandroidx/tv/material3/CarouselKt;->access$onAnimationCompletion(Landroidx/compose/animation/AnimatedVisibilityScope;Landroidx/tv/material3/CarouselKt$Carousel$5$2$1$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HPLandroidx/tv/material3/CarouselState;->getActiveSlideIndex()I
+HPLandroidx/tv/material3/ComposableSingletons$CarouselKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/MainActivity$jankReportListener$1;->onJankReport(Ljava/lang/String;ILjava/util/ArrayList;)V
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$FeaturedCarousel$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt;->access$OverlayButton(Landroidx/compose/runtime/Composer;I)V
+HPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/google/gson/Gson;->getAdapter(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+HPLcom/google/gson/JsonArray;-><init>()V
+HPLcom/google/gson/JsonElement;-><init>()V
+HPLcom/google/gson/JsonObject;-><init>()V
+HPLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/Boolean;)V
+HPLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/Number;)V
+HPLcom/google/gson/JsonPrimitive;->getAsNumber()Ljava/lang/Number;
+HPLcom/google/gson/TypeAdapter;-><init>()V
+HPLcom/google/gson/internal/$Gson$Types;->canonicalize(Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type;
+HPLcom/google/gson/internal/LinkedTreeMap$EntrySet;-><init>(Lcom/google/gson/internal/LinkedTreeMap;)V
+HPLcom/google/gson/internal/LinkedTreeMap$Node;-><init>(ZLcom/google/gson/internal/LinkedTreeMap$Node;Ljava/lang/Object;Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V
+HPLcom/google/gson/internal/LinkedTreeMap;-><init>(Z)V
+HPLcom/google/gson/internal/LinkedTreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HPLcom/google/gson/internal/LinkedTreeMap;->rebalance(Lcom/google/gson/internal/LinkedTreeMap$Node;Z)V
+HPLcom/google/gson/internal/LinkedTreeMap;->replaceInParent(Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V
+HPLcom/google/gson/internal/LinkedTreeMap;->rotateLeft(Lcom/google/gson/internal/LinkedTreeMap$Node;)V
+HPLcom/google/gson/internal/LinkedTreeMap;->rotateRight(Lcom/google/gson/internal/LinkedTreeMap$Node;)V
+HPLcom/google/gson/internal/bind/CollectionTypeAdapterFactory$Adapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;-><init>()V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->beginArray()V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->beginObject()V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->endArray()V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->endObject()V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->get()Lcom/google/gson/JsonElement;
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->peek()Lcom/google/gson/JsonElement;
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->value(J)V
+HPLcom/google/gson/internal/bind/JsonTreeWriter;->value(Ljava/lang/Boolean;)V
+HPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V
+HPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;-><init>(Lcom/google/gson/Gson;Lcom/google/gson/TypeAdapter;Ljava/lang/reflect/Type;)V
+HPLcom/google/gson/internal/bind/TypeAdapters$11;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V
+HPLcom/google/gson/internal/bind/TypeAdapters$3;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V
+HPLcom/google/gson/reflect/TypeToken;->equals(Ljava/lang/Object;)Z
+HPLcom/google/gson/reflect/TypeToken;->hashCode()I
+HPLcom/google/gson/stream/JsonWriter;-><init>(Ljava/io/Writer;)V
+HPLcom/google/gson/stream/JsonWriter;->beginArray()V
+HPLcom/google/gson/stream/JsonWriter;->beginObject()V
+HPLcom/google/gson/stream/JsonWriter;->close(IIC)V
+HPLcom/google/gson/stream/JsonWriter;->name(Ljava/lang/String;)V
+HPLcom/google/gson/stream/JsonWriter;->peek()I
+HPLcom/google/gson/stream/JsonWriter;->string(Ljava/lang/String;)V
+HPLcom/google/gson/stream/JsonWriter;->value(Ljava/lang/Number;)V
+HPLcom/google/gson/stream/JsonWriter;->writeDeferredName()V
+HPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/util/concurrent/CancellationException;)V
+HPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z
+HPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext;
+HPLkotlinx/coroutines/scheduling/Task;-><init>(JLkotlinx/coroutines/scheduling/TaskContext;)V
+HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->onContextAvailable()V
+HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Ljava/lang/StringBuilder;
+HSPLandroidx/activity/ComponentActivity$1;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$2;-><init>()V
+HSPLandroidx/activity/ComponentActivity$3;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/activity/ComponentActivity$4;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/activity/ComponentActivity$5;-><init>(Landroidx/activity/ComponentActivity;)V
+HSPLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/activity/ComponentActivity;-><init>()V
+HSPLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras;
+HSPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry;
+HSPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;
+HSPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;
+HSPLandroidx/activity/ComponentActivity;->initViewTreeOwners()V
+HSPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
+HSPLandroidx/activity/ComponentActivity;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
+HSPLandroidx/activity/OnBackPressedDispatcher;-><init>(Landroidx/activity/ComponentActivity$1;)V
+HSPLandroidx/activity/compose/ComponentActivityKt;-><clinit>()V
+HSPLandroidx/activity/contextaware/ContextAwareHelper;-><init>()V
+HSPLandroidx/activity/result/ActivityResultRegistry;-><init>()V
+HSPLandroidx/arch/core/executor/ArchTaskExecutor;-><init>()V
+HSPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor;
+HSPLandroidx/arch/core/executor/DefaultTaskExecutor$1;-><init>()V
+HSPLandroidx/arch/core/executor/DefaultTaskExecutor;-><init>()V
+HSPLandroidx/arch/core/executor/TaskExecutor;-><init>()V
+HSPLandroidx/arch/core/internal/FastSafeIterableMap;-><init>()V
+HSPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;
+HSPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
+HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object;
+HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object;
+HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;-><init>(Landroidx/arch/core/internal/SafeIterableMap;)V
+HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z
+HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object;
+HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
+HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
+HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z
+HSPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;-><init>()V
+HSPLandroidx/arch/core/internal/SafeIterableMap;-><init>()V
+HSPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;
+HSPLandroidx/arch/core/internal/SafeIterableMap;->iterator()Ljava/util/Iterator;
+HSPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/collection/ArraySet;-><clinit>()V
+HSPLandroidx/collection/ArraySet;-><init>()V
+HSPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z
+HSPLandroidx/collection/ArraySet;->allocArrays(I)V
+HSPLandroidx/collection/ArraySet;->clear()V
+HSPLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V
+HSPLandroidx/collection/ArraySet;->indexOf(ILjava/lang/Object;)I
+HSPLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object;
+HSPLandroidx/collection/ContainerHelpers;-><clinit>()V
+HSPLandroidx/collection/SimpleArrayMap;-><init>()V
+HSPLandroidx/collection/SparseArrayCompat;-><clinit>()V
+HSPLandroidx/collection/SparseArrayCompat;-><init>()V
+HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;-><clinit>()V
+HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;-><init>()V
+HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2;-><init>(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)V
+HSPLandroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/ColorVectorConverterKt;-><clinit>()V
+HSPLandroidx/compose/animation/ColorVectorConverterKt;->access$multiplyColumn(IFFF[F)F
+HSPLandroidx/compose/animation/FlingCalculator;-><init>(FLandroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/animation/FlingCalculatorKt;-><clinit>()V
+HSPLandroidx/compose/animation/SingleValueAnimationKt;-><clinit>()V
+HSPLandroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/AnimationState;
+HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;-><init>(Landroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;-><clinit>()V
+HSPLandroidx/compose/animation/core/Animatable$runAnimation$2$1;-><init>(Landroidx/compose/animation/core/Animatable;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/Ref$BooleanRef;)V
+HSPLandroidx/compose/animation/core/Animatable$runAnimation$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;-><init>(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/Animatable;-><init>(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/String;)V
+HSPLandroidx/compose/animation/core/Animatable;->access$clampToBounds(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/Animatable;->animateTo$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationSpec;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/Animatable;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;-><init>(Lkotlinx/coroutines/channels/Channel;Ljava/lang/Object;)V
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;-><init>(Ljava/lang/Object;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;-><init>(Lkotlinx/coroutines/channels/Channel;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt;-><clinit>()V
+HSPLandroidx/compose/animation/core/AnimateAsStateKt;->animateDpAsState-AjpBEmI(FLandroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/AnimationState;
+HSPLandroidx/compose/animation/core/AnimateAsStateKt;->animateValueAsState(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationSpec;Ljava/lang/Float;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/AnimationState;
+HSPLandroidx/compose/animation/core/Animation;->isFinishedFromNanos(J)Z
+HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;-><clinit>()V
+HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->compareTo(II)I
+HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->ordinal(I)I
+HSPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->values(I)[I
+HSPLandroidx/compose/animation/core/AnimationResult;-><init>(Landroidx/compose/animation/core/AnimationState;I)V
+HSPLandroidx/compose/animation/core/AnimationScope;-><init>(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationVector;JLjava/lang/Object;JLkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/animation/core/AnimationScope;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimationState;-><init>(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;I)V
+HSPLandroidx/compose/animation/core/AnimationState;-><init>(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;JJZ)V
+HSPLandroidx/compose/animation/core/AnimationState;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/AnimationVector1D;-><init>(F)V
+HSPLandroidx/compose/animation/core/AnimationVector1D;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/animation/core/AnimationVector1D;->get$animation_core_release(I)F
+HSPLandroidx/compose/animation/core/AnimationVector1D;->getSize$animation_core_release()I
+HSPLandroidx/compose/animation/core/AnimationVector1D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/AnimationVector1D;->reset$animation_core_release()V
+HSPLandroidx/compose/animation/core/AnimationVector1D;->set$animation_core_release(FI)V
+HSPLandroidx/compose/animation/core/AnimationVector4D;-><init>(FFFF)V
+HSPLandroidx/compose/animation/core/AnimationVector4D;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/animation/core/AnimationVector4D;->get$animation_core_release(I)F
+HSPLandroidx/compose/animation/core/AnimationVector4D;->getSize$animation_core_release()I
+HSPLandroidx/compose/animation/core/AnimationVector4D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/AnimationVector4D;->reset$animation_core_release()V
+HSPLandroidx/compose/animation/core/AnimationVector4D;->set$animation_core_release(FI)V
+HSPLandroidx/compose/animation/core/AnimationVector;-><init>()V
+HSPLandroidx/compose/animation/core/ComplexDouble;-><init>(DD)V
+HSPLandroidx/compose/animation/core/ComplexDoubleKt;->complexSqrt(D)Landroidx/compose/animation/core/ComplexDouble;
+HSPLandroidx/compose/animation/core/DecayAnimationSpecImpl;-><init>(Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;)V
+HSPLandroidx/compose/animation/core/FloatSpringSpec;-><init>(FFF)V
+HSPLandroidx/compose/animation/core/FloatSpringSpec;-><init>(FFI)V
+HSPLandroidx/compose/animation/core/FloatSpringSpec;->getDurationNanos(FFF)J
+HSPLandroidx/compose/animation/core/FloatSpringSpec;->getEndVelocity(FFF)F
+HSPLandroidx/compose/animation/core/FloatSpringSpec;->getValueFromNanos(JFFF)F
+HSPLandroidx/compose/animation/core/FloatSpringSpec;->getVelocityFromNanos(JFFF)F
+HSPLandroidx/compose/animation/core/MutatorMutex$Mutator;-><init>(ILkotlinx/coroutines/Job;)V
+HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;-><init>(ILandroidx/compose/animation/core/MutatorMutex;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/MutatorMutex;-><init>()V
+HSPLandroidx/compose/animation/core/SpringSimulation;-><init>()V
+HSPLandroidx/compose/animation/core/SpringSimulation;->updateValues-IJZedt4$animation_core_release(FFJ)J
+HSPLandroidx/compose/animation/core/SpringSpec;-><init>(FFLjava/lang/Object;)V
+HSPLandroidx/compose/animation/core/SpringSpec;-><init>(Ljava/lang/Object;I)V
+HSPLandroidx/compose/animation/core/SpringSpec;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/animation/core/SpringSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec;
+HSPLandroidx/compose/animation/core/SpringSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedSpringSpec;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;-><init>(Landroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2$1;Landroidx/compose/animation/core/TwoWayConverterImpl;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6$1;-><init>(Landroidx/compose/animation/core/AnimationState;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationState;FLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$7;-><init>(Landroidx/compose/animation/core/AnimationState;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;FLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$callWithFrameNanos$2;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt$callWithFrameNanos$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt;->animate(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt;->callWithFrameNanos(Landroidx/compose/animation/core/Animation;Lkotlin/jvm/functions/Function1;Landroidx/compose/animation/core/SuspendAnimationKt$animate$4;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/SuspendAnimationKt;->doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/animation/core/SuspendAnimationKt;->getDurationScale(Lkotlin/coroutines/CoroutineContext;)F
+HSPLandroidx/compose/animation/core/SuspendAnimationKt;->updateState(Landroidx/compose/animation/core/AnimationScope;Landroidx/compose/animation/core/AnimationState;)V
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;-><init>(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getDurationNanos()J
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getTargetValue()Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter;
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getValueFromNanos(J)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/TargetBasedAnimation;->isInfinite()Z
+HSPLandroidx/compose/animation/core/TwoWayConverterImpl;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertFromVector()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertToVector()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$FloatToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$IntToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$RectToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$RectToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$RectToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$RectToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$SizeToVector$1;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$SizeToVector$1;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$SizeToVector$2;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt$SizeToVector$2;-><init>()V
+HSPLandroidx/compose/animation/core/VectorConvertersKt;-><clinit>()V
+HSPLandroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$1;-><init>(FFLandroidx/compose/animation/core/AnimationVector;)V
+HSPLandroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$1;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec;
+HSPLandroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$2;-><init>(FF)V
+HSPLandroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$2;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec;
+HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;-><init>(Landroidx/compose/animation/core/Animations;)V
+HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J
+HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;-><init>(FFLandroidx/compose/animation/core/AnimationVector;)V
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->isInfinite()V
+HSPLandroidx/compose/animation/core/VisibilityThresholdsKt;-><clinit>()V
+HSPLandroidx/compose/animation/core/VisibilityThresholdsKt;->getVisibilityThreshold()J
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;-><init>(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;-><init>(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$onNewSize$1;-><init>(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$onNewSize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;-><init>(Landroid/content/Context;Landroidx/compose/foundation/OverscrollConfiguration;)V
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->animateToRelease()V
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->getEffectModifier()Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->invalidateOverscroll()V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1;-><init>(Landroidx/compose/ui/layout/Placeable;I)V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1;-><clinit>()V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1;-><init>()V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1;-><init>(Landroidx/compose/ui/layout/Placeable;I)V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2;-><clinit>()V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2;-><init>()V
+HSPLandroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/AndroidOverscrollKt;-><clinit>()V
+HSPLandroidx/compose/foundation/Api31Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/widget/EdgeEffect;)F
+HSPLandroidx/compose/foundation/Api31Impl;-><clinit>()V
+HSPLandroidx/compose/foundation/Api31Impl;-><init>()V
+HSPLandroidx/compose/foundation/Api31Impl;->create(Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/widget/EdgeEffect;
+HSPLandroidx/compose/foundation/Api31Impl;->getDistance(Landroid/widget/EdgeEffect;)F
+HSPLandroidx/compose/foundation/Background;-><init>(Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Shape;)V
+HSPLandroidx/compose/foundation/Background;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/foundation/Background;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/BackgroundKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/BorderKt$border$2$1;-><init>(FLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/node/Ref;Landroidx/compose/ui/graphics/Brush;)V
+HSPLandroidx/compose/foundation/BorderKt$border$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/BorderKt$border$2;-><init>(FLandroidx/compose/ui/graphics/SolidColor;Landroidx/compose/ui/graphics/Shape;)V
+HSPLandroidx/compose/foundation/BorderKt$border$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/BorderKt$drawRectBorder$1;-><init>(Landroidx/compose/ui/graphics/Brush;JJLandroidx/arch/core/executor/TaskExecutor;)V
+HSPLandroidx/compose/foundation/BorderKt$drawRectBorder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/MutableState;Ljava/util/Map;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1;-><init>(Landroidx/compose/runtime/MutableState;Ljava/util/Map;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$clickable$2;-><init>(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$1$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$1$1;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$delayPressInteraction$1$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/Clickable_androidKt$isComposeRootInScrollableContainer$1;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$1;-><init>(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$2;-><init>(Landroidx/compose/runtime/State;Z)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1;-><init>(Landroidx/compose/runtime/MutableState;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$clickable$4;-><init>(Landroidx/compose/foundation/Indication;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/semantics/Role;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Z)V
+HSPLandroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1$1;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1;-><init>(Landroidx/compose/ui/semantics/Role;Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$detectPressAndClickFromKey$1;-><init>(ZLjava/util/Map;Landroidx/compose/runtime/MutableState;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$detectPressAndClickFromKey$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ClickableKt;->PressedInteractionSourceDisposableEffect(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Ljava/util/Map;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/ClickableKt;->clickable-O2vRcR0(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/Clickable_androidKt$isComposeRootInScrollableContainer$1;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/foundation/Clickable_androidKt;-><clinit>()V
+HSPLandroidx/compose/foundation/ClipScrollableContainerKt$HorizontalScrollableClipModifier$1;-><init>()V
+HSPLandroidx/compose/foundation/ClipScrollableContainerKt$HorizontalScrollableClipModifier$1;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/Outline;
+HSPLandroidx/compose/foundation/ClipScrollableContainerKt$VerticalScrollableClipModifier$1;-><init>()V
+HSPLandroidx/compose/foundation/ClipScrollableContainerKt;-><clinit>()V
+HSPLandroidx/compose/foundation/ClipScrollableContainerKt;->clipScrollableContainer(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/Orientation;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/DefaultDebugIndication$DefaultDebugIndicationInstance;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/DefaultDebugIndication$DefaultDebugIndicationInstance;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/foundation/DefaultDebugIndication;-><clinit>()V
+HSPLandroidx/compose/foundation/DefaultDebugIndication;-><init>()V
+HSPLandroidx/compose/foundation/DefaultDebugIndication;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance;
+HSPLandroidx/compose/foundation/DrawOverscrollModifier;-><init>(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V
+HSPLandroidx/compose/foundation/DrawOverscrollModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/foundation/DrawOverscrollModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/EdgeEffectCompat;->create(Landroid/content/Context;)Landroid/widget/EdgeEffect;
+HSPLandroidx/compose/foundation/EdgeEffectCompat;->getDistanceCompat(Landroid/widget/EdgeEffect;)F
+HSPLandroidx/compose/foundation/FocusableKt$focusGroup$1;-><clinit>()V
+HSPLandroidx/compose/foundation/FocusableKt$focusGroup$1;-><init>()V
+HSPLandroidx/compose/foundation/FocusableKt$focusGroup$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$1$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$1$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$2$invoke$$inlined$onDispose$1;-><init>()V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$2$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$2;-><init>(ZLkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$3$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$3$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$3$1;-><init>(Landroidx/compose/ui/layout/PinnableContainer;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$4$1$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/ui/focus/FocusRequester;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$4$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/ui/focus/FocusRequester;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/relocation/BringIntoViewRequester;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$2;-><init>(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5;-><init>(Landroidx/compose/ui/layout/PinnableContainer;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2;-><init>(Landroidx/compose/foundation/interaction/MutableInteractionSource;Z)V
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2;->invoke$lambda$2(Landroidx/compose/runtime/MutableState;)Z
+HSPLandroidx/compose/foundation/FocusableKt$focusable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2$1;-><init>(Landroidx/compose/ui/input/InputModeManager;)V
+HSPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2;-><init>(Landroidx/compose/foundation/interaction/MutableInteractionSource;Z)V
+HSPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusableKt;-><clinit>()V
+HSPLandroidx/compose/foundation/FocusableKt;->focusable(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/FocusedBoundsKt$ModifierLocalFocusedBoundsObserver$1;-><clinit>()V
+HSPLandroidx/compose/foundation/FocusedBoundsKt$ModifierLocalFocusedBoundsObserver$1;-><init>()V
+HSPLandroidx/compose/foundation/FocusedBoundsKt$ModifierLocalFocusedBoundsObserver$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusedBoundsKt$onFocusedBoundsChanged$2;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/foundation/FocusedBoundsKt$onFocusedBoundsChanged$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusedBoundsKt;-><clinit>()V
+HSPLandroidx/compose/foundation/FocusedBoundsModifier;-><init>()V
+HSPLandroidx/compose/foundation/FocusedBoundsModifier;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/foundation/FocusedBoundsModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V
+HSPLandroidx/compose/foundation/FocusedBoundsObserverModifier;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/foundation/FocusedBoundsObserverModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLandroidx/compose/foundation/FocusedBoundsObserverModifier;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusedBoundsObserverModifier;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/FocusedBoundsObserverModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$1$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$2$1;-><init>(ZLandroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3$1;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3;-><init>(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2;-><init>(Landroidx/compose/foundation/interaction/MutableInteractionSource;Z)V
+HSPLandroidx/compose/foundation/HoverableKt$hoverable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ImageKt$Image$2$measure$1;-><clinit>()V
+HSPLandroidx/compose/foundation/ImageKt$Image$2$measure$1;-><init>()V
+HSPLandroidx/compose/foundation/ImageKt$Image$2$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ImageKt$Image$2;-><clinit>()V
+HSPLandroidx/compose/foundation/ImageKt$Image$2;-><init>()V
+HSPLandroidx/compose/foundation/ImageKt$Image$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;-><init>(Ljava/lang/String;)V
+HSPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ImageKt;->Image(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;-><clinit>()V
+HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;-><init>()V
+HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/IndicationKt$indication$2;-><init>(Landroidx/compose/foundation/Indication;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/IndicationKt$indication$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/IndicationKt;-><clinit>()V
+HSPLandroidx/compose/foundation/IndicationModifier;-><init>(Landroidx/compose/foundation/IndicationInstance;)V
+HSPLandroidx/compose/foundation/IndicationModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/foundation/MutatePriority;-><clinit>()V
+HSPLandroidx/compose/foundation/MutatePriority;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/foundation/MutatorMutex$Mutator;-><init>(Landroidx/compose/foundation/MutatePriority;Lkotlinx/coroutines/Job;)V
+HSPLandroidx/compose/foundation/MutatorMutex$mutateWith$2;-><init>(Landroidx/compose/foundation/MutatePriority;Landroidx/compose/foundation/MutatorMutex;Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/MutatorMutex;-><init>()V
+HSPLandroidx/compose/foundation/OverscrollConfiguration;-><init>()V
+HSPLandroidx/compose/foundation/OverscrollConfiguration;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;-><clinit>()V
+HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;-><init>()V
+HSPLandroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/OverscrollConfigurationKt;-><clinit>()V
+HSPLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;-><init>(I)V
+HSPLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1;-><init>(Lkotlinx/coroutines/CoroutineScope;ZLandroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$1;-><init>(Landroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$2;-><init>(Landroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1;-><init>(ZZZLandroidx/compose/foundation/ScrollState;Lkotlinx/coroutines/CoroutineScope;)V
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2;-><init>(Landroidx/compose/foundation/ScrollState;Landroidx/compose/foundation/gestures/FlingBehavior;ZZ)V
+HSPLandroidx/compose/foundation/ScrollKt$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;-><clinit>()V
+HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;-><init>()V
+HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$2;-><clinit>()V
+HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$2;-><init>()V
+HSPLandroidx/compose/foundation/ScrollState$canScrollBackward$2;-><init>(Landroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollState$canScrollForward$2;-><init>(Landroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollState$scrollableState$1;-><init>(Landroidx/compose/foundation/ScrollState;)V
+HSPLandroidx/compose/foundation/ScrollState;-><clinit>()V
+HSPLandroidx/compose/foundation/ScrollState;-><init>(I)V
+HSPLandroidx/compose/foundation/ScrollState;->getValue()I
+HSPLandroidx/compose/foundation/ScrollingLayoutModifier$measure$1;-><init>(Landroidx/compose/foundation/ScrollingLayoutModifier;ILandroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/foundation/ScrollingLayoutModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/ScrollingLayoutModifier;-><init>(Landroidx/compose/foundation/ScrollState;ZZ)V
+HSPLandroidx/compose/foundation/ScrollingLayoutModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/ScrollingLayoutModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/gestures/AndroidConfig;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/AndroidConfig;-><init>()V
+HSPLandroidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier$modifier$1;-><init>(Landroidx/compose/foundation/gestures/ContentInViewModifier;)V
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier$modifier$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;-><init>(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;Z)V
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->bringChildIntoView(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->calculateRectForParent(Landroidx/compose/ui/geometry/Rect;)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->onRemeasured-ozmzZPI(J)V
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->relocationDistance(FFF)F
+HSPLandroidx/compose/foundation/gestures/ContentInViewModifier;->relocationOffset-BMxPBkI(Landroidx/compose/ui/geometry/Rect;J)J
+HSPLandroidx/compose/foundation/gestures/DefaultFlingBehavior;-><init>(Landroidx/compose/animation/core/DecayAnimationSpec;)V
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2$1;-><init>(Landroidx/compose/foundation/gestures/DefaultScrollableState;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;-><init>(Landroidx/compose/foundation/gestures/DefaultScrollableState;Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;-><init>(Landroidx/compose/foundation/gestures/DefaultScrollableState;)V
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->scrollBy(F)F
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/foundation/gestures/DefaultScrollableState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DragLogic;-><init>(Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$1;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$6;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$2;-><init>(Lkotlinx/coroutines/channels/Channel;Landroidx/compose/foundation/gestures/DraggableState;Landroidx/compose/runtime/State;Landroidx/compose/foundation/gestures/Orientation;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1$1;-><init>(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/foundation/gestures/Orientation;Lkotlinx/coroutines/channels/Channel;ZLkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1;-><init>(Landroidx/compose/ui/input/pointer/PointerInputScope;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/foundation/gestures/Orientation;Lkotlinx/coroutines/channels/Channel;ZLkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;-><init>(ZLandroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/foundation/gestures/Orientation;Lkotlinx/coroutines/channels/Channel;ZLkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9;-><init>(Landroidx/compose/foundation/gestures/ScrollDraggableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ZZ)V
+HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$9;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/DraggableKt;->access$awaitDownAndSlop(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/ui/input/pointer/util/VelocityTracker;Landroidx/compose/foundation/gestures/Orientation;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable;
+HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitEachGesture(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/Orientation;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/Orientation;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;-><init>(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;-><init>(Landroidx/compose/ui/input/pointer/PointerInputScope;)V
+HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->reset(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollDraggableState;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$1;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2$1;-><init>(Lkotlin/jvm/internal/Ref$FloatRef;Landroidx/compose/foundation/gestures/ScrollScope;)V
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2;-><init>(FLandroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/internal/Ref$FloatRef;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt;->animateScrollBy$default(Landroidx/compose/foundation/gestures/ScrollableState;FLkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollExtensionsKt;->animateScrollBy(Landroidx/compose/foundation/gestures/ScrollableState;FLandroidx/compose/animation/core/AnimationSpec;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$awaitScrollEvent$1;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1$1;-><init>(Landroidx/compose/foundation/gestures/ScrollConfig;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1;-><init>(Landroidx/compose/foundation/gestures/ScrollConfig;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$1;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$1;-><init>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$2$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$3$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$scrollable$2;-><init>(Landroidx/compose/foundation/OverscrollEffect;Landroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/ScrollState;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZZ)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$scrollable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollableKt$scrollableNestedScrollConnection$1;-><init>(Landroidx/compose/runtime/MutableState;Z)V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/ScrollableKt;->access$awaitScrollEvent(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/ScrollingLogic;-><init>(Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/runtime/MutableState;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/OverscrollEffect;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$NoPressGesture$1;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;-><init>(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;-><init>(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;-><init>(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown$default(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;ZLandroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/gestures/UpdatableAnimationState;-><clinit>()V
+HSPLandroidx/compose/foundation/gestures/UpdatableAnimationState;-><init>()V
+HSPLandroidx/compose/foundation/interaction/FocusInteraction$Focus;-><init>()V
+HSPLandroidx/compose/foundation/interaction/FocusInteraction$Unfocus;-><init>(Landroidx/compose/foundation/interaction/FocusInteraction$Focus;)V
+HSPLandroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1$1;-><init>(Ljava/util/ArrayList;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1;-><init>(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1$1;-><init>(Ljava/util/ArrayList;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1;-><init>(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;-><init>()V
+HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->emit(Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->getInteractions()Lkotlinx/coroutines/flow/SharedFlowImpl;
+HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1$1;-><init>(Ljava/util/ArrayList;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;-><init>(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/Arrangement$Bottom$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V
+HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->getSpacing-D9Ej5fM()F
+HSPLandroidx/compose/foundation/layout/Arrangement$End$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpaceAround$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpaceBetween$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpaceEvenly$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;-><init>(F)V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V
+HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->getSpacing-D9Ej5fM()F
+HSPLandroidx/compose/foundation/layout/Arrangement$Start$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$Top$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$Top$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V
+HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/Arrangement;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/Arrangement;->placeCenter$foundation_layout_release(I[I[IZ)V
+HSPLandroidx/compose/foundation/layout/Arrangement;->placeLeftOrTop$foundation_layout_release([I[IZ)V
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1$measure$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1$measure$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/layout/MeasureScope;IILandroidx/compose/ui/Alignment;)V
+HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;-><init>(Z)V
+HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/BoxKt;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/BoxKt;->Box(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/layout/BoxKt;->access$placeInBox(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/unit/LayoutDirection;IILandroidx/compose/ui/Alignment;)V
+HSPLandroidx/compose/foundation/layout/BoxKt;->rememberBoxMeasurePolicy(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy;
+HSPLandroidx/compose/foundation/layout/ColumnKt$DefaultColumnMeasurePolicy$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/ColumnKt$DefaultColumnMeasurePolicy$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/ColumnKt$DefaultColumnMeasurePolicy$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/io/Serializable;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;-><init>(Landroidx/compose/foundation/layout/Arrangement$Vertical;)V
+HSPLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/io/Serializable;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/ColumnKt;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/ColumnKt;->columnMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy;
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$CenterCrossAxisAlignment;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$CenterCrossAxisAlignment;-><init>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$EndCrossAxisAlignment;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$EndCrossAxisAlignment;-><init>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$HorizontalCrossAxisAlignment;-><init>(Landroidx/compose/ui/Alignment$Horizontal;)V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$HorizontalCrossAxisAlignment;->align$foundation_layout_release(ILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/layout/Placeable;)I
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$StartCrossAxisAlignment;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$StartCrossAxisAlignment;-><init>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;-><init>(Landroidx/compose/ui/BiasAlignment$Vertical;)V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;->align$foundation_layout_release(ILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/layout/Placeable;)I
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/CrossAxisAlignment;-><init>()V
+HSPLandroidx/compose/foundation/layout/FillModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/foundation/layout/FillModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/FillModifier;-><init>(IFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/foundation/layout/FillModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/FillModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/HorizontalAlignModifier;-><init>()V
+HSPLandroidx/compose/foundation/layout/HorizontalAlignModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/HorizontalAlignModifier;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$2;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$2;-><init>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/OffsetModifier$measure$1;-><init>(Landroidx/compose/foundation/layout/OffsetModifier;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;)V
+HSPLandroidx/compose/foundation/layout/OffsetModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/OffsetModifier;-><init>(FF)V
+HSPLandroidx/compose/foundation/layout/OffsetModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/OffsetModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/OrientationIndependentConstraints$$ExternalSyntheticOutline0;->m(III)I
+HSPLandroidx/compose/foundation/layout/PaddingKt;->calculateEndPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F
+HSPLandroidx/compose/foundation/layout/PaddingKt;->calculateStartPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F
+HSPLandroidx/compose/foundation/layout/PaddingKt;->padding-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/layout/PaddingModifier$measure$1;-><init>(Landroidx/compose/foundation/layout/PaddingModifier;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;)V
+HSPLandroidx/compose/foundation/layout/PaddingModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/PaddingModifier;-><init>(FFFF)V
+HSPLandroidx/compose/foundation/layout/PaddingModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/PaddingModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;-><init>(FFFF)V
+HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateBottomPadding-D9Ej5fM()F
+HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F
+HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F
+HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateTopPadding-D9Ej5fM()F
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1$measure$1;-><init>(Landroidx/compose/foundation/layout/RowColumnMeasurementHelper;Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult;Landroidx/compose/ui/layout/MeasureScope;)V
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;-><init>(ILkotlin/jvm/functions/Function5;FLandroidx/compose/foundation/layout/CrossAxisAlignment;)V
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->maxIntrinsicHeight(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->access$intrinsicSize(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IIII)I
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->getRowColumnParentData(Landroidx/compose/ui/layout/IntrinsicMeasurable;)Landroidx/compose/foundation/layout/RowColumnParentData;
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->getWeight(Landroidx/compose/foundation/layout/RowColumnParentData;)F
+HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->rowColumnMeasurePolicy-TDGSqEk(ILkotlin/jvm/functions/Function5;FLandroidx/compose/foundation/layout/CrossAxisAlignment;)Landroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;
+HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;-><init>(III[I)V
+HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;-><init>(ILkotlin/jvm/functions/Function5;FILandroidx/compose/foundation/layout/CrossAxisAlignment;Ljava/util/List;[Landroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->crossAxisSize(Landroidx/compose/ui/layout/Placeable;)I
+HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->mainAxisSize(Landroidx/compose/ui/layout/Placeable;)I
+HSPLandroidx/compose/foundation/layout/RowColumnParentData;-><init>(I)V
+HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;-><init>(Landroidx/compose/foundation/layout/Arrangement$HorizontalOrVertical;)V
+HSPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/io/Serializable;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/RowKt;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/RowKt;->rowMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$HorizontalOrVertical;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy;
+HSPLandroidx/compose/foundation/layout/RowScopeInstance;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/RowScopeInstance;-><init>()V
+HSPLandroidx/compose/foundation/layout/SizeKt$createFillSizeModifier$1;-><init>(F)V
+HSPLandroidx/compose/foundation/layout/SizeKt$createFillWidthModifier$1;-><init>(F)V
+HSPLandroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$1;-><init>(Landroidx/compose/ui/Alignment;)V
+HSPLandroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$2;-><init>(Landroidx/compose/ui/Alignment;Z)V
+HSPLandroidx/compose/foundation/layout/SizeKt;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/SizeKt;->createWrapContentSizeModifier(Landroidx/compose/ui/Alignment;Z)Landroidx/compose/foundation/layout/WrapContentModifier;
+HSPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/layout/SizeKt;->height-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/layout/SizeKt;->width-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/layout/SizeModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/foundation/layout/SizeModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/SizeModifier;-><init>(FFFF)V
+HSPLandroidx/compose/foundation/layout/SizeModifier;-><init>(FFFFI)V
+HSPLandroidx/compose/foundation/layout/SizeModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/SizeModifier;->getTargetConstraints-OenEA2s(Landroidx/compose/ui/unit/Density;)J
+HSPLandroidx/compose/foundation/layout/SizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/SpacerKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;-><init>()V
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;-><clinit>()V
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;-><init>()V
+HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;-><init>(Landroidx/compose/foundation/layout/WrapContentModifier;ILandroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/MeasureScope;)V
+HSPLandroidx/compose/foundation/layout/WrapContentModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/layout/WrapContentModifier;-><init>(IZLkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/foundation/layout/WrapContentModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/layout/WrapContentModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider$Item$1;-><init>(Landroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;II)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;-><init>(Landroidx/compose/runtime/DerivedSnapshotState;)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;->Item(ILandroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;->getContentType(I)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;->getItemCount()I
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;->getKey(I)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;->getKeyToIndexMap()Ljava/util/Map;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion$CREATOR$1;-><init>()V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;-><clinit>()V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;-><init>(I)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->hashCode()I
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider$generateKeyToIndexMap$1$1;-><init>(IILjava/util/HashMap;)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider$generateKeyToIndexMap$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;-><init>(Landroidx/compose/foundation/lazy/layout/MutableIntervalList;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/ranges/IntRange;)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;->Item(ILandroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;->getContentType(I)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;->getItemCount()I
+HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;->getKey(I)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;-><init>(IILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent;)V
+HSPLandroidx/compose/foundation/lazy/layout/IntervalListKt;->access$binarySearch(ILandroidx/compose/runtime/collection/MutableVector;)I
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;I)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;ILjava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;-><init>(Landroidx/compose/runtime/saveable/SaveableStateHolder;Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$itemContentFactory$1$1;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContent(ILjava/lang/Object;)Lkotlin/jvm/functions/Function2;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContentType(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->areCompatible(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->getSlotsToRetain(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$2$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$itemContentFactory$1$1;-><init>(Landroidx/compose/runtime/State;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$itemContentFactory$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ILandroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayout(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->measure-0kLqBqw(JI)Ljava/util/List;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->roundToPx-0680j_4(F)I
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;-><init>()V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;-><init>(IJ)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;->cancel()V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroid/view/View;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->doFrame(J)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onRemembered()V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->run()V
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->schedulePrefetch-0kLqBqw(JI)Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;
+HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt;->LazyLayoutPrefetcher(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$1;-><init>(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$2;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1;-><init>(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt;->rememberLazyNearestItemsRangeState(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;-><clinit>()V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;-><init>()V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$2;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;-><init>(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/util/Map;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->canBeSaved(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->performSave()Ljava/util/Map;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->registerProvider(Ljava/lang/String;Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;)Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Lkotlin/jvm/functions/Function3;I)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$holder$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$holder$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt;->LazySaveableStateHolderProvider(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;-><init>()V
+HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->addInterval(ILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent;)V
+HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->checkIndexBounds(I)V
+HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->forEach(IILandroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider$generateKeyToIndexMap$1$1;)V
+HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->getSize()I
+HSPLandroidx/compose/foundation/relocation/AndroidBringIntoViewParent;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/foundation/relocation/AndroidBringIntoViewParent;->bringChildIntoView(Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewChildModifier;-><init>(Landroidx/compose/foundation/relocation/AndroidBringIntoViewParent;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewChildModifier;->getLayoutCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewChildModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewChildModifier;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;-><clinit>()V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;-><init>()V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewKt;-><clinit>()V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl$bringIntoView$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl$bringIntoView$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;-><init>()V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;->bringIntoView(Landroidx/compose/ui/geometry/Rect;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewRequester;Landroidx/compose/foundation/relocation/BringIntoViewRequesterModifier;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewRequester;Landroidx/compose/foundation/relocation/BringIntoViewRequesterModifier;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterModifier$bringIntoView$2;-><init>(Landroidx/compose/ui/geometry/Rect;Landroidx/compose/foundation/relocation/BringIntoViewRequesterModifier;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterModifier$bringIntoView$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterModifier;-><init>(Landroidx/compose/foundation/relocation/AndroidBringIntoViewParent;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderKt$bringIntoViewResponder$2;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponder;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderKt$bringIntoViewResponder$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderKt;->bringIntoViewResponder(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/relocation/BringIntoViewResponder;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$2;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$parentRect$1;-><init>(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$parentRect$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier;-><init>(Landroidx/compose/foundation/relocation/AndroidBringIntoViewParent;)V
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier;->access$bringChildIntoView$localRect(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier;->bringChildIntoView(Landroidx/compose/ui/layout/LayoutCoordinates;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderModifier;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/relocation/BringIntoViewResponder_androidKt;->rememberDefaultBringIntoViewParent(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/relocation/AndroidBringIntoViewParent;
+HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;-><clinit>()V
+HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;-><init>()V
+HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/shape/CornerBasedShape;-><init>(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V
+HSPLandroidx/compose/foundation/shape/CornerBasedShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/Outline;
+HSPLandroidx/compose/foundation/shape/DpCornerSize;-><init>(F)V
+HSPLandroidx/compose/foundation/shape/PercentCornerSize;-><init>(F)V
+HSPLandroidx/compose/foundation/shape/PercentCornerSize;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/shape/PercentCornerSize;->toPx-TmRCtEA(JLandroidx/compose/ui/unit/Density;)F
+HSPLandroidx/compose/foundation/shape/RoundedCornerShape;-><init>(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V
+HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->createOutline-LjSzlW0(JFFFFLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/graphics/Outline;
+HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;-><clinit>()V
+HSPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->RoundedCornerShape-0680j_4(F)Landroidx/compose/foundation/shape/RoundedCornerShape;
+HSPLandroidx/compose/foundation/text/BasicTextKt$BasicText-4YKlhWE$$inlined$Layout$1;-><init>(Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;)V
+HSPLandroidx/compose/foundation/text/BasicTextKt$BasicText-4YKlhWE$$inlined$Layout$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/BasicTextKt;->BasicText-BpD7jsM(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function1;IZILandroidx/compose/runtime/Composer;II)V
+HSPLandroidx/compose/foundation/text/HeightInLinesModifierKt$heightInLines$2;-><init>(IILandroidx/compose/ui/text/TextStyle;)V
+HSPLandroidx/compose/foundation/text/HeightInLinesModifierKt$heightInLines$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/HeightInLinesModifierKt;->validateMinMaxLines(II)V
+HSPLandroidx/compose/foundation/text/TextController$coreModifiers$1;-><init>(Landroidx/compose/foundation/text/TextController;)V
+HSPLandroidx/compose/foundation/text/TextController$coreModifiers$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/TextController$createSemanticsModifierFor$1$1;-><init>(Landroidx/compose/foundation/text/TextController;)V
+HSPLandroidx/compose/foundation/text/TextController$createSemanticsModifierFor$1;-><init>(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/foundation/text/TextController;)V
+HSPLandroidx/compose/foundation/text/TextController$createSemanticsModifierFor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;-><init>(Landroidx/compose/foundation/text/TextController;)V
+HSPLandroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1$measure$2;-><init>(Ljava/util/ArrayList;)V
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1;-><init>(Landroidx/compose/foundation/text/TextController;)V
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1;->maxIntrinsicHeight(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1;->maxIntrinsicWidth(Landroidx/compose/ui/node/NodeCoordinator;Ljava/util/List;I)I
+HSPLandroidx/compose/foundation/text/TextController$measurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/foundation/text/TextController;-><init>(Landroidx/compose/foundation/text/TextState;)V
+HSPLandroidx/compose/foundation/text/TextController;->onForgotten()V
+HSPLandroidx/compose/foundation/text/TextController;->onRemembered()V
+HSPLandroidx/compose/foundation/text/TextDelegate;-><init>(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;IIZILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;)V
+HSPLandroidx/compose/foundation/text/TextDelegate;->layout-NN6Ew-U(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/text/TextLayoutResult;)Landroidx/compose/ui/text/TextLayoutResult;
+HSPLandroidx/compose/foundation/text/TextDelegate;->layoutIntrinsics(Landroidx/compose/ui/unit/LayoutDirection;)V
+HSPLandroidx/compose/foundation/text/TextDelegateKt;->ceilToIntPx(F)I
+HSPLandroidx/compose/foundation/text/TextState$onTextLayout$1;-><clinit>()V
+HSPLandroidx/compose/foundation/text/TextState$onTextLayout$1;-><init>()V
+HSPLandroidx/compose/foundation/text/TextState;-><init>(Landroidx/compose/foundation/text/TextDelegate;J)V
+HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;-><clinit>()V
+HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;-><init>()V
+HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;-><clinit>()V
+HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->hasSelection(Landroidx/compose/foundation/text/selection/SelectionRegistrar;J)Z
+HSPLandroidx/compose/foundation/text/selection/TextSelectionColors;-><init>(JJ)V
+HSPLandroidx/compose/foundation/text/selection/TextSelectionColors;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt$LocalTextSelectionColors$1;-><clinit>()V
+HSPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt$LocalTextSelectionColors$1;-><init>()V
+HSPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;-><clinit>()V
+HSPLandroidx/compose/material3/ColorScheme$$ExternalSyntheticOutline0;->m(JLandroidx/compose/runtime/StructuralEqualityPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState;
+HSPLandroidx/compose/material3/TextKt$LocalTextStyle$1;-><clinit>()V
+HSPLandroidx/compose/material3/TextKt$LocalTextStyle$1;-><init>()V
+HSPLandroidx/compose/material3/TextKt$LocalTextStyle$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/material3/TextKt$Text$1;-><clinit>()V
+HSPLandroidx/compose/material3/TextKt$Text$1;-><init>()V
+HSPLandroidx/compose/material3/TextKt$Text$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/material3/TextKt;-><clinit>()V
+HSPLandroidx/compose/material3/TextKt;->Text-fLXpl1I(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V
+HSPLandroidx/compose/runtime/AbstractApplier;-><init>(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/AbstractApplier;->down(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/AbstractApplier;->getCurrent()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/AbstractApplier;->up()V
+HSPLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;-><clinit>()V
+HSPLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;-><init>()V
+HSPLandroidx/compose/runtime/ActualAndroid_androidKt;-><clinit>()V
+HSPLandroidx/compose/runtime/Anchor;-><init>(I)V
+HSPLandroidx/compose/runtime/Anchor;->getValid()Z
+HSPLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;-><init>(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CancellableContinuationImpl;)V
+HSPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;-><init>(Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/jvm/internal/Ref$ObjectRef;)V
+HSPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/BroadcastFrameClock;-><init>(Landroidx/compose/runtime/Recomposer$broadcastFrameClock$1;)V
+HSPLandroidx/compose/runtime/BroadcastFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/BroadcastFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLandroidx/compose/runtime/BroadcastFrameClock;->getHasAwaiters()Z
+HSPLandroidx/compose/runtime/BroadcastFrameClock;->sendFrame(J)V
+HSPLandroidx/compose/runtime/BroadcastFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-2$1;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-2$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt;-><clinit>()V
+HSPLandroidx/compose/runtime/Composer$Companion$Empty$1;-><init>()V
+HSPLandroidx/compose/runtime/Composer$Companion;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;-><init>(Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onRemembered()V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;-><init>(Landroidx/compose/runtime/ComposerImpl;IZ)V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->doneComposing$runtime_release()V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingParameterInformation$runtime_release()Z
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompoundHashKey$runtime_release()I
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getEffectCoroutineContext$runtime_release()Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->startComposing$runtime_release()V
+HSPLandroidx/compose/runtime/ComposerImpl$apply$operation$1$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/Applier;Ljava/lang/String;Landroidx/compose/runtime/SlotWriter;Ljava/lang/String;Landroidx/compose/runtime/RememberManager;Ljava/lang/String;)V
+HSPLandroidx/compose/runtime/ComposerImpl$apply$operation$1;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/ComposerImpl$apply$operation$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$createNode$2;-><init>(Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Anchor;I)V
+HSPLandroidx/compose/runtime/ComposerImpl$createNode$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$createNode$3;-><init>(ILandroidx/compose/runtime/Anchor;)V
+HSPLandroidx/compose/runtime/ComposerImpl$createNode$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$1;-><init>(IILjava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$2;-><init>(IILjava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$3;-><init>(Landroidx/compose/runtime/ComposerImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$4;-><init>(Landroidx/compose/runtime/ComposerImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;-><init>(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$37$$inlined$sortBy$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$37$$inlined$sortBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/ComposerImpl$realizeDowns$1;-><init>([Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$realizeDowns$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$realizeOperationLocation$2;-><init>(I)V
+HSPLandroidx/compose/runtime/ComposerImpl$realizeOperationLocation$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$realizeUps$1;-><init>(I)V
+HSPLandroidx/compose/runtime/ComposerImpl$realizeUps$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$recordInsert$1;-><init>(Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/Anchor;)V
+HSPLandroidx/compose/runtime/ComposerImpl$recordInsert$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$recordInsert$2;-><init>(Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/Anchor;Ljava/util/ArrayList;)V
+HSPLandroidx/compose/runtime/ComposerImpl$recordInsert$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$recordSideEffect$1;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/ComposerImpl$recordSideEffect$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$recordSlotEditing$1;-><init>(Landroidx/compose/runtime/Anchor;)V
+HSPLandroidx/compose/runtime/ComposerImpl$recordSlotEditing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$startProviders$currentProviders$1;-><init>([Landroidx/compose/runtime/ProvidedValue;Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;)V
+HSPLandroidx/compose/runtime/ComposerImpl$startProviders$currentProviders$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$startReaderGroup$1;-><init>(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$startReaderGroup$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$updateValue$1;-><init>(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$updateValue$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl$updateValue$2;-><init>(ILjava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl$updateValue$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl;-><init>(Landroidx/compose/runtime/AbstractApplier;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/SlotTable;Ljava/util/HashSet;Ljava/util/ArrayList;Ljava/util/ArrayList;Landroidx/compose/runtime/ControlledComposition;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->buildContext()Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;
+HSPLandroidx/compose/runtime/ComposerImpl;->changed(I)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->changed(J)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->changed(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->changed(Z)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->changedInstance(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->cleanUpCompose()V
+HSPLandroidx/compose/runtime/ComposerImpl;->composeContent$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->consume(Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl;->createNode(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->currentCompositionLocalScope(Ljava/lang/Integer;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;
+HSPLandroidx/compose/runtime/ComposerImpl;->deactivateToEndGroup(Z)V
+HSPLandroidx/compose/runtime/ComposerImpl;->disableReusing()V
+HSPLandroidx/compose/runtime/ComposerImpl;->doCompose(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->doRecordDownsFor(II)V
+HSPLandroidx/compose/runtime/ComposerImpl;->enableReusing()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endDefaults()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endNode()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endProviders()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endReplaceableGroup()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endRestartGroup()Landroidx/compose/runtime/RecomposeScopeImpl;
+HSPLandroidx/compose/runtime/ComposerImpl;->endReusableGroup()V
+HSPLandroidx/compose/runtime/ComposerImpl;->endRoot()V
+HSPLandroidx/compose/runtime/ComposerImpl;->enterGroup(ZLandroidx/compose/runtime/Pending;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->getApplier()Landroidx/compose/runtime/Applier;
+HSPLandroidx/compose/runtime/ComposerImpl;->getApplyCoroutineContext()Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/runtime/ComposerImpl;->getCompoundKeyHash()I
+HSPLandroidx/compose/runtime/ComposerImpl;->getCurrentRecomposeScope$runtime_release()Landroidx/compose/runtime/RecomposeScopeImpl;
+HSPLandroidx/compose/runtime/ComposerImpl;->getDefaultsInvalid()Z
+HSPLandroidx/compose/runtime/ComposerImpl;->getInserting()Z
+HSPLandroidx/compose/runtime/ComposerImpl;->getRecomposeScope()Landroidx/compose/runtime/RecomposeScopeImpl;
+HSPLandroidx/compose/runtime/ComposerImpl;->getSkipping()Z
+HSPLandroidx/compose/runtime/ComposerImpl;->nextSlot()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl;->realizeDowns$1()V
+HSPLandroidx/compose/runtime/ComposerImpl;->realizeMovement()V
+HSPLandroidx/compose/runtime/ComposerImpl;->realizeOperationLocation(Z)V
+HSPLandroidx/compose/runtime/ComposerImpl;->realizeUps()V
+HSPLandroidx/compose/runtime/ComposerImpl;->recompose$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->recomposeToGroupEnd()V
+HSPLandroidx/compose/runtime/ComposerImpl;->record(Lkotlin/jvm/functions/Function3;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordDelete()V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordRemoveNode(II)V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordSideEffect(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordSlotEditing()V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordSlotTableOperation(ZLkotlin/jvm/functions/Function3;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordUp()V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordUpsAndDowns(III)V
+HSPLandroidx/compose/runtime/ComposerImpl;->recordUsed(Landroidx/compose/runtime/RecomposeScope;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->rememberedValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerImpl;->reportFreeMovableContent$reportGroup(Landroidx/compose/runtime/ComposerImpl;IZI)I
+HSPLandroidx/compose/runtime/ComposerImpl;->skipReaderToGroupEnd()V
+HSPLandroidx/compose/runtime/ComposerImpl;->skipToGroupEnd()V
+HSPLandroidx/compose/runtime/ComposerImpl;->start-BaiHCIY(IILjava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startDefaults()V
+HSPLandroidx/compose/runtime/ComposerImpl;->startGroup(ILandroidx/compose/runtime/OpaqueKey;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startNode()V
+HSPLandroidx/compose/runtime/ComposerImpl;->startProviders([Landroidx/compose/runtime/ProvidedValue;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startReaderGroup(Ljava/lang/Object;Z)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startReplaceableGroup(I)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startRestartGroup(I)Landroidx/compose/runtime/ComposerImpl;
+HSPLandroidx/compose/runtime/ComposerImpl;->startReusableGroup(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->startReusableNode()V
+HSPLandroidx/compose/runtime/ComposerImpl;->startRoot()V
+HSPLandroidx/compose/runtime/ComposerImpl;->tryImminentInvalidation$runtime_release(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeExitGroupKeyHash(I)V
+HSPLandroidx/compose/runtime/ComposerImpl;->updateNodeCount(II)V
+HSPLandroidx/compose/runtime/ComposerImpl;->updateNodeCountOverrides(II)V
+HSPLandroidx/compose/runtime/ComposerImpl;->updateProviderMapGroup(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;
+HSPLandroidx/compose/runtime/ComposerImpl;->updateRememberedValue(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
+HSPLandroidx/compose/runtime/ComposerImpl;->useNode()V
+HSPLandroidx/compose/runtime/ComposerKt$endGroupInstance$1;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposerKt$endGroupInstance$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposerKt$endGroupInstance$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerKt$removeCurrentGroupInstance$1;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposerKt$removeCurrentGroupInstance$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposerKt$removeCurrentGroupInstance$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;-><init>()V
+HSPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/ComposerKt;-><clinit>()V
+HSPLandroidx/compose/runtime/ComposerKt;->access$removeRange(Ljava/util/ArrayList;II)V
+HSPLandroidx/compose/runtime/ComposerKt;->findLocation(ILjava/util/List;)I
+HSPLandroidx/compose/runtime/ComposerKt;->runtimeCheck(Z)V
+HSPLandroidx/compose/runtime/CompositionContext;-><init>()V
+HSPLandroidx/compose/runtime/CompositionContext;->doneComposing$runtime_release()V
+HSPLandroidx/compose/runtime/CompositionContext;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;
+HSPLandroidx/compose/runtime/CompositionContext;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V
+HSPLandroidx/compose/runtime/CompositionContext;->startComposing$runtime_release()V
+HSPLandroidx/compose/runtime/CompositionContextKt;-><clinit>()V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;-><init>(Ljava/util/HashSet;)V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchAbandons()V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchRememberObservers()V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchSideEffects()V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->forgetting(Landroidx/compose/runtime/RememberObserver;)V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->remembering(Landroidx/compose/runtime/RememberObserver;)V
+HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->sideEffect(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/CompositionImpl;-><init>(Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/AbstractApplier;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked$invalidate(Landroidx/compose/runtime/CompositionImpl;ZLkotlin/jvm/internal/Ref$ObjectRef;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/Set;Z)V
+HSPLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
+HSPLandroidx/compose/runtime/CompositionImpl;->applyChangesInLocked(Ljava/util/ArrayList;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->applyLateChanges()V
+HSPLandroidx/compose/runtime/CompositionImpl;->changesApplied()V
+HSPLandroidx/compose/runtime/CompositionImpl;->cleanUpDerivedStateObservations()V
+HSPLandroidx/compose/runtime/CompositionImpl;->composeContent(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsForCompositionLocked()V
+HSPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsLocked()V
+HSPLandroidx/compose/runtime/CompositionImpl;->getHasInvalidations()Z
+HSPLandroidx/compose/runtime/CompositionImpl;->invalidate$enumunboxing$(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/CompositionImpl;->invalidateChecked$enumunboxing$(Landroidx/compose/runtime/RecomposeScopeImpl;Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/CompositionImpl;->invalidateScopeOfLocked(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->isComposing()Z
+HSPLandroidx/compose/runtime/CompositionImpl;->isDisposed()Z
+HSPLandroidx/compose/runtime/CompositionImpl;->observesAnyOf(Landroidx/compose/runtime/collection/IdentityArraySet;)Z
+HSPLandroidx/compose/runtime/CompositionImpl;->prepareCompose(Landroidx/compose/runtime/Recomposer$performRecompose$1$1;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->recompose()Z
+HSPLandroidx/compose/runtime/CompositionImpl;->recordModificationsOf(Ljava/util/Set;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->recordReadOf(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->recordWriteOf(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/CompositionImpl;->setContent(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/CompositionKt;-><clinit>()V
+HSPLandroidx/compose/runtime/CompositionKt;->Composition(Landroidx/compose/runtime/AbstractApplier;Landroidx/compose/runtime/CompositionContext;)Landroidx/compose/runtime/CompositionImpl;
+HSPLandroidx/compose/runtime/CompositionLocal;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/CompositionLocalKt;->CompositionLocalProvider([Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/runtime/CompositionLocalKt;->compositionLocalOf$default(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DynamicProvidableCompositionLocal;
+HSPLandroidx/compose/runtime/CompositionLocalKt;->compositionLocalOf(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DynamicProvidableCompositionLocal;
+HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;-><init>(Lkotlinx/coroutines/internal/ContextScope;)V
+HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onForgotten()V
+HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onRemembered()V
+HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;-><clinit>()V
+HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;-><init>()V
+HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V
+HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->readableHash(Landroidx/compose/runtime/DerivedState;Landroidx/compose/runtime/snapshots/Snapshot;)I
+HSPLandroidx/compose/runtime/DerivedSnapshotState$currentRecord$result$1$result$1;-><init>(Landroidx/compose/runtime/DerivedSnapshotState;Landroidx/compose/runtime/collection/IdentityArrayMap;I)V
+HSPLandroidx/compose/runtime/DerivedSnapshotState$currentRecord$result$1$result$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->getCurrentValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->getDependencies()[Ljava/lang/Object;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->getPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/DerivedSnapshotState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V
+HSPLandroidx/compose/runtime/DisposableEffectImpl;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/DisposableEffectImpl;->onForgotten()V
+HSPLandroidx/compose/runtime/DisposableEffectImpl;->onRemembered()V
+HSPLandroidx/compose/runtime/DisposableEffectScope;-><init>()V
+HSPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;-><init>(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->provided$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State;
+HSPLandroidx/compose/runtime/EffectsKt;-><clinit>()V
+HSPLandroidx/compose/runtime/EffectsKt;->DisposableEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/runtime/EffectsKt;->createCompositionCoroutineScope(Landroidx/compose/runtime/Composer;)Lkotlinx/coroutines/internal/ContextScope;
+HSPLandroidx/compose/runtime/GroupInfo;-><init>(III)V
+HSPLandroidx/compose/runtime/IntStack;-><init>()V
+HSPLandroidx/compose/runtime/IntStack;->pop()I
+HSPLandroidx/compose/runtime/IntStack;->push(I)V
+HSPLandroidx/compose/runtime/Invalidation;-><init>(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArraySet;)V
+HSPLandroidx/compose/runtime/KeyInfo;-><init>(ILjava/lang/Object;II)V
+HSPLandroidx/compose/runtime/Latch;-><init>()V
+HSPLandroidx/compose/runtime/LaunchedEffectImpl;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/LaunchedEffectImpl;->onForgotten()V
+HSPLandroidx/compose/runtime/LaunchedEffectImpl;->onRemembered()V
+HSPLandroidx/compose/runtime/LazyValueHolder;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/LazyValueHolder;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/MonotonicFrameClock$Key;-><clinit>()V
+HSPLandroidx/compose/runtime/MonotonicFrameClock$Key;-><init>()V
+HSPLandroidx/compose/runtime/MonotonicFrameClock;->getKey()Lkotlin/coroutines/CoroutineContext$Key;
+HSPLandroidx/compose/runtime/MonotonicFrameClockKt;->getMonotonicFrameClock(Lkotlin/coroutines/CoroutineContext;)Landroidx/compose/runtime/MonotonicFrameClock;
+HSPLandroidx/compose/runtime/MonotonicFrameClockKt;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/NeverEqualPolicy;-><clinit>()V
+HSPLandroidx/compose/runtime/NeverEqualPolicy;-><init>()V
+HSPLandroidx/compose/runtime/NeverEqualPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/OpaqueKey;-><init>(Ljava/lang/String;)V
+HSPLandroidx/compose/runtime/OpaqueKey;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/OpaqueKey;->hashCode()I
+HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1;-><init>()V
+HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;-><clinit>()V
+HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;-><init>(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;-><init>(Landroidx/compose/runtime/PausableMonotonicFrameClock;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;-><init>(Landroidx/compose/runtime/MonotonicFrameClock;)V
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Pending$keyMap$2;-><init>(Landroidx/compose/runtime/Pending;)V
+HSPLandroidx/compose/runtime/Pending$keyMap$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Pending;-><init>(ILjava/util/ArrayList;)V
+HSPLandroidx/compose/runtime/PrioritySet;-><init>(I)V
+HSPLandroidx/compose/runtime/PrioritySet;->add(I)V
+HSPLandroidx/compose/runtime/PrioritySet;->takeMax()I
+HSPLandroidx/compose/runtime/ProvidableCompositionLocal;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/ProvidableCompositionLocal;->provides(Ljava/lang/Object;)Landroidx/compose/runtime/ProvidedValue;
+HSPLandroidx/compose/runtime/ProvidedValue;-><init>(Landroidx/compose/runtime/CompositionLocal;Ljava/lang/Object;Z)V
+HSPLandroidx/compose/runtime/RecomposeScopeImpl;-><init>(Landroidx/compose/runtime/CompositionImpl;)V
+HSPLandroidx/compose/runtime/RecomposeScopeImpl;->invalidate()V
+HSPLandroidx/compose/runtime/Recomposer$Companion;-><init>()V
+HSPLandroidx/compose/runtime/Recomposer$RecomposerInfoImpl;-><init>()V
+HSPLandroidx/compose/runtime/Recomposer$State;-><clinit>()V
+HSPLandroidx/compose/runtime/Recomposer$State;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/runtime/Recomposer$broadcastFrameClock$1;-><init>(Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/runtime/Recomposer$broadcastFrameClock$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$effectJob$1$1;-><init>(Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/runtime/Recomposer$join$2;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/Recomposer$join$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/runtime/Recomposer$join$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$join$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;-><init>(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/collection/IdentityArraySet;)V
+HSPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$readObserverOf$1;-><init>(Landroidx/compose/runtime/ControlledComposition;)V
+HSPLandroidx/compose/runtime/Recomposer$readObserverOf$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$2;-><init>(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;-><init>(Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;-><init>(Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$2;-><init>(Landroidx/compose/runtime/Recomposer;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/List;Ljava/util/Set;)V
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;-><init>(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->access$invokeSuspend$fillToInsert(Ljava/util/List;Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer$writeObserverOf$1;-><init>(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/collection/IdentityArraySet;)V
+HSPLandroidx/compose/runtime/Recomposer$writeObserverOf$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Recomposer;-><clinit>()V
+HSPLandroidx/compose/runtime/Recomposer;-><init>(Lkotlin/coroutines/CoroutineContext;)V
+HSPLandroidx/compose/runtime/Recomposer;->access$performRecompose(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/collection/IdentityArraySet;)Landroidx/compose/runtime/ControlledComposition;
+HSPLandroidx/compose/runtime/Recomposer;->access$recordComposerModificationsLocked(Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/runtime/Recomposer;->applyAndCheck(Landroidx/compose/runtime/snapshots/MutableSnapshot;)V
+HSPLandroidx/compose/runtime/Recomposer;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/runtime/Recomposer;->deriveStateLocked()Lkotlinx/coroutines/CancellableContinuation;
+HSPLandroidx/compose/runtime/Recomposer;->getCollectingParameterInformation$runtime_release()Z
+HSPLandroidx/compose/runtime/Recomposer;->getCompoundHashKey$runtime_release()I
+HSPLandroidx/compose/runtime/Recomposer;->getEffectCoroutineContext$runtime_release()Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/runtime/Recomposer;->getHasSchedulingWork()Z
+HSPLandroidx/compose/runtime/Recomposer;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V
+HSPLandroidx/compose/runtime/Recomposer;->performInitialMovableContentInserts(Landroidx/compose/runtime/ControlledComposition;)V
+HSPLandroidx/compose/runtime/ReferentialEqualityPolicy;-><clinit>()V
+HSPLandroidx/compose/runtime/ReferentialEqualityPolicy;-><init>()V
+HSPLandroidx/compose/runtime/SkippableUpdater;-><init>(Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/runtime/SlotReader;-><init>(Landroidx/compose/runtime/SlotTable;)V
+HSPLandroidx/compose/runtime/SlotReader;->anchor(I)Landroidx/compose/runtime/Anchor;
+HSPLandroidx/compose/runtime/SlotReader;->aux([II)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotReader;->close()V
+HSPLandroidx/compose/runtime/SlotReader;->endGroup()V
+HSPLandroidx/compose/runtime/SlotReader;->getGroupAux()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotReader;->getGroupKey()I
+HSPLandroidx/compose/runtime/SlotReader;->groupGet(II)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotReader;->groupSize(I)I
+HSPLandroidx/compose/runtime/SlotReader;->isNode(I)Z
+HSPLandroidx/compose/runtime/SlotReader;->node(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotReader;->nodeCount(I)I
+HSPLandroidx/compose/runtime/SlotReader;->objectKey([II)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotReader;->parent(I)I
+HSPLandroidx/compose/runtime/SlotReader;->reposition(I)V
+HSPLandroidx/compose/runtime/SlotReader;->skipGroup()I
+HSPLandroidx/compose/runtime/SlotReader;->skipToGroupEnd()V
+HSPLandroidx/compose/runtime/SlotReader;->startGroup()V
+HSPLandroidx/compose/runtime/SlotTable;-><init>()V
+HSPLandroidx/compose/runtime/SlotTable;->anchorIndex(Landroidx/compose/runtime/Anchor;)I
+HSPLandroidx/compose/runtime/SlotTable;->openReader()Landroidx/compose/runtime/SlotReader;
+HSPLandroidx/compose/runtime/SlotTable;->openWriter()Landroidx/compose/runtime/SlotWriter;
+HSPLandroidx/compose/runtime/SlotTable;->ownsAnchor(Landroidx/compose/runtime/Anchor;)Z
+HSPLandroidx/compose/runtime/SlotTableKt;->access$containsMark([II)Z
+HSPLandroidx/compose/runtime/SlotTableKt;->access$groupSize([II)I
+HSPLandroidx/compose/runtime/SlotTableKt;->access$hasAux([II)Z
+HSPLandroidx/compose/runtime/SlotTableKt;->access$isNode([II)Z
+HSPLandroidx/compose/runtime/SlotTableKt;->access$locationOf(Ljava/util/ArrayList;II)I
+HSPLandroidx/compose/runtime/SlotTableKt;->access$nodeCount([II)I
+HSPLandroidx/compose/runtime/SlotTableKt;->access$slotAnchor([II)I
+HSPLandroidx/compose/runtime/SlotTableKt;->access$updateGroupSize([III)V
+HSPLandroidx/compose/runtime/SlotTableKt;->access$updateNodeCount([III)V
+HSPLandroidx/compose/runtime/SlotTableKt;->countOneBits(I)I
+HSPLandroidx/compose/runtime/SlotTableKt;->search(Ljava/util/ArrayList;II)I
+HSPLandroidx/compose/runtime/SlotWriter$Companion;-><init>()V
+HSPLandroidx/compose/runtime/SlotWriter$Companion;->access$moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;ZZ)Ljava/util/List;
+HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;-><init>(IILandroidx/compose/runtime/SlotWriter;)V
+HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->hasNext()Z
+HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->next()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotWriter;-><clinit>()V
+HSPLandroidx/compose/runtime/SlotWriter;-><init>(Landroidx/compose/runtime/SlotTable;)V
+HSPLandroidx/compose/runtime/SlotWriter;->advanceBy(I)V
+HSPLandroidx/compose/runtime/SlotWriter;->anchor(I)Landroidx/compose/runtime/Anchor;
+HSPLandroidx/compose/runtime/SlotWriter;->anchorIndex(Landroidx/compose/runtime/Anchor;)I
+HSPLandroidx/compose/runtime/SlotWriter;->auxIndex([II)I
+HSPLandroidx/compose/runtime/SlotWriter;->beginInsert()V
+HSPLandroidx/compose/runtime/SlotWriter;->close()V
+HSPLandroidx/compose/runtime/SlotWriter;->dataIndex([II)I
+HSPLandroidx/compose/runtime/SlotWriter;->dataIndexToDataAddress(I)I
+HSPLandroidx/compose/runtime/SlotWriter;->endGroup()V
+HSPLandroidx/compose/runtime/SlotWriter;->endInsert()V
+HSPLandroidx/compose/runtime/SlotWriter;->ensureStarted(I)V
+HSPLandroidx/compose/runtime/SlotWriter;->getSize$runtime_release()I
+HSPLandroidx/compose/runtime/SlotWriter;->groupIndexToAddress(I)I
+HSPLandroidx/compose/runtime/SlotWriter;->groupSize(I)I
+HSPLandroidx/compose/runtime/SlotWriter;->insertGroups(I)V
+HSPLandroidx/compose/runtime/SlotWriter;->insertSlots(II)V
+HSPLandroidx/compose/runtime/SlotWriter;->markGroup$default(Landroidx/compose/runtime/SlotWriter;)V
+HSPLandroidx/compose/runtime/SlotWriter;->moveFrom(Landroidx/compose/runtime/SlotTable;I)V
+HSPLandroidx/compose/runtime/SlotWriter;->moveGroupGapTo(I)V
+HSPLandroidx/compose/runtime/SlotWriter;->moveSlotGapTo(II)V
+HSPLandroidx/compose/runtime/SlotWriter;->node(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotWriter;->parent(I)I
+HSPLandroidx/compose/runtime/SlotWriter;->parent([II)I
+HSPLandroidx/compose/runtime/SlotWriter;->recalculateMarks()V
+HSPLandroidx/compose/runtime/SlotWriter;->removeGroup()Z
+HSPLandroidx/compose/runtime/SlotWriter;->removeGroups(II)Z
+HSPLandroidx/compose/runtime/SlotWriter;->removeSlots(III)V
+HSPLandroidx/compose/runtime/SlotWriter;->set(ILjava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotWriter;->skipGroup()I
+HSPLandroidx/compose/runtime/SlotWriter;->skipToGroupEnd()V
+HSPLandroidx/compose/runtime/SlotWriter;->slot(II)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SlotWriter;->slotIndex([II)I
+HSPLandroidx/compose/runtime/SlotWriter;->startGroup()V
+HSPLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;ZLjava/lang/Object;)V
+HSPLandroidx/compose/runtime/SlotWriter;->update(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/SlotWriter;->updateAux(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/SlotWriter;->updateContainsMark(I)V
+HSPLandroidx/compose/runtime/SlotWriter;->updateNodeOfGroup(ILjava/lang/Object;)V
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;-><init>(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;-><init>(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V
+HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->setValue(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;-><clinit>()V
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$readObserver$1;-><init>(Ljava/util/LinkedHashSet;)V
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$readObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$unregisterApplyObserver$1;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$unregisterApplyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;-><init>(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>()V
+HSPLandroidx/compose/runtime/SnapshotThreadLocal;->get()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/SnapshotThreadLocal;->set(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/Stack;-><init>()V
+HSPLandroidx/compose/runtime/Stack;->pop()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/Stack;->push(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/StaticProvidableCompositionLocal;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/StaticProvidableCompositionLocal;->provided$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State;
+HSPLandroidx/compose/runtime/StaticValueHolder;-><init>(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/StaticValueHolder;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/StaticValueHolder;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/StructuralEqualityPolicy;-><clinit>()V
+HSPLandroidx/compose/runtime/StructuralEqualityPolicy;-><init>()V
+HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;-><init>()V
+HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->add(ILjava/lang/Object;)I
+HSPLandroidx/compose/runtime/collection/IdentityArrayMap;-><init>()V
+HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->find(Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;-><init>()V
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->add(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->clear()V
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->contains(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->find(Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->get(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->isEmpty()Z
+HSPLandroidx/compose/runtime/collection/IdentityArraySet;->remove(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;-><init>()V
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->add(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->contains(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->find(Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->removeScope(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->scopeSetAt(I)Landroidx/compose/runtime/collection/IdentityArraySet;
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;-><init>(Landroidx/compose/runtime/collection/MutableVector;)V
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->get(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->indexOf(Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->isEmpty()Z
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->iterator()Ljava/util/Iterator;
+HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->size()I
+HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;-><init>(ILjava/util/List;)V
+HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->hasNext()Z
+HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->next()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/collection/MutableVector;-><init>([Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/MutableVector;->add(ILjava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/MutableVector;->add(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/collection/MutableVector;->addAll(ILandroidx/compose/runtime/collection/MutableVector;)V
+HSPLandroidx/compose/runtime/collection/MutableVector;->asMutableList()Ljava/util/List;
+HSPLandroidx/compose/runtime/collection/MutableVector;->clear()V
+HSPLandroidx/compose/runtime/collection/MutableVector;->contains(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/MutableVector;->ensureCapacity(I)V
+HSPLandroidx/compose/runtime/collection/MutableVector;->isEmpty()Z
+HSPLandroidx/compose/runtime/collection/MutableVector;->isNotEmpty()Z
+HSPLandroidx/compose/runtime/collection/MutableVector;->remove(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/collection/MutableVector;->removeAt(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/collection/MutableVector;->removeRange(II)V
+HSPLandroidx/compose/runtime/collection/MutableVectorKt;->access$checkIndex(ILjava/util/List;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/ExtensionsKt;->persistentHashMapOf()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;-><init>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->remove(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;-><clinit>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;-><init>([Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->get(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->getSize()I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->indexOf(Ljava/lang/Object;)I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->removeAt(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getKey()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;-><clinit>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->builder()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->containsKey(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->put(Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;[Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->ensureNextEntryIsReady()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->hasNext()Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->moveToNextNodeWithData(I)I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->next()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->build$1()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->putAll(Ljava/util/Map;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setSize(I)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->getSize()I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->iterator()Ljava/util/Iterator;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntriesIterator;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode$ModificationResult;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;-><clinit>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;-><init>(II[Ljava/lang/Object;Landroidx/lifecycle/runtime/R$id;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->bufferMoveEntryToNode(IIILjava/lang/Object;Ljava/lang/Object;ILandroidx/lifecycle/runtime/R$id;)[Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->containsKey(IILjava/lang/Object;)Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->elementsIdentityEquals(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryKeyIndex$runtime_release(I)I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->get(IILjava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasEntryAt$runtime_release(I)Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasNodeAt(I)Z
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->makeNode(ILjava/lang/Object;Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;ILandroidx/lifecycle/runtime/R$id;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePut(ILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePutAll(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeAtIndex$runtime_release(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeIndex$runtime_release(I)I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->put(IILjava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode$ModificationResult;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->valueAtKeyIndex(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;-><init>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator;-><init>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator;->next()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;-><init>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;-><clinit>()V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;-><init>(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->add(Landroidx/compose/runtime/Recomposer$RecomposerInfoImpl;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->getSize()I
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;-><init>(I)V
+HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation;->checkElementIndex$runtime_release(II)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;-><init>(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;I)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2;-><init>(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;Ljava/lang/Object;I)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;-><init>(IZ)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->trackRead(Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->update(Lkotlin/jvm/internal/Lambda;)V
+HSPLandroidx/compose/runtime/internal/ComposableLambdaKt;->bitsForSlot(II)I
+HSPLandroidx/compose/runtime/internal/ComposableLambdaKt;->composableLambda(Landroidx/compose/runtime/Composer;ILkotlin/jvm/internal/Lambda;)Landroidx/compose/runtime/internal/ComposableLambdaImpl;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaKt;->composableLambdaInstance(ILkotlin/jvm/internal/Lambda;Z)Landroidx/compose/runtime/internal/ComposableLambdaImpl;
+HSPLandroidx/compose/runtime/internal/ComposableLambdaKt;->replacableWith(Landroidx/compose/runtime/RecomposeScope;Landroidx/compose/runtime/RecomposeScope;)Z
+HSPLandroidx/compose/runtime/internal/ThreadMap;-><init>(I[J[Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/internal/ThreadMap;->find(J)I
+HSPLandroidx/compose/runtime/internal/ThreadMap;->newWith(JLjava/lang/Object;)Landroidx/compose/runtime/internal/ThreadMap;
+HSPLandroidx/compose/runtime/internal/ThreadMapKt;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/ListSaverKt$listSaver$1;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/saveable/ListSaverKt$listSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;)V
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1$1$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1$1$1;->canBeSaved(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;-><init>(Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/RememberSaveableKt;->rememberSaveable([Ljava/lang/Object;Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$1;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$1;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$2;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$2;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder$registry$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;-><init>(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->saveTo(Ljava/util/Map;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;-><init>(I)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;-><init>(Ljava/util/Map;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;Ljava/lang/String;Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;-><init>(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->canBeSaved(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->performSave()Ljava/util/Map;
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->registerProvider(Ljava/lang/String;Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;)Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt$LocalSaveableStateRegistry$1;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt$LocalSaveableStateRegistry$1;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;-><clinit>()V
+HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;-><init>()V
+HSPLandroidx/compose/runtime/saveable/SaverKt$Saver$1;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/saveable/SaverKt$Saver$1;->save(Landroidx/compose/runtime/saveable/SaverScope;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/saveable/SaverKt;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedMutableSnapshot$1;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedMutableSnapshot$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedSnapshot$1;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedSnapshot$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;-><init>(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->dispose()V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->notifyObjectsInitialized$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot;
+HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;-><init>(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->advance$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/SnapshotApplyResult;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->closeLocked$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->dispose()V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getModified$runtime_release()Ljava/util/Set;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadOnly()Z
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteObserver$runtime_release()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->innerApplyLocked$runtime_release(ILjava/util/HashMap;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotApplyResult;
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedDeactivated$runtime_release(Landroidx/compose/runtime/snapshots/Snapshot;)V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->notifyObjectsInitialized$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPrevious$runtime_release(I)V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setModified(Ljava/util/HashSet;)V
+HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;-><init>(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->dispose()V
+HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->nestedDeactivated$runtime_release(Landroidx/compose/runtime/snapshots/Snapshot;)V
+HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->observe(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/Snapshot;-><init>(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->closeAndReleasePinning$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->closeLocked$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->dispose()V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->getId()I
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->makeCurrent()Landroidx/compose/runtime/snapshots/Snapshot;
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->restoreCurrent(Landroidx/compose/runtime/snapshots/Snapshot;)V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->setId$runtime_release(I)V
+HSPLandroidx/compose/runtime/snapshots/Snapshot;->setInvalid$runtime_release(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotApplyResult;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->add(I)I
+HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->swap(II)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;-><init>(JJI[I)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->andNot(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->clear(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->get(I)Z
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->or(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->set(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedWriteObserver$1;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedWriteObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$mergedWriteObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$optimisticMerges(Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Ljava/util/HashMap;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$validateOpen(Landroidx/compose/runtime/snapshots/Snapshot;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->addRange(IILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/runtime/snapshots/Snapshot;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->currentSnapshot()Landroidx/compose/runtime/snapshots/Snapshot;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedReadObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)Lkotlin/jvm/functions/Function1;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newOverwritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newWritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->notifyWrite(Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateObject;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwritableRecord(Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->releasePinningLocked(I)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->writableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;-><init>(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->setList$runtime_release(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->add(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->get(I)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getReadable$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(Ljava/lang/Object;)Z
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->size()I
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;-><clinit>()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateEnterObserver$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateEnterObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateExitObserver$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateExitObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->access$clearObsoleteStateReads(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordInvalidation(Ljava/util/Set;)Z
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeScopeIf()V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$observeReads$1$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$observeReads$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$readObserver$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$readObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;-><init>(Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;)V
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$drainChanges(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z
+HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->ensureMap(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;
+HSPLandroidx/compose/runtime/snapshots/StateRecord;-><init>()V
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;-><init>(Landroidx/compose/runtime/snapshots/MutableSnapshot;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZZ)V
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/SnapshotApplyResult;
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->dispose()V
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getCurrentSnapshot()Landroidx/compose/runtime/snapshots/MutableSnapshot;
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getId()I
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getReadOnly()Z
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->notifyObjectsInitialized$runtime_release()V
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V
+HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot;
+HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;-><clinit>()V
+HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;-><init>()V
+HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/runtime/tooling/InspectionTablesKt;-><clinit>()V
+HSPLandroidx/compose/ui/Alignment$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/BiasAlignment$Horizontal;-><init>(F)V
+HSPLandroidx/compose/ui/BiasAlignment$Horizontal;->align(IILandroidx/compose/ui/unit/LayoutDirection;)I
+HSPLandroidx/compose/ui/BiasAlignment$Horizontal;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/BiasAlignment$Vertical;-><init>(F)V
+HSPLandroidx/compose/ui/BiasAlignment$Vertical;->align(II)I
+HSPLandroidx/compose/ui/BiasAlignment$Vertical;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/BiasAlignment;-><init>(FF)V
+HSPLandroidx/compose/ui/BiasAlignment;->align-KFBX0sM(JJLandroidx/compose/ui/unit/LayoutDirection;)J
+HSPLandroidx/compose/ui/BiasAlignment;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/CombinedModifier;-><init>(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Modifier;)V
+HSPLandroidx/compose/ui/CombinedModifier;->all(Lkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/CombinedModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/CombinedModifier;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/ComposedModifier;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V
+HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;-><clinit>()V
+HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;-><init>()V
+HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;-><init>(Landroidx/compose/runtime/Composer;)V
+HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/ComposedModifierKt;->composed(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/ComposedModifierKt;->materialize(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/Modifier$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/Modifier$Companion;-><init>()V
+HSPLandroidx/compose/ui/Modifier$Companion;->all(Lkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/Modifier$Companion;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/Modifier$Element;->all(Lkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/Modifier$Element;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/Modifier$Node;-><init>()V
+HSPLandroidx/compose/ui/Modifier$Node;->detach$ui_release()V
+HSPLandroidx/compose/ui/Modifier$Node;->getNode()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/Modifier$Node;->onAttach()V
+HSPLandroidx/compose/ui/Modifier$Node;->onDetach()V
+HSPLandroidx/compose/ui/Modifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/MotionDurationScale$Key;-><clinit>()V
+HSPLandroidx/compose/ui/MotionDurationScale$Key;-><init>()V
+HSPLandroidx/compose/ui/MotionDurationScale;->getKey()Lkotlin/coroutines/CoroutineContext$Key;
+HSPLandroidx/compose/ui/ZIndexModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/ZIndexModifier;)V
+HSPLandroidx/compose/ui/ZIndexModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/ZIndexModifier;-><init>()V
+HSPLandroidx/compose/ui/ZIndexModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/ZIndexModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/autofill/AndroidAutofill;-><init>(Landroid/view/View;Landroidx/compose/ui/autofill/AutofillTree;)V
+HSPLandroidx/compose/ui/autofill/AutofillCallback;-><clinit>()V
+HSPLandroidx/compose/ui/autofill/AutofillCallback;-><init>()V
+HSPLandroidx/compose/ui/autofill/AutofillCallback;->register(Landroidx/compose/ui/autofill/AndroidAutofill;)V
+HSPLandroidx/compose/ui/autofill/AutofillTree;-><init>()V
+HSPLandroidx/compose/ui/draw/CacheDrawScope;-><init>()V
+HSPLandroidx/compose/ui/draw/CacheDrawScope;->getDensity()F
+HSPLandroidx/compose/ui/draw/CacheDrawScope;->getSize-NH-jbRc()J
+HSPLandroidx/compose/ui/draw/ClipKt;->clip(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/draw/ClipKt;->clipToBounds(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/draw/DrawBackgroundModifier;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/draw/DrawBackgroundModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/ui/draw/DrawContentCacheModifier;-><init>(Landroidx/compose/ui/draw/CacheDrawScope;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/draw/DrawContentCacheModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/ui/draw/DrawContentCacheModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/draw/DrawContentCacheModifier;->onBuildCache(Landroidx/compose/ui/node/BackwardsCompatNode;)V
+HSPLandroidx/compose/ui/draw/DrawModifierKt$drawBehind$$inlined$modifierElementOf$1;-><init>(Landroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;Landroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;Landroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;)V
+HSPLandroidx/compose/ui/draw/DrawModifierKt$drawBehind$$inlined$modifierElementOf$1;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/draw/DrawModifierKt$drawBehind$$inlined$modifierElementOf$1;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/draw/DrawModifierKt$drawWithCache$2;-><init>(Landroidx/compose/foundation/BorderKt$border$2$1;)V
+HSPLandroidx/compose/ui/draw/DrawModifierKt$drawWithCache$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/draw/DrawResult;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;-><clinit>()V
+HSPLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;-><init>()V
+HSPLandroidx/compose/ui/draw/PainterModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/ui/draw/PainterModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/draw/PainterModifier;-><init>(Landroidx/compose/ui/graphics/painter/Painter;ZLandroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V
+HSPLandroidx/compose/ui/draw/PainterModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/ui/draw/PainterModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/draw/PainterModifier;->getUseIntrinsicSize()Z
+HSPLandroidx/compose/ui/draw/PainterModifier;->hasSpecifiedAndFiniteHeight-uvyYCjk(J)Z
+HSPLandroidx/compose/ui/draw/PainterModifier;->hasSpecifiedAndFiniteWidth-uvyYCjk(J)Z
+HSPLandroidx/compose/ui/draw/PainterModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/draw/PainterModifier;->modifyConstraints-ZezNO4M(J)J
+HSPLandroidx/compose/ui/focus/BeyondBoundsLayoutKt;->searchBeyondBounds--OM-vw8(Landroidx/compose/ui/focus/FocusTargetModifierNode;ILkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/focus/FocusChangedModifierKt$onFocusChanged$$inlined$modifierElementOf$2;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/focus/FocusChangedModifierKt$onFocusChanged$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusChangedModifierKt$onFocusChanged$$inlined$modifierElementOf$2;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusChangedModifierKt;->onFocusChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/focus/FocusChangedModifierNode;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/focus/FocusChangedModifierNode;->onFocusEvent(Landroidx/compose/ui/focus/FocusStateImpl;)V
+HSPLandroidx/compose/ui/focus/FocusDirection;-><init>(I)V
+HSPLandroidx/compose/ui/focus/FocusEventModifierNodeKt;->getFocusState(Landroidx/compose/ui/focus/FocusEventModifierNode;)Landroidx/compose/ui/focus/FocusStateImpl;
+HSPLandroidx/compose/ui/focus/FocusEventModifierNodeKt;->refreshFocusEventNodes(Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;-><init>(Landroidx/compose/ui/focus/FocusInvalidationManager;)V
+HSPLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/focus/FocusInvalidationManager;-><init>(Landroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;)V
+HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Ljava/util/LinkedHashSet;Ljava/lang/Object;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl$moveFocus$foundNextItem$1;-><init>(Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl$moveFocus$foundNextItem$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl$special$$inlined$modifierElementOf$2;-><init>(Landroidx/compose/ui/focus/FocusOwnerImpl;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl$special$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;-><init>(Landroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->dispatchKeyEvent-ZmokQxo(Landroid/view/KeyEvent;)Z
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->getModifier()Landroidx/compose/ui/focus/FocusOwnerImpl$special$$inlined$modifierElementOf$2;
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->moveFocus-3ESFkO8(I)Z
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusEventModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusPropertiesModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V
+HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->takeFocus()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl$enter$1;-><clinit>()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl$enter$1;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl$exit$1;-><clinit>()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl$exit$1;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusPropertiesImpl;->setCanFocus(Z)V
+HSPLandroidx/compose/ui/focus/FocusPropertiesKt$focusProperties$$inlined$modifierElementOf$2;-><init>(Lkotlin/jvm/internal/Lambda;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/focus/FocusPropertiesKt$focusProperties$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusPropertiesKt$focusProperties$$inlined$modifierElementOf$2;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusPropertiesModifierNodeImpl;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/focus/FocusPropertiesModifierNodeImpl;->modifyFocusProperties(Landroidx/compose/ui/focus/FocusProperties;)V
+HSPLandroidx/compose/ui/focus/FocusRequester;-><clinit>()V
+HSPLandroidx/compose/ui/focus/FocusRequester;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusRequester;->findFocusTarget$ui_release(Lkotlin/jvm/functions/Function1;)Ljava/lang/Boolean;
+HSPLandroidx/compose/ui/focus/FocusRequesterModifierKt$focusRequester$$inlined$modifierElementOf$2;-><init>(Ljava/lang/Object;Landroidx/compose/ui/focus/FocusRequester;Landroidx/compose/ui/focus/FocusRequester;)V
+HSPLandroidx/compose/ui/focus/FocusRequesterModifierKt$focusRequester$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusRequesterModifierKt$focusRequester$$inlined$modifierElementOf$2;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusRequesterModifierNodeImpl;-><init>(Landroidx/compose/ui/focus/FocusRequester;)V
+HSPLandroidx/compose/ui/focus/FocusRequesterModifierNodeImpl;->onAttach()V
+HSPLandroidx/compose/ui/focus/FocusStateImpl;-><clinit>()V
+HSPLandroidx/compose/ui/focus/FocusStateImpl;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/ui/focus/FocusStateImpl;->getHasFocus()Z
+HSPLandroidx/compose/ui/focus/FocusStateImpl;->isFocused()Z
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode$special$$inlined$modifierElementOf$2;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode$special$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode;-><clinit>()V
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode;-><init>()V
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode;->fetchFocusProperties$ui_release()Landroidx/compose/ui/focus/FocusPropertiesImpl;
+HSPLandroidx/compose/ui/focus/FocusTargetModifierNode;->invalidateFocus$ui_release()V
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt$grantFocus$1;-><init>(Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt$grantFocus$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt;->clearFocus(Landroidx/compose/ui/focus/FocusTargetModifierNode;ZZ)Z
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt;->grantFocus(Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt;->requestFocus(Landroidx/compose/ui/focus/FocusTargetModifierNode;)Z
+HSPLandroidx/compose/ui/focus/FocusTransactionsKt;->requestFocusForChild(Landroidx/compose/ui/focus/FocusTargetModifierNode;Landroidx/compose/ui/focus/FocusTargetModifierNode;)Z
+HSPLandroidx/compose/ui/focus/FocusTraversalKt;->findActiveFocusNode(Landroidx/compose/ui/focus/FocusTargetModifierNode;)Landroidx/compose/ui/focus/FocusTargetModifierNode;
+HSPLandroidx/compose/ui/focus/FocusTraversalKt;->focusRect(Landroidx/compose/ui/focus/FocusTargetModifierNode;)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/ui/focus/FocusTraversalKt;->getActiveChild(Landroidx/compose/ui/focus/FocusTargetModifierNode;)Landroidx/compose/ui/focus/FocusTargetModifierNode;
+HSPLandroidx/compose/ui/focus/FocusTraversalKt;->isEligibleForFocusSearch(Landroidx/compose/ui/focus/FocusTargetModifierNode;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt$generateAndSearchChildren$1;-><init>(Landroidx/compose/ui/focus/FocusTargetModifierNode;Landroidx/compose/ui/focus/FocusTargetModifierNode;ILkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt$generateAndSearchChildren$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->beamBeats-I7lrPNg(Landroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;I)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->beamBeats_I7lrPNg$inSourceBeam(ILandroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->collectAccessibleChildren(Landroidx/compose/ui/node/DelegatableNode;Landroidx/compose/runtime/collection/MutableVector;)V
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->findBestCandidate-4WY_MpI(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/geometry/Rect;I)Landroidx/compose/ui/focus/FocusTargetModifierNode;
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->findChildCorrespondingToFocusEnter--OM-vw8(Landroidx/compose/ui/focus/FocusTargetModifierNode;ILkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->generateAndSearchChildren-4C6V_qg(Landroidx/compose/ui/focus/FocusTargetModifierNode;Landroidx/compose/ui/focus/FocusTargetModifierNode;ILkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->isBetterCandidate_I7lrPNg$isCandidate(ILandroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->isBetterCandidate_I7lrPNg$weightedDistance(ILandroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;)J
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->searchChildren-4C6V_qg(Landroidx/compose/ui/focus/FocusTargetModifierNode;Landroidx/compose/ui/focus/FocusTargetModifierNode;ILkotlin/jvm/functions/Function1;)Z
+HSPLandroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;->twoDimensionalFocusSearch--OM-vw8(Landroidx/compose/ui/focus/FocusTargetModifierNode;ILandroidx/compose/ui/focus/FocusOwnerImpl$moveFocus$foundNextItem$1;)Z
+HSPLandroidx/compose/ui/geometry/CornerRadius;-><clinit>()V
+HSPLandroidx/compose/ui/geometry/CornerRadius;->getX-impl(J)F
+HSPLandroidx/compose/ui/geometry/CornerRadius;->getY-impl(J)F
+HSPLandroidx/compose/ui/geometry/CornerRadiusKt;->CornerRadius(FF)J
+HSPLandroidx/compose/ui/geometry/MutableRect;-><init>()V
+HSPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z
+HSPLandroidx/compose/ui/geometry/Offset;-><clinit>()V
+HSPLandroidx/compose/ui/geometry/Offset;-><init>(J)V
+HSPLandroidx/compose/ui/geometry/Offset;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/geometry/Offset;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/geometry/Offset;->getX-impl(J)F
+HSPLandroidx/compose/ui/geometry/Offset;->getY-impl(J)F
+HSPLandroidx/compose/ui/geometry/OffsetKt;->Offset(FF)J
+HSPLandroidx/compose/ui/geometry/Rect;-><clinit>()V
+HSPLandroidx/compose/ui/geometry/Rect;-><init>(FFFF)V
+HSPLandroidx/compose/ui/geometry/Rect;->translate(FF)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/ui/geometry/Rect;->translate-k-4lQ0M(J)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/ui/geometry/RoundRect;-><clinit>()V
+HSPLandroidx/compose/ui/geometry/RoundRect;-><init>(FFFFJJJJ)V
+HSPLandroidx/compose/ui/geometry/RoundRectKt;->RoundRect-gG7oq9Y(FFFFJ)Landroidx/compose/ui/geometry/RoundRect;
+HSPLandroidx/compose/ui/geometry/Size;-><clinit>()V
+HSPLandroidx/compose/ui/geometry/Size;-><init>(J)V
+HSPLandroidx/compose/ui/geometry/Size;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/geometry/Size;->getHeight-impl(J)F
+HSPLandroidx/compose/ui/geometry/Size;->getMinDimension-impl(J)F
+HSPLandroidx/compose/ui/geometry/Size;->getWidth-impl(J)F
+HSPLandroidx/compose/ui/geometry/Size;->isEmpty-impl(J)Z
+HSPLandroidx/compose/ui/geometry/SizeKt;->Size(FF)J
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;-><init>()V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawImageRect-HPBpro0(Landroidx/compose/ui/graphics/ImageBitmap;JJJJLandroidx/compose/ui/graphics/AndroidPaint;)V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRect(FFFFLandroidx/compose/ui/graphics/AndroidPaint;)V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRoundRect(FFFFFFLandroidx/compose/ui/graphics/AndroidPaint;)V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->restore()V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->save()V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->setInternalCanvas(Landroid/graphics/Canvas;)V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas;->translate(FF)V
+HSPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;-><init>(Landroid/graphics/Bitmap;)V
+HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getHeight()I
+HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getWidth()I
+HSPLandroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;->setFrom-tU-YjHk(Landroid/graphics/Matrix;[F)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint;-><init>(Landroid/graphics/Paint;)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->getAlpha()F
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->getColor-0d7_KjU()J
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->setAlpha(F)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->setColor-8_81llA(J)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->setShader(Landroid/graphics/Shader;)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint;->setStyle-k9PVt8s(I)V
+HSPLandroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/AndroidPaint_androidKt;->Paint()Landroidx/compose/ui/graphics/AndroidPaint;
+HSPLandroidx/compose/ui/graphics/Brush;-><init>()V
+HSPLandroidx/compose/ui/graphics/CanvasHolder;-><init>()V
+HSPLandroidx/compose/ui/graphics/Color;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/Color;-><init>(J)V
+HSPLandroidx/compose/ui/graphics/Color;->convert-vNxB06k(JLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J
+HSPLandroidx/compose/ui/graphics/Color;->copy-wmQWz5c$default(JF)J
+HSPLandroidx/compose/ui/graphics/Color;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/Color;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/graphics/Color;->getAlpha-impl(J)F
+HSPLandroidx/compose/ui/graphics/Color;->getBlue-impl(J)F
+HSPLandroidx/compose/ui/graphics/Color;->getColorSpace-impl(J)Landroidx/compose/ui/graphics/colorspace/ColorSpace;
+HSPLandroidx/compose/ui/graphics/Color;->getGreen-impl(J)F
+HSPLandroidx/compose/ui/graphics/Color;->getRed-impl(J)F
+HSPLandroidx/compose/ui/graphics/ColorKt;->Color$default(III)J
+HSPLandroidx/compose/ui/graphics/ColorKt;->Color(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J
+HSPLandroidx/compose/ui/graphics/ColorKt;->Color(J)J
+HSPLandroidx/compose/ui/graphics/ColorKt;->toArgb-8_81llA(J)I
+HSPLandroidx/compose/ui/graphics/Float16$Companion;-><init>()V
+HSPLandroidx/compose/ui/graphics/Float16;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/Float16;->constructor-impl(F)S
+HSPLandroidx/compose/ui/graphics/Float16;->toFloat-impl(S)F
+HSPLandroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer-Ap8cVGQ$default(Landroidx/compose/ui/Modifier;FFLandroidx/compose/ui/graphics/Shape;ZI)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/graphics/GraphicsLayerModifierNodeElement;-><init>(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZJJI)V
+HSPLandroidx/compose/ui/graphics/GraphicsLayerModifierNodeElement;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/graphics/GraphicsLayerModifierNodeElement;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/GraphicsLayerModifierNodeElement;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default()[F
+HSPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J
+HSPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V
+HSPLandroidx/compose/ui/graphics/Outline$Rectangle;-><init>(Landroidx/compose/ui/geometry/Rect;)V
+HSPLandroidx/compose/ui/graphics/Outline$Rounded;-><init>(Landroidx/compose/ui/geometry/RoundRect;)V
+HSPLandroidx/compose/ui/graphics/Outline;-><init>()V
+HSPLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;-><init>()V
+HSPLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/Outline;
+HSPLandroidx/compose/ui/graphics/RectangleShapeKt;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;-><init>()V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAlpha(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAmbientShadowColor-8_81llA(J)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCameraDistance(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setClip(Z)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCompositingStrategy-aDBOjCE(I)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRenderEffect()V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationX(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationY(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationZ(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleX(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleY(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShadowElevation(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShape(Landroidx/compose/ui/graphics/Shape;)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSpotShadowColor-8_81llA(J)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTransformOrigin-__ExYCQ(J)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationX(F)V
+HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationY(F)V
+HSPLandroidx/compose/ui/graphics/Shadow;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/Shadow;-><init>(JJF)V
+HSPLandroidx/compose/ui/graphics/Shadow;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;-><init>(Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)V
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)V
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;-><init>(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZJJI)V
+HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/graphics/SolidColor;-><init>(J)V
+HSPLandroidx/compose/ui/graphics/SolidColor;->applyTo-Pq9zytI(FJLandroidx/compose/ui/graphics/AndroidPaint;)V
+HSPLandroidx/compose/ui/graphics/TransformOrigin;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/TransformOrigin;->getPivotFractionY-impl(J)F
+HSPLandroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;-><init>([F)V
+HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;-><init>([F)V
+HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;-><init>(Ljava/lang/String;JI)V
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroidx/compose/ui/graphics/colorspace/ColorSpace;
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->chromaticAdaptation([F[F[F)[F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->compare(Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Z
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->connect-YBCOT_4$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;I)Landroidx/compose/ui/graphics/colorspace/Connector;
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->inverse3x3([F)[F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3([F[F)[F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Diag([F[F)[F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Float3([F[F)V
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Float3_0([FFFF)F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Float3_1([FFFF)F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaceKt;->mul3x3Float3_2([FFFF)F
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces$$ExternalSyntheticLambda0;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1;-><init>(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector$Companion;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector;-><init>(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;I)V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector;-><init>(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;[F)V
+HSPLandroidx/compose/ui/graphics/colorspace/Connector;->transformToColor-wmQWz5c$ui_graphics_release(FFFF)J
+HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Lab;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Oklab;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Oklab;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;-><init>(Landroidx/compose/ui/graphics/colorspace/Rgb;)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->invoke(D)D
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;-><init>(Landroidx/compose/ui/graphics/colorspace/Rgb;)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;->invoke(D)D
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2;->invoke(D)D
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda3;-><init>(Landroidx/compose/ui/graphics/colorspace/TransferParameters;)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda3;->invoke(D)D
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda5;-><init>(Landroidx/compose/ui/graphics/colorspace/TransferParameters;)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda5;->invoke(D)D
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda6;-><init>(D)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda7;-><init>(D)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb$Companion;->area([F)F
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;-><init>(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;DFFI)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;-><init>(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;-><init>(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;[FLandroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFLandroidx/compose/ui/graphics/colorspace/TransferParameters;I)V
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMaxValue(I)F
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMinValue(I)F
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->isSrgb()Z
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->toXy$ui_graphics_release(FFF)J
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->toZ$ui_graphics_release(FFF)F
+HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J
+HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;-><init>(DDDDD)V
+HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;-><init>(FF)V
+HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->toXyz$ui_graphics_release()[F
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;-><init>()V
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->clamp(F)F
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->getMaxValue(I)F
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->getMinValue(I)F
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->toXy$ui_graphics_release(FFF)J
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->toZ$ui_graphics_release(FFF)F
+HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;-><init>()V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;-><init>(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getCanvas()Landroidx/compose/ui/graphics/Canvas;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getSize-NH-jbRc()J
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->setSize-uvyYCjk(J)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;-><init>()V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-2qPWKa0$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JLandroidx/arch/core/executor/TaskExecutor;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;Landroidx/compose/ui/graphics/Brush;Landroidx/arch/core/executor/TaskExecutor;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE(Landroidx/compose/ui/graphics/Brush;Landroidx/arch/core/executor/TaskExecutor;FLandroidx/compose/ui/graphics/ColorFilter;II)Landroidx/compose/ui/graphics/AndroidPaint;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;II)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRect-AsUm42w(Landroidx/compose/ui/graphics/Brush;JJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/arch/core/executor/TaskExecutor;FLandroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->selectPaint(Landroidx/arch/core/executor/TaskExecutor;)Landroidx/compose/ui/graphics/AndroidPaint;
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;-><init>(Landroidx/compose/ui/graphics/drawscope/DrawContext;)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->inset(FFFF)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->translate(FF)V
+HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawImage-AZ2fEMs$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;III)V
+HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRect-AsUm42w$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Brush;JJFLandroidx/arch/core/executor/TaskExecutor;I)V
+HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRect-n-J9OG0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJI)V
+HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->getSize-NH-jbRc()J
+HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->offsetSize-PENXr5M(JJ)J
+HSPLandroidx/compose/ui/graphics/drawscope/EmptyCanvas;-><init>()V
+HSPLandroidx/compose/ui/graphics/drawscope/Fill;-><clinit>()V
+HSPLandroidx/compose/ui/graphics/drawscope/Fill;-><init>()V
+HSPLandroidx/compose/ui/graphics/drawscope/Stroke;-><init>(FFIII)V
+HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/painter/BitmapPainter;-><init>(Landroidx/compose/ui/graphics/ImageBitmap;)V
+HSPLandroidx/compose/ui/graphics/painter/BitmapPainter;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/graphics/painter/BitmapPainter;->getIntrinsicSize-NH-jbRc()J
+HSPLandroidx/compose/ui/graphics/painter/BitmapPainter;->onDraw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V
+HSPLandroidx/compose/ui/graphics/painter/Painter;-><init>()V
+HSPLandroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/ui/input/InputMode;-><init>(I)V
+HSPLandroidx/compose/ui/input/InputMode;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/input/InputModeManagerImpl;-><init>(ILandroidx/compose/ui/platform/AndroidComposeView$_inputModeManager$1;)V
+HSPLandroidx/compose/ui/input/InputModeManagerImpl;->getInputMode-aOaMEAU()I
+HSPLandroidx/compose/ui/input/key/Key;-><clinit>()V
+HSPLandroidx/compose/ui/input/key/Key;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/input/key/KeyEvent;-><init>(Landroid/view/KeyEvent;)V
+HSPLandroidx/compose/ui/input/key/KeyEvent_androidKt;->getKey-ZmokQxo(Landroid/view/KeyEvent;)J
+HSPLandroidx/compose/ui/input/key/KeyEvent_androidKt;->getType-ZmokQxo(Landroid/view/KeyEvent;)I
+HSPLandroidx/compose/ui/input/key/KeyInputInputModifierNodeImpl;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/input/key/KeyInputInputModifierNodeImpl;->onKeyEvent-ZmokQxo(Landroid/view/KeyEvent;)Z
+HSPLandroidx/compose/ui/input/key/KeyInputInputModifierNodeImpl;->onPreKeyEvent-ZmokQxo(Landroid/view/KeyEvent;)Z
+HSPLandroidx/compose/ui/input/key/KeyInputModifierKt$onKeyEvent$$inlined$modifierElementOf$2;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/input/key/KeyInputModifierKt$onKeyEvent$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/input/key/KeyInputModifierKt$onKeyEvent$$inlined$modifierElementOf$2;->update(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/input/key/KeyInputModifierKt;->onKeyEvent(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/input/key/Key_androidKt;->Key(I)J
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$calculateNestedScrollScope$1;-><init>(Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;-><init>()V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt$nestedScroll$2;-><init>(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt$nestedScroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal$1;-><init>(Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;)V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;-><init>(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;->getParent()Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt$ModifierLocalNestedScroll$1;-><clinit>()V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt$ModifierLocalNestedScroll$1;-><init>()V
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt$ModifierLocalNestedScroll$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt;-><clinit>()V
+HSPLandroidx/compose/ui/input/pointer/AwaitPointerEventScope;->awaitPointerEvent$default(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/HitPathTracker;-><init>(Landroidx/compose/ui/node/InnerNodeCoordinator;)V
+HSPLandroidx/compose/ui/input/pointer/MotionEventAdapter;-><init>()V
+HSPLandroidx/compose/ui/input/pointer/NodeParent;-><init>()V
+HSPLandroidx/compose/ui/input/pointer/PointerEvent;-><init>(Ljava/util/List;)V
+HSPLandroidx/compose/ui/input/pointer/PointerEvent;-><init>(Ljava/util/List;Landroidx/compose/ui/input/pointer/InternalPointerEvent;)V
+HSPLandroidx/compose/ui/input/pointer/PointerEventPass;-><clinit>()V
+HSPLandroidx/compose/ui/input/pointer/PointerEventPass;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;-><init>()V
+HSPLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/input/pointer/PointerInputFilter;-><init>()V
+HSPLandroidx/compose/ui/input/pointer/PointerInputFilter;->getSize-YbymL2g()J
+HSPLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;-><init>(I)V
+HSPLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;Lkotlinx/coroutines/CancellableContinuationImpl;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;->awaitPointerEvent(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$awaitPointerEventScope$2$2;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;-><init>(Landroidx/compose/ui/platform/ViewConfiguration;Landroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;->awaitPointerEventScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;->getPointerInputFilter()Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2$2$1;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2;-><init>(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4$2$1;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4;-><init>(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6$2$1;-><init>(Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6;-><init>([Ljava/lang/Object;Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;)V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;-><clinit>()V
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->pointerInput(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->pointerInput(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;-><init>()V
+HSPLandroidx/compose/ui/input/pointer/util/VelocityTracker;-><init>()V
+HSPLandroidx/compose/ui/input/rotary/RotaryInputModifierKt$onRotaryScrollEvent$$inlined$modifierElementOf$2;-><init>()V
+HSPLandroidx/compose/ui/input/rotary/RotaryInputModifierKt$onRotaryScrollEvent$$inlined$modifierElementOf$2;->create()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/input/rotary/RotaryInputModifierNodeImpl;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/layout/AlignmentLine;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;-><init>()V
+HSPLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;-><init>()V
+HSPLandroidx/compose/ui/layout/AlignmentLineKt;-><clinit>()V
+HSPLandroidx/compose/ui/layout/BeyondBoundsLayoutKt$ModifierLocalBeyondBoundsLayout$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/BeyondBoundsLayoutKt$ModifierLocalBeyondBoundsLayout$1;-><init>()V
+HSPLandroidx/compose/ui/layout/BeyondBoundsLayoutKt$ModifierLocalBeyondBoundsLayout$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/BeyondBoundsLayoutKt;-><clinit>()V
+HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;-><init>()V
+HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt;-><clinit>()V
+HSPLandroidx/compose/ui/layout/ContentScale$Companion$FillBounds$1;-><init>()V
+HSPLandroidx/compose/ui/layout/ContentScale$Companion$Fit$1;-><init>()V
+HSPLandroidx/compose/ui/layout/ContentScale$Companion$Fit$1;->computeScaleFactor-H7hwNQA(JJ)J
+HSPLandroidx/compose/ui/layout/ContentScale$Companion$Inside$1;-><init>()V
+HSPLandroidx/compose/ui/layout/ContentScale$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/layout/IntrinsicsMeasureScope;-><init>(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)V
+HSPLandroidx/compose/ui/layout/IntrinsicsMeasureScope;->roundToPx-0680j_4(F)I
+HSPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;-><init>(Landroidx/compose/ui/Modifier;)V
+HSPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/LayoutKt;->materializerOf(Landroidx/compose/ui/Modifier;)Landroidx/compose/runtime/internal/ComposableLambdaImpl;
+HSPLandroidx/compose/ui/layout/LayoutModifier;->maxIntrinsicHeight(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/layout/LayoutModifier;->maxIntrinsicWidth(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/layout/LayoutModifierImpl;-><init>(Lkotlin/jvm/functions/Function3;)V
+HSPLandroidx/compose/ui/layout/LayoutModifierImpl;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/layout/LayoutModifierImpl;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/layout/LayoutModifierKt;->layout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;-><init>(Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;-><init>(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getDensity()F
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;-><init>(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;I)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;->getAlignmentLines()Ljava/util/Map;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;->getHeight()I
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;->getWidth()I
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;->placeChildren()V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;-><init>(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Lkotlin/jvm/functions/Function2;Ljava/lang/String;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;-><init>(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Ljava/lang/Object;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->dispose()V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->getPlaceablesCount()I
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;->premeasure-0kLqBqw(JI)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$2$1$1;-><init>(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;-><init>(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->disposeOrReuseStartingFromIndex(I)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->makeSureStateIsConsistent()V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Landroidx/compose/ui/node/LayoutNode;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->takeNodeFromReusables(Ljava/lang/Object;)Landroidx/compose/ui/node/LayoutNode;
+HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;-><init>(IILjava/util/Map;Landroidx/compose/ui/layout/MeasureScope;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getAlignmentLines()Ljava/util/Map;
+HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getHeight()I
+HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getWidth()I
+HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->placeChildren()V
+HSPLandroidx/compose/ui/layout/MeasureScope;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/layout/MeasuringIntrinsics$DefaultIntrinsicMeasurable;-><init>(Landroidx/compose/ui/layout/IntrinsicMeasurable;II)V
+HSPLandroidx/compose/ui/layout/MeasuringIntrinsics$DefaultIntrinsicMeasurable;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable;
+HSPLandroidx/compose/ui/layout/MeasuringIntrinsics$EmptyPlaceable;-><init>(II)V
+HSPLandroidx/compose/ui/layout/NoOpSubcomposeSlotReusePolicy;-><clinit>()V
+HSPLandroidx/compose/ui/layout/NoOpSubcomposeSlotReusePolicy;-><init>()V
+HSPLandroidx/compose/ui/layout/OnGloballyPositionedModifierImpl;-><init>(Landroidx/compose/foundation/text/TextController$coreModifiers$1;)V
+HSPLandroidx/compose/ui/layout/OnGloballyPositionedModifierImpl;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/layout/OnGloballyPositionedModifierImpl;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;->onRemeasured-ozmzZPI(J)V
+HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;-><init>()V
+HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/PinnableContainerKt;-><clinit>()V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;-><init>(I)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->access$configureForPlacingForAlignment(Landroidx/compose/ui/layout/Placeable$PlacementScope$Companion;Landroidx/compose/ui/node/LookaheadCapablePlaceable;)Z
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->getParentLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;-><clinit>()V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;-><init>()V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place(Landroidx/compose/ui/layout/Placeable;IIF)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50(Landroidx/compose/ui/layout/Placeable;JF)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelative$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelativeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelativeWithLayer-aW-9-wM$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;IILkotlin/jvm/functions/Function1;I)V
+HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM(Landroidx/compose/ui/layout/Placeable;JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/layout/Placeable;-><init>()V
+HSPLandroidx/compose/ui/layout/Placeable;->getApparentToRealOffset-nOcc-ac()J
+HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I
+HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I
+HSPLandroidx/compose/ui/layout/Placeable;->recalculateWidthAndHeight()V
+HSPLandroidx/compose/ui/layout/Placeable;->setMeasuredSize-ozmzZPI(J)V
+HSPLandroidx/compose/ui/layout/Placeable;->setMeasurementConstraints-BRTryo0(J)V
+HSPLandroidx/compose/ui/layout/PlaceableKt$DefaultLayerBlock$1;-><clinit>()V
+HSPLandroidx/compose/ui/layout/PlaceableKt$DefaultLayerBlock$1;-><init>()V
+HSPLandroidx/compose/ui/layout/PlaceableKt$DefaultLayerBlock$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/PlaceableKt;-><clinit>()V
+HSPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$2;-><init>(Landroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/RootMeasurePolicy;-><clinit>()V
+HSPLandroidx/compose/ui/layout/RootMeasurePolicy;-><init>()V
+HSPLandroidx/compose/ui/layout/RootMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/layout/ScaleFactor;-><clinit>()V
+HSPLandroidx/compose/ui/layout/ScaleFactorKt;->ScaleFactor(FF)J
+HSPLandroidx/compose/ui/layout/ScaleFactorKt;->times-UQTWf7w(JJ)J
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;-><init>(Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$4;-><init>(Landroidx/compose/ui/layout/SubcomposeLayoutState;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$4;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/State;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$6;-><init>(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;II)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt;->SubcomposeLayout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt;->SubcomposeLayout(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setCompositionContext$1;-><init>(Landroidx/compose/ui/layout/SubcomposeLayoutState;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setCompositionContext$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setMeasurePolicy$1;-><init>(Landroidx/compose/ui/layout/SubcomposeLayoutState;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setMeasurePolicy$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;-><init>(Landroidx/compose/ui/layout/SubcomposeLayoutState;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;-><init>()V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;-><init>(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getState()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;
+HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->precompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;
+HSPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;-><init>(I)V
+HSPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->clear()V
+HSPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->contains(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->iterator()Ljava/util/Iterator;
+HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;-><init>(Landroidx/compose/ui/modifier/ModifierLocalProvider;)V
+HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z
+HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->get$ui_release(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/modifier/EmptyMap;-><clinit>()V
+HSPLandroidx/compose/ui/modifier/EmptyMap;-><init>()V
+HSPLandroidx/compose/ui/modifier/EmptyMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z
+HSPLandroidx/compose/ui/modifier/ModifierLocal;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/ui/modifier/ModifierLocalManager;-><init>(Landroidx/compose/ui/node/Owner;)V
+HSPLandroidx/compose/ui/modifier/ModifierLocalMap;-><init>()V
+HSPLandroidx/compose/ui/modifier/ModifierLocalNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/modifier/ModifierLocalNode;->getProvidedValues()Landroidx/compose/ui/modifier/ModifierLocalMap;
+HSPLandroidx/compose/ui/modifier/ProvidableModifierLocal;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/ui/node/AlignmentLines;-><init>(Landroidx/compose/ui/node/AlignmentLinesOwner;)V
+HSPLandroidx/compose/ui/node/AlignmentLines;->getQueried$ui_release()Z
+HSPLandroidx/compose/ui/node/AlignmentLines;->getRequired$ui_release()Z
+HSPLandroidx/compose/ui/node/AlignmentLines;->onAlignmentsChanged()V
+HSPLandroidx/compose/ui/node/AlignmentLines;->recalculateQueryOwner()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$1;-><init>(Landroidx/compose/ui/node/BackwardsCompatNode;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;-><init>(Landroidx/compose/ui/node/BackwardsCompatNode;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->onLayoutComplete()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$updateDrawCache$1;-><init>(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/node/BackwardsCompatNode;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$updateDrawCache$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$updateModifierLocalConsumer$1;-><init>(Landroidx/compose/ui/node/BackwardsCompatNode;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode$updateModifierLocalConsumer$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;-><init>(Landroidx/compose/ui/Modifier$Element;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getDensity()Landroidx/compose/ui/unit/Density;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getProvidedValues()Landroidx/compose/ui/modifier/ModifierLocalMap;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getSize-NH-jbRc()J
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->initializeModifier(Z)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->isValid()Z
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->maxIntrinsicHeight(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->maxIntrinsicWidth(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onAttach()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onDetach()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onMeasureResultChanged()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onRemeasured-ozmzZPI(J)V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->unInitializeModifier()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNode;->updateModifierLocalConsumer()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;-><init>()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;-><init>()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$updateModifierLocalConsumer$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$updateModifierLocalConsumer$1;-><init>()V
+HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt;-><clinit>()V
+HSPLandroidx/compose/ui/node/CanFocusChecker;-><clinit>()V
+HSPLandroidx/compose/ui/node/CanFocusChecker;-><init>()V
+HSPLandroidx/compose/ui/node/CanFocusChecker;->setCanFocus(Z)V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetLayoutDirection$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetLayoutDirection$1;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetLayoutDirection$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetMeasurePolicy$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetMeasurePolicy$1;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetMeasurePolicy$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetViewConfiguration$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetViewConfiguration$1;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetViewConfiguration$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;-><init>()V
+HSPLandroidx/compose/ui/node/ComposeUiNode;-><clinit>()V
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->access$addLayoutNodeChildren(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;)V
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->ancestors(Landroidx/compose/ui/node/DelegatableNode;I)Ljava/util/ArrayList;
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->nearestAncestor(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireCoordinator-64DMado(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/node/NodeCoordinator;
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireLayoutNode(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/LayoutNode;
+HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireOwner(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/Owner;
+HSPLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;-><init>()V
+HSPLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLandroidx/compose/ui/node/DepthSortedSet$mapOfOriginalDepth$2;-><clinit>()V
+HSPLandroidx/compose/ui/node/DepthSortedSet$mapOfOriginalDepth$2;-><init>()V
+HSPLandroidx/compose/ui/node/DepthSortedSet;-><init>()V
+HSPLandroidx/compose/ui/node/DepthSortedSet;->add(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/DepthSortedSet;->remove(Landroidx/compose/ui/node/LayoutNode;)Z
+HSPLandroidx/compose/ui/node/DrawModifierNode;->onMeasureResultChanged()V
+HSPLandroidx/compose/ui/node/DrawModifierNodeKt;->invalidateDraw(Landroidx/compose/ui/node/DrawModifierNode;)V
+HSPLandroidx/compose/ui/node/HitTestResult;-><init>()V
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator$tail$1;-><init>()V
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;-><clinit>()V
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->maxIntrinsicHeight(I)I
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->maxIntrinsicWidth(I)I
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable;
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/IntStack;-><init>(I)V
+HSPLandroidx/compose/ui/node/IntStack;->pop()I
+HSPLandroidx/compose/ui/node/IntStack;->pushDiagonal(III)V
+HSPLandroidx/compose/ui/node/IntStack;->pushRange(IIII)V
+HSPLandroidx/compose/ui/node/IntStack;->quickSort(II)V
+HSPLandroidx/compose/ui/node/IntStack;->swapDiagonal(II)V
+HSPLandroidx/compose/ui/node/IntrinsicsPolicy;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/IntrinsicsPolicy;->measurePolicyFromState()Landroidx/compose/ui/layout/MeasurePolicy;
+HSPLandroidx/compose/ui/node/LayerPositionalProperties;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutModifierNode;->forceRemeasure()V
+HSPLandroidx/compose/ui/node/LayoutModifierNode;->maxIntrinsicHeight(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/node/LayoutModifierNode;->maxIntrinsicWidth(Landroidx/compose/ui/layout/IntrinsicMeasureScope;Landroidx/compose/ui/layout/IntrinsicMeasurable;I)I
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;-><clinit>()V
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;-><init>(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutModifierNode;)V
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->maxIntrinsicHeight(I)I
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->maxIntrinsicWidth(I)I
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable;
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->onLayoutModifierNodeChanged()V
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy;-><init>(Ljava/lang/String;)V
+HSPLandroidx/compose/ui/node/LayoutNode$WhenMappings;-><clinit>()V
+HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNode;-><clinit>()V
+HSPLandroidx/compose/ui/node/LayoutNode;-><init>(IZ)V
+HSPLandroidx/compose/ui/node/LayoutNode;-><init>(IZI)V
+HSPLandroidx/compose/ui/node/LayoutNode;->attach$ui_release(Landroidx/compose/ui/node/Owner;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreeIntrinsicsUsage$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreePlacementIntrinsicsUsage()V
+HSPLandroidx/compose/ui/node/LayoutNode;->draw$ui_release(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->forceRemeasure()V
+HSPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui_release()Ljava/util/List;
+HSPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui_release()Ljava/util/List;
+HSPLandroidx/compose/ui/node/LayoutNode;->getFoldedChildren$ui_release()Ljava/util/List;
+HSPLandroidx/compose/ui/node/LayoutNode;->getParent$ui_release()Landroidx/compose/ui/node/LayoutNode;
+HSPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector;
+HSPLandroidx/compose/ui/node/LayoutNode;->get_children$ui_release()Landroidx/compose/runtime/collection/MutableVector;
+HSPLandroidx/compose/ui/node/LayoutNode;->insertAt$ui_release(ILandroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayer$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayers$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->invalidateMeasurements$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->invalidateUnfoldedVirtualChildren()V
+HSPLandroidx/compose/ui/node/LayoutNode;->isAttached()Z
+HSPLandroidx/compose/ui/node/LayoutNode;->isValid()Z
+HSPLandroidx/compose/ui/node/LayoutNode;->markNodeAndSubtreeAsPlaced()V
+HSPLandroidx/compose/ui/node/LayoutNode;->markSubtreeAsNotPlaced()V
+HSPLandroidx/compose/ui/node/LayoutNode;->move$ui_release(III)V
+HSPLandroidx/compose/ui/node/LayoutNode;->onZSortedChildrenInvalidated$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->replace$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->requestRelayout$ui_release(Z)V
+HSPLandroidx/compose/ui/node/LayoutNode;->requestRemeasure$ui_release(Z)V
+HSPLandroidx/compose/ui/node/LayoutNode;->rescheduleRemeasureOrRelayout$ui_release(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->resetSubtreeIntrinsicsUsage$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNode;->setDensity(Landroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->setMeasurePolicy(Landroidx/compose/ui/layout/MeasurePolicy;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->setViewConfiguration(Landroidx/compose/ui/platform/ViewConfiguration;)V
+HSPLandroidx/compose/ui/node/LayoutNode;->updateChildrenIfDirty$ui_release()V
+HSPLandroidx/compose/ui/node/LayoutNodeAlignmentLines;-><init>(Landroidx/compose/ui/node/AlignmentLinesOwner;)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->draw-x_KDEd0$ui_release(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/node/DrawModifierNode;)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawContent()V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;II)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRect-AsUm42w(Landroidx/compose/ui/graphics/Brush;JJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/arch/core/executor/TaskExecutor;FLandroidx/compose/ui/graphics/ColorFilter;I)V
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getSize-NH-jbRc()J
+HSPLandroidx/compose/ui/node/LayoutNodeKt;->requireOwner(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/Owner;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$childMeasurables$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$childMeasurables$1;-><init>()V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$childMeasurables$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1;-><init>(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;-><init>(Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;JF)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;-><init>(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getAlignmentLines()Landroidx/compose/ui/node/AlignmentLines;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getInnerCoordinator()Landroidx/compose/ui/node/InnerNodeCoordinator;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getMeasuredWidth()I
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentData()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->layoutChildren()V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->maxIntrinsicHeight(I)I
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->maxIntrinsicWidth(I)I
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->notifyChildrenUsingCoordinatesWhilePlacing()V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onIntrinsicsQueried()V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeOuterCoordinator-f8xVGno(JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->remeasure-BRTryo0(J)Z
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;-><init>(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;J)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getOuterCoordinator()Landroidx/compose/ui/node/NodeCoordinator;
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)Z
+HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegateKt;->access$updateChildMeasurables(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/runtime/collection/MutableVector;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;-><init>()V
+HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->invalidateAlignmentLinesFromPositionChange(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->dispatchOnPositionedCallbacks(Z)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->doRemeasure-sdFAvZA(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/unit/Constraints;)Z
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout(Landroidx/compose/ui/platform/AndroidComposeView$resendMotionEventOnLayout$1;)Z
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureOnly()V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->recurseRemeasure(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureAndRelayoutIfNeeded(Landroidx/compose/ui/node/LayoutNode;)Z
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureOnly(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRelayout(Landroidx/compose/ui/node/LayoutNode;Z)Z
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRemeasure(Landroidx/compose/ui/node/LayoutNode;Z)Z
+HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->updateRootConstraints-BRTryo0(J)V
+HSPLandroidx/compose/ui/node/ModifierNodeElement;-><init>(Ljava/lang/Object;Z)V
+HSPLandroidx/compose/ui/node/ModifierNodeElement;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/node/MutableVectorWithMutationTracking;-><init>(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1;)V
+HSPLandroidx/compose/ui/node/NodeChain$Differ;-><init>(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;)V
+HSPLandroidx/compose/ui/node/NodeChain$Differ;->remove()V
+HSPLandroidx/compose/ui/node/NodeChain$Differ;->same(II)V
+HSPLandroidx/compose/ui/node/NodeChain;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/NodeChain;->attach(Z)V
+HSPLandroidx/compose/ui/node/NodeChain;->createAndInsertNodeAsParent(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/NodeChain;->structuralUpdate(Landroidx/compose/runtime/collection/MutableVector;ILandroidx/compose/runtime/collection/MutableVector;ILandroidx/compose/ui/Modifier$Node;)V
+HSPLandroidx/compose/ui/node/NodeChain;->updateNodeAndReplaceIfNeeded(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/NodeChainKt$SentinelHead$1;-><init>()V
+HSPLandroidx/compose/ui/node/NodeChainKt;-><clinit>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$PointerInputSource$1;-><init>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$SemanticsSource$1;-><init>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayer$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayer$1;-><init>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayer$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayerParams$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayerParams$1;-><init>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;-><init>(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;-><init>(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator$updateLayerParameters$1;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator$updateLayerParameters$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator;-><clinit>()V
+HSPLandroidx/compose/ui/node/NodeCoordinator;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->draw(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->drawContainedDrawModifiers(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getDensity()F
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getFontScale()F
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui_release()Landroidx/compose/ui/layout/MeasureResult;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getParent()Landroidx/compose/ui/node/LookaheadCapablePlaceable;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/node/NodeCoordinator;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->getSize-YbymL2g()J
+HSPLandroidx/compose/ui/node/NodeCoordinator;->headNode(Z)Landroidx/compose/ui/Modifier$Node;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->invalidateLayer()V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z
+HSPLandroidx/compose/ui/node/NodeCoordinator;->isValid()Z
+HSPLandroidx/compose/ui/node/NodeCoordinator;->localBoundingBoxOf(Landroidx/compose/ui/layout/LayoutCoordinates;Z)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/compose/ui/node/NodeCoordinator;->localToRoot-MK-Hz9U(J)J
+HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayerBlockUpdated(Lkotlin/jvm/functions/Function1;Z)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutModifierNodeChanged()V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->onMeasured()V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->onPlaced$1()V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release(Landroidx/compose/ui/geometry/MutableRect;ZZ)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->setMeasureResult$ui_release(Landroidx/compose/ui/layout/MeasureResult;)V
+HSPLandroidx/compose/ui/node/NodeCoordinator;->toParentPosition-MK-Hz9U(J)J
+HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters()V
+HSPLandroidx/compose/ui/node/NodeKind;->spring$default(FLjava/lang/Object;I)Landroidx/compose/animation/core/SpringSpec;
+HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNode(Landroidx/compose/ui/Modifier$Node;I)V
+HSPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Element;)I
+HSPLandroidx/compose/ui/node/NodeKindKt;->getIncludeSelfInTraversal-H91voCI(I)Z
+HSPLandroidx/compose/ui/node/NodeMeasuringIntrinsics$DefaultIntrinsicMeasurable;-><init>(Landroidx/compose/ui/layout/IntrinsicMeasurable;II)V
+HSPLandroidx/compose/ui/node/NodeMeasuringIntrinsics$DefaultIntrinsicMeasurable;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable;
+HSPLandroidx/compose/ui/node/NodeMeasuringIntrinsics$EmptyPlaceable;-><init>(II)V
+HSPLandroidx/compose/ui/node/ObserverNode$Companion$OnObserveReadsChanged$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/ObserverNode$Companion$OnObserveReadsChanged$1;-><init>()V
+HSPLandroidx/compose/ui/node/ObserverNode$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/node/ObserverNode$Companion;-><init>()V
+HSPLandroidx/compose/ui/node/ObserverNode;-><clinit>()V
+HSPLandroidx/compose/ui/node/ObserverNodeKt;->observeReads(Landroidx/compose/ui/Modifier$Node;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;-><clinit>()V
+HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;-><init>()V
+HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLandroidx/compose/ui/node/OnPositionedDispatcher;-><init>()V
+HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatchHierarchy(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;-><init>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayoutModifier$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayoutModifier$1;-><init>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingMeasure$1;-><clinit>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingMeasure$1;-><init>()V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingMeasure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;-><init>(Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;)V
+HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeReads$ui_release(Landroidx/compose/ui/node/OwnerScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/ui/node/Ref;-><init>()V
+HSPLandroidx/compose/ui/node/SemanticsModifierNodeKt;->collapsedSemanticsConfiguration(Landroidx/compose/ui/node/SemanticsModifierNode;)Landroidx/compose/ui/semantics/SemanticsConfiguration;
+HSPLandroidx/compose/ui/node/Snake;->copy(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/ui/node/Snake;->getDiagonalSize-impl([I)I
+HSPLandroidx/compose/ui/node/Snake;->newInstance(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/compose/ui/node/TreeSet;-><init>(Landroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;)V
+HSPLandroidx/compose/ui/node/UiApplier;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/node/UiApplier;->insertBottomUp(ILjava/lang/Object;)V
+HSPLandroidx/compose/ui/node/UiApplier;->insertTopDown(ILjava/lang/Object;)V
+HSPLandroidx/compose/ui/node/UiApplier;->onEndChanges()V
+HSPLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;-><init>(Landroidx/compose/ui/platform/AbstractComposeView;)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AbstractComposeView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->checkAddView()V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->ensureCompositionCreated()V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnLayout$ui_release(ZIIII)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnMeasure$ui_release(II)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->isAlive(Landroidx/compose/runtime/CompositionContext;)Z
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->onAttachedToWindow()V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->onLayout(ZIIII)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->onMeasure(II)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->onRtlPropertiesChanged(I)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->resolveParentCompositionContext()Landroidx/compose/runtime/CompositionContext;
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->setParentCompositionContext(Landroidx/compose/runtime/CompositionContext;)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->setParentContext(Landroidx/compose/runtime/CompositionContext;)V
+HSPLandroidx/compose/ui/platform/AbstractComposeView;->setPreviousAttachedWindowToken(Landroid/os/IBinder;)V
+HSPLandroidx/compose/ui/platform/AndroidAccessibilityManager;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/AndroidClipboardManager;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda0;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda0;->onGlobalLayout()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;->onTouchModeChanged(Z)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda3;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$Companion;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$Companion;->access$getIsShowingLayoutBounds()Z
+HSPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;-><init>(Landroidx/lifecycle/LifecycleOwner;Landroidx/savedstate/SavedStateRegistryOwner;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$_inputModeManager$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$configurationChangeObserver$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$configurationChangeObserver$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeView$keyInputModifier$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$keyInputModifier$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$resendMotionEventOnLayout$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$resendMotionEventOnLayout$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeView$resendMotionEventRunnable$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$rotaryInputModifier$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$rotaryInputModifier$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$semanticsModifier$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$semanticsModifier$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$semanticsModifier$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->convertMeasureSpec(I)Lkotlin/Pair;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->createLayer(Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/OwnedLayer;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/graphics/Canvas;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AccessibilityManager;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/Autofill;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/ClipboardManager;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getDensity()Landroidx/compose/ui/unit/Density;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFocusOwner()Landroidx/compose/ui/focus/FocusOwner;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamily$Resolver;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFontLoader()Landroidx/compose/ui/text/font/Font$ResourceLoader;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getHapticFeedBack()Landroidx/compose/ui/hapticfeedback/HapticFeedback;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getInputModeManager()Landroidx/compose/ui/input/InputModeManager;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getPointerIconService()Landroidx/compose/ui/input/pointer/PointerIconService;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getRoot()Landroidx/compose/ui/node/LayoutNode;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSemanticsOwner()Landroidx/compose/ui/semantics/SemanticsOwner;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSharedDrawScope()Landroidx/compose/ui/node/LayoutNodeDrawScope;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getShowLayoutBounds()Z
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSnapshotObserver()Landroidx/compose/ui/node/OwnerSnapshotObserver;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getTextInputService()Landroidx/compose/ui/text/input/TextInputService;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getTextToolbar()Landroidx/compose/ui/platform/TextToolbar;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getView()Landroid/view/View;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getViewTreeOwners()Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->getWindowInfo()Landroidx/compose/ui/platform/WindowInfo;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui_release(Landroidx/compose/ui/node/OwnedLayer;Z)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onAttach(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onAttachedToWindow()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onCheckIsTextEditor()Z
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onDraw(Landroid/graphics/Canvas;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onEndApplyChanges()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onFocusChanged(ZILandroid/graphics/Rect;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onLayout(ZIIII)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onLayoutChange(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onMeasure(II)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestMeasure(Landroidx/compose/ui/node/LayoutNode;ZZ)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestRelayout(Landroidx/compose/ui/node/LayoutNode;ZZ)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onResume(Landroidx/lifecycle/LifecycleOwner;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRtlPropertiesChanged(I)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->recycle$ui_release(Landroidx/compose/ui/node/OwnedLayer;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnEndApplyChangesListener(Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnLayoutCompletedListener(Landroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->scheduleMeasureAndLayout(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->setConfigurationChangeObserver(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->setOnViewTreeOwnersAvailable(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->setShowLayoutBounds(Z)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->setViewTreeOwners(Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeView;->updatePositionCacheAndDispatch()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda0;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewAttachedToWindow(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy;-><init>(Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/Map;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$sendScrollEventIfNeededLambda$1;-><init>(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;
+HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isEnabled$ui_release()Z
+HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->disallowForceDark(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->focusable(Landroid/view/View;IZ)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalConfiguration$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalConfiguration$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalContext$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalContext$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalImageVectorCache$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalImageVectorCache$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalLifecycleOwner$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalLifecycleOwner$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalSavedStateRegistryOwner$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalSavedStateRegistryOwner$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalView$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalView$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$1$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/ui/platform/DisposableSaveableStateRegistry;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2;-><init>(Landroidx/compose/ui/platform/DisposableSaveableStateRegistry;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/ui/platform/AndroidUriHandler;Lkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;-><init>(Landroid/content/Context;Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1;-><init>(Landroid/content/Context;Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;-><init>(Landroid/content/res/Configuration;Landroidx/compose/ui/res/ImageVectorCache;)V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->ProvideAndroidCompositionLocals(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/ui/platform/AndroidFontResourceLoader;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/AndroidTextToolbar;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$currentThread$1;-><init>()V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;-><init>(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->doFrame(J)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->run()V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;-><clinit>()V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;-><init>(Landroid/view/Choreographer;Landroid/os/Handler;)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performTrampolineDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V
+HSPLandroidx/compose/ui/platform/AndroidUiDispatcher_androidKt;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$1;-><init>(Landroidx/compose/ui/platform/AndroidUiDispatcher;Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;)V
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;-><init>(Lkotlinx/coroutines/CancellableContinuationImpl;Landroidx/compose/ui/platform/AndroidUiFrameClock;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->doFrame(J)V
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;-><init>(Landroid/view/Choreographer;)V
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/AndroidUriHandler;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;-><init>(Landroid/view/ViewConfiguration;)V
+HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;-><init>()V
+HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;-><init>()V
+HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/ComposeView$Content$1;-><init>(Landroidx/compose/ui/platform/ComposeView;I)V
+HSPLandroidx/compose/ui/platform/ComposeView;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/platform/ComposeView;->Content(Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z
+HSPLandroidx/compose/ui/platform/ComposeView;->setContent(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAccessibilityManager$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAccessibilityManager$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofill$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofill$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofillTree$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofillTree$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalClipboardManager$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalClipboardManager$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFocusManager$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFocusManager$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFontFamilyResolver$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFontFamilyResolver$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFontLoader$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalFontLoader$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalHapticFeedback$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalHapticFeedback$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalInputModeManager$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalInputModeManager$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalLayoutDirection$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalLayoutDirection$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalPointerIconService$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalPointerIconService$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalTextInputService$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalTextInputService$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalTextToolbar$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalTextToolbar$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalUriHandler$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalUriHandler$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalViewConfiguration$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalViewConfiguration$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalWindowInfo$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalWindowInfo$1;-><init>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;-><init>(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->ProvideCommonCompositionLocals(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;)V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->canBeSaved(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->registerProvider(Ljava/lang/String;Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;)Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;-><init>(ZLandroidx/savedstate/SavedStateRegistry;Ljava/lang/String;)V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;-><init>(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;)V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$saveableStateRegistry$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$saveableStateRegistry$1;-><init>()V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$saveableStateRegistry$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;->canBeSavedToBundle(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;-><init>(Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/GlobalSnapshotManager;-><clinit>()V
+HSPLandroidx/compose/ui/platform/InspectableModifier$End;-><init>()V
+HSPLandroidx/compose/ui/platform/InspectableModifier;-><init>()V
+HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;-><init>()V
+HSPLandroidx/compose/ui/platform/InspectorValueInfo;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/LayerMatrixCache;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateMatrix-GrdbGEg(Ljava/lang/Object;)[F
+HSPLandroidx/compose/ui/platform/LayerMatrixCache;->invalidate()V
+HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;-><init>()V
+HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->getScaleFactor()F
+HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLandroidx/compose/ui/platform/OutlineResolver;-><init>(Landroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/ui/platform/OutlineResolver;->getOutline()Landroid/graphics/Outline;
+HSPLandroidx/compose/ui/platform/OutlineResolver;->update(Landroidx/compose/ui/graphics/Shape;FZFLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Z
+HSPLandroidx/compose/ui/platform/OutlineResolver;->updateCache()V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;Landroid/graphics/RenderNode;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->discardDisplayList()V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->drawInto(Landroid/graphics/Canvas;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getAlpha()F
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToOutline()Z
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getElevation()F
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getHasDisplayList()Z
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getHeight()I
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getLeft()I
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getMatrix(Landroid/graphics/Matrix;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getTop()I
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getWidth()I
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->offsetLeftAndRight(I)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->offsetTopAndBottom(I)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->record(Landroidx/compose/ui/graphics/CanvasHolder;Landroidx/compose/ui/graphics/Path;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setAlpha(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setAmbientShadowColor(I)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setCameraDistance(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToBounds(Z)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToOutline(Z)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setCompositingStrategy-aDBOjCE(I)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setElevation(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setHasOverlappingRendering()Z
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setOutline(Landroid/graphics/Outline;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotX(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotY(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPosition(IIII)Z
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRenderEffect()V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationX(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationY(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationZ(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleX(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleY(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setSpotShadowColor(I)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationX(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationY(F)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29VerificationHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29VerificationHelper;-><clinit>()V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29VerificationHelper;-><init>()V
+HSPLandroidx/compose/ui/platform/RenderNodeApi29VerificationHelper;->setRenderEffect(Landroid/graphics/RenderNode;Landroidx/compose/ui/graphics/RenderEffect;)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1;-><init>()V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->destroy()V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->drawLayer(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->invalidate()V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapOffset-8S9VItk(JZ)J
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->move--gyyYBs(J)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->resize-ozmzZPI(J)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->reuseLayer(Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->setDirty(Z)V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateDisplayList()V
+HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateLayerProperties-dDxr-wY(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZJJILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)V
+HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$1;-><init>(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1;)V
+HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;-><init>(Landroidx/compose/ui/platform/AbstractComposeView;)V
+HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;->onViewAttachedToWindow(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1;-><init>()V
+HSPLandroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1;-><init>()V
+HSPLandroidx/compose/ui/platform/ViewLayer;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WeakCache;-><init>()V
+HSPLandroidx/compose/ui/platform/WindowInfoImpl;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowInfoImpl;-><init>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;-><init>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;->createRecomposer(Landroid/view/View;)Landroidx/compose/runtime/Recomposer;
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion;-><init>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerFactory;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;-><init>(Lkotlinx/coroutines/StandaloneCoroutine;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;-><init>(Landroidx/compose/runtime/Recomposer;Landroid/view/View;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;-><init>(Landroid/view/View;Landroidx/compose/runtime/Recomposer;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;-><init>(Landroidx/compose/ui/platform/MotionDurationScaleImpl;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;-><init>(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/ui/platform/MotionDurationScaleImpl;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/compose/runtime/Recomposer;Landroidx/lifecycle/LifecycleOwner;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;Landroid/view/View;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;-><init>(Lkotlinx/coroutines/internal/ContextScope;Landroidx/compose/runtime/PausableMonotonicFrameClock;Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/internal/Ref$ObjectRef;Landroid/view/View;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;-><init>(Landroid/content/ContentResolver;Landroid/net/Uri;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;Lkotlinx/coroutines/channels/Channel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;Landroid/os/Handler;)V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->access$getAnimationScaleFlowFor(Landroid/content/Context;)Lkotlinx/coroutines/flow/StateFlow;
+HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->getCompositionContext(Landroid/view/View;)Landroidx/compose/runtime/CompositionContext;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;-><init>(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$2;-><init>(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$3;-><init>(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;-><init>(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1;-><init>(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/platform/WrappedComposition;-><init>(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/runtime/CompositionImpl;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/compose/ui/platform/WrappedComposition;->setContent(Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;-><init>()V
+HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->onDescendantInvalidated(Landroidx/compose/ui/platform/AndroidComposeView;)V
+HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Ljava/util/Map;
+HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;-><clinit>()V
+HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;-><init>()V
+HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->attributeSourceResourceMap(Landroid/view/View;)Ljava/util/Map;
+HSPLandroidx/compose/ui/platform/Wrapper_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)Landroidx/compose/runtime/Composition;
+HSPLandroidx/compose/ui/res/ImageVectorCache;-><init>()V
+HSPLandroidx/compose/ui/res/PainterResources_androidKt;->painterResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/painter/Painter;
+HSPLandroidx/compose/ui/semantics/AccessibilityAction;-><init>(Ljava/lang/String;Lkotlin/Function;)V
+HSPLandroidx/compose/ui/semantics/AccessibilityAction;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/semantics/CollectionInfo;-><init>(II)V
+HSPLandroidx/compose/ui/semantics/Role;-><init>(I)V
+HSPLandroidx/compose/ui/semantics/Role;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/semantics/ScrollAxisRange;-><init>(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V
+HSPLandroidx/compose/ui/semantics/SemanticsActions;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->contains(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Z
+HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V
+HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;-><init>(ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/semantics/SemanticsModifierCore;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration;
+HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/compose/ui/semantics/SemanticsNode;-><init>(Landroidx/compose/ui/node/SemanticsModifierNode;ZLandroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren(Z)Ljava/util/List;
+HSPLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z
+HSPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui_release(ZZ)Ljava/util/List;
+HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->findOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/List;)V
+HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode;
+HSPLandroidx/compose/ui/semantics/SemanticsOwner;-><init>(Landroidx/compose/ui/node/LayoutNode;)V
+HSPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode;
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$ContentDescription$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$ContentDescription$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$InvisibleToUser$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$InvisibleToUser$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$PaneTitle$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$PaneTitle$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$Role$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$Role$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$TestTag$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$TestTag$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$Text$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties$Text$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsProperties;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;-><clinit>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;-><init>()V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;-><init>(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V
+HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V
+HSPLandroidx/compose/ui/text/AndroidParagraph$wordBoundary$2;-><init>(Landroidx/compose/ui/text/AndroidParagraph;)V
+HSPLandroidx/compose/ui/text/AndroidParagraph;-><init>(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IZJ)V
+HSPLandroidx/compose/ui/text/AndroidParagraph;->constructTextLayout(IILandroid/text/TextUtils$TruncateAt;IIIII)Landroidx/compose/ui/text/android/TextLayout;
+HSPLandroidx/compose/ui/text/AndroidParagraph;->getFirstBaseline()F
+HSPLandroidx/compose/ui/text/AndroidParagraph;->getHeight()F
+HSPLandroidx/compose/ui/text/AndroidParagraph;->getLastBaseline()F
+HSPLandroidx/compose/ui/text/AndroidParagraph;->getPlaceholderRects()Ljava/util/List;
+HSPLandroidx/compose/ui/text/AndroidParagraph;->getWidth()F
+HSPLandroidx/compose/ui/text/AndroidParagraph;->paint(Landroidx/compose/ui/graphics/Canvas;)V
+HSPLandroidx/compose/ui/text/AndroidParagraph;->paint-iJQMabo(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextDecoration;Landroidx/arch/core/executor/TaskExecutor;)V
+HSPLandroidx/compose/ui/text/AnnotatedString$Range;-><init>(IILjava/lang/Object;)V
+HSPLandroidx/compose/ui/text/AnnotatedString$Range;-><init>(Ljava/lang/Object;IILjava/lang/String;)V
+HSPLandroidx/compose/ui/text/AnnotatedString;-><init>(Ljava/lang/String;)V
+HSPLandroidx/compose/ui/text/AnnotatedString;-><init>(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
+HSPLandroidx/compose/ui/text/AnnotatedString;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/AnnotatedStringKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/MultiParagraph;-><init>(Landroidx/compose/ui/text/MultiParagraphIntrinsics;JIZ)V
+HSPLandroidx/compose/ui/text/MultiParagraph;->paint-iJQMabo(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextDecoration;Landroidx/arch/core/executor/TaskExecutor;)V
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics$maxIntrinsicWidth$2;-><init>(Landroidx/compose/ui/text/MultiParagraphIntrinsics;)V
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics$maxIntrinsicWidth$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics$minIntrinsicWidth$2;-><init>(Landroidx/compose/ui/text/MultiParagraphIntrinsics;)V
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics;-><init>(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;)V
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics;->getHasStaleResolvedFonts()Z
+HSPLandroidx/compose/ui/text/MultiParagraphIntrinsics;->getMaxIntrinsicWidth()F
+HSPLandroidx/compose/ui/text/ParagraphInfo;-><init>(Landroidx/compose/ui/text/AndroidParagraph;IIIIFF)V
+HSPLandroidx/compose/ui/text/ParagraphIntrinsicInfo;-><init>(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;II)V
+HSPLandroidx/compose/ui/text/ParagraphStyle;-><init>(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;)V
+HSPLandroidx/compose/ui/text/ParagraphStyle;-><init>(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;Landroidx/compose/ui/text/style/TextMotion;)V
+HSPLandroidx/compose/ui/text/ParagraphStyle;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/ParagraphStyle;->merge(Landroidx/compose/ui/text/ParagraphStyle;)Landroidx/compose/ui/text/ParagraphStyle;
+HSPLandroidx/compose/ui/text/ParagraphStyleKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/SpanStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;I)V
+HSPLandroidx/compose/ui/text/SpanStyle;-><init>(Landroidx/compose/ui/text/style/TextForegroundStyle;JLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;)V
+HSPLandroidx/compose/ui/text/SpanStyle;-><init>(Landroidx/compose/ui/text/style/TextForegroundStyle;JLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/arch/core/executor/TaskExecutor;)V
+HSPLandroidx/compose/ui/text/SpanStyle;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/SpanStyle;->getBrush()Landroidx/compose/ui/graphics/Brush;
+HSPLandroidx/compose/ui/text/SpanStyle;->getColor-0d7_KjU()J
+HSPLandroidx/compose/ui/text/SpanStyle;->hasSameLayoutAffectingAttributes$ui_text_release(Landroidx/compose/ui/text/SpanStyle;)Z
+HSPLandroidx/compose/ui/text/SpanStyle;->merge(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle;
+HSPLandroidx/compose/ui/text/SpanStyleKt$resolveSpanStyleDefaults$1;-><clinit>()V
+HSPLandroidx/compose/ui/text/SpanStyleKt$resolveSpanStyleDefaults$1;-><init>()V
+HSPLandroidx/compose/ui/text/SpanStyleKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/TextLayoutInput;-><init>(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;IZILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/text/font/FontFamily$Resolver;J)V
+HSPLandroidx/compose/ui/text/TextLayoutInput;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/TextLayoutResult;-><init>(Landroidx/compose/ui/text/TextLayoutInput;Landroidx/compose/ui/text/MultiParagraph;J)V
+HSPLandroidx/compose/ui/text/TextLayoutResult;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/TextRange;-><clinit>()V
+HSPLandroidx/compose/ui/text/TextRange;->getEnd-impl(J)I
+HSPLandroidx/compose/ui/text/TextRangeKt;->TextRange(II)J
+HSPLandroidx/compose/ui/text/TextRangeKt;->constrain-8ffj60Q(IJ)J
+HSPLandroidx/compose/ui/text/TextStyle;-><clinit>()V
+HSPLandroidx/compose/ui/text/TextStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JI)V
+HSPLandroidx/compose/ui/text/TextStyle;-><init>(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JII)V
+HSPLandroidx/compose/ui/text/TextStyle;-><init>(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;)V
+HSPLandroidx/compose/ui/text/TextStyle;-><init>(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Lkotlin/internal/ProgressionUtilKt;)V
+HSPLandroidx/compose/ui/text/TextStyle;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/TextStyle;->merge(Landroidx/compose/ui/text/TextStyle;)Landroidx/compose/ui/text/TextStyle;
+HSPLandroidx/compose/ui/text/android/BoringLayoutFactory;->create(Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/BoringLayout$Metrics;Landroid/text/Layout$Alignment;ZZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;
+HSPLandroidx/compose/ui/text/android/BoringLayoutFactoryDefault;->create(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;
+HSPLandroidx/compose/ui/text/android/BoringLayoutFactoryDefault;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;)Landroid/text/BoringLayout$Metrics;
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$boringMetrics$2;-><init>(ILandroidx/compose/ui/text/platform/AndroidTextPaint;Ljava/lang/CharSequence;)V
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$boringMetrics$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$maxIntrinsicWidth$2;-><init>(Landroidx/compose/ui/text/android/LayoutIntrinsics;Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;)V
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$maxIntrinsicWidth$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics$minIntrinsicWidth$2;-><init>(Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;)V
+HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;-><init>(ILandroidx/compose/ui/text/platform/AndroidTextPaint;Ljava/lang/CharSequence;)V
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;-><init>()V
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->create(Landroidx/compose/ui/text/android/StaticLayoutParams;)Landroid/text/StaticLayout;
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory26;->setJustificationMode(Landroid/text/StaticLayout$Builder;I)V
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory28;->setUseLineSpacingFromFallbacks(Landroid/text/StaticLayout$Builder;Z)V
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory;-><clinit>()V
+HSPLandroidx/compose/ui/text/android/StaticLayoutFactory;->create(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)Landroid/text/StaticLayout;
+HSPLandroidx/compose/ui/text/android/StaticLayoutParams;-><init>(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)V
+HSPLandroidx/compose/ui/text/android/TextAlignmentAdapter;-><clinit>()V
+HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;-><init>()V
+HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V
+HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->getClipBounds(Landroid/graphics/Rect;)Z
+HSPLandroidx/compose/ui/text/android/TextLayout$layoutHelper$2;-><init>(Landroidx/compose/ui/text/android/TextLayout;)V
+HSPLandroidx/compose/ui/text/android/TextLayout;-><init>(Ljava/lang/CharSequence;FLandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextUtils$TruncateAt;IIIIIIILandroidx/compose/ui/text/android/LayoutIntrinsics;)V
+HSPLandroidx/compose/ui/text/android/TextLayout;->getHeight()I
+HSPLandroidx/compose/ui/text/android/TextLayout;->getLineBaseline(I)F
+HSPLandroidx/compose/ui/text/android/TextLayout;->getText()Ljava/lang/CharSequence;
+HSPLandroidx/compose/ui/text/android/TextLayoutKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/android/TextLayoutKt;->getTextDirectionHeuristic(I)Landroid/text/TextDirectionHeuristic;
+HSPLandroidx/compose/ui/text/android/style/IndentationFixSpanKt;->getEllipsizedLeftPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F
+HSPLandroidx/compose/ui/text/android/style/IndentationFixSpanKt;->getEllipsizedRightPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F
+HSPLandroidx/compose/ui/text/android/style/LetterSpacingSpanPx;-><init>(F)V
+HSPLandroidx/compose/ui/text/android/style/LetterSpacingSpanPx;->updateDrawState(Landroid/text/TextPaint;)V
+HSPLandroidx/compose/ui/text/android/style/LetterSpacingSpanPx;->updateMeasureState(Landroid/text/TextPaint;)V
+HSPLandroidx/compose/ui/text/android/style/LineHeightSpan;-><init>(F)V
+HSPLandroidx/compose/ui/text/android/style/LineHeightSpan;->chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V
+HSPLandroidx/compose/ui/text/caches/ContainerHelpersKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/caches/LruCache;-><init>()V
+HSPLandroidx/compose/ui/text/caches/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/caches/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/caches/LruCache;->size()I
+HSPLandroidx/compose/ui/text/caches/SimpleArrayMap;-><init>(I)V
+HSPLandroidx/compose/ui/text/font/AndroidFontLoader;-><init>(Landroid/content/Context;)V
+HSPLandroidx/compose/ui/text/font/AndroidFontLoader;->getCacheKey()V
+HSPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;-><init>(I)V
+HSPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->interceptFontWeight(Landroidx/compose/ui/text/font/FontWeight;)Landroidx/compose/ui/text/font/FontWeight;
+HSPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor_androidKt;->AndroidFontResolveInterceptor(Landroid/content/Context;)Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;
+HSPLandroidx/compose/ui/text/font/AsyncTypefaceCache;-><init>()V
+HSPLandroidx/compose/ui/text/font/DefaultFontFamily;-><init>()V
+HSPLandroidx/compose/ui/text/font/FontFamily;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/FontFamily;-><init>()V
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$createDefaultTypeface$1;-><init>(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)V
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;-><init>(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;Landroidx/compose/ui/text/font/TypefaceRequest;)V
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;-><init>(Landroidx/compose/ui/text/font/AndroidFontLoader;Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;)V
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;)Landroidx/compose/ui/text/font/TypefaceResult;
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve-DPcqOEQ(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;II)Landroidx/compose/ui/text/font/TypefaceResult;
+HSPLandroidx/compose/ui/text/font/FontFamilyResolverKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1;-><init>()V
+HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;-><init>(Landroidx/compose/ui/text/font/AsyncTypefaceCache;)V
+HSPLandroidx/compose/ui/text/font/FontStyle;-><init>(I)V
+HSPLandroidx/compose/ui/text/font/FontSynthesis;-><init>(I)V
+HSPLandroidx/compose/ui/text/font/FontWeight;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/FontWeight;-><init>(I)V
+HSPLandroidx/compose/ui/text/font/FontWeight;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/font/GenericFontFamily;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+HSPLandroidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter;-><init>()V
+HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1;-><init>()V
+HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;-><init>()V
+HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor;-><clinit>()V
+HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;-><init>()V
+HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi28;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface;
+HSPLandroidx/compose/ui/text/font/SystemFontFamily;-><init>()V
+HSPLandroidx/compose/ui/text/font/TypefaceRequest;-><init>(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;IILjava/lang/Object;)V
+HSPLandroidx/compose/ui/text/font/TypefaceRequest;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/font/TypefaceRequest;->hashCode()I
+HSPLandroidx/compose/ui/text/font/TypefaceRequestCache$runCached$currentTypefaceResult$1;-><init>(Landroidx/compose/ui/text/font/TypefaceRequestCache;Landroidx/compose/ui/text/font/TypefaceRequest;)V
+HSPLandroidx/compose/ui/text/font/TypefaceRequestCache;-><init>()V
+HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;-><init>(Ljava/lang/Object;Z)V
+HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getCacheable()Z
+HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/input/ImmHelper30;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/ui/text/input/InputMethodManagerImpl$imm$2;-><init>(Landroidx/compose/ui/text/input/InputMethodManagerImpl;)V
+HSPLandroidx/compose/ui/text/input/InputMethodManagerImpl;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;-><clinit>()V
+HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;-><init>()V
+HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;-><clinit>()V
+HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;-><init>()V
+HSPLandroidx/compose/ui/text/input/TextFieldValue;-><clinit>()V
+HSPLandroidx/compose/ui/text/input/TextFieldValue;-><init>(Landroidx/compose/ui/text/AnnotatedString;JLandroidx/compose/ui/text/TextRange;)V
+HSPLandroidx/compose/ui/text/input/TextInputService;-><init>(Landroidx/compose/ui/text/input/PlatformTextInputService;)V
+HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid$baseInputConnection$2;-><init>(Landroidx/compose/ui/text/input/TextInputServiceAndroid;)V
+HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid$textInputCommandEventLoop$1;-><init>(Landroidx/compose/ui/text/input/TextInputServiceAndroid;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid;-><init>(Landroid/view/View;)V
+HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid;->textInputCommandEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/intl/AndroidLocale;-><init>(Ljava/util/Locale;)V
+HSPLandroidx/compose/ui/text/intl/AndroidLocale;->toLanguageTag()Ljava/lang/String;
+HSPLandroidx/compose/ui/text/intl/Locale;-><init>(Landroidx/compose/ui/text/intl/PlatformLocale;)V
+HSPLandroidx/compose/ui/text/intl/Locale;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/intl/LocaleList$Companion;->getCurrent()Landroidx/compose/ui/text/intl/LocaleList;
+HSPLandroidx/compose/ui/text/intl/LocaleList;-><init>(Ljava/util/ArrayList;)V
+HSPLandroidx/compose/ui/text/intl/LocaleList;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1;-><init>()V
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;-><clinit>()V
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;-><init>(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;)V
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;-><init>(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;Landroidx/compose/ui/unit/Density;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getHasStaleResolvedFonts()Z
+HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getMaxIntrinsicWidth()F
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;-><init>(F)V
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBrush-12SF9DM(Landroidx/compose/ui/graphics/Brush;JF)V
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setColor-8_81llA(J)V
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setDrawStyle(Landroidx/arch/core/executor/TaskExecutor;)V
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setShadow(Landroidx/compose/ui/graphics/Shadow;)V
+HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setTextDecoration(Landroidx/compose/ui/text/style/TextDecoration;)V
+HSPLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;-><init>(Landroidx/compose/runtime/ParcelableSnapshotMutableState;Landroidx/compose/ui/text/platform/DefaultImpl;)V
+HSPLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->onInitialized()V
+HSPLandroidx/compose/ui/text/platform/DefaultImpl;-><init>()V
+HSPLandroidx/compose/ui/text/platform/DefaultImpl;->getFontLoadState()Landroidx/compose/runtime/State;
+HSPLandroidx/compose/ui/text/platform/EmojiCompatStatus;-><clinit>()V
+HSPLandroidx/compose/ui/text/platform/ImmutableBool;-><init>(Z)V
+HSPLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/platform/TypefaceDirtyTracker;-><init>(Landroidx/compose/runtime/State;)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpanRange;-><init>(IILandroid/text/style/MetricAffectingSpan;)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt$setFontAttributes$1;-><init>(Landroid/text/Spannable;Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->resolveLineHeightInPx-o2QH7mI(JFLandroidx/compose/ui/unit/Density;)F
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setBackground-RPmYEkk(Landroid/text/Spannable;JII)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setColor-RPmYEkk(Landroid/text/Spannable;JII)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setFontSize-KmRG4DE(Landroid/text/Spannable;JLandroidx/compose/ui/unit/Density;II)V
+HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setSpan(Landroid/text/Spannable;Ljava/lang/Object;II)V
+HSPLandroidx/compose/ui/text/platform/extensions/TextPaintExtensions_androidKt;->hasFontAttributes(Landroidx/compose/ui/text/SpanStyle;)Z
+HSPLandroidx/compose/ui/text/style/BaselineShift;-><init>(F)V
+HSPLandroidx/compose/ui/text/style/ColorStyle;-><init>(J)V
+HSPLandroidx/compose/ui/text/style/ColorStyle;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/style/ColorStyle;->getAlpha()F
+HSPLandroidx/compose/ui/text/style/ColorStyle;->getBrush()Landroidx/compose/ui/graphics/Brush;
+HSPLandroidx/compose/ui/text/style/ColorStyle;->getColor-0d7_KjU()J
+HSPLandroidx/compose/ui/text/style/Hyphens;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/Hyphens;-><init>()V
+HSPLandroidx/compose/ui/text/style/LineBreak$Strategy;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/LineBreak$Strictness;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/LineBreak$WordBreak;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/LineBreak;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/LineBreak;-><init>()V
+HSPLandroidx/compose/ui/text/style/TextAlign;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/TextDecoration;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/TextDecoration;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/TextDecoration;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/style/TextDirection;-><init>(I)V
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;-><init>()V
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getAlpha()F
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getBrush()Landroidx/compose/ui/graphics/Brush;
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getColor-0d7_KjU()J
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$merge$2;-><init>(Landroidx/compose/ui/text/style/TextForegroundStyle;)V
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle$merge$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle;->merge(Landroidx/compose/ui/text/style/TextForegroundStyle;)Landroidx/compose/ui/text/style/TextForegroundStyle;
+HSPLandroidx/compose/ui/text/style/TextForegroundStyle;->takeOrElse(Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/text/style/TextForegroundStyle;
+HSPLandroidx/compose/ui/text/style/TextGeometricTransform;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/TextGeometricTransform;-><init>(FF)V
+HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/text/style/TextIndent;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/TextIndent;-><init>(JJ)V
+HSPLandroidx/compose/ui/text/style/TextMotion;-><clinit>()V
+HSPLandroidx/compose/ui/text/style/TextMotion;-><init>(IZ)V
+HSPLandroidx/compose/ui/unit/AndroidDensity_androidKt;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/DensityImpl;
+HSPLandroidx/compose/ui/unit/Constraints$Companion;->bitsNeedForSize(I)I
+HSPLandroidx/compose/ui/unit/Constraints$Companion;->createConstraints-Zbe2FdA$ui_unit_release(IIII)J
+HSPLandroidx/compose/ui/unit/Constraints$Companion;->fixed-JhjzzOo(II)J
+HSPLandroidx/compose/ui/unit/Constraints;-><clinit>()V
+HSPLandroidx/compose/ui/unit/Constraints;-><init>(J)V
+HSPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA$default(JIIIII)J
+HSPLandroidx/compose/ui/unit/Constraints;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/unit/Constraints;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/unit/Constraints;->getHasBoundedHeight-impl(J)Z
+HSPLandroidx/compose/ui/unit/Constraints;->getHasBoundedWidth-impl(J)Z
+HSPLandroidx/compose/ui/unit/Constraints;->getHasFixedHeight-impl(J)Z
+HSPLandroidx/compose/ui/unit/Constraints;->getHasFixedWidth-impl(J)Z
+HSPLandroidx/compose/ui/unit/Constraints;->getMaxHeight-impl(J)I
+HSPLandroidx/compose/ui/unit/Constraints;->getMaxWidth-impl(J)I
+HSPLandroidx/compose/ui/unit/Constraints;->getMinHeight-impl(J)I
+HSPLandroidx/compose/ui/unit/Constraints;->getMinWidth-impl(J)I
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->Constraints$default(III)J
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->Constraints(IIII)J
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->constrain-4WqzIAM(JJ)J
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->constrainHeight-K40F9xA(JI)I
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->constrainWidth-K40F9xA(JI)I
+HSPLandroidx/compose/ui/unit/ConstraintsKt;->offset-NN6Ew-U(IIJ)J
+HSPLandroidx/compose/ui/unit/Density;->roundToPx-0680j_4(F)I
+HSPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(I)F
+HSPLandroidx/compose/ui/unit/Density;->toPx--R2X_6o(J)F
+HSPLandroidx/compose/ui/unit/Density;->toPx-0680j_4(F)F
+HSPLandroidx/compose/ui/unit/DensityImpl;-><init>(FF)V
+HSPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/unit/DensityImpl;->getDensity()F
+HSPLandroidx/compose/ui/unit/DensityImpl;->getFontScale()F
+HSPLandroidx/compose/ui/unit/Dp;-><init>(F)V
+HSPLandroidx/compose/ui/unit/Dp;->compareTo(Ljava/lang/Object;)I
+HSPLandroidx/compose/ui/unit/Dp;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/unit/Dp;->equals-impl0(FF)Z
+HSPLandroidx/compose/ui/unit/DpKt;->DpOffset-YgX7TsA(FF)J
+HSPLandroidx/compose/ui/unit/DpOffset;-><clinit>()V
+HSPLandroidx/compose/ui/unit/DpRect;-><init>(FFFF)V
+HSPLandroidx/compose/ui/unit/DpRect;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/compose/ui/unit/IntOffset$Companion;-><init>()V
+HSPLandroidx/compose/ui/unit/IntOffset;-><clinit>()V
+HSPLandroidx/compose/ui/unit/IntOffset;-><init>(J)V
+HSPLandroidx/compose/ui/unit/IntOffset;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/unit/IntOffset;->getY-impl(J)I
+HSPLandroidx/compose/ui/unit/IntOffsetKt;->IntOffset(II)J
+HSPLandroidx/compose/ui/unit/IntSize$Companion;-><init>()V
+HSPLandroidx/compose/ui/unit/IntSize;-><clinit>()V
+HSPLandroidx/compose/ui/unit/IntSize;-><init>(J)V
+HSPLandroidx/compose/ui/unit/IntSize;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/unit/IntSize;->getHeight-impl(J)I
+HSPLandroidx/compose/ui/unit/IntSizeKt;->IntSize(II)J
+HSPLandroidx/compose/ui/unit/IntSizeKt;->toSize-ozmzZPI(J)J
+HSPLandroidx/compose/ui/unit/LayoutDirection;-><clinit>()V
+HSPLandroidx/compose/ui/unit/LayoutDirection;-><init>(ILjava/lang/String;)V
+HSPLandroidx/compose/ui/unit/TextUnit;-><clinit>()V
+HSPLandroidx/compose/ui/unit/TextUnit;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/unit/TextUnit;->getType-UIouoOA(J)J
+HSPLandroidx/compose/ui/unit/TextUnit;->getValue-impl(J)F
+HSPLandroidx/compose/ui/unit/TextUnitKt;->getSp(D)J
+HSPLandroidx/compose/ui/unit/TextUnitKt;->getSp(I)J
+HSPLandroidx/compose/ui/unit/TextUnitKt;->isUnspecified--R2X_6o(J)Z
+HSPLandroidx/compose/ui/unit/TextUnitKt;->pack(FJ)J
+HSPLandroidx/compose/ui/unit/TextUnitType;-><init>(J)V
+HSPLandroidx/compose/ui/unit/TextUnitType;->equals-impl0(JJ)Z
+HSPLandroidx/compose/ui/util/MathHelpersKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
+HSPLandroidx/core/R$id;->createCoroutineUnintercepted(Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function2;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/core/R$id;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLandroidx/core/R$id;->systemProp$default(Ljava/lang/String;IIII)I
+HSPLandroidx/core/R$id;->systemProp(Ljava/lang/String;JJJ)J
+HSPLandroidx/core/app/ComponentActivity;-><init>()V
+HSPLandroidx/core/app/ComponentActivity;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z
+HSPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V
+HSPLandroidx/core/app/ComponentActivity;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z
+HSPLandroidx/core/app/CoreComponentFactory;-><init>()V
+HSPLandroidx/core/app/CoreComponentFactory;->checkCompatWrapper(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application;
+HSPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;
+HSPLandroidx/core/graphics/TypefaceCompat;-><clinit>()V
+HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;-><init>()V
+HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;[Landroidx/core/provider/FontsContractCompat$FontInfo;I)Landroid/graphics/Typeface;
+HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->findBaseFont(Landroid/graphics/fonts/FontFamily;I)Landroid/graphics/fonts/Font;
+HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I
+HSPLandroidx/core/graphics/TypefaceCompatBaseImpl;-><init>()V
+HSPLandroidx/core/graphics/TypefaceCompatUtil$Api19Impl;->openFileDescriptor(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;
+HSPLandroidx/core/graphics/TypefaceCompatUtil;->mmap(Landroid/content/Context;Landroid/net/Uri;)Ljava/nio/MappedByteBuffer;
+HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z
+HSPLandroidx/core/os/TraceCompat$Api18Impl;->beginSection(Ljava/lang/String;)V
+HSPLandroidx/core/os/TraceCompat$Api18Impl;->endSection()V
+HSPLandroidx/core/os/TraceCompat;-><clinit>()V
+HSPLandroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;-><init>()V
+HSPLandroidx/core/provider/FontProvider$Api16Impl;->query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Landroid/database/Cursor;
+HSPLandroidx/core/provider/FontProvider;-><clinit>()V
+HSPLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult;
+HSPLandroidx/core/provider/FontRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
+HSPLandroidx/core/provider/FontsContractCompat$FontFamilyResult;-><init>(I[Landroidx/core/provider/FontsContractCompat$FontInfo;)V
+HSPLandroidx/core/provider/FontsContractCompat$FontInfo;-><init>(Landroid/net/Uri;IIZI)V
+HSPLandroidx/core/util/Preconditions;->checkArgument(Ljava/lang/String;Z)V
+HSPLandroidx/core/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;-><init>(Landroidx/core/view/AccessibilityDelegateCompat;)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V
+HSPLandroidx/core/view/AccessibilityDelegateCompat;-><clinit>()V
+HSPLandroidx/core/view/AccessibilityDelegateCompat;-><init>()V
+HSPLandroidx/core/view/MenuHostHelper;-><init>()V
+HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;-><init>()V
+HSPLandroidx/core/view/ViewCompat;-><clinit>()V
+HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;-><init>(Landroid/view/accessibility/AccessibilityNodeProvider;)V
+HSPLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder;
+HSPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;-><init>()V
+HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;-><init>(Ljava/lang/String;)V
+HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
+HSPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler;
+HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig;
+HSPLandroidx/emoji2/text/DefaultGlyphChecker;-><clinit>()V
+HSPLandroidx/emoji2/text/DefaultGlyphChecker;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;-><init>(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V
+HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V
+HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;-><init>(Landroidx/emoji2/text/EmojiCompat;)V
+HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal;-><init>(Landroidx/emoji2/text/EmojiCompat;)V
+HSPLandroidx/emoji2/text/EmojiCompat$Config;-><init>(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V
+HSPLandroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompat$InitCallback;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;-><init>(Ljava/util/List;ILjava/lang/Throwable;)V
+HSPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V
+HSPLandroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompat;-><clinit>()V
+HSPLandroidx/emoji2/text/EmojiCompat;-><init>(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;)V
+HSPLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat;
+HSPLandroidx/emoji2/text/EmojiCompat;->getLoadState()I
+HSPLandroidx/emoji2/text/EmojiCompat;->load()V
+HSPLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadSuccess()V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;-><init>(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;-><init>(Landroid/content/Context;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;-><init>(Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;-><init>(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;Ljava/util/concurrent/ThreadPoolExecutor;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->onLoaded(Landroidx/emoji2/text/MetadataRepo;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;-><init>(Landroid/content/Context;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer;-><init>()V
+HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Boolean;
+HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;
+HSPLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List;
+HSPLandroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Reflections;->getExclusions()Ljava/util/Set;
+HSPLandroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;-><init>(Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable;Landroidx/emoji2/text/EmojiCompat$SpanFactory;)V
+HSPLandroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;->getResult()Ljava/lang/Object;
+HSPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;-><init>(Landroidx/emoji2/text/MetadataRepo$Node;Z[I)V
+HSPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->reset()V
+HSPLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->shouldUseEmojiPresentationStyleForSingleCodepoint()Z
+HSPLandroidx/emoji2/text/EmojiProcessor;-><init>(Landroidx/emoji2/text/MetadataRepo;Landroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;Landroidx/emoji2/text/DefaultGlyphChecker;Ljava/util/Set;)V
+HSPLandroidx/emoji2/text/EmojiProcessor;->process(Ljava/lang/CharSequence;IIIZLandroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback;)Ljava/lang/Object;
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;-><init>()V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;-><init>(Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;)V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;->run()V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;-><init>(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->cleanUp()V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->load(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;)V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->loadInternal()V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->retrieveFontInfo()Landroidx/core/provider/FontsContractCompat$FontInfo;
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;-><clinit>()V
+HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;-><init>(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V
+HSPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;-><init>(Ljava/nio/ByteBuffer;)V
+HSPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->readUnsignedInt()J
+HSPLandroidx/emoji2/text/MetadataListReader$ByteBufferReader;->skip(I)V
+HSPLandroidx/emoji2/text/MetadataListReader;->read(Ljava/nio/MappedByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataList;
+HSPLandroidx/emoji2/text/MetadataRepo$Node;-><init>()V
+HSPLandroidx/emoji2/text/MetadataRepo$Node;-><init>(I)V
+HSPLandroidx/emoji2/text/MetadataRepo$Node;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;II)V
+HSPLandroidx/emoji2/text/MetadataRepo;-><init>(Landroid/graphics/Typeface;Landroidx/emoji2/text/flatbuffer/MetadataList;)V
+HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;-><clinit>()V
+HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;-><init>(Landroidx/emoji2/text/MetadataRepo;I)V
+HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointAt(I)I
+HSPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointsLength()I
+HSPLandroidx/emoji2/text/flatbuffer/MetadataItem;-><init>()V
+HSPLandroidx/emoji2/text/flatbuffer/MetadataList;-><init>()V
+HSPLandroidx/emoji2/text/flatbuffer/Table;-><init>()V
+HSPLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I
+HSPLandroidx/emoji2/text/flatbuffer/Table;->__reset(ILjava/nio/ByteBuffer;)V
+HSPLandroidx/emoji2/text/flatbuffer/Utf8Safe;-><init>()V
+HSPLandroidx/lifecycle/DefaultLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V
+HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;-><clinit>()V
+HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;-><init>(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V
+HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;-><init>()V
+HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/Lifecycle$Event$Companion;-><init>()V
+HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event;
+HSPLandroidx/lifecycle/Lifecycle$Event$WhenMappings;-><clinit>()V
+HSPLandroidx/lifecycle/Lifecycle$Event;-><clinit>()V
+HSPLandroidx/lifecycle/Lifecycle$Event;-><init>(ILjava/lang/String;)V
+HSPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State;
+HSPLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event;
+HSPLandroidx/lifecycle/Lifecycle$State;-><clinit>()V
+HSPLandroidx/lifecycle/Lifecycle$State;-><init>(ILjava/lang/String;)V
+HSPLandroidx/lifecycle/Lifecycle;-><init>()V
+HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;-><init>()V
+HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/LifecycleDispatcher;-><clinit>()V
+HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;-><init>(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V
+HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;-><init>(Landroidx/lifecycle/LifecycleOwner;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State;
+HSPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->sync()V
+HSPLandroidx/lifecycle/Lifecycling;-><clinit>()V
+HSPLandroidx/lifecycle/ProcessLifecycleInitializer;-><init>()V
+HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;
+HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->dependencies()Ljava/util/List;
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$1;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$2;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroidx/lifecycle/ProcessLifecycleOwner$3$1;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner$3;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostResumed(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostStarted(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner;-><clinit>()V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner;-><init>()V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed()V
+HSPLandroidx/lifecycle/ProcessLifecycleOwner;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry;
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;-><init>()V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->registerIn(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment;-><init>()V
+HSPLandroidx/lifecycle/ReportFragment;->dispatch(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V
+HSPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V
+HSPLandroidx/lifecycle/ReportFragment;->onResume()V
+HSPLandroidx/lifecycle/ReportFragment;->onStart()V
+HSPLandroidx/lifecycle/SavedStateHandleAttacher;-><init>(Landroidx/lifecycle/SavedStateHandlesProvider;)V
+HSPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;-><init>()V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$SAVED_STATE_REGISTRY_OWNER_KEY$1;-><init>()V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$VIEW_MODEL_STORE_OWNER_KEY$1;-><init>()V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;-><clinit>()V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;-><init>()V
+HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/lifecycle/SavedStateHandleSupport;-><clinit>()V
+HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;-><init>(Landroidx/lifecycle/ViewModelStoreOwner;)V
+HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/lifecycle/SavedStateHandlesProvider;-><init>(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V
+HSPLandroidx/lifecycle/SavedStateHandlesVM;-><init>()V
+HSPLandroidx/lifecycle/ViewModel;-><init>()V
+HSPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$ApplicationKeyImpl;-><clinit>()V
+HSPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$ApplicationKeyImpl;-><init>()V
+HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion$ViewModelKeyImpl;-><clinit>()V
+HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion$ViewModelKeyImpl;-><init>()V
+HSPLandroidx/lifecycle/ViewModelStore;-><init>()V
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$1;-><clinit>()V
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$1;-><init>()V
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$2;-><clinit>()V
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$2;-><init>()V
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/lifecycle/ViewTreeLifecycleOwner;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner;
+HSPLandroidx/lifecycle/runtime/R$id;-><init>()V
+HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;-><clinit>()V
+HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;-><init>()V
+HSPLandroidx/lifecycle/viewmodel/CreationExtras;-><init>()V
+HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;-><init>([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V
+HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel;
+HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;-><init>()V
+HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;-><init>(Landroidx/lifecycle/viewmodel/CreationExtras;)V
+HSPLandroidx/lifecycle/viewmodel/ViewModelInitializer;-><init>(Ljava/lang/Class;)V
+HSPLandroidx/metrics/performance/DelegatingFrameMetricsListener;-><init>(Ljava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/DelegatingFrameMetricsListener;->onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V
+HSPLandroidx/metrics/performance/FrameData;-><init>(JJZLjava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/FrameDataApi24;-><init>(JJJZLjava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/FrameDataApi31;-><init>(JJJJZLjava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/FrameDataApi31;->copy()Landroidx/metrics/performance/FrameData;
+HSPLandroidx/metrics/performance/JankStats;-><init>(Landroid/view/Window;Lcom/example/tvcomposebasedtests/JankStatsAggregator$listener$1;)V
+HSPLandroidx/metrics/performance/JankStatsApi16Impl$onFrameListenerDelegate$1;-><init>(Landroidx/metrics/performance/JankStats;Landroidx/metrics/performance/JankStatsApi16Impl;)V
+HSPLandroidx/metrics/performance/JankStatsApi16Impl;-><init>(Landroidx/metrics/performance/JankStats;Landroid/view/View;)V
+HSPLandroidx/metrics/performance/JankStatsApi22Impl;-><init>(Landroidx/metrics/performance/JankStats;Landroid/view/View;)V
+HSPLandroidx/metrics/performance/JankStatsApi24Impl$$ExternalSyntheticLambda0;-><init>(Landroidx/metrics/performance/JankStatsApi24Impl;Landroidx/metrics/performance/JankStats;)V
+HSPLandroidx/metrics/performance/JankStatsApi24Impl$$ExternalSyntheticLambda0;->onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V
+HSPLandroidx/metrics/performance/JankStatsApi24Impl;-><init>(Landroidx/metrics/performance/JankStats;Landroid/view/View;Landroid/view/Window;)V
+HSPLandroidx/metrics/performance/JankStatsApi24Impl;->getOrCreateFrameMetricsListenerDelegator(Landroid/view/Window;)Landroidx/metrics/performance/DelegatingFrameMetricsListener;
+HSPLandroidx/metrics/performance/JankStatsApi24Impl;->setupFrameTimer(Z)V
+HSPLandroidx/metrics/performance/JankStatsApi26Impl;-><init>(Landroidx/metrics/performance/JankStats;Landroid/view/View;Landroid/view/Window;)V
+HSPLandroidx/metrics/performance/JankStatsApi26Impl;->getFrameStartTime$metrics_performance_release(Landroid/view/FrameMetrics;)J
+HSPLandroidx/metrics/performance/JankStatsApi31Impl;-><init>(Landroidx/metrics/performance/JankStats;Landroid/view/View;Landroid/view/Window;)V
+HSPLandroidx/metrics/performance/JankStatsApi31Impl;->getExpectedFrameDuration(Landroid/view/FrameMetrics;)J
+HSPLandroidx/metrics/performance/JankStatsApi31Impl;->getFrameData$metrics_performance_release(JJLandroid/view/FrameMetrics;)Landroidx/metrics/performance/FrameDataApi24;
+HSPLandroidx/metrics/performance/JankStatsBaseImpl;-><init>(Landroidx/metrics/performance/JankStats;)V
+HSPLandroidx/metrics/performance/PerformanceMetricsState$Holder;-><init>()V
+HSPLandroidx/metrics/performance/PerformanceMetricsState;-><init>()V
+HSPLandroidx/metrics/performance/PerformanceMetricsState;->addFrameState(JJLjava/util/ArrayList;Ljava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/PerformanceMetricsState;->cleanupSingleFrameStates$metrics_performance_release()V
+HSPLandroidx/metrics/performance/PerformanceMetricsState;->getIntervalStates$metrics_performance_release(JJLjava/util/ArrayList;)V
+HSPLandroidx/metrics/performance/R$id;->createZeroVectorFrom(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;)Landroidx/compose/animation/core/AnimationVector;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;-><init>(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;-><init>(ILjava/lang/Object;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Runnable;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Result;-><init>()V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer;-><init>()V
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;
+HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List;
+HSPLandroidx/savedstate/Recreator;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V
+HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;-><init>(Landroidx/savedstate/SavedStateRegistry;)V
+HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V
+HSPLandroidx/savedstate/SavedStateRegistry;-><init>()V
+HSPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle;
+HSPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V
+HSPLandroidx/savedstate/SavedStateRegistryController;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V
+HSPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;-><clinit>()V
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;-><init>()V
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$2;-><clinit>()V
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$2;-><init>()V
+HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/startup/AppInitializer;-><clinit>()V
+HSPLandroidx/startup/AppInitializer;-><init>(Landroid/content/Context;)V
+HSPLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V
+HSPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/HashSet;)Ljava/lang/Object;
+HSPLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer;
+HSPLandroidx/startup/InitializationProvider;-><init>()V
+HSPLandroidx/startup/InitializationProvider;->onCreate()Z
+HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m()Z
+HSPLandroidx/tracing/Trace;->isEnabled()Z
+HSPLandroidx/tv/foundation/ContentInViewModifier$modifier$1;-><init>(Landroidx/tv/foundation/ContentInViewModifier;)V
+HSPLandroidx/tv/foundation/ContentInViewModifier$modifier$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/ContentInViewModifier;-><init>(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;ZLandroidx/tv/foundation/PivotOffsets;)V
+HSPLandroidx/tv/foundation/ContentInViewModifier;->bringChildIntoView(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/ContentInViewModifier;->calculateRectForParent(Landroidx/compose/ui/geometry/Rect;)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/tv/foundation/ContentInViewModifier;->computeDestination-JVtK1S4(Landroidx/compose/ui/geometry/Rect;JLandroidx/tv/foundation/PivotOffsets;)Landroidx/compose/ui/geometry/Rect;
+HSPLandroidx/tv/foundation/ContentInViewModifier;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/tv/foundation/ContentInViewModifier;->onRemeasured-ozmzZPI(J)V
+HSPLandroidx/tv/foundation/ContentInViewModifier;->performBringIntoView(Landroidx/compose/ui/geometry/Rect;Landroidx/compose/ui/geometry/Rect;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/ContentInViewModifier;->relocationDistance(FFFLandroidx/tv/foundation/PivotOffsets;)F
+HSPLandroidx/tv/foundation/PivotOffsets;-><init>(I)V
+HSPLandroidx/tv/foundation/PivotOffsets;->validateFraction(F)V
+HSPLandroidx/tv/foundation/ScrollableWithPivotKt$scrollableNestedScrollConnection$1;-><init>(Landroidx/compose/runtime/MutableState;Z)V
+HSPLandroidx/tv/foundation/ScrollableWithPivotKt$scrollableWithPivot$2;-><init>(Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;ZZLandroidx/tv/foundation/PivotOffsets;)V
+HSPLandroidx/tv/foundation/ScrollableWithPivotKt$scrollableWithPivot$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/ScrollableWithPivotKt;->scrollableWithPivot(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/tv/foundation/PivotOffsets;ZZ)Landroidx/compose/ui/Modifier;
+HSPLandroidx/tv/foundation/ScrollingLogic;-><init>(Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/foundation/gestures/ScrollableState;)V
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;-><init>(Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$indexForKeyMapping$1;ZLandroidx/compose/ui/semantics/ScrollAxisRange;Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1;Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1;Landroidx/compose/ui/semantics/CollectionInfo;)V
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$indexForKeyMapping$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;)V
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1;-><init>(ZLkotlinx/coroutines/CoroutineScope;Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticState;)V
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Lkotlinx/coroutines/CoroutineScope;Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticState;)V
+HSPLandroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt;->lazyLayoutSemantics(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier;
+HSPLandroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier$waitForFirstLayout$1;-><init>(Landroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V
+HSPLandroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier;->waitForFirstLayout(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/DataIndex;-><init>(I)V
+HSPLandroidx/tv/foundation/lazy/list/DataIndex;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/tv/foundation/lazy/list/EmptyLazyListLayoutInfo;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/EmptyLazyListLayoutInfo;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyDslKt;->TvLazyRow(Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZLandroidx/tv/foundation/PivotOffsets;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo$Interval;-><init>(II)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo$Interval;->equals(Ljava/lang/Object;)Z
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal$Companion$emptyBeyondBoundsScope$1;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal$layout$2;-><init>(Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;Lkotlin/jvm/internal/Ref$ObjectRef;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo;ZLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/gestures/Orientation;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;->getValue()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;->hasMoreContent-FR3nfPY(Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo$Interval;I)Z
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;->hasMoreContent_FR3nfPY$hasMoreItemsAfter(Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo$Interval;Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;)Z
+HSPLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;->layout-o7g1Pn8(ILkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListIntervalContent;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListIntervalContent;->getKey()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/tv/foundation/lazy/list/LazyListIntervalContent;->getType()Lkotlin/jvm/functions/Function1;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;-><init>(Lkotlinx/coroutines/CoroutineScope;Z)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1$1;-><init>(Landroidx/compose/foundation/lazy/layout/IntervalList$Interval;Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;-><init>(Landroidx/compose/foundation/lazy/layout/MutableIntervalList;Lkotlin/ranges/IntRange;Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;->Item(ILandroidx/compose/runtime/Composer;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;->getItemCount()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;->getKeyToIndexMap()Ljava/util/Map;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;-><init>(Landroidx/compose/runtime/DerivedSnapshotState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->Item(ILandroidx/compose/runtime/Composer;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getContentType(I)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getHeaderIndexes()Ljava/util/List;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemCount()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getItemScope()Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKey(I)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;->getKeyToIndexMap()Ljava/util/Map;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$ScrollPositionUpdater$1;-><init>(Landroidx/tv/foundation/lazy/list/LazyListItemProvider;Landroidx/tv/foundation/lazy/list/TvLazyListState;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$ScrollPositionUpdater$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;-><init>(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;JII)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;-><init>(IILandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZIILandroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;J)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->createItem-44a8dek(ILjava/lang/Object;Ljava/util/List;)Landroidx/tv/foundation/lazy/list/LazyMeasuredItem;
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1;-><init>(ZLandroidx/compose/foundation/layout/PaddingValues;ZLandroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo;ILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZZZILandroidx/tv/foundation/PivotOffsets;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListKt;->ScrollPositionUpdater(Landroidx/tv/foundation/lazy/list/LazyListItemProvider;Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureKt$measureLazyList$5;-><init>(Ljava/util/ArrayList;Landroidx/tv/foundation/lazy/list/LazyListPositionedItem;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureKt$measureLazyList$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureKt;->createItemsAfterList$addItem(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/tv/foundation/lazy/list/LazyMeasuredItemProvider;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;-><init>(Landroidx/tv/foundation/lazy/list/LazyMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;Ljava/util/List;ILandroidx/compose/foundation/gestures/Orientation;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map;
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->getHeight()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->getTotalItemsCount()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->getVisibleItemsInfo()Ljava/util/List;
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->getWidth()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListMeasureResult;->placeChildren()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/tv/foundation/lazy/list/LazyListPinnableItem;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1$invoke$$inlined$onDispose$1;->dispose()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1;-><init>(Landroidx/tv/foundation/lazy/list/LazyListPinnableItem;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt;->LazyListPinnableContainerProvider(Landroidx/tv/foundation/lazy/list/TvLazyListState;ILkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableItem;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableItem;->getIndex()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableItem;->getPinsCount()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableItem;->pin()Landroidx/tv/foundation/lazy/list/LazyListPinnableItem;
+HSPLandroidx/tv/foundation/lazy/list/LazyListPinnableItem;->unpin()V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPlaceableWrapper;-><init>(JLandroidx/compose/ui/layout/Placeable;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPositionedItem;-><init>(IILjava/lang/Object;IIIZLjava/util/ArrayList;Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;JZI)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListPositionedItem;->getAnimationSpec(I)Landroidx/compose/animation/core/FiniteAnimationSpec;
+HSPLandroidx/tv/foundation/lazy/list/LazyListPositionedItem;->getIndex()I
+HSPLandroidx/tv/foundation/lazy/list/LazyListPositionedItem;->getOffset-Bjo55l4(I)J
+HSPLandroidx/tv/foundation/lazy/list/LazyListPositionedItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListScrollPosition;-><init>(II)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListScrollPosition;->update-ELO9Zo8(II)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListStateKt$rememberTvLazyListState$1$1;-><init>(II)V
+HSPLandroidx/tv/foundation/lazy/list/LazyListStateKt$rememberTvLazyListState$1$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/LazyListStateKt;->rememberTvLazyListState(Landroidx/compose/runtime/Composer;)Landroidx/tv/foundation/lazy/list/TvLazyListState;
+HSPLandroidx/tv/foundation/lazy/list/LazyMeasuredItem;-><init>(ILjava/util/List;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;ZIILandroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;IJLjava/lang/Object;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyMeasuredItem;->position(III)Landroidx/tv/foundation/lazy/list/LazyListPositionedItem;
+HSPLandroidx/tv/foundation/lazy/list/LazyMeasuredItemProvider;-><init>(JZLandroidx/tv/foundation/lazy/list/LazyListItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;Landroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;)V
+HSPLandroidx/tv/foundation/lazy/list/LazyMeasuredItemProvider;->getAndMeasure-KvsoDyw(I)Landroidx/tv/foundation/lazy/list/LazyMeasuredItem;
+HSPLandroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;)V
+HSPLandroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1;-><init>(ZLandroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;Z)V
+HSPLandroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo;
+HSPLandroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1;->scrollAxisRange()Landroidx/compose/ui/semantics/ScrollAxisRange;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListScope$items$1;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListScope$items$1;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListScope$items$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListScopeImpl;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListScopeImpl;->items(ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$1;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$1;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$2;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$2;-><init>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$remeasurementModifier$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/layout/Remeasurement;)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$scroll$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;Lkotlin/coroutines/Continuation;)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$scroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$scrollableState$1;-><init>(Landroidx/tv/foundation/lazy/list/TvLazyListState;)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState$scrollableState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;-><clinit>()V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;-><init>(II)V
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->getCanScrollBackward()Z
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->getCanScrollForward()Z
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->getFirstVisibleItemIndex()I
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->getLayoutInfo()Landroidx/tv/foundation/lazy/list/TvLazyListLayoutInfo;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLandroidx/tv/foundation/lazy/list/TvLazyListState;->updateScrollPositionIfTheFirstItemWasMoved$tv_foundation_release(Landroidx/tv/foundation/lazy/list/LazyListItemProvider;)V
+HSPLandroidx/tv/material3/ColorScheme;-><init>(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)V
+HSPLandroidx/tv/material3/ColorSchemeKt$LocalColorScheme$1;-><clinit>()V
+HSPLandroidx/tv/material3/ColorSchemeKt$LocalColorScheme$1;-><init>()V
+HSPLandroidx/tv/material3/ColorSchemeKt;-><clinit>()V
+HSPLandroidx/tv/material3/ContentColorKt$LocalContentColor$1;-><clinit>()V
+HSPLandroidx/tv/material3/ContentColorKt$LocalContentColor$1;-><init>()V
+HSPLandroidx/tv/material3/ContentColorKt;-><clinit>()V
+HSPLandroidx/tv/material3/MaterialThemeKt$$ExternalSyntheticOutline0;->m(JLandroidx/compose/runtime/ParcelableSnapshotMutableState;)V
+HSPLandroidx/tv/material3/MaterialThemeKt$MaterialTheme$1;-><init>(Landroidx/tv/material3/Typography;Lkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/tv/material3/MaterialThemeKt$MaterialTheme$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/MaterialThemeKt$MaterialTheme$2;-><init>(Landroidx/tv/material3/ColorScheme;Landroidx/tv/material3/Shapes;Landroidx/tv/material3/Typography;Lkotlin/jvm/functions/Function2;II)V
+HSPLandroidx/tv/material3/MaterialThemeKt;->MaterialTheme(Landroidx/tv/material3/ColorScheme;Landroidx/tv/material3/Shapes;Landroidx/tv/material3/Typography;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/tv/material3/ShapeDefaults;-><clinit>()V
+HSPLandroidx/tv/material3/Shapes;-><init>(I)V
+HSPLandroidx/tv/material3/ShapesKt$LocalShapes$1;-><clinit>()V
+HSPLandroidx/tv/material3/ShapesKt$LocalShapes$1;-><init>()V
+HSPLandroidx/tv/material3/ShapesKt$LocalShapes$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/material3/ShapesKt;-><clinit>()V
+HSPLandroidx/tv/material3/TabColors;-><init>(JJJJJJJJ)V
+HSPLandroidx/tv/material3/TabKt$Tab$1;-><clinit>()V
+HSPLandroidx/tv/material3/TabKt$Tab$1;-><init>()V
+HSPLandroidx/tv/material3/TabKt$Tab$3$1$1;-><init>(Z)V
+HSPLandroidx/tv/material3/TabKt$Tab$3$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabKt$Tab$3$2$1;-><init>(Landroidx/compose/runtime/MutableState;Lkotlin/jvm/functions/Function0;)V
+HSPLandroidx/tv/material3/TabKt$Tab$3$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabKt$Tab$3;-><init>(Landroidx/compose/ui/Modifier;ZILandroidx/compose/runtime/MutableState;Lkotlin/jvm/functions/Function0;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;)V
+HSPLandroidx/tv/material3/TabKt$Tab$4;-><init>(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLandroidx/tv/material3/TabColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;II)V
+HSPLandroidx/tv/material3/TabKt$Tab$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabKt;->Tab(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLandroidx/tv/material3/TabColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/tv/material3/TabRowDefaults$PillIndicator$1;-><init>(Landroidx/tv/material3/TabRowDefaults;Landroidx/compose/ui/unit/DpRect;Landroidx/compose/ui/Modifier;JJII)V
+HSPLandroidx/tv/material3/TabRowDefaults$PillIndicator$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowDefaults;-><clinit>()V
+HSPLandroidx/tv/material3/TabRowDefaults;-><init>()V
+HSPLandroidx/tv/material3/TabRowDefaults;->PillIndicator-eaDK9VM(Landroidx/compose/ui/unit/DpRect;Landroidx/compose/ui/Modifier;JJLandroidx/compose/runtime/Composer;II)V
+HSPLandroidx/tv/material3/TabRowKt$LocalTabRowHasFocus$1;-><clinit>()V
+HSPLandroidx/tv/material3/TabRowKt$LocalTabRowHasFocus$1;-><init>()V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$1;-><init>(I)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$1$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$1$2;-><init>(Lkotlin/jvm/functions/Function3;Ljava/util/ArrayList;I)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$1;-><init>(Ljava/util/ArrayList;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Ljava/util/ArrayList;ILkotlin/jvm/functions/Function3;III)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$separators$1;-><init>(ILkotlin/jvm/functions/Function2;I)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1$separators$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function3;)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2;-><init>(Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/ScrollState;Landroidx/compose/runtime/MutableState;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;I)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt$TabRow$3;-><init>(ILandroidx/compose/ui/Modifier;JJLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;II)V
+HSPLandroidx/tv/material3/TabRowKt$TabRow$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TabRowKt;-><clinit>()V
+HSPLandroidx/tv/material3/TabRowKt;->TabRow-pAZo6Ak(ILandroidx/compose/ui/Modifier;JJLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V
+HSPLandroidx/tv/material3/TabRowSlots;-><clinit>()V
+HSPLandroidx/tv/material3/TabRowSlots;-><init>(ILjava/lang/String;)V
+HSPLandroidx/tv/material3/TextKt$LocalTextStyle$1;-><clinit>()V
+HSPLandroidx/tv/material3/TextKt$LocalTextStyle$1;-><init>()V
+HSPLandroidx/tv/material3/TextKt$LocalTextStyle$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/material3/TextKt$Text$1;-><clinit>()V
+HSPLandroidx/tv/material3/TextKt$Text$1;-><init>()V
+HSPLandroidx/tv/material3/TextKt$Text$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLandroidx/tv/material3/TextKt$Text$2;-><init>(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;III)V
+HSPLandroidx/tv/material3/TextKt;-><clinit>()V
+HSPLandroidx/tv/material3/TextKt;->ProvideTextStyle(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V
+HSPLandroidx/tv/material3/TextKt;->Text-fLXpl1I(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V
+HSPLandroidx/tv/material3/Typography;-><init>(I)V
+HSPLandroidx/tv/material3/TypographyKt$LocalTypography$1;-><clinit>()V
+HSPLandroidx/tv/material3/TypographyKt$LocalTypography$1;-><init>()V
+HSPLandroidx/tv/material3/TypographyKt$LocalTypography$1;->invoke()Ljava/lang/Object;
+HSPLandroidx/tv/material3/TypographyKt;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/ColorDarkTokens;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/PaletteTokens;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/ShapeTokens;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/TypeScaleTokens;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/TypefaceTokens;-><clinit>()V
+HSPLandroidx/tv/material3/tokens/TypographyTokens;-><clinit>()V
+HSPLcoil/base/R$id;->hasSpan(Landroid/text/Spanned;Ljava/lang/Class;)Z
+HSPLcoil/request/ViewTargetDisposable;->findRootCoordinates(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/layout/LayoutCoordinates;
+HSPLcoil/request/ViewTargetDisposable;->updateChangedFlags(I)I
+HSPLcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt$lambda-1$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt$lambda-1$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/JankStatsAggregator$listener$1;-><init>(Lcom/example/tvcomposebasedtests/JankStatsAggregator;)V
+HSPLcom/example/tvcomposebasedtests/JankStatsAggregator$listener$1;->onFrame(Landroidx/metrics/performance/FrameData;)V
+HSPLcom/example/tvcomposebasedtests/JankStatsAggregator;-><init>(Landroid/view/Window;Lcom/example/tvcomposebasedtests/MainActivity$jankReportListener$1;)V
+HSPLcom/example/tvcomposebasedtests/MainActivity$jankReportListener$1;-><init>(Lcom/example/tvcomposebasedtests/MainActivity;)V
+HSPLcom/example/tvcomposebasedtests/MainActivity$startFrameMetrics$listener$1;-><init>(Lcom/example/tvcomposebasedtests/MainActivity;)V
+HSPLcom/example/tvcomposebasedtests/MainActivity$startFrameMetrics$listener$1;->onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V
+HSPLcom/example/tvcomposebasedtests/MainActivity;-><init>()V
+HSPLcom/example/tvcomposebasedtests/MainActivity;->onCreate(Landroid/os/Bundle;)V
+HSPLcom/example/tvcomposebasedtests/MainActivity;->onResume()V
+HSPLcom/example/tvcomposebasedtests/UtilsKt;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1$1$1$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/AppKt;->App(Landroidx/compose/runtime/Composer;I)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-1$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-1$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-2$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-2$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-3$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-3$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-4$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-4$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-1$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-1$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-2$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-2$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-3$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-3$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-4$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-4$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-5$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-5$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-6$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-6$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-7$1;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-7$1;-><init>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-7$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleCardItem$2;-><init>(II)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleCardItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyRow$1$1;-><init>(I)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyRow$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$drawBorderAndScaleOnFocus$1$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$drawBorderAndScaleOnFocus$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->SampleCardItem(ILandroidx/compose/runtime/Composer;I)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->SampleTvLazyRow(ILandroidx/compose/runtime/Composer;I)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/Navigation;-><clinit>()V
+HSPLcom/example/tvcomposebasedtests/tvComponents/Navigation;-><init>(Ljava/lang/String;ILjava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/Navigation;->values()[Lcom/example/tvcomposebasedtests/tvComponents/Navigation;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$1$1;-><init>(ILkotlin/jvm/functions/Function1;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$1$1;->invoke()Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$2;-><init>(Ljava/lang/String;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1;-><init>(IILjava/util/List;Lkotlin/jvm/functions/Function1;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$2$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$3$1;-><init>(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$4;-><init>(IILkotlin/jvm/functions/Function1;)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt;->PillIndicatorTabRow(Ljava/util/List;ILkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
+HSPLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt;->TopNavigation(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V
+HSPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;
+HSPLkotlin/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLkotlin/Result$Failure;-><init>(Ljava/lang/Throwable;)V
+HSPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable;
+HSPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Lkotlin/Result$Failure;
+HSPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V
+HSPLkotlin/SynchronizedLazyImpl;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object;
+HSPLkotlin/UNINITIALIZED_VALUE;-><clinit>()V
+HSPLkotlin/UNINITIALIZED_VALUE;-><init>()V
+HSPLkotlin/Unit;-><clinit>()V
+HSPLkotlin/Unit;-><init>()V
+HSPLkotlin/UnsafeLazyImpl;-><init>(Lkotlin/jvm/functions/Function0;)V
+HSPLkotlin/UnsafeLazyImpl;->getValue()Ljava/lang/Object;
+HSPLkotlin/UnsignedKt;->ulongToDouble(J)D
+HSPLkotlin/collections/AbstractCollection;-><init>()V
+HSPLkotlin/collections/AbstractCollection;->isEmpty()Z
+HSPLkotlin/collections/AbstractCollection;->size()I
+HSPLkotlin/collections/AbstractList;-><init>()V
+HSPLkotlin/collections/AbstractList;->equals(Ljava/lang/Object;)Z
+HSPLkotlin/collections/AbstractMap;-><init>()V
+HSPLkotlin/collections/AbstractMap;->entrySet()Ljava/util/Set;
+HSPLkotlin/collections/AbstractMap;->equals(Ljava/lang/Object;)Z
+HSPLkotlin/collections/AbstractMap;->size()I
+HSPLkotlin/collections/AbstractMutableList;-><init>()V
+HSPLkotlin/collections/AbstractMutableMap;-><init>()V
+HSPLkotlin/collections/AbstractSet;-><init>()V
+HSPLkotlin/collections/AbstractSet;->equals(Ljava/lang/Object;)Z
+HSPLkotlin/collections/ArrayDeque;-><clinit>()V
+HSPLkotlin/collections/ArrayDeque;-><init>()V
+HSPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V
+HSPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V
+HSPLkotlin/collections/ArrayDeque;->getSize()I
+HSPLkotlin/collections/ArrayDeque;->incremented(I)I
+HSPLkotlin/collections/ArrayDeque;->isEmpty()Z
+HSPLkotlin/collections/ArrayDeque;->positiveMod(I)I
+HSPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object;
+HSPLkotlin/collections/ArraysKt___ArraysKt;->asList([Ljava/lang/Object;)Ljava/util/List;
+HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto$default([I[III)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIII)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto([I[IIII)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->fill$default([Ljava/lang/Object;Lkotlinx/coroutines/internal/Symbol;)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->fill(II[Ljava/lang/Object;)V
+HSPLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I
+HSPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf(Ljava/lang/Object;)Ljava/util/List;
+HSPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf([Ljava/lang/Object;)Ljava/util/List;
+HSPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->collectionSizeOrDefault(Ljava/lang/Iterable;)I
+HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sortWith(Ljava/util/List;Ljava/util/Comparator;)V
+HSPLkotlin/collections/CollectionsKt__ReversedViewsKt;->addAll(Ljava/lang/Iterable;Ljava/util/Collection;)V
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object;
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object;
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object;
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->lastOrNull(Ljava/util/List;)Ljava/lang/Object;
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/ArrayList;
+HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/ArrayList;
+HSPLkotlin/collections/EmptyList;-><clinit>()V
+HSPLkotlin/collections/EmptyList;-><init>()V
+HSPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z
+HSPLkotlin/collections/EmptyList;->isEmpty()Z
+HSPLkotlin/collections/EmptyList;->size()I
+HSPLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object;
+HSPLkotlin/collections/EmptyMap;-><clinit>()V
+HSPLkotlin/collections/EmptyMap;-><init>()V
+HSPLkotlin/collections/EmptyMap;->isEmpty()Z
+HSPLkotlin/collections/EmptyMap;->size()I
+HSPLkotlin/collections/IntIterator;-><init>()V
+HSPLkotlin/collections/SetsKt__SetsKt;->mapCapacity(I)I
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;-><init>(Lkotlin/coroutines/CoroutineContext$Key;)V
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key;
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/AbstractCoroutineContextKey;-><init>(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V
+HSPLkotlin/coroutines/CombinedContext;-><init>(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/ContinuationInterceptor$Key;-><clinit>()V
+HSPLkotlin/coroutines/ContinuationInterceptor$Key;-><init>()V
+HSPLkotlin/coroutines/ContinuationKt;->access$lowestBitOf(J)I
+HSPLkotlin/coroutines/ContinuationKt;->binarySearch([II)I
+HSPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/CoroutineContext$plus$1;-><clinit>()V
+HSPLkotlin/coroutines/CoroutineContext$plus$1;-><init>()V
+HSPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlin/coroutines/EmptyCoroutineContext;-><clinit>()V
+HSPLkotlin/coroutines/EmptyCoroutineContext;-><init>()V
+HSPLkotlin/coroutines/EmptyCoroutineContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/SafeContinuation;-><clinit>()V
+HSPLkotlin/coroutines/SafeContinuation;-><init>(Lkotlin/coroutines/intrinsics/CoroutineSingletons;Lkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/SafeContinuation;->resumeWith(Ljava/lang/Object;)V
+HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;-><clinit>()V
+HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;-><init>(ILjava/lang/String;)V
+HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V
+HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;-><clinit>()V
+HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;-><init>()V
+HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V
+HSPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/jvm/internal/SuspendLambda;-><init>(ILkotlin/coroutines/Continuation;)V
+HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I
+HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I
+HSPLkotlin/jvm/JvmClassMappingKt;->Rect-tz77jQw(JJ)Landroidx/compose/ui/geometry/Rect;
+HSPLkotlin/jvm/JvmClassMappingKt;->resolveDefaults(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/TextStyle;
+HSPLkotlin/jvm/internal/CallableReference$NoReceiver;-><clinit>()V
+HSPLkotlin/jvm/internal/CallableReference$NoReceiver;-><init>()V
+HSPLkotlin/jvm/internal/CallableReference;-><init>(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V
+HSPLkotlin/jvm/internal/ClassReference;-><clinit>()V
+HSPLkotlin/jvm/internal/ClassReference;-><init>(Ljava/lang/Class;)V
+HSPLkotlin/jvm/internal/ClassReference;->getJClass()Ljava/lang/Class;
+HSPLkotlin/jvm/internal/CollectionToArray;-><clinit>()V
+HSPLkotlin/jvm/internal/CollectionToArray;->toArray(Ljava/util/Collection;)[Ljava/lang/Object;
+HSPLkotlin/jvm/internal/FunctionReference;-><init>(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V
+HSPLkotlin/jvm/internal/FunctionReference;->getArity()I
+HSPLkotlin/jvm/internal/FunctionReferenceImpl;-><init>(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V
+HSPLkotlin/jvm/internal/Intrinsics$$ExternalSyntheticCheckNotZero0;->m(ILjava/lang/String;)V
+HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V
+HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/Intrinsics;->compare(II)I
+HSPLkotlin/jvm/internal/Lambda;-><init>(I)V
+HSPLkotlin/jvm/internal/Lambda;->getArity()I
+HSPLkotlin/jvm/internal/MutablePropertyReference1;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/MutablePropertyReference1Impl;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/MutablePropertyReference;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/PropertyReference;-><init>(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)V
+HSPLkotlin/jvm/internal/Ref$BooleanRef;-><init>()V
+HSPLkotlin/jvm/internal/Ref$FloatRef;-><init>()V
+HSPLkotlin/jvm/internal/Ref$ObjectRef;-><init>()V
+HSPLkotlin/jvm/internal/Reflection;-><clinit>()V
+HSPLkotlin/jvm/internal/ReflectionFactory;-><init>()V
+HSPLkotlin/jvm/internal/TypeIntrinsics;->beforeCheckcastToFunctionOfArity(ILjava/lang/Object;)V
+HSPLkotlin/math/MathKt__MathJVMKt;->roundToInt(F)I
+HSPLkotlin/ranges/IntProgression;-><init>(III)V
+HSPLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator;
+HSPLkotlin/ranges/IntProgression;->iterator()Lkotlin/ranges/IntProgressionIterator;
+HSPLkotlin/ranges/IntProgressionIterator;-><init>(III)V
+HSPLkotlin/ranges/IntProgressionIterator;->hasNext()Z
+HSPLkotlin/ranges/IntProgressionIterator;->nextInt()I
+HSPLkotlin/ranges/IntRange;-><clinit>()V
+HSPLkotlin/ranges/IntRange;-><init>(II)V
+HSPLkotlin/ranges/IntRange;->equals(Ljava/lang/Object;)Z
+HSPLkotlin/ranges/IntRange;->isEmpty()Z
+HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(DDD)D
+HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(FFF)F
+HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(III)I
+HSPLkotlin/ranges/RangesKt___RangesKt;->until(II)Lkotlin/ranges/IntRange;
+HSPLkotlin/sequences/ConstrainedOnceSequence;-><init>(Lkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;)V
+HSPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator;
+HSPLkotlin/sequences/FilteringSequence$iterator$1;-><init>(Lkotlin/sequences/FilteringSequence;)V
+HSPLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V
+HSPLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z
+HSPLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object;
+HSPLkotlin/sequences/FilteringSequence;-><init>(Lkotlin/sequences/TransformingSequence;)V
+HSPLkotlin/sequences/GeneratorSequence$iterator$1;-><init>(Lkotlin/sequences/GeneratorSequence;)V
+HSPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V
+HSPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z
+HSPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object;
+HSPLkotlin/sequences/GeneratorSequence;-><init>(Lkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;Lkotlin/jvm/functions/Function1;)V
+HSPLkotlin/sequences/GeneratorSequence;->iterator()Ljava/util/Iterator;
+HSPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;-><init>(Ljava/util/Iterator;)V
+HSPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator;
+HSPLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;-><init>(Ljava/lang/Object;)V
+HSPLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;->invoke()Ljava/lang/Object;
+HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence;
+HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;-><clinit>()V
+HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;-><init>()V
+HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlin/sequences/SequencesKt___SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List;
+HSPLkotlin/sequences/TransformingSequence$iterator$1;-><init>(Lkotlin/sequences/TransformingSequence;)V
+HSPLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z
+HSPLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object;
+HSPLkotlin/sequences/TransformingSequence;-><init>(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)V
+HSPLkotlin/sequences/TransformingSequence;->iterator()Ljava/util/Iterator;
+HSPLkotlin/text/CharsKt__CharKt;->checkRadix(I)V
+HSPLkotlin/text/CharsKt__CharKt;->isWhitespace(C)Z
+HSPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z
+HSPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/String;)Z
+HSPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I
+HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;II)I
+HSPLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;)Ljava/lang/String;
+HSPLkotlinx/coroutines/AbstractCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Z)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String;
+HSPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z
+HSPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/AbstractCoroutine;->start$enumunboxing$(ILkotlinx/coroutines/AbstractCoroutine;Lkotlin/jvm/functions/Function2;)V
+HSPLkotlinx/coroutines/Active;-><clinit>()V
+HSPLkotlinx/coroutines/Active;-><init>()V
+HSPLkotlinx/coroutines/BeforeResumeCancelHandler;-><init>()V
+HSPLkotlinx/coroutines/BlockingEventLoop;-><init>(Ljava/lang/Thread;)V
+HSPLkotlinx/coroutines/BuildersKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/AbstractCoroutineContextElement;ILkotlin/jvm/functions/Function2;I)Lkotlinx/coroutines/StandaloneCoroutine;
+HSPLkotlinx/coroutines/BuildersKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/StandaloneCoroutine;
+HSPLkotlinx/coroutines/BuildersKt;->withContext(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CancelHandler;-><init>()V
+HSPLkotlinx/coroutines/CancelHandlerBase;-><init>()V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;-><clinit>()V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;-><init>(ILkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume()V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/JobSupport;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->resetStateReusable()Z
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Object;ILkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/CancellableContinuationImplKt;-><clinit>()V
+HSPLkotlinx/coroutines/CancellableContinuationKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl;
+HSPLkotlinx/coroutines/CancelledContinuation;-><clinit>()V
+HSPLkotlinx/coroutines/CancelledContinuation;-><init>(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V
+HSPLkotlinx/coroutines/ChildContinuation;-><init>(Lkotlinx/coroutines/CancellableContinuationImpl;)V
+HSPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/ChildHandleNode;-><init>(Lkotlinx/coroutines/JobSupport;)V
+HSPLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z
+HSPLkotlinx/coroutines/CompletedContinuation;-><init>(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/CompletedContinuation;-><init>(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/util/concurrent/CancellationException;I)V
+HSPLkotlinx/coroutines/CompletedExceptionally;-><clinit>()V
+HSPLkotlinx/coroutines/CompletedExceptionally;-><init>(Ljava/lang/Throwable;Z)V
+HSPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z
+HSPLkotlinx/coroutines/CompletionHandlerBase;-><init>()V
+HSPLkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;-><clinit>()V
+HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;-><init>()V
+HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CoroutineContextKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/CoroutineDispatcher$Key$1;-><clinit>()V
+HSPLkotlinx/coroutines/CoroutineDispatcher$Key$1;-><init>()V
+HSPLkotlinx/coroutines/CoroutineDispatcher$Key;-><init>()V
+HSPLkotlinx/coroutines/CoroutineDispatcher;-><clinit>()V
+HSPLkotlinx/coroutines/CoroutineDispatcher;-><init>()V
+HSPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlinx/coroutines/CoroutineDispatcher;->interceptContinuation(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Lkotlinx/coroutines/internal/DispatchedContinuation;
+HSPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded()Z
+HSPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/CoroutineDispatcher;->releaseInterceptedContinuation(Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/CoroutineExceptionHandler$Key;-><clinit>()V
+HSPLkotlinx/coroutines/CoroutineExceptionHandler$Key;-><init>()V
+HSPLkotlinx/coroutines/CoroutineScopeKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/internal/ContextScope;
+HSPLkotlinx/coroutines/CoroutineScopeKt;->cancel$default(Lkotlinx/coroutines/CoroutineScope;)V
+HSPLkotlinx/coroutines/CoroutineScopeKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/CoroutineScopeKt;->isActive(Lkotlinx/coroutines/CoroutineScope;)Z
+HSPLkotlinx/coroutines/CoroutineScopeKt;->modifierLocalOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+HSPLkotlinx/coroutines/DefaultExecutor;-><clinit>()V
+HSPLkotlinx/coroutines/DefaultExecutor;-><init>()V
+HSPLkotlinx/coroutines/DefaultExecutorKt;-><clinit>()V
+HSPLkotlinx/coroutines/DispatchedTask;-><init>(I)V
+HSPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/DispatchedTask;->handleFatalException(Ljava/lang/Throwable;Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/DispatchedTask;->run()V
+HSPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V
+HSPLkotlinx/coroutines/Dispatchers;-><clinit>()V
+HSPLkotlinx/coroutines/Empty;-><init>(Z)V
+HSPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList;
+HSPLkotlinx/coroutines/Empty;->isActive()Z
+HSPLkotlinx/coroutines/EventLoop;-><init>()V
+HSPLkotlinx/coroutines/EventLoop;->decrementUseCount(Z)V
+HSPLkotlinx/coroutines/EventLoop;->incrementUseCount(Z)V
+HSPLkotlinx/coroutines/EventLoop;->isUnconfinedLoopActive()Z
+HSPLkotlinx/coroutines/EventLoop;->processUnconfinedEvent()Z
+HSPLkotlinx/coroutines/EventLoopImplBase;-><clinit>()V
+HSPLkotlinx/coroutines/EventLoopImplBase;-><init>()V
+HSPLkotlinx/coroutines/EventLoopImplPlatform;-><init>()V
+HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher;-><clinit>()V
+HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher;-><init>()V
+HSPLkotlinx/coroutines/GlobalScope;-><clinit>()V
+HSPLkotlinx/coroutines/GlobalScope;-><init>()V
+HSPLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/InvokeOnCancel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/InvokeOnCompletion;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/Job$DefaultImpls;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;I)Lkotlinx/coroutines/DisposableHandle;
+HSPLkotlinx/coroutines/Job$Key;-><clinit>()V
+HSPLkotlinx/coroutines/Job$Key;-><init>()V
+HSPLkotlinx/coroutines/JobCancellationException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V
+HSPLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/JobCancellingNode;-><init>()V
+HSPLkotlinx/coroutines/JobImpl;-><init>(Lkotlinx/coroutines/Job;)V
+HSPLkotlinx/coroutines/JobImpl;->getHandlesException$kotlinx_coroutines_core()Z
+HSPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z
+HSPLkotlinx/coroutines/JobKt;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlinx/coroutines/JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job;
+HSPLkotlinx/coroutines/JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z
+HSPLkotlinx/coroutines/JobNode;-><init>()V
+HSPLkotlinx/coroutines/JobNode;->dispose()V
+HSPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport;
+HSPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList;
+HSPLkotlinx/coroutines/JobNode;->isActive()Z
+HSPLkotlinx/coroutines/JobSupport$ChildCompletion;-><init>(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/JobSupport$Finishing;-><init>(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList;
+HSPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z
+HSPLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z
+HSPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/ArrayList;
+HSPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting()V
+HSPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/JobSupport;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/JobSupport;-><clinit>()V
+HSPLkotlinx/coroutines/JobSupport;-><init>(Z)V
+HSPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/JobSupport;)Lkotlinx/coroutines/ChildHandle;
+HSPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V
+HSPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/util/concurrent/CancellationException;)V
+HSPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z
+HSPLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String;
+HSPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z
+HSPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException;
+HSPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/ArrayList;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key;
+HSPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z
+HSPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList;
+HSPLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle;
+HSPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V
+HSPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle;
+HSPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(ZZLkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle;
+HSPLkotlinx/coroutines/JobSupport;->isActive()Z
+HSPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z
+HSPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode;
+HSPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/JobSupport;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/JobSupport;->promoteSingleToNodeList(Lkotlinx/coroutines/JobNode;)V
+HSPLkotlinx/coroutines/JobSupport;->start()Z
+HSPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I
+HSPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/JobSupportKt;-><clinit>()V
+HSPLkotlinx/coroutines/JobSupportKt;-><init>()V
+HSPLkotlinx/coroutines/MainCoroutineDispatcher;-><init>()V
+HSPLkotlinx/coroutines/NodeList;-><init>()V
+HSPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList;
+HSPLkotlinx/coroutines/NodeList;->isActive()Z
+HSPLkotlinx/coroutines/NonDisposableHandle;-><clinit>()V
+HSPLkotlinx/coroutines/NonDisposableHandle;-><init>()V
+HSPLkotlinx/coroutines/NonDisposableHandle;->dispose()V
+HSPLkotlinx/coroutines/RemoveOnCancel;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V
+HSPLkotlinx/coroutines/StandaloneCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Z)V
+HSPLkotlinx/coroutines/SupervisorJobImpl;-><init>(Lkotlinx/coroutines/Job;)V
+HSPLkotlinx/coroutines/ThreadLocalEventLoop;-><clinit>()V
+HSPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoop;
+HSPLkotlinx/coroutines/Unconfined;-><clinit>()V
+HSPLkotlinx/coroutines/Unconfined;-><init>()V
+HSPLkotlinx/coroutines/UndispatchedCoroutine;-><init>(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlinx/coroutines/UndispatchedMarker;-><clinit>()V
+HSPLkotlinx/coroutines/UndispatchedMarker;-><init>()V
+HSPLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
+HSPLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key;
+HSPLkotlinx/coroutines/android/AndroidDispatcherFactory;-><init>()V
+HSPLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher;
+HSPLkotlinx/coroutines/android/HandlerContext;-><init>(Landroid/os/Handler;)V
+HSPLkotlinx/coroutines/android/HandlerContext;-><init>(Landroid/os/Handler;Ljava/lang/String;Z)V
+HSPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V
+HSPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded()Z
+HSPLkotlinx/coroutines/android/HandlerDispatcher;-><init>()V
+HSPLkotlinx/coroutines/android/HandlerDispatcherKt;-><clinit>()V
+HSPLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;)Landroid/os/Handler;
+HSPLkotlinx/coroutines/channels/AbstractChannel$Itr;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$Itr;->hasNext(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel$Itr;->next()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;-><init>(Lkotlinx/coroutines/CancellableContinuationImpl;I)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->completeResumeReceive(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->tryResumeReceive(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;-><init>(Lkotlinx/coroutines/channels/AbstractChannel$Itr;Lkotlinx/coroutines/CancellableContinuationImpl;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;->completeResumeReceive(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;->resumeOnCancellationFun(Ljava/lang/Object;)Lkotlin/jvm/functions/Function1;
+HSPLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;->tryResumeReceive(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlinx/coroutines/channels/Receive;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;->invoke(Ljava/lang/Throwable;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$enqueueReceiveInternal$$inlined$addLastIfPrevAndIf$1;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$enqueueReceiveInternal$$inlined$addLastIfPrevAndIf$1;->prepare(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/AbstractChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z
+HSPLkotlinx/coroutines/channels/AbstractChannel;->iterator()Lkotlinx/coroutines/channels/ChannelIterator;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->pollInternal()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->receive(Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->receiveSuspend(ILkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed;
+HSPLkotlinx/coroutines/channels/AbstractChannel;->tryReceive-PtdJZtk()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractChannelKt;-><clinit>()V
+HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->completeResumeSend()V
+HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->getPollResult()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->tryResumeSend()Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;-><clinit>()V
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->getClosedForSend()Lkotlinx/coroutines/channels/Closed;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstSendOrPeekClosed()Lkotlinx/coroutines/channels/Send;
+HSPLkotlinx/coroutines/channels/AbstractSendChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ArrayChannel;-><init>(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/ArrayChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z
+HSPLkotlinx/coroutines/channels/ArrayChannel;->isBufferAlwaysEmpty()Z
+HSPLkotlinx/coroutines/channels/ArrayChannel;->isBufferEmpty()Z
+HSPLkotlinx/coroutines/channels/ArrayChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ArrayChannel;->pollInternal()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/BufferOverflow;-><clinit>()V
+HSPLkotlinx/coroutines/channels/BufferOverflow;-><init>(ILjava/lang/String;)V
+HSPLkotlinx/coroutines/channels/Channel$Factory;-><clinit>()V
+HSPLkotlinx/coroutines/channels/Channel$Factory;-><init>()V
+HSPLkotlinx/coroutines/channels/Channel;-><clinit>()V
+HSPLkotlinx/coroutines/channels/ChannelCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLkotlinx/coroutines/channels/ChannelCoroutine;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ChannelCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ChannelKt;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;I)Lkotlinx/coroutines/channels/AbstractChannel;
+HSPLkotlinx/coroutines/channels/ChannelKt;->invokeComposable(Landroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;)V
+HSPLkotlinx/coroutines/channels/ChannelResult$Failed;-><init>()V
+HSPLkotlinx/coroutines/channels/ChannelResult;-><clinit>()V
+HSPLkotlinx/coroutines/channels/ChannelResult;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/channels/ChannelResult;->getOrThrow-impl(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/channels/ConflatedChannel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/ConflatedChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z
+HSPLkotlinx/coroutines/channels/ConflatedChannel;->isBufferAlwaysEmpty()Z
+HSPLkotlinx/coroutines/channels/ConflatedChannel;->isBufferEmpty()Z
+HSPLkotlinx/coroutines/channels/ConflatedChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ConflatedChannel;->pollInternal()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/LinkedListChannel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/LinkedListChannel;->isBufferAlwaysEmpty()Z
+HSPLkotlinx/coroutines/channels/LinkedListChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/ProducerCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/AbstractChannel;)V
+HSPLkotlinx/coroutines/channels/Receive;-><init>()V
+HSPLkotlinx/coroutines/channels/Receive;->getOfferResult()Ljava/lang/Object;
+HSPLkotlinx/coroutines/channels/Receive;->resumeOnCancellationFun(Ljava/lang/Object;)Lkotlin/jvm/functions/Function1;
+HSPLkotlinx/coroutines/channels/RendezvousChannel;-><init>(Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/channels/RendezvousChannel;->isBufferAlwaysEmpty()Z
+HSPLkotlinx/coroutines/channels/Send;-><init>()V
+HSPLkotlinx/coroutines/flow/AbstractFlow$collect$1;-><init>(Lkotlinx/coroutines/flow/AbstractFlow;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/AbstractFlow;-><init>()V
+HSPLkotlinx/coroutines/flow/AbstractFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;-><init>(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;-><init>(Lkotlinx/coroutines/flow/DistinctFlowImpl;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V
+HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/DistinctFlowImpl;-><init>(Lkotlinx/coroutines/flow/Flow;)V
+HSPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState;
+HSPLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow;
+HSPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState;
+HSPLkotlinx/coroutines/flow/FlowKt;->mutableStateOf(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState;
+HSPLkotlinx/coroutines/flow/FlowKt;->observeDerivedStateRecalculations(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V
+HSPLkotlinx/coroutines/flow/FlowKt;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState;
+HSPLkotlinx/coroutines/flow/FlowKt;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/SafeFlow;
+HSPLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/SafeFlow;Lkotlinx/coroutines/internal/ContextScope;Lkotlinx/coroutines/flow/StartedWhileSubscribed;Ljava/lang/Float;)Lkotlinx/coroutines/flow/ReadonlyStateFlow;
+HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ProducerCoroutine;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;-><clinit>()V
+HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;-><init>()V
+HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;-><clinit>()V
+HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;-><init>()V
+HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;)V
+HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;-><init>(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V
+HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;-><init>(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;-><init>(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlinx/coroutines/StandaloneCoroutine;)V
+HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SafeFlow;-><init>(Lkotlin/jvm/functions/Function2;)V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;-><init>(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;-><init>(IILkotlinx/coroutines/channels/BufferOverflow;)V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/intrinsics/CoroutineSingletons;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer(II[Ljava/lang/Object;)[Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V
+HSPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/SharedFlowKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/SharedFlowSlot;-><init>()V
+HSPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)Z
+HSPLkotlinx/coroutines/flow/SharingCommand;-><clinit>()V
+HSPLkotlinx/coroutines/flow/SharingCommand;-><init>(ILjava/lang/String;)V
+HSPLkotlinx/coroutines/flow/SharingConfig;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;)V
+HSPLkotlinx/coroutines/flow/SharingStarted$Companion;-><clinit>()V
+HSPLkotlinx/coroutines/flow/StartedEagerly;-><init>()V
+HSPLkotlinx/coroutines/flow/StartedLazily;-><init>()V
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;-><init>(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;-><init>(Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;-><init>(JJ)V
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/StateFlow;)Lkotlinx/coroutines/flow/Flow;
+HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;-><init>(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StateFlowImpl;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z
+HSPLkotlinx/coroutines/flow/StateFlowKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/StateFlowSlot;-><clinit>()V
+HSPLkotlinx/coroutines/flow/StateFlowSlot;-><init>()V
+HSPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)Z
+HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;
+HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;-><init>(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow;-><init>(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;-><init>(ILkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/flow/Flow;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;-><init>(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow;
+HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/NoOpContinuation;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/NoOpContinuation;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/NopCollector;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/NopCollector;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/NullSurrogateKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SafeCollector;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;-><init>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt;-><clinit>()V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;-><init>(Lkotlinx/coroutines/flow/internal/SafeCollector;)V
+HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SendingCollector;-><init>(Lkotlinx/coroutines/channels/SendChannel;)V
+HSPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;-><init>(I)V
+HSPLkotlinx/coroutines/internal/AtomicKt;-><clinit>()V
+HSPLkotlinx/coroutines/internal/AtomicOp;-><clinit>()V
+HSPLkotlinx/coroutines/internal/AtomicOp;-><init>()V
+HSPLkotlinx/coroutines/internal/AtomicOp;->perform(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/internal/ContextScope;-><init>(Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;-><clinit>()V
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;-><init>(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation()Lkotlinx/coroutines/CancellableContinuationImpl;
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation;
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable()Z
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation(Ljava/lang/Throwable;)Z
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->release()V
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object;
+HSPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable;
+HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;-><clinit>()V
+HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V
+HSPLkotlinx/coroutines/internal/LimitedDispatcher;-><init>(Lkotlinx/coroutines/scheduling/UnlimitedIoScheduler;I)V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListHead;-><init>()V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;-><clinit>()V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;-><init>()V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListHead;)Z
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->correctPrev()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object;
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove$1()Z
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->removeOrNext()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;
+HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->tryCondAddNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;)I
+HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;-><clinit>()V
+HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;-><init>()V
+HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;-><clinit>()V
+HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;-><init>(IZ)V
+HSPLkotlinx/coroutines/internal/MainDispatcherLoader$$ExternalSyntheticServiceLoad0;->m()Ljava/util/Iterator;
+HSPLkotlinx/coroutines/internal/MainDispatcherLoader;-><clinit>()V
+HSPLkotlinx/coroutines/internal/OpDescriptor;-><init>()V
+HSPLkotlinx/coroutines/internal/Removed;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V
+HSPLkotlinx/coroutines/internal/ResizableAtomicArray;-><init>(I)V
+HSPLkotlinx/coroutines/internal/ScopeCoroutine;-><init>(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V
+HSPLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z
+HSPLkotlinx/coroutines/internal/Symbol;-><init>(Ljava/lang/String;)V
+HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;-><clinit>()V
+HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;-><clinit>()V
+HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;-><init>()V
+HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/internal/ThreadContextKt;-><clinit>()V
+HSPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Lkotlinx/coroutines/internal/ScopeCoroutine;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;-><init>(IIJLjava/lang/String;)V
+HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;-><init>()V
+HSPLkotlinx/coroutines/scheduling/DefaultScheduler;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/DefaultScheduler;-><init>()V
+HSPLkotlinx/coroutines/scheduling/GlobalQueue;-><init>()V
+HSPLkotlinx/coroutines/scheduling/NanoTimeSource;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/NanoTimeSource;-><init>()V
+HSPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;-><init>(IIJ)V
+HSPLkotlinx/coroutines/scheduling/SchedulerTimeSource;-><init>()V
+HSPLkotlinx/coroutines/scheduling/Task;-><init>()V
+HSPLkotlinx/coroutines/scheduling/TaskContextImpl;-><init>(I)V
+HSPLkotlinx/coroutines/scheduling/TaskContextImpl;->afterTask()V
+HSPLkotlinx/coroutines/scheduling/TasksKt;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;-><clinit>()V
+HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;-><init>()V
+HSPLkotlinx/coroutines/sync/Empty;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockCont$tryResumeLockWaiter$1;-><init>(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/sync/MutexImpl$LockCont;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockCont;-><init>(Lkotlinx/coroutines/sync/MutexImpl;Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuationImpl;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockCont;->completeResumeLockWaiter()V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockCont;->tryResumeLockWaiter()Z
+HSPLkotlinx/coroutines/sync/MutexImpl$LockWaiter;-><clinit>()V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockWaiter;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$LockedQueue;-><init>(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$UnlockOp;-><init>(Lkotlinx/coroutines/sync/MutexImpl$LockedQueue;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$UnlockOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/sync/MutexImpl$UnlockOp;->prepare(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Symbol;
+HSPLkotlinx/coroutines/sync/MutexImpl;-><clinit>()V
+HSPLkotlinx/coroutines/sync/MutexImpl;-><init>(Z)V
+HSPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+HSPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V
+HSPLkotlinx/coroutines/sync/MutexKt;-><clinit>()V
+Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;
+Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;
+Landroidx/activity/ComponentActivity$$ExternalSyntheticOutline0;
+Landroidx/activity/ComponentActivity$1;
+Landroidx/activity/ComponentActivity$2;
+Landroidx/activity/ComponentActivity$3;
+Landroidx/activity/ComponentActivity$4;
+Landroidx/activity/ComponentActivity$5;
+Landroidx/activity/ComponentActivity$NonConfigurationInstances;
+Landroidx/activity/ComponentActivity;
+Landroidx/activity/OnBackPressedDispatcher;
+Landroidx/activity/compose/ComponentActivityKt;
+Landroidx/activity/contextaware/ContextAwareHelper;
+Landroidx/activity/contextaware/OnContextAvailableListener;
+Landroidx/activity/result/ActivityResultRegistry;
+Landroidx/arch/core/executor/ArchTaskExecutor;
+Landroidx/arch/core/executor/DefaultTaskExecutor$1;
+Landroidx/arch/core/executor/DefaultTaskExecutor;
+Landroidx/arch/core/executor/TaskExecutor;
+Landroidx/arch/core/internal/FastSafeIterableMap;
+Landroidx/arch/core/internal/SafeIterableMap$AscendingIterator;
+Landroidx/arch/core/internal/SafeIterableMap$Entry;
+Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;
+Landroidx/arch/core/internal/SafeIterableMap$ListIterator;
+Landroidx/arch/core/internal/SafeIterableMap$SupportRemove;
+Landroidx/arch/core/internal/SafeIterableMap;
+Landroidx/collection/ArraySet;
+Landroidx/collection/ContainerHelpers;
+Landroidx/collection/SimpleArrayMap;
+Landroidx/collection/SparseArrayCompat;
+Landroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$1;
+Landroidx/compose/animation/ColorVectorConverterKt$ColorToVector$1$2;
+Landroidx/compose/animation/ColorVectorConverterKt;
+Landroidx/compose/animation/FlingCalculator;
+Landroidx/compose/animation/FlingCalculatorKt;
+Landroidx/compose/animation/SingleValueAnimationKt;
+Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;
+Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;
+Landroidx/compose/animation/core/Animatable$runAnimation$2$1;
+Landroidx/compose/animation/core/Animatable$runAnimation$2;
+Landroidx/compose/animation/core/Animatable;
+Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;
+Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;
+Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;
+Landroidx/compose/animation/core/AnimateAsStateKt;
+Landroidx/compose/animation/core/Animation;
+Landroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;
+Landroidx/compose/animation/core/AnimationResult;
+Landroidx/compose/animation/core/AnimationScope;
+Landroidx/compose/animation/core/AnimationSpec;
+Landroidx/compose/animation/core/AnimationState;
+Landroidx/compose/animation/core/AnimationVector1D;
+Landroidx/compose/animation/core/AnimationVector4D;
+Landroidx/compose/animation/core/AnimationVector;
+Landroidx/compose/animation/core/Animations;
+Landroidx/compose/animation/core/ComplexDouble;
+Landroidx/compose/animation/core/ComplexDoubleKt;
+Landroidx/compose/animation/core/DecayAnimationSpec;
+Landroidx/compose/animation/core/DecayAnimationSpecImpl;
+Landroidx/compose/animation/core/FiniteAnimationSpec;
+Landroidx/compose/animation/core/FloatAnimationSpec;
+Landroidx/compose/animation/core/FloatDecayAnimationSpec;
+Landroidx/compose/animation/core/FloatSpringSpec;
+Landroidx/compose/animation/core/MutatorMutex$Mutator;
+Landroidx/compose/animation/core/MutatorMutex$mutate$2;
+Landroidx/compose/animation/core/MutatorMutex;
+Landroidx/compose/animation/core/SpringSimulation;
+Landroidx/compose/animation/core/SpringSpec;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$3;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$4;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$6$1;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$6;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$7;
+Landroidx/compose/animation/core/SuspendAnimationKt$animate$9;
+Landroidx/compose/animation/core/SuspendAnimationKt$callWithFrameNanos$2;
+Landroidx/compose/animation/core/SuspendAnimationKt;
+Landroidx/compose/animation/core/TargetBasedAnimation;
+Landroidx/compose/animation/core/TwoWayConverter;
+Landroidx/compose/animation/core/TwoWayConverterImpl;
+Landroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$DpOffsetToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$DpToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$DpToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$FloatToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$FloatToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$IntToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$IntToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$OffsetToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$RectToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$RectToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt$SizeToVector$1;
+Landroidx/compose/animation/core/VectorConvertersKt$SizeToVector$2;
+Landroidx/compose/animation/core/VectorConvertersKt;
+Landroidx/compose/animation/core/VectorizedAnimationSpec;
+Landroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$1;
+Landroidx/compose/animation/core/VectorizedAnimationSpecKt$createSpringAnimations$2;
+Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec;
+Landroidx/compose/animation/core/VectorizedFloatAnimationSpec;
+Landroidx/compose/animation/core/VectorizedSpringSpec;
+Landroidx/compose/animation/core/VisibilityThresholdsKt;
+Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;
+Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;
+Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$onNewSize$1;
+Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;
+Landroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1;
+Landroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1;
+Landroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1;
+Landroidx/compose/foundation/AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2;
+Landroidx/compose/foundation/AndroidOverscrollKt;
+Landroidx/compose/foundation/Api31Impl$$ExternalSyntheticApiModelOutline1;
+Landroidx/compose/foundation/Api31Impl;
+Landroidx/compose/foundation/Background;
+Landroidx/compose/foundation/BackgroundKt;
+Landroidx/compose/foundation/BorderCache;
+Landroidx/compose/foundation/BorderKt$border$2$1;
+Landroidx/compose/foundation/BorderKt$border$2;
+Landroidx/compose/foundation/BorderKt$drawContentWithoutBorder$1;
+Landroidx/compose/foundation/BorderKt$drawGenericBorder$1;
+Landroidx/compose/foundation/BorderKt$drawRectBorder$1;
+Landroidx/compose/foundation/BorderKt$drawRoundRectBorder$1;
+Landroidx/compose/foundation/BorderKt$drawRoundRectBorder$2;
+Landroidx/compose/foundation/BorderKt;
+Landroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1;
+Landroidx/compose/foundation/ClickableKt$clickable$2;
+Landroidx/compose/foundation/ClickableKt$clickable$4$1$1;
+Landroidx/compose/foundation/ClickableKt$clickable$4$delayPressInteraction$1$1;
+Landroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$1;
+Landroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1$2;
+Landroidx/compose/foundation/ClickableKt$clickable$4$gesture$1$1;
+Landroidx/compose/foundation/ClickableKt$clickable$4;
+Landroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1$1;
+Landroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$clickSemantics$1;
+Landroidx/compose/foundation/ClickableKt$genericClickableWithoutGesture$detectPressAndClickFromKey$1;
+Landroidx/compose/foundation/ClickableKt;
+Landroidx/compose/foundation/Clickable_androidKt$isComposeRootInScrollableContainer$1;
+Landroidx/compose/foundation/Clickable_androidKt;
+Landroidx/compose/foundation/ClipScrollableContainerKt$HorizontalScrollableClipModifier$1;
+Landroidx/compose/foundation/ClipScrollableContainerKt$VerticalScrollableClipModifier$1;
+Landroidx/compose/foundation/ClipScrollableContainerKt;
+Landroidx/compose/foundation/DefaultDebugIndication$DefaultDebugIndicationInstance;
+Landroidx/compose/foundation/DefaultDebugIndication;
+Landroidx/compose/foundation/DrawOverscrollModifier;
+Landroidx/compose/foundation/EdgeEffectCompat;
+Landroidx/compose/foundation/FocusableKt$focusGroup$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$1$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$1$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$2$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$2;
+Landroidx/compose/foundation/FocusableKt$focusable$2$3$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$3$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$4$1$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$4$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$5$1;
+Landroidx/compose/foundation/FocusableKt$focusable$2$5$2;
+Landroidx/compose/foundation/FocusableKt$focusable$2$5;
+Landroidx/compose/foundation/FocusableKt$focusable$2;
+Landroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2$1;
+Landroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$2;
+Landroidx/compose/foundation/FocusableKt;
+Landroidx/compose/foundation/FocusedBoundsKt$ModifierLocalFocusedBoundsObserver$1;
+Landroidx/compose/foundation/FocusedBoundsKt$onFocusedBoundsChanged$2;
+Landroidx/compose/foundation/FocusedBoundsKt;
+Landroidx/compose/foundation/FocusedBoundsModifier;
+Landroidx/compose/foundation/FocusedBoundsObserverModifier;
+Landroidx/compose/foundation/HoverableKt$hoverable$2$1$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/HoverableKt$hoverable$2$1$1;
+Landroidx/compose/foundation/HoverableKt$hoverable$2$2$1;
+Landroidx/compose/foundation/HoverableKt$hoverable$2$3$1;
+Landroidx/compose/foundation/HoverableKt$hoverable$2$3;
+Landroidx/compose/foundation/HoverableKt$hoverable$2;
+Landroidx/compose/foundation/ImageKt$Image$2$measure$1;
+Landroidx/compose/foundation/ImageKt$Image$2;
+Landroidx/compose/foundation/ImageKt$Image$3;
+Landroidx/compose/foundation/ImageKt$Image$semantics$1$1;
+Landroidx/compose/foundation/ImageKt;
+Landroidx/compose/foundation/Indication;
+Landroidx/compose/foundation/IndicationInstance;
+Landroidx/compose/foundation/IndicationKt$LocalIndication$1;
+Landroidx/compose/foundation/IndicationKt$indication$2;
+Landroidx/compose/foundation/IndicationKt;
+Landroidx/compose/foundation/IndicationModifier;
+Landroidx/compose/foundation/MutatePriority;
+Landroidx/compose/foundation/MutatorMutex$Mutator;
+Landroidx/compose/foundation/MutatorMutex$mutateWith$2;
+Landroidx/compose/foundation/MutatorMutex;
+Landroidx/compose/foundation/OverscrollConfiguration;
+Landroidx/compose/foundation/OverscrollConfigurationKt$LocalOverscrollConfiguration$1;
+Landroidx/compose/foundation/OverscrollConfigurationKt;
+Landroidx/compose/foundation/OverscrollEffect;
+Landroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;
+Landroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1;
+Landroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$1;
+Landroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$accessibilityScrollState$2;
+Landroidx/compose/foundation/ScrollKt$scroll$2$semantics$1;
+Landroidx/compose/foundation/ScrollKt$scroll$2;
+Landroidx/compose/foundation/ScrollState$Companion$Saver$1;
+Landroidx/compose/foundation/ScrollState$Companion$Saver$2;
+Landroidx/compose/foundation/ScrollState$canScrollBackward$2;
+Landroidx/compose/foundation/ScrollState$canScrollForward$2;
+Landroidx/compose/foundation/ScrollState$scrollableState$1;
+Landroidx/compose/foundation/ScrollState;
+Landroidx/compose/foundation/ScrollingLayoutModifier$measure$1;
+Landroidx/compose/foundation/ScrollingLayoutModifier;
+Landroidx/compose/foundation/gestures/AndroidConfig;
+Landroidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue;
+Landroidx/compose/foundation/gestures/ContentInViewModifier$Request;
+Landroidx/compose/foundation/gestures/ContentInViewModifier$modifier$1;
+Landroidx/compose/foundation/gestures/ContentInViewModifier;
+Landroidx/compose/foundation/gestures/DefaultFlingBehavior;
+Landroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2$1;
+Landroidx/compose/foundation/gestures/DefaultScrollableState$scroll$2;
+Landroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;
+Landroidx/compose/foundation/gestures/DefaultScrollableState;
+Landroidx/compose/foundation/gestures/DragLogic;
+Landroidx/compose/foundation/gestures/DragScope;
+Landroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$1;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$6;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$2;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1$1;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$3$1;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9$3;
+Landroidx/compose/foundation/gestures/DraggableKt$draggable$9;
+Landroidx/compose/foundation/gestures/DraggableKt;
+Landroidx/compose/foundation/gestures/DraggableState;
+Landroidx/compose/foundation/gestures/FlingBehavior;
+Landroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;
+Landroidx/compose/foundation/gestures/ForEachGestureKt;
+Landroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;
+Landroidx/compose/foundation/gestures/Orientation;
+Landroidx/compose/foundation/gestures/PressGestureScope;
+Landroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;
+Landroidx/compose/foundation/gestures/PressGestureScopeImpl;
+Landroidx/compose/foundation/gestures/ScrollConfig;
+Landroidx/compose/foundation/gestures/ScrollDraggableState;
+Landroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$1;
+Landroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2$1;
+Landroidx/compose/foundation/gestures/ScrollExtensionsKt$animateScrollBy$2;
+Landroidx/compose/foundation/gestures/ScrollExtensionsKt;
+Landroidx/compose/foundation/gestures/ScrollScope;
+Landroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$awaitScrollEvent$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$mouseWheelScroll$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$2$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$pointerScrollable$3$1;
+Landroidx/compose/foundation/gestures/ScrollableKt$scrollable$2;
+Landroidx/compose/foundation/gestures/ScrollableKt$scrollableNestedScrollConnection$1;
+Landroidx/compose/foundation/gestures/ScrollableKt;
+Landroidx/compose/foundation/gestures/ScrollableState;
+Landroidx/compose/foundation/gestures/ScrollingLogic;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt$NoPressGesture$1;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;
+Landroidx/compose/foundation/gestures/TapGestureDetectorKt;
+Landroidx/compose/foundation/gestures/UpdatableAnimationState;
+Landroidx/compose/foundation/interaction/FocusInteraction$Focus;
+Landroidx/compose/foundation/interaction/FocusInteraction$Unfocus;
+Landroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1$1;
+Landroidx/compose/foundation/interaction/FocusInteractionKt$collectIsFocusedAsState$1$1;
+Landroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1$1;
+Landroidx/compose/foundation/interaction/HoverInteractionKt$collectIsHoveredAsState$1$1;
+Landroidx/compose/foundation/interaction/Interaction;
+Landroidx/compose/foundation/interaction/InteractionSource;
+Landroidx/compose/foundation/interaction/MutableInteractionSource;
+Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;
+Landroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1$1;
+Landroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;
+Landroidx/compose/foundation/layout/Arrangement$Bottom$1;
+Landroidx/compose/foundation/layout/Arrangement$Center$1;
+Landroidx/compose/foundation/layout/Arrangement$End$1;
+Landroidx/compose/foundation/layout/Arrangement$Horizontal;
+Landroidx/compose/foundation/layout/Arrangement$HorizontalOrVertical;
+Landroidx/compose/foundation/layout/Arrangement$SpaceAround$1;
+Landroidx/compose/foundation/layout/Arrangement$SpaceBetween$1;
+Landroidx/compose/foundation/layout/Arrangement$SpaceEvenly$1;
+Landroidx/compose/foundation/layout/Arrangement$SpacedAligned;
+Landroidx/compose/foundation/layout/Arrangement$Start$1;
+Landroidx/compose/foundation/layout/Arrangement$Top$1;
+Landroidx/compose/foundation/layout/Arrangement$Vertical;
+Landroidx/compose/foundation/layout/Arrangement$spacedBy$1;
+Landroidx/compose/foundation/layout/Arrangement;
+Landroidx/compose/foundation/layout/BoxChildData;
+Landroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1$measure$1;
+Landroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;
+Landroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;
+Landroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;
+Landroidx/compose/foundation/layout/BoxKt;
+Landroidx/compose/foundation/layout/ColumnKt$DefaultColumnMeasurePolicy$1;
+Landroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;
+Landroidx/compose/foundation/layout/ColumnKt;
+Landroidx/compose/foundation/layout/CrossAxisAlignment$CenterCrossAxisAlignment;
+Landroidx/compose/foundation/layout/CrossAxisAlignment$EndCrossAxisAlignment;
+Landroidx/compose/foundation/layout/CrossAxisAlignment$HorizontalCrossAxisAlignment;
+Landroidx/compose/foundation/layout/CrossAxisAlignment$StartCrossAxisAlignment;
+Landroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;
+Landroidx/compose/foundation/layout/CrossAxisAlignment;
+Landroidx/compose/foundation/layout/FillModifier$measure$1;
+Landroidx/compose/foundation/layout/FillModifier;
+Landroidx/compose/foundation/layout/HorizontalAlignModifier;
+Landroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$1;
+Landroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1$2;
+Landroidx/compose/foundation/layout/IntrinsicMeasureBlocks$HorizontalMaxHeight$1;
+Landroidx/compose/foundation/layout/OffsetModifier$measure$1;
+Landroidx/compose/foundation/layout/OffsetModifier;
+Landroidx/compose/foundation/layout/OrientationIndependentConstraints$$ExternalSyntheticOutline0;
+Landroidx/compose/foundation/layout/PaddingKt;
+Landroidx/compose/foundation/layout/PaddingModifier$measure$1;
+Landroidx/compose/foundation/layout/PaddingModifier;
+Landroidx/compose/foundation/layout/PaddingValues;
+Landroidx/compose/foundation/layout/PaddingValuesImpl;
+Landroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1$measure$1;
+Landroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;
+Landroidx/compose/foundation/layout/RowColumnImplKt;
+Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult;
+Landroidx/compose/foundation/layout/RowColumnMeasurementHelper;
+Landroidx/compose/foundation/layout/RowColumnParentData;
+Landroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;
+Landroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;
+Landroidx/compose/foundation/layout/RowKt;
+Landroidx/compose/foundation/layout/RowScope;
+Landroidx/compose/foundation/layout/RowScopeInstance;
+Landroidx/compose/foundation/layout/SizeKt$createFillSizeModifier$1;
+Landroidx/compose/foundation/layout/SizeKt$createFillWidthModifier$1;
+Landroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$1;
+Landroidx/compose/foundation/layout/SizeKt$createWrapContentSizeModifier$2;
+Landroidx/compose/foundation/layout/SizeKt;
+Landroidx/compose/foundation/layout/SizeModifier$measure$1;
+Landroidx/compose/foundation/layout/SizeModifier;
+Landroidx/compose/foundation/layout/SpacerKt;
+Landroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;
+Landroidx/compose/foundation/layout/SpacerMeasurePolicy;
+Landroidx/compose/foundation/layout/WrapContentModifier$measure$1;
+Landroidx/compose/foundation/layout/WrapContentModifier;
+Landroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider$Item$1;
+Landroidx/compose/foundation/lazy/layout/DefaultDelegatingLazyLayoutItemProvider;
+Landroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion$CREATOR$1;
+Landroidx/compose/foundation/lazy/layout/DefaultLazyKey;
+Landroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider$generateKeyToIndexMap$1$1;
+Landroidx/compose/foundation/lazy/layout/DefaultLazyLayoutItemsProvider;
+Landroidx/compose/foundation/lazy/layout/IntervalList$Interval;
+Landroidx/compose/foundation/lazy/layout/IntervalList;
+Landroidx/compose/foundation/lazy/layout/IntervalListKt;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1$2;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$2$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1$itemContentFactory$1$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$1;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutKt;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScope;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$PrefetchHandle;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$Prefetcher;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;
+Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher_androidKt;
+Landroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$1;
+Landroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1$2;
+Landroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt$rememberLazyNearestItemsRangeState$1$1;
+Landroidx/compose/foundation/lazy/layout/LazyNearestItemsRangeKt;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$2;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$holder$1;
+Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt;
+Landroidx/compose/foundation/lazy/layout/MutableIntervalList;
+Landroidx/compose/foundation/relocation/AndroidBringIntoViewParent;
+Landroidx/compose/foundation/relocation/BringIntoViewChildModifier;
+Landroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;
+Landroidx/compose/foundation/relocation/BringIntoViewKt;
+Landroidx/compose/foundation/relocation/BringIntoViewParent;
+Landroidx/compose/foundation/relocation/BringIntoViewRequester;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterImpl$bringIntoView$1;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2$1;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterKt$bringIntoViewRequester$2;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterModifier$bringIntoView$2;
+Landroidx/compose/foundation/relocation/BringIntoViewRequesterModifier;
+Landroidx/compose/foundation/relocation/BringIntoViewResponder;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderKt$bringIntoViewResponder$2;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderKt;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$2;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$parentRect$1;
+Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier;
+Landroidx/compose/foundation/relocation/BringIntoViewResponder_androidKt;
+Landroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;
+Landroidx/compose/foundation/shape/CornerBasedShape;
+Landroidx/compose/foundation/shape/CornerSize;
+Landroidx/compose/foundation/shape/DpCornerSize;
+Landroidx/compose/foundation/shape/PercentCornerSize;
+Landroidx/compose/foundation/shape/RoundedCornerShape;
+Landroidx/compose/foundation/shape/RoundedCornerShapeKt;
+Landroidx/compose/foundation/text/BasicTextKt$BasicText$1;
+Landroidx/compose/foundation/text/BasicTextKt$BasicText$2;
+Landroidx/compose/foundation/text/BasicTextKt$BasicText$selectableId$1;
+Landroidx/compose/foundation/text/BasicTextKt$BasicText-4YKlhWE$$inlined$Layout$1;
+Landroidx/compose/foundation/text/BasicTextKt$selectionIdSaver$1;
+Landroidx/compose/foundation/text/BasicTextKt$selectionIdSaver$2;
+Landroidx/compose/foundation/text/BasicTextKt;
+Landroidx/compose/foundation/text/HeightInLinesModifierKt$heightInLines$2;
+Landroidx/compose/foundation/text/HeightInLinesModifierKt;
+Landroidx/compose/foundation/text/TextController$coreModifiers$1;
+Landroidx/compose/foundation/text/TextController$createSemanticsModifierFor$1$1;
+Landroidx/compose/foundation/text/TextController$createSemanticsModifierFor$1;
+Landroidx/compose/foundation/text/TextController$drawTextAndSelectionBehind$1;
+Landroidx/compose/foundation/text/TextController$measurePolicy$1$measure$2;
+Landroidx/compose/foundation/text/TextController$measurePolicy$1;
+Landroidx/compose/foundation/text/TextController$update$1;
+Landroidx/compose/foundation/text/TextController$update$2;
+Landroidx/compose/foundation/text/TextController;
+Landroidx/compose/foundation/text/TextDelegate;
+Landroidx/compose/foundation/text/TextDelegateKt;
+Landroidx/compose/foundation/text/TextDragObserver;
+Landroidx/compose/foundation/text/TextState$onTextLayout$1;
+Landroidx/compose/foundation/text/TextState;
+Landroidx/compose/foundation/text/selection/SelectionRegistrar;
+Landroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;
+Landroidx/compose/foundation/text/selection/SelectionRegistrarKt;
+Landroidx/compose/foundation/text/selection/TextSelectionColors;
+Landroidx/compose/foundation/text/selection/TextSelectionColorsKt$LocalTextSelectionColors$1;
+Landroidx/compose/foundation/text/selection/TextSelectionColorsKt;
+Landroidx/compose/material3/ColorScheme$$ExternalSyntheticOutline0;
+Landroidx/compose/material3/TextKt$LocalTextStyle$1;
+Landroidx/compose/material3/TextKt$Text$1;
+Landroidx/compose/material3/TextKt;
+Landroidx/compose/runtime/AbstractApplier;
+Landroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;
+Landroidx/compose/runtime/ActualAndroid_androidKt;
+Landroidx/compose/runtime/Anchor;
+Landroidx/compose/runtime/Applier;
+Landroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;
+Landroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;
+Landroidx/compose/runtime/BroadcastFrameClock;
+Landroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;
+Landroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-2$1;
+Landroidx/compose/runtime/ComposableSingletons$CompositionKt;
+Landroidx/compose/runtime/ComposablesKt;
+Landroidx/compose/runtime/Composer$Companion$Empty$1;
+Landroidx/compose/runtime/Composer$Companion;
+Landroidx/compose/runtime/Composer;
+Landroidx/compose/runtime/ComposerImpl$CompositionContextHolder;
+Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;
+Landroidx/compose/runtime/ComposerImpl$apply$operation$1$$ExternalSyntheticOutline0;
+Landroidx/compose/runtime/ComposerImpl$apply$operation$1;
+Landroidx/compose/runtime/ComposerImpl$createNode$2;
+Landroidx/compose/runtime/ComposerImpl$createNode$3;
+Landroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$1;
+Landroidx/compose/runtime/ComposerImpl$deactivateToEndGroup$2$2;
+Landroidx/compose/runtime/ComposerImpl$doCompose$2$3;
+Landroidx/compose/runtime/ComposerImpl$doCompose$2$4;
+Landroidx/compose/runtime/ComposerImpl$doCompose$2$5;
+Landroidx/compose/runtime/ComposerImpl$doCompose$lambda$37$$inlined$sortBy$1;
+Landroidx/compose/runtime/ComposerImpl$endRestartGroup$1$1;
+Landroidx/compose/runtime/ComposerImpl$realizeDowns$1;
+Landroidx/compose/runtime/ComposerImpl$realizeMovement$1;
+Landroidx/compose/runtime/ComposerImpl$realizeMovement$2;
+Landroidx/compose/runtime/ComposerImpl$realizeOperationLocation$2;
+Landroidx/compose/runtime/ComposerImpl$realizeUps$1;
+Landroidx/compose/runtime/ComposerImpl$recordInsert$1;
+Landroidx/compose/runtime/ComposerImpl$recordInsert$2;
+Landroidx/compose/runtime/ComposerImpl$recordSideEffect$1;
+Landroidx/compose/runtime/ComposerImpl$recordSlotEditing$1;
+Landroidx/compose/runtime/ComposerImpl$start$2;
+Landroidx/compose/runtime/ComposerImpl$startProviders$currentProviders$1;
+Landroidx/compose/runtime/ComposerImpl$startReaderGroup$1;
+Landroidx/compose/runtime/ComposerImpl$updateValue$1;
+Landroidx/compose/runtime/ComposerImpl$updateValue$2;
+Landroidx/compose/runtime/ComposerImpl;
+Landroidx/compose/runtime/ComposerKt$endGroupInstance$1;
+Landroidx/compose/runtime/ComposerKt$removeCurrentGroupInstance$1;
+Landroidx/compose/runtime/ComposerKt$startRootGroup$1;
+Landroidx/compose/runtime/ComposerKt;
+Landroidx/compose/runtime/Composition;
+Landroidx/compose/runtime/CompositionContext;
+Landroidx/compose/runtime/CompositionContextKt;
+Landroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;
+Landroidx/compose/runtime/CompositionImpl;
+Landroidx/compose/runtime/CompositionKt;
+Landroidx/compose/runtime/CompositionLocal;
+Landroidx/compose/runtime/CompositionLocalKt;
+Landroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;
+Landroidx/compose/runtime/ControlledComposition;
+Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord;
+Landroidx/compose/runtime/DerivedSnapshotState$currentRecord$result$1$result$1;
+Landroidx/compose/runtime/DerivedSnapshotState;
+Landroidx/compose/runtime/DerivedState;
+Landroidx/compose/runtime/DisposableEffectImpl;
+Landroidx/compose/runtime/DisposableEffectResult;
+Landroidx/compose/runtime/DisposableEffectScope;
+Landroidx/compose/runtime/DynamicProvidableCompositionLocal;
+Landroidx/compose/runtime/EffectsKt;
+Landroidx/compose/runtime/GroupInfo;
+Landroidx/compose/runtime/IntStack;
+Landroidx/compose/runtime/Invalidation;
+Landroidx/compose/runtime/JoinedKey;
+Landroidx/compose/runtime/KeyInfo;
+Landroidx/compose/runtime/Latch;
+Landroidx/compose/runtime/LaunchedEffectImpl;
+Landroidx/compose/runtime/LazyValueHolder;
+Landroidx/compose/runtime/MonotonicFrameClock$Key;
+Landroidx/compose/runtime/MonotonicFrameClock;
+Landroidx/compose/runtime/MonotonicFrameClockKt;
+Landroidx/compose/runtime/MovableContent;
+Landroidx/compose/runtime/MovableContentState;
+Landroidx/compose/runtime/MovableContentStateReference;
+Landroidx/compose/runtime/MutableState;
+Landroidx/compose/runtime/NeverEqualPolicy;
+Landroidx/compose/runtime/OpaqueKey;
+Landroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1;
+Landroidx/compose/runtime/ParcelableSnapshotMutableState;
+Landroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;
+Landroidx/compose/runtime/PausableMonotonicFrameClock;
+Landroidx/compose/runtime/Pending$keyMap$2;
+Landroidx/compose/runtime/Pending;
+Landroidx/compose/runtime/PrioritySet;
+Landroidx/compose/runtime/ProvidableCompositionLocal;
+Landroidx/compose/runtime/ProvidedValue;
+Landroidx/compose/runtime/RecomposeScope;
+Landroidx/compose/runtime/RecomposeScopeImpl$end$1$2;
+Landroidx/compose/runtime/RecomposeScopeImpl;
+Landroidx/compose/runtime/Recomposer$Companion;
+Landroidx/compose/runtime/Recomposer$RecomposerErrorState;
+Landroidx/compose/runtime/Recomposer$RecomposerInfoImpl;
+Landroidx/compose/runtime/Recomposer$State;
+Landroidx/compose/runtime/Recomposer$broadcastFrameClock$1;
+Landroidx/compose/runtime/Recomposer$effectJob$1$1;
+Landroidx/compose/runtime/Recomposer$join$2;
+Landroidx/compose/runtime/Recomposer$performRecompose$1$1;
+Landroidx/compose/runtime/Recomposer$readObserverOf$1;
+Landroidx/compose/runtime/Recomposer$recompositionRunner$2$2;
+Landroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;
+Landroidx/compose/runtime/Recomposer$recompositionRunner$2;
+Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$2;
+Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;
+Landroidx/compose/runtime/Recomposer$writeObserverOf$1;
+Landroidx/compose/runtime/Recomposer;
+Landroidx/compose/runtime/ReferentialEqualityPolicy;
+Landroidx/compose/runtime/RememberManager;
+Landroidx/compose/runtime/RememberObserver;
+Landroidx/compose/runtime/SkippableUpdater;
+Landroidx/compose/runtime/SlotReader;
+Landroidx/compose/runtime/SlotTable;
+Landroidx/compose/runtime/SlotTableKt;
+Landroidx/compose/runtime/SlotWriter$Companion;
+Landroidx/compose/runtime/SlotWriter$groupSlots$1;
+Landroidx/compose/runtime/SlotWriter;
+Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;
+Landroidx/compose/runtime/SnapshotMutableStateImpl;
+Landroidx/compose/runtime/SnapshotMutationPolicy;
+Landroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;
+Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$readObserver$1;
+Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1$unregisterApplyObserver$1;
+Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;
+Landroidx/compose/runtime/SnapshotThreadLocal;
+Landroidx/compose/runtime/Stack;
+Landroidx/compose/runtime/State;
+Landroidx/compose/runtime/StaticProvidableCompositionLocal;
+Landroidx/compose/runtime/StaticValueHolder;
+Landroidx/compose/runtime/StructuralEqualityPolicy;
+Landroidx/compose/runtime/Updater;
+Landroidx/compose/runtime/collection/IdentityArrayIntMap;
+Landroidx/compose/runtime/collection/IdentityArrayMap;
+Landroidx/compose/runtime/collection/IdentityArraySet;
+Landroidx/compose/runtime/collection/IdentityScopeMap;
+Landroidx/compose/runtime/collection/MutableVector$MutableVectorList;
+Landroidx/compose/runtime/collection/MutableVector$VectorListIterator;
+Landroidx/compose/runtime/collection/MutableVector;
+Landroidx/compose/runtime/collection/MutableVectorKt;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/ExtensionsKt;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableList;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableSet;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentSet;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntriesIterator;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode$ModificationResult;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeEntriesIterator;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;
+Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation;
+Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;
+Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2;
+Landroidx/compose/runtime/internal/ComposableLambdaImpl;
+Landroidx/compose/runtime/internal/ComposableLambdaKt;
+Landroidx/compose/runtime/internal/ThreadMap;
+Landroidx/compose/runtime/internal/ThreadMapKt;
+Landroidx/compose/runtime/saveable/ListSaverKt$listSaver$1;
+Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1$1$1;
+Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$valueProvider$1;
+Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;
+Landroidx/compose/runtime/saveable/RememberSaveableKt;
+Landroidx/compose/runtime/saveable/SaveableStateHolder;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$1;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$Companion$Saver$2;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder$registry$1;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;
+Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;
+Landroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;
+Landroidx/compose/runtime/saveable/SaveableStateRegistry$Entry;
+Landroidx/compose/runtime/saveable/SaveableStateRegistry;
+Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;
+Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;
+Landroidx/compose/runtime/saveable/SaveableStateRegistryKt$LocalSaveableStateRegistry$1;
+Landroidx/compose/runtime/saveable/SaveableStateRegistryKt;
+Landroidx/compose/runtime/saveable/Saver;
+Landroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;
+Landroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;
+Landroidx/compose/runtime/saveable/SaverKt$Saver$1;
+Landroidx/compose/runtime/saveable/SaverKt;
+Landroidx/compose/runtime/saveable/SaverScope;
+Landroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;
+Landroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedMutableSnapshot$1;
+Landroidx/compose/runtime/snapshots/GlobalSnapshot$takeNestedSnapshot$1;
+Landroidx/compose/runtime/snapshots/GlobalSnapshot;
+Landroidx/compose/runtime/snapshots/MutableSnapshot;
+Landroidx/compose/runtime/snapshots/ObserverHandle;
+Landroidx/compose/runtime/snapshots/ReadonlySnapshot;
+Landroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;
+Landroidx/compose/runtime/snapshots/Snapshot$Companion;
+Landroidx/compose/runtime/snapshots/Snapshot;
+Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Failure;
+Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;
+Landroidx/compose/runtime/snapshots/SnapshotApplyResult;
+Landroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;
+Landroidx/compose/runtime/snapshots/SnapshotIdSet;
+Landroidx/compose/runtime/snapshots/SnapshotKt$advanceGlobalSnapshot$2;
+Landroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;
+Landroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotKt$mergedWriteObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;
+Landroidx/compose/runtime/snapshots/SnapshotKt;
+Landroidx/compose/runtime/snapshots/SnapshotMutableState;
+Landroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;
+Landroidx/compose/runtime/snapshots/SnapshotStateList;
+Landroidx/compose/runtime/snapshots/SnapshotStateListKt;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateEnterObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateExitObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$observeReads$1$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$readObserver$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;
+Landroidx/compose/runtime/snapshots/SnapshotStateObserver;
+Landroidx/compose/runtime/snapshots/StateObject;
+Landroidx/compose/runtime/snapshots/StateRecord;
+Landroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;
+Landroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;
+Landroidx/compose/runtime/tooling/InspectionTablesKt;
+Landroidx/compose/ui/Alignment$Companion;
+Landroidx/compose/ui/Alignment$Horizontal;
+Landroidx/compose/ui/Alignment$Vertical;
+Landroidx/compose/ui/Alignment;
+Landroidx/compose/ui/BiasAlignment$Horizontal;
+Landroidx/compose/ui/BiasAlignment$Vertical;
+Landroidx/compose/ui/BiasAlignment;
+Landroidx/compose/ui/CombinedModifier;
+Landroidx/compose/ui/ComposedModifier;
+Landroidx/compose/ui/ComposedModifierKt$materialize$1;
+Landroidx/compose/ui/ComposedModifierKt$materialize$result$1;
+Landroidx/compose/ui/ComposedModifierKt;
+Landroidx/compose/ui/Modifier$Companion;
+Landroidx/compose/ui/Modifier$Element;
+Landroidx/compose/ui/Modifier$Node;
+Landroidx/compose/ui/Modifier;
+Landroidx/compose/ui/MotionDurationScale$Key;
+Landroidx/compose/ui/MotionDurationScale;
+Landroidx/compose/ui/ZIndexModifier$measure$1;
+Landroidx/compose/ui/ZIndexModifier;
+Landroidx/compose/ui/autofill/AndroidAutofill;
+Landroidx/compose/ui/autofill/Autofill;
+Landroidx/compose/ui/autofill/AutofillCallback;
+Landroidx/compose/ui/autofill/AutofillTree;
+Landroidx/compose/ui/draw/BuildDrawCacheParams;
+Landroidx/compose/ui/draw/CacheDrawScope;
+Landroidx/compose/ui/draw/ClipKt;
+Landroidx/compose/ui/draw/DrawBackgroundModifier;
+Landroidx/compose/ui/draw/DrawCacheModifier;
+Landroidx/compose/ui/draw/DrawContentCacheModifier;
+Landroidx/compose/ui/draw/DrawModifier;
+Landroidx/compose/ui/draw/DrawModifierKt$drawBehind$$inlined$modifierElementOf$1;
+Landroidx/compose/ui/draw/DrawModifierKt$drawWithCache$2;
+Landroidx/compose/ui/draw/DrawResult;
+Landroidx/compose/ui/draw/EmptyBuildDrawCacheParams;
+Landroidx/compose/ui/draw/PainterModifier$measure$1;
+Landroidx/compose/ui/draw/PainterModifier;
+Landroidx/compose/ui/focus/BeyondBoundsLayoutKt;
+Landroidx/compose/ui/focus/FocusChangedModifierKt$onFocusChanged$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/focus/FocusChangedModifierKt;
+Landroidx/compose/ui/focus/FocusChangedModifierNode;
+Landroidx/compose/ui/focus/FocusDirection;
+Landroidx/compose/ui/focus/FocusEventModifier;
+Landroidx/compose/ui/focus/FocusEventModifierNode;
+Landroidx/compose/ui/focus/FocusEventModifierNodeKt;
+Landroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;
+Landroidx/compose/ui/focus/FocusInvalidationManager;
+Landroidx/compose/ui/focus/FocusManager;
+Landroidx/compose/ui/focus/FocusOrderModifier;
+Landroidx/compose/ui/focus/FocusOwner;
+Landroidx/compose/ui/focus/FocusOwnerImpl$moveFocus$foundNextItem$1;
+Landroidx/compose/ui/focus/FocusOwnerImpl$special$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/focus/FocusOwnerImpl;
+Landroidx/compose/ui/focus/FocusProperties;
+Landroidx/compose/ui/focus/FocusPropertiesImpl$enter$1;
+Landroidx/compose/ui/focus/FocusPropertiesImpl$exit$1;
+Landroidx/compose/ui/focus/FocusPropertiesImpl;
+Landroidx/compose/ui/focus/FocusPropertiesKt$focusProperties$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/focus/FocusPropertiesModifierNode;
+Landroidx/compose/ui/focus/FocusPropertiesModifierNodeImpl;
+Landroidx/compose/ui/focus/FocusRequester;
+Landroidx/compose/ui/focus/FocusRequesterModifier;
+Landroidx/compose/ui/focus/FocusRequesterModifierKt$focusRequester$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/focus/FocusRequesterModifierNode;
+Landroidx/compose/ui/focus/FocusRequesterModifierNodeImpl;
+Landroidx/compose/ui/focus/FocusState;
+Landroidx/compose/ui/focus/FocusStateImpl;
+Landroidx/compose/ui/focus/FocusTargetModifierNode$special$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/focus/FocusTargetModifierNode;
+Landroidx/compose/ui/focus/FocusTransactionsKt$grantFocus$1;
+Landroidx/compose/ui/focus/FocusTransactionsKt;
+Landroidx/compose/ui/focus/FocusTraversalKt;
+Landroidx/compose/ui/focus/TwoDimensionalFocusSearchKt$generateAndSearchChildren$1;
+Landroidx/compose/ui/focus/TwoDimensionalFocusSearchKt;
+Landroidx/compose/ui/geometry/CornerRadius;
+Landroidx/compose/ui/geometry/CornerRadiusKt;
+Landroidx/compose/ui/geometry/MutableRect;
+Landroidx/compose/ui/geometry/Offset;
+Landroidx/compose/ui/geometry/OffsetKt;
+Landroidx/compose/ui/geometry/Rect;
+Landroidx/compose/ui/geometry/RoundRect;
+Landroidx/compose/ui/geometry/RoundRectKt;
+Landroidx/compose/ui/geometry/Size;
+Landroidx/compose/ui/geometry/SizeKt;
+Landroidx/compose/ui/graphics/AndroidBlendMode_androidKt;
+Landroidx/compose/ui/graphics/AndroidCanvas;
+Landroidx/compose/ui/graphics/AndroidCanvas_androidKt;
+Landroidx/compose/ui/graphics/AndroidImageBitmap;
+Landroidx/compose/ui/graphics/AndroidMatrixConversions_androidKt;
+Landroidx/compose/ui/graphics/AndroidPaint;
+Landroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;
+Landroidx/compose/ui/graphics/AndroidPaint_androidKt;
+Landroidx/compose/ui/graphics/AndroidPath;
+Landroidx/compose/ui/graphics/BlendMode;
+Landroidx/compose/ui/graphics/BlendModeColorFilterHelper;
+Landroidx/compose/ui/graphics/Brush;
+Landroidx/compose/ui/graphics/Canvas;
+Landroidx/compose/ui/graphics/CanvasHolder;
+Landroidx/compose/ui/graphics/Color;
+Landroidx/compose/ui/graphics/ColorFilter;
+Landroidx/compose/ui/graphics/ColorKt;
+Landroidx/compose/ui/graphics/Float16$Companion;
+Landroidx/compose/ui/graphics/Float16;
+Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;
+Landroidx/compose/ui/graphics/GraphicsLayerModifierNodeElement;
+Landroidx/compose/ui/graphics/GraphicsLayerScope;
+Landroidx/compose/ui/graphics/GraphicsLayerScopeKt;
+Landroidx/compose/ui/graphics/ImageBitmap;
+Landroidx/compose/ui/graphics/Matrix;
+Landroidx/compose/ui/graphics/Outline$Generic;
+Landroidx/compose/ui/graphics/Outline$Rectangle;
+Landroidx/compose/ui/graphics/Outline$Rounded;
+Landroidx/compose/ui/graphics/Outline;
+Landroidx/compose/ui/graphics/Paint;
+Landroidx/compose/ui/graphics/Path;
+Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;
+Landroidx/compose/ui/graphics/RectangleShapeKt;
+Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;
+Landroidx/compose/ui/graphics/ShaderBrush;
+Landroidx/compose/ui/graphics/Shadow;
+Landroidx/compose/ui/graphics/Shape;
+Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;
+Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$measure$1;
+Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;
+Landroidx/compose/ui/graphics/SolidColor;
+Landroidx/compose/ui/graphics/TransformOrigin;
+Landroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;
+Landroidx/compose/ui/graphics/colorspace/Adaptation;
+Landroidx/compose/ui/graphics/colorspace/ColorModel;
+Landroidx/compose/ui/graphics/colorspace/ColorSpace;
+Landroidx/compose/ui/graphics/colorspace/ColorSpaceKt;
+Landroidx/compose/ui/graphics/colorspace/ColorSpaces$$ExternalSyntheticLambda0;
+Landroidx/compose/ui/graphics/colorspace/ColorSpaces;
+Landroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1;
+Landroidx/compose/ui/graphics/colorspace/Connector$Companion;
+Landroidx/compose/ui/graphics/colorspace/Connector;
+Landroidx/compose/ui/graphics/colorspace/DoubleFunction;
+Landroidx/compose/ui/graphics/colorspace/Illuminant;
+Landroidx/compose/ui/graphics/colorspace/Lab;
+Landroidx/compose/ui/graphics/colorspace/Oklab;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda3;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda5;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda6;
+Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda7;
+Landroidx/compose/ui/graphics/colorspace/Rgb$Companion;
+Landroidx/compose/ui/graphics/colorspace/Rgb;
+Landroidx/compose/ui/graphics/colorspace/TransferParameters;
+Landroidx/compose/ui/graphics/colorspace/WhitePoint;
+Landroidx/compose/ui/graphics/colorspace/Xyz;
+Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;
+Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;
+Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;
+Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;
+Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt;
+Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;
+Landroidx/compose/ui/graphics/drawscope/DrawContext;
+Landroidx/compose/ui/graphics/drawscope/DrawScope;
+Landroidx/compose/ui/graphics/drawscope/EmptyCanvas;
+Landroidx/compose/ui/graphics/drawscope/Fill;
+Landroidx/compose/ui/graphics/drawscope/Stroke;
+Landroidx/compose/ui/graphics/painter/BitmapPainter;
+Landroidx/compose/ui/graphics/painter/Painter;
+Landroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;
+Landroidx/compose/ui/graphics/vector/ImageVector$Builder;
+Landroidx/compose/ui/graphics/vector/ImageVector;
+Landroidx/compose/ui/graphics/vector/VNode;
+Landroidx/compose/ui/graphics/vector/VectorComponent;
+Landroidx/compose/ui/graphics/vector/VectorGroup;
+Landroidx/compose/ui/graphics/vector/VectorKt;
+Landroidx/compose/ui/graphics/vector/VectorNode;
+Landroidx/compose/ui/graphics/vector/VectorPainter;
+Landroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3;
+Landroidx/compose/ui/graphics/vector/VectorPath;
+Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;
+Landroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;
+Landroidx/compose/ui/graphics/vector/compat/XmlVectorParser_androidKt;
+Landroidx/compose/ui/hapticfeedback/HapticFeedback;
+Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;
+Landroidx/compose/ui/input/InputMode;
+Landroidx/compose/ui/input/InputModeManager;
+Landroidx/compose/ui/input/InputModeManagerImpl;
+Landroidx/compose/ui/input/key/Key;
+Landroidx/compose/ui/input/key/KeyEvent;
+Landroidx/compose/ui/input/key/KeyEvent_androidKt;
+Landroidx/compose/ui/input/key/KeyInputInputModifierNodeImpl;
+Landroidx/compose/ui/input/key/KeyInputModifierKt$onKeyEvent$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/input/key/KeyInputModifierKt;
+Landroidx/compose/ui/input/key/KeyInputModifierNode;
+Landroidx/compose/ui/input/key/Key_androidKt;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$calculateNestedScrollScope$1;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt$nestedScroll$2;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal$1;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt$ModifierLocalNestedScroll$1;
+Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocalKt;
+Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;
+Landroidx/compose/ui/input/pointer/HitPathTracker;
+Landroidx/compose/ui/input/pointer/MotionEventAdapter;
+Landroidx/compose/ui/input/pointer/Node;
+Landroidx/compose/ui/input/pointer/NodeParent;
+Landroidx/compose/ui/input/pointer/PointerEvent;
+Landroidx/compose/ui/input/pointer/PointerEventPass;
+Landroidx/compose/ui/input/pointer/PointerIconService;
+Landroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;
+Landroidx/compose/ui/input/pointer/PointerInputEventProcessor;
+Landroidx/compose/ui/input/pointer/PointerInputFilter;
+Landroidx/compose/ui/input/pointer/PointerInputModifier;
+Landroidx/compose/ui/input/pointer/PointerInputScope;
+Landroidx/compose/ui/input/pointer/PointerKeyboardModifiers;
+Landroidx/compose/ui/input/pointer/PositionCalculator;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$awaitPointerEventScope$2$2;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilter;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2$2$1;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$2;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4$2$1;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$4;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6$2$1;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$pointerInput$6;
+Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;
+Landroidx/compose/ui/input/pointer/util/DataPointAtTime;
+Landroidx/compose/ui/input/pointer/util/VelocityTracker1D;
+Landroidx/compose/ui/input/pointer/util/VelocityTracker;
+Landroidx/compose/ui/input/rotary/RotaryInputModifierKt$onRotaryScrollEvent$$inlined$modifierElementOf$2;
+Landroidx/compose/ui/input/rotary/RotaryInputModifierNode;
+Landroidx/compose/ui/input/rotary/RotaryInputModifierNodeImpl;
+Landroidx/compose/ui/layout/AlignmentLine;
+Landroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;
+Landroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;
+Landroidx/compose/ui/layout/AlignmentLineKt;
+Landroidx/compose/ui/layout/BeyondBoundsLayout$BeyondBoundsScope;
+Landroidx/compose/ui/layout/BeyondBoundsLayout;
+Landroidx/compose/ui/layout/BeyondBoundsLayoutKt$ModifierLocalBeyondBoundsLayout$1;
+Landroidx/compose/ui/layout/BeyondBoundsLayoutKt;
+Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;
+Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt;
+Landroidx/compose/ui/layout/ContentScale$Companion$FillBounds$1;
+Landroidx/compose/ui/layout/ContentScale$Companion$Fit$1;
+Landroidx/compose/ui/layout/ContentScale$Companion$Inside$1;
+Landroidx/compose/ui/layout/ContentScale$Companion;
+Landroidx/compose/ui/layout/ContentScale;
+Landroidx/compose/ui/layout/HorizontalAlignmentLine;
+Landroidx/compose/ui/layout/IntermediateLayoutModifier;
+Landroidx/compose/ui/layout/IntrinsicMeasurable;
+Landroidx/compose/ui/layout/IntrinsicMeasureScope;
+Landroidx/compose/ui/layout/IntrinsicsMeasureScope;
+Landroidx/compose/ui/layout/LayoutCoordinates;
+Landroidx/compose/ui/layout/LayoutKt$materializerOf$1;
+Landroidx/compose/ui/layout/LayoutKt;
+Landroidx/compose/ui/layout/LayoutModifier;
+Landroidx/compose/ui/layout/LayoutModifierImpl;
+Landroidx/compose/ui/layout/LayoutModifierKt;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precompose$1;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$2$1$1;
+Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;
+Landroidx/compose/ui/layout/LookaheadLayoutCoordinatesImpl;
+Landroidx/compose/ui/layout/LookaheadOnPlacedModifier;
+Landroidx/compose/ui/layout/Measurable;
+Landroidx/compose/ui/layout/MeasurePolicy;
+Landroidx/compose/ui/layout/MeasureResult;
+Landroidx/compose/ui/layout/MeasureScope$layout$1;
+Landroidx/compose/ui/layout/MeasureScope;
+Landroidx/compose/ui/layout/Measured;
+Landroidx/compose/ui/layout/MeasuringIntrinsics$DefaultIntrinsicMeasurable;
+Landroidx/compose/ui/layout/MeasuringIntrinsics$EmptyPlaceable;
+Landroidx/compose/ui/layout/NoOpSubcomposeSlotReusePolicy;
+Landroidx/compose/ui/layout/OnGloballyPositionedModifier;
+Landroidx/compose/ui/layout/OnGloballyPositionedModifierImpl;
+Landroidx/compose/ui/layout/OnPlacedModifier;
+Landroidx/compose/ui/layout/OnRemeasuredModifier;
+Landroidx/compose/ui/layout/OnSizeChangedModifier;
+Landroidx/compose/ui/layout/ParentDataModifier;
+Landroidx/compose/ui/layout/PinnableContainer$PinnedHandle;
+Landroidx/compose/ui/layout/PinnableContainer;
+Landroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;
+Landroidx/compose/ui/layout/PinnableContainerKt;
+Landroidx/compose/ui/layout/Placeable$PlacementScope$Companion;
+Landroidx/compose/ui/layout/Placeable$PlacementScope;
+Landroidx/compose/ui/layout/Placeable;
+Landroidx/compose/ui/layout/PlaceableKt$DefaultLayerBlock$1;
+Landroidx/compose/ui/layout/PlaceableKt;
+Landroidx/compose/ui/layout/Remeasurement;
+Landroidx/compose/ui/layout/RemeasurementModifier;
+Landroidx/compose/ui/layout/RootMeasurePolicy$measure$2;
+Landroidx/compose/ui/layout/RootMeasurePolicy;
+Landroidx/compose/ui/layout/ScaleFactor;
+Landroidx/compose/ui/layout/ScaleFactorKt;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$4;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$6;
+Landroidx/compose/ui/layout/SubcomposeLayoutKt;
+Landroidx/compose/ui/layout/SubcomposeLayoutState$PrecomposedSlotHandle;
+Landroidx/compose/ui/layout/SubcomposeLayoutState$setCompositionContext$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutState$setMeasurePolicy$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;
+Landroidx/compose/ui/layout/SubcomposeLayoutState;
+Landroidx/compose/ui/layout/SubcomposeMeasureScope;
+Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;
+Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;
+Landroidx/compose/ui/modifier/BackwardsCompatLocalMap;
+Landroidx/compose/ui/modifier/EmptyMap;
+Landroidx/compose/ui/modifier/ModifierLocal;
+Landroidx/compose/ui/modifier/ModifierLocalConsumer;
+Landroidx/compose/ui/modifier/ModifierLocalManager;
+Landroidx/compose/ui/modifier/ModifierLocalMap;
+Landroidx/compose/ui/modifier/ModifierLocalNode;
+Landroidx/compose/ui/modifier/ModifierLocalProvider;
+Landroidx/compose/ui/modifier/ModifierLocalReadScope;
+Landroidx/compose/ui/modifier/ProvidableModifierLocal;
+Landroidx/compose/ui/node/AlignmentLines;
+Landroidx/compose/ui/node/AlignmentLinesOwner;
+Landroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$1;
+Landroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;
+Landroidx/compose/ui/node/BackwardsCompatNode$updateDrawCache$1;
+Landroidx/compose/ui/node/BackwardsCompatNode$updateModifierLocalConsumer$1;
+Landroidx/compose/ui/node/BackwardsCompatNode;
+Landroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;
+Landroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;
+Landroidx/compose/ui/node/BackwardsCompatNodeKt$updateModifierLocalConsumer$1;
+Landroidx/compose/ui/node/BackwardsCompatNodeKt;
+Landroidx/compose/ui/node/CanFocusChecker;
+Landroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;
+Landroidx/compose/ui/node/ComposeUiNode$Companion$SetLayoutDirection$1;
+Landroidx/compose/ui/node/ComposeUiNode$Companion$SetMeasurePolicy$1;
+Landroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;
+Landroidx/compose/ui/node/ComposeUiNode$Companion$SetViewConfiguration$1;
+Landroidx/compose/ui/node/ComposeUiNode$Companion;
+Landroidx/compose/ui/node/ComposeUiNode;
+Landroidx/compose/ui/node/DelegatableNode;
+Landroidx/compose/ui/node/DelegatableNodeKt;
+Landroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;
+Landroidx/compose/ui/node/DepthSortedSet$mapOfOriginalDepth$2;
+Landroidx/compose/ui/node/DepthSortedSet;
+Landroidx/compose/ui/node/DrawModifierNode;
+Landroidx/compose/ui/node/DrawModifierNodeKt;
+Landroidx/compose/ui/node/GlobalPositionAwareModifierNode;
+Landroidx/compose/ui/node/HitTestResult;
+Landroidx/compose/ui/node/InnerNodeCoordinator$tail$1;
+Landroidx/compose/ui/node/InnerNodeCoordinator;
+Landroidx/compose/ui/node/IntStack;
+Landroidx/compose/ui/node/IntermediateLayoutModifierNode;
+Landroidx/compose/ui/node/IntrinsicsPolicy;
+Landroidx/compose/ui/node/LayerPositionalProperties;
+Landroidx/compose/ui/node/LayoutAwareModifierNode;
+Landroidx/compose/ui/node/LayoutModifierNode;
+Landroidx/compose/ui/node/LayoutModifierNodeCoordinator;
+Landroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;
+Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;
+Landroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1;
+Landroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1;
+Landroidx/compose/ui/node/LayoutNode$LayoutState$EnumUnboxingLocalUtility;
+Landroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy;
+Landroidx/compose/ui/node/LayoutNode$UsageByParent$EnumUnboxingLocalUtility;
+Landroidx/compose/ui/node/LayoutNode$WhenMappings;
+Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1;
+Landroidx/compose/ui/node/LayoutNode;
+Landroidx/compose/ui/node/LayoutNodeAlignmentLines;
+Landroidx/compose/ui/node/LayoutNodeDrawScope;
+Landroidx/compose/ui/node/LayoutNodeKt;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$childMeasurables$1;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;
+Landroidx/compose/ui/node/LayoutNodeLayoutDelegateKt;
+Landroidx/compose/ui/node/LookaheadCapablePlaceable;
+Landroidx/compose/ui/node/LookaheadDelegate;
+Landroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;
+Landroidx/compose/ui/node/MeasureAndLayoutDelegate;
+Landroidx/compose/ui/node/ModifierNodeElement;
+Landroidx/compose/ui/node/MutableVectorWithMutationTracking;
+Landroidx/compose/ui/node/NodeChain$Differ;
+Landroidx/compose/ui/node/NodeChain;
+Landroidx/compose/ui/node/NodeChainKt$SentinelHead$1;
+Landroidx/compose/ui/node/NodeChainKt$fillVector$1;
+Landroidx/compose/ui/node/NodeChainKt;
+Landroidx/compose/ui/node/NodeCoordinator$Companion$PointerInputSource$1;
+Landroidx/compose/ui/node/NodeCoordinator$Companion$SemanticsSource$1;
+Landroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayer$1;
+Landroidx/compose/ui/node/NodeCoordinator$Companion$onCommitAffectingLayerParams$1;
+Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;
+Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;
+Landroidx/compose/ui/node/NodeCoordinator$invoke$1;
+Landroidx/compose/ui/node/NodeCoordinator$updateLayerParameters$1;
+Landroidx/compose/ui/node/NodeCoordinator;
+Landroidx/compose/ui/node/NodeKind;
+Landroidx/compose/ui/node/NodeKindKt;
+Landroidx/compose/ui/node/NodeMeasuringIntrinsics$DefaultIntrinsicMeasurable;
+Landroidx/compose/ui/node/NodeMeasuringIntrinsics$EmptyPlaceable;
+Landroidx/compose/ui/node/ObserverNode$Companion$OnObserveReadsChanged$1;
+Landroidx/compose/ui/node/ObserverNode$Companion;
+Landroidx/compose/ui/node/ObserverNode;
+Landroidx/compose/ui/node/ObserverNodeKt;
+Landroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;
+Landroidx/compose/ui/node/OnPositionedDispatcher;
+Landroidx/compose/ui/node/OwnedLayer;
+Landroidx/compose/ui/node/Owner$OnLayoutCompletedListener;
+Landroidx/compose/ui/node/Owner;
+Landroidx/compose/ui/node/OwnerScope;
+Landroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;
+Landroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayoutModifier$1;
+Landroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingMeasure$1;
+Landroidx/compose/ui/node/OwnerSnapshotObserver;
+Landroidx/compose/ui/node/ParentDataModifierNode;
+Landroidx/compose/ui/node/PointerInputModifierNode;
+Landroidx/compose/ui/node/Ref;
+Landroidx/compose/ui/node/RootForTest;
+Landroidx/compose/ui/node/SemanticsModifierNode;
+Landroidx/compose/ui/node/SemanticsModifierNodeKt;
+Landroidx/compose/ui/node/Snake;
+Landroidx/compose/ui/node/TreeSet;
+Landroidx/compose/ui/node/UiApplier;
+Landroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;
+Landroidx/compose/ui/platform/AbstractComposeView;
+Landroidx/compose/ui/platform/AccessibilityManager;
+Landroidx/compose/ui/platform/AndroidAccessibilityManager;
+Landroidx/compose/ui/platform/AndroidClipboardManager;
+Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda0;
+Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda1;
+Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;
+Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda3;
+Landroidx/compose/ui/platform/AndroidComposeView$Companion;
+Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;
+Landroidx/compose/ui/platform/AndroidComposeView$_inputModeManager$1;
+Landroidx/compose/ui/platform/AndroidComposeView$configurationChangeObserver$1;
+Landroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;
+Landroidx/compose/ui/platform/AndroidComposeView$keyInputModifier$1;
+Landroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1;
+Landroidx/compose/ui/platform/AndroidComposeView$resendMotionEventOnLayout$1;
+Landroidx/compose/ui/platform/AndroidComposeView$resendMotionEventRunnable$1;
+Landroidx/compose/ui/platform/AndroidComposeView$rotaryInputModifier$1;
+Landroidx/compose/ui/platform/AndroidComposeView$semanticsModifier$1;
+Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;
+Landroidx/compose/ui/platform/AndroidComposeView;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda0;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$sendScrollEventIfNeededLambda$1;
+Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;
+Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ$$ExternalSyntheticApiModelOutline0;
+Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;
+Landroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalConfiguration$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalContext$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalImageVectorCache$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalLifecycleOwner$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalSavedStateRegistryOwner$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$LocalView$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$1$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;
+Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;
+Landroidx/compose/ui/platform/AndroidFontResourceLoader;
+Landroidx/compose/ui/platform/AndroidTextToolbar;
+Landroidx/compose/ui/platform/AndroidUiDispatcher$Companion$Main$2;
+Landroidx/compose/ui/platform/AndroidUiDispatcher$Companion$currentThread$1;
+Landroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;
+Landroidx/compose/ui/platform/AndroidUiDispatcher;
+Landroidx/compose/ui/platform/AndroidUiDispatcher_androidKt;
+Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$1;
+Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;
+Landroidx/compose/ui/platform/AndroidUiFrameClock;
+Landroidx/compose/ui/platform/AndroidUriHandler;
+Landroidx/compose/ui/platform/AndroidViewConfiguration;
+Landroidx/compose/ui/platform/CalculateMatrixToWindow;
+Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29;
+Landroidx/compose/ui/platform/ClipboardManager;
+Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda-1$1;
+Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;
+Landroidx/compose/ui/platform/ComposeView$Content$1;
+Landroidx/compose/ui/platform/ComposeView;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalAccessibilityManager$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofill$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalAutofillTree$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalClipboardManager$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalFocusManager$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalFontFamilyResolver$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalFontLoader$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalHapticFeedback$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalInputModeManager$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalLayoutDirection$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalPointerIconService$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalTextInputService$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalTextToolbar$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalUriHandler$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalViewConfiguration$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$LocalWindowInfo$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;
+Landroidx/compose/ui/platform/CompositionLocalsKt;
+Landroidx/compose/ui/platform/DeviceRenderNode;
+Landroidx/compose/ui/platform/DisposableSaveableStateRegistry;
+Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;
+Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;
+Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$saveableStateRegistry$1;
+Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt;
+Landroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;
+Landroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;
+Landroidx/compose/ui/platform/GlobalSnapshotManager;
+Landroidx/compose/ui/platform/InspectableModifier$End;
+Landroidx/compose/ui/platform/InspectableModifier;
+Landroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;
+Landroidx/compose/ui/platform/InspectableValueKt;
+Landroidx/compose/ui/platform/InspectorValueInfo;
+Landroidx/compose/ui/platform/LayerMatrixCache;
+Landroidx/compose/ui/platform/MotionDurationScaleImpl;
+Landroidx/compose/ui/platform/OutlineResolver;
+Landroidx/compose/ui/platform/RenderNodeApi29$$ExternalSyntheticApiModelOutline0;
+Landroidx/compose/ui/platform/RenderNodeApi29;
+Landroidx/compose/ui/platform/RenderNodeApi29VerificationHelper$$ExternalSyntheticApiModelOutline0;
+Landroidx/compose/ui/platform/RenderNodeApi29VerificationHelper;
+Landroidx/compose/ui/platform/RenderNodeLayer$Companion$getMatrix$1;
+Landroidx/compose/ui/platform/RenderNodeLayer;
+Landroidx/compose/ui/platform/TextToolbar;
+Landroidx/compose/ui/platform/UriHandler;
+Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$1;
+Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;
+Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1;
+Landroidx/compose/ui/platform/ViewConfiguration;
+Landroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1;
+Landroidx/compose/ui/platform/ViewLayer;
+Landroidx/compose/ui/platform/WeakCache;
+Landroidx/compose/ui/platform/WindowInfo;
+Landroidx/compose/ui/platform/WindowInfoImpl;
+Landroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;
+Landroidx/compose/ui/platform/WindowRecomposerFactory$Companion;
+Landroidx/compose/ui/platform/WindowRecomposerFactory;
+Landroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;
+Landroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;
+Landroidx/compose/ui/platform/WindowRecomposerPolicy;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;
+Landroidx/compose/ui/platform/WindowRecomposer_androidKt;
+Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;
+Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1$2;
+Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1$3;
+Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1;
+Landroidx/compose/ui/platform/WrappedComposition$setContent$1;
+Landroidx/compose/ui/platform/WrappedComposition;
+Landroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;
+Landroidx/compose/ui/platform/WrapperVerificationHelperMethods$$ExternalSyntheticApiModelOutline0;
+Landroidx/compose/ui/platform/WrapperVerificationHelperMethods;
+Landroidx/compose/ui/platform/Wrapper_androidKt;
+Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;
+Landroidx/compose/ui/res/ImageVectorCache$Key;
+Landroidx/compose/ui/res/ImageVectorCache;
+Landroidx/compose/ui/res/PainterResources_androidKt;
+Landroidx/compose/ui/semantics/AccessibilityAction;
+Landroidx/compose/ui/semantics/CollectionInfo;
+Landroidx/compose/ui/semantics/Role;
+Landroidx/compose/ui/semantics/ScrollAxisRange;
+Landroidx/compose/ui/semantics/SemanticsActions;
+Landroidx/compose/ui/semantics/SemanticsConfiguration;
+Landroidx/compose/ui/semantics/SemanticsConfigurationKt;
+Landroidx/compose/ui/semantics/SemanticsModifier;
+Landroidx/compose/ui/semantics/SemanticsModifierCore;
+Landroidx/compose/ui/semantics/SemanticsModifierKt;
+Landroidx/compose/ui/semantics/SemanticsNode;
+Landroidx/compose/ui/semantics/SemanticsNodeKt;
+Landroidx/compose/ui/semantics/SemanticsOwner;
+Landroidx/compose/ui/semantics/SemanticsProperties$ContentDescription$1;
+Landroidx/compose/ui/semantics/SemanticsProperties$InvisibleToUser$1;
+Landroidx/compose/ui/semantics/SemanticsProperties$PaneTitle$1;
+Landroidx/compose/ui/semantics/SemanticsProperties$Role$1;
+Landroidx/compose/ui/semantics/SemanticsProperties$TestTag$1;
+Landroidx/compose/ui/semantics/SemanticsProperties$Text$1;
+Landroidx/compose/ui/semantics/SemanticsProperties;
+Landroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;
+Landroidx/compose/ui/semantics/SemanticsPropertiesKt;
+Landroidx/compose/ui/semantics/SemanticsPropertyKey$1;
+Landroidx/compose/ui/semantics/SemanticsPropertyKey;
+Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;
+Landroidx/compose/ui/text/AndroidParagraph$wordBoundary$2;
+Landroidx/compose/ui/text/AndroidParagraph;
+Landroidx/compose/ui/text/AnnotatedString$Range;
+Landroidx/compose/ui/text/AnnotatedString;
+Landroidx/compose/ui/text/AnnotatedStringKt;
+Landroidx/compose/ui/text/MultiParagraph;
+Landroidx/compose/ui/text/MultiParagraphIntrinsics$maxIntrinsicWidth$2;
+Landroidx/compose/ui/text/MultiParagraphIntrinsics$minIntrinsicWidth$2;
+Landroidx/compose/ui/text/MultiParagraphIntrinsics;
+Landroidx/compose/ui/text/Paragraph;
+Landroidx/compose/ui/text/ParagraphInfo;
+Landroidx/compose/ui/text/ParagraphIntrinsicInfo;
+Landroidx/compose/ui/text/ParagraphIntrinsics;
+Landroidx/compose/ui/text/ParagraphStyle;
+Landroidx/compose/ui/text/ParagraphStyleKt;
+Landroidx/compose/ui/text/Placeholder;
+Landroidx/compose/ui/text/SpanStyle;
+Landroidx/compose/ui/text/SpanStyleKt$resolveSpanStyleDefaults$1;
+Landroidx/compose/ui/text/SpanStyleKt;
+Landroidx/compose/ui/text/TextLayoutInput;
+Landroidx/compose/ui/text/TextLayoutResult;
+Landroidx/compose/ui/text/TextRange;
+Landroidx/compose/ui/text/TextRangeKt;
+Landroidx/compose/ui/text/TextStyle;
+Landroidx/compose/ui/text/android/BoringLayoutFactory;
+Landroidx/compose/ui/text/android/BoringLayoutFactoryDefault;
+Landroidx/compose/ui/text/android/LayoutCompat;
+Landroidx/compose/ui/text/android/LayoutIntrinsics$boringMetrics$2;
+Landroidx/compose/ui/text/android/LayoutIntrinsics$maxIntrinsicWidth$2;
+Landroidx/compose/ui/text/android/LayoutIntrinsics$minIntrinsicWidth$2;
+Landroidx/compose/ui/text/android/LayoutIntrinsics;
+Landroidx/compose/ui/text/android/StaticLayoutFactory23;
+Landroidx/compose/ui/text/android/StaticLayoutFactory26;
+Landroidx/compose/ui/text/android/StaticLayoutFactory28;
+Landroidx/compose/ui/text/android/StaticLayoutFactory;
+Landroidx/compose/ui/text/android/StaticLayoutFactoryImpl;
+Landroidx/compose/ui/text/android/StaticLayoutParams;
+Landroidx/compose/ui/text/android/TextAlignmentAdapter;
+Landroidx/compose/ui/text/android/TextAndroidCanvas;
+Landroidx/compose/ui/text/android/TextLayout$layoutHelper$2;
+Landroidx/compose/ui/text/android/TextLayout;
+Landroidx/compose/ui/text/android/TextLayoutKt;
+Landroidx/compose/ui/text/android/style/BaselineShiftSpan;
+Landroidx/compose/ui/text/android/style/FontFeatureSpan;
+Landroidx/compose/ui/text/android/style/IndentationFixSpan;
+Landroidx/compose/ui/text/android/style/IndentationFixSpanKt;
+Landroidx/compose/ui/text/android/style/LetterSpacingSpanEm;
+Landroidx/compose/ui/text/android/style/LetterSpacingSpanPx;
+Landroidx/compose/ui/text/android/style/LineHeightSpan;
+Landroidx/compose/ui/text/android/style/LineHeightStyleSpan;
+Landroidx/compose/ui/text/android/style/PlaceholderSpan;
+Landroidx/compose/ui/text/android/style/ShadowSpan;
+Landroidx/compose/ui/text/android/style/SkewXSpan;
+Landroidx/compose/ui/text/android/style/TextDecorationSpan;
+Landroidx/compose/ui/text/caches/ContainerHelpersKt;
+Landroidx/compose/ui/text/caches/LruCache;
+Landroidx/compose/ui/text/caches/SimpleArrayMap;
+Landroidx/compose/ui/text/font/AndroidFontLoader;
+Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;
+Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor_androidKt;
+Landroidx/compose/ui/text/font/AsyncTypefaceCache;
+Landroidx/compose/ui/text/font/DefaultFontFamily;
+Landroidx/compose/ui/text/font/FileBasedFontFamily;
+Landroidx/compose/ui/text/font/Font$ResourceLoader;
+Landroidx/compose/ui/text/font/FontFamily$Resolver;
+Landroidx/compose/ui/text/font/FontFamily;
+Landroidx/compose/ui/text/font/FontFamilyResolverImpl$createDefaultTypeface$1;
+Landroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;
+Landroidx/compose/ui/text/font/FontFamilyResolverImpl;
+Landroidx/compose/ui/text/font/FontFamilyResolverKt;
+Landroidx/compose/ui/text/font/FontListFontFamily;
+Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1;
+Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;
+Landroidx/compose/ui/text/font/FontStyle;
+Landroidx/compose/ui/text/font/FontSynthesis;
+Landroidx/compose/ui/text/font/FontWeight;
+Landroidx/compose/ui/text/font/GenericFontFamily;
+Landroidx/compose/ui/text/font/PlatformFontFamilyTypefaceAdapter;
+Landroidx/compose/ui/text/font/PlatformFontLoader;
+Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1;
+Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;
+Landroidx/compose/ui/text/font/PlatformResolveInterceptor;
+Landroidx/compose/ui/text/font/PlatformTypefacesApi28;
+Landroidx/compose/ui/text/font/SystemFontFamily;
+Landroidx/compose/ui/text/font/TypefaceRequest;
+Landroidx/compose/ui/text/font/TypefaceRequestCache$runCached$currentTypefaceResult$1;
+Landroidx/compose/ui/text/font/TypefaceRequestCache;
+Landroidx/compose/ui/text/font/TypefaceResult$Immutable;
+Landroidx/compose/ui/text/font/TypefaceResult;
+Landroidx/compose/ui/text/input/ImmHelper30;
+Landroidx/compose/ui/text/input/ImmHelper;
+Landroidx/compose/ui/text/input/InputMethodManager;
+Landroidx/compose/ui/text/input/InputMethodManagerImpl$imm$2;
+Landroidx/compose/ui/text/input/InputMethodManagerImpl;
+Landroidx/compose/ui/text/input/PlatformTextInputService;
+Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;
+Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;
+Landroidx/compose/ui/text/input/TextFieldValue;
+Landroidx/compose/ui/text/input/TextInputService;
+Landroidx/compose/ui/text/input/TextInputServiceAndroid$baseInputConnection$2;
+Landroidx/compose/ui/text/input/TextInputServiceAndroid$textInputCommandEventLoop$1;
+Landroidx/compose/ui/text/input/TextInputServiceAndroid;
+Landroidx/compose/ui/text/intl/AndroidLocale;
+Landroidx/compose/ui/text/intl/Locale;
+Landroidx/compose/ui/text/intl/LocaleList$Companion;
+Landroidx/compose/ui/text/intl/LocaleList;
+Landroidx/compose/ui/text/intl/PlatformLocale;
+Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1;
+Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;
+Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;
+Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;
+Landroidx/compose/ui/text/platform/AndroidTextPaint;
+Landroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;
+Landroidx/compose/ui/text/platform/DefaultImpl;
+Landroidx/compose/ui/text/platform/EmojiCompatStatus;
+Landroidx/compose/ui/text/platform/EmojiCompatStatusKt;
+Landroidx/compose/ui/text/platform/ImmutableBool;
+Landroidx/compose/ui/text/platform/TypefaceDirtyTracker;
+Landroidx/compose/ui/text/platform/extensions/LocaleListHelperMethods;
+Landroidx/compose/ui/text/platform/extensions/PlaceholderExtensions_androidKt;
+Landroidx/compose/ui/text/platform/extensions/SpanRange;
+Landroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt$setFontAttributes$1;
+Landroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;
+Landroidx/compose/ui/text/platform/extensions/TextPaintExtensions_androidKt;
+Landroidx/compose/ui/text/platform/style/DrawStyleSpan;
+Landroidx/compose/ui/text/platform/style/ShaderBrushSpan;
+Landroidx/compose/ui/text/style/BaselineShift;
+Landroidx/compose/ui/text/style/BrushStyle;
+Landroidx/compose/ui/text/style/ColorStyle;
+Landroidx/compose/ui/text/style/Hyphens;
+Landroidx/compose/ui/text/style/LineBreak$Strategy;
+Landroidx/compose/ui/text/style/LineBreak$Strictness;
+Landroidx/compose/ui/text/style/LineBreak$WordBreak;
+Landroidx/compose/ui/text/style/LineBreak;
+Landroidx/compose/ui/text/style/TextAlign;
+Landroidx/compose/ui/text/style/TextDecoration;
+Landroidx/compose/ui/text/style/TextDirection;
+Landroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;
+Landroidx/compose/ui/text/style/TextForegroundStyle$merge$2;
+Landroidx/compose/ui/text/style/TextForegroundStyle;
+Landroidx/compose/ui/text/style/TextGeometricTransform;
+Landroidx/compose/ui/text/style/TextIndent;
+Landroidx/compose/ui/text/style/TextMotion;
+Landroidx/compose/ui/unit/AndroidDensity_androidKt;
+Landroidx/compose/ui/unit/Constraints$Companion;
+Landroidx/compose/ui/unit/Constraints;
+Landroidx/compose/ui/unit/ConstraintsKt;
+Landroidx/compose/ui/unit/Density;
+Landroidx/compose/ui/unit/DensityImpl;
+Landroidx/compose/ui/unit/Dp;
+Landroidx/compose/ui/unit/DpKt;
+Landroidx/compose/ui/unit/DpOffset;
+Landroidx/compose/ui/unit/DpRect;
+Landroidx/compose/ui/unit/IntOffset$Companion;
+Landroidx/compose/ui/unit/IntOffset;
+Landroidx/compose/ui/unit/IntOffsetKt;
+Landroidx/compose/ui/unit/IntSize$Companion;
+Landroidx/compose/ui/unit/IntSize;
+Landroidx/compose/ui/unit/IntSizeKt;
+Landroidx/compose/ui/unit/LayoutDirection;
+Landroidx/compose/ui/unit/TextUnit;
+Landroidx/compose/ui/unit/TextUnitKt;
+Landroidx/compose/ui/unit/TextUnitType;
+Landroidx/compose/ui/util/MathHelpersKt;
+Landroidx/core/R$id;
+Landroidx/core/app/ComponentActivity;
+Landroidx/core/app/CoreComponentFactory$CompatWrapped;
+Landroidx/core/app/CoreComponentFactory;
+Landroidx/core/content/res/CamUtils;
+Landroidx/core/content/res/ColorStateListInflaterCompat;
+Landroidx/core/content/res/TypedArrayUtils;
+Landroidx/core/graphics/TypefaceCompat;
+Landroidx/core/graphics/TypefaceCompatApi29Impl;
+Landroidx/core/graphics/TypefaceCompatBaseImpl;
+Landroidx/core/graphics/TypefaceCompatUtil$Api19Impl;
+Landroidx/core/graphics/TypefaceCompatUtil;
+Landroidx/core/math/MathUtils;
+Landroidx/core/os/BuildCompat;
+Landroidx/core/os/TraceCompat$Api18Impl;
+Landroidx/core/os/TraceCompat;
+Landroidx/core/provider/FontProvider$$ExternalSyntheticLambda0;
+Landroidx/core/provider/FontProvider$Api16Impl;
+Landroidx/core/provider/FontProvider;
+Landroidx/core/provider/FontRequest;
+Landroidx/core/provider/FontsContractCompat$FontFamilyResult;
+Landroidx/core/provider/FontsContractCompat$FontInfo;
+Landroidx/core/text/TextUtilsCompat$Api17Impl;
+Landroidx/core/text/TextUtilsCompat;
+Landroidx/core/util/Preconditions;
+Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;
+Landroidx/core/view/AccessibilityDelegateCompat;
+Landroidx/core/view/MenuHostHelper;
+Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;
+Landroidx/core/view/ViewCompat;
+Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat;
+Landroidx/customview/poolingcontainer/PoolingContainer;
+Landroidx/customview/poolingcontainer/PoolingContainerListener;
+Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder;
+Landroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;
+Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;
+Landroidx/emoji2/text/DefaultEmojiCompatConfig;
+Landroidx/emoji2/text/DefaultGlyphChecker;
+Landroidx/emoji2/text/EmojiCompat$CompatInternal19$1;
+Landroidx/emoji2/text/EmojiCompat$CompatInternal19;
+Landroidx/emoji2/text/EmojiCompat$CompatInternal;
+Landroidx/emoji2/text/EmojiCompat$Config;
+Landroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;
+Landroidx/emoji2/text/EmojiCompat$GlyphChecker;
+Landroidx/emoji2/text/EmojiCompat$InitCallback;
+Landroidx/emoji2/text/EmojiCompat$ListenerDispatcher;
+Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;
+Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoaderCallback;
+Landroidx/emoji2/text/EmojiCompat$SpanFactory;
+Landroidx/emoji2/text/EmojiCompat;
+Landroidx/emoji2/text/EmojiCompatInitializer$1;
+Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultConfig;
+Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;
+Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;
+Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader;
+Landroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;
+Landroidx/emoji2/text/EmojiCompatInitializer;
+Landroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Reflections;
+Landroidx/emoji2/text/EmojiProcessor$EmojiProcessAddSpanCallback;
+Landroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback;
+Landroidx/emoji2/text/EmojiProcessor$ProcessorSm;
+Landroidx/emoji2/text/EmojiProcessor;
+Landroidx/emoji2/text/EmojiSpan;
+Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontProviderHelper;
+Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0;
+Landroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;
+Landroidx/emoji2/text/FontRequestEmojiCompatConfig;
+Landroidx/emoji2/text/MetadataListReader$ByteBufferReader;
+Landroidx/emoji2/text/MetadataListReader;
+Landroidx/emoji2/text/MetadataRepo$Node;
+Landroidx/emoji2/text/MetadataRepo;
+Landroidx/emoji2/text/SpannableBuilder;
+Landroidx/emoji2/text/TypefaceEmojiRasterizer;
+Landroidx/emoji2/text/UnprecomputeTextOnModificationSpannable;
+Landroidx/emoji2/text/flatbuffer/MetadataItem;
+Landroidx/emoji2/text/flatbuffer/MetadataList;
+Landroidx/emoji2/text/flatbuffer/Table;
+Landroidx/emoji2/text/flatbuffer/Utf8Safe;
+Landroidx/lifecycle/DefaultLifecycleObserver;
+Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;
+Landroidx/lifecycle/DefaultLifecycleObserverAdapter;
+Landroidx/lifecycle/EmptyActivityLifecycleCallbacks;
+Landroidx/lifecycle/HasDefaultViewModelProviderFactory;
+Landroidx/lifecycle/Lifecycle$Event$Companion;
+Landroidx/lifecycle/Lifecycle$Event$WhenMappings;
+Landroidx/lifecycle/Lifecycle$Event;
+Landroidx/lifecycle/Lifecycle$State;
+Landroidx/lifecycle/Lifecycle;
+Landroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;
+Landroidx/lifecycle/LifecycleDispatcher;
+Landroidx/lifecycle/LifecycleEventObserver;
+Landroidx/lifecycle/LifecycleObserver;
+Landroidx/lifecycle/LifecycleOwner;
+Landroidx/lifecycle/LifecycleRegistry$ObserverWithState;
+Landroidx/lifecycle/LifecycleRegistry;
+Landroidx/lifecycle/LifecycleRegistryOwner;
+Landroidx/lifecycle/Lifecycling;
+Landroidx/lifecycle/ProcessLifecycleInitializer;
+Landroidx/lifecycle/ProcessLifecycleOwner$1;
+Landroidx/lifecycle/ProcessLifecycleOwner$2;
+Landroidx/lifecycle/ProcessLifecycleOwner$3$$ExternalSyntheticApiModelOutline0;
+Landroidx/lifecycle/ProcessLifecycleOwner$3$1;
+Landroidx/lifecycle/ProcessLifecycleOwner$3;
+Landroidx/lifecycle/ProcessLifecycleOwner;
+Landroidx/lifecycle/ReportFragment$ActivityInitializationListener;
+Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$$ExternalSyntheticApiModelOutline0;
+Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;
+Landroidx/lifecycle/ReportFragment;
+Landroidx/lifecycle/SavedStateHandleAttacher;
+Landroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;
+Landroidx/lifecycle/SavedStateHandleSupport$SAVED_STATE_REGISTRY_OWNER_KEY$1;
+Landroidx/lifecycle/SavedStateHandleSupport$VIEW_MODEL_STORE_OWNER_KEY$1;
+Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;
+Landroidx/lifecycle/SavedStateHandleSupport;
+Landroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;
+Landroidx/lifecycle/SavedStateHandlesProvider;
+Landroidx/lifecycle/SavedStateHandlesVM;
+Landroidx/lifecycle/ViewModel;
+Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory$Companion$ApplicationKeyImpl;
+Landroidx/lifecycle/ViewModelProvider$Factory;
+Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion$ViewModelKeyImpl;
+Landroidx/lifecycle/ViewModelStore;
+Landroidx/lifecycle/ViewModelStoreOwner;
+Landroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$1;
+Landroidx/lifecycle/ViewTreeLifecycleOwner$findViewTreeLifecycleOwner$2;
+Landroidx/lifecycle/ViewTreeLifecycleOwner;
+Landroidx/lifecycle/runtime/R$id;
+Landroidx/lifecycle/viewmodel/CreationExtras$Empty;
+Landroidx/lifecycle/viewmodel/CreationExtras;
+Landroidx/lifecycle/viewmodel/InitializerViewModelFactory;
+Landroidx/lifecycle/viewmodel/MutableCreationExtras;
+Landroidx/lifecycle/viewmodel/ViewModelInitializer;
+Landroidx/metrics/performance/DelegatingFrameMetricsListener;
+Landroidx/metrics/performance/FrameData;
+Landroidx/metrics/performance/FrameDataApi24;
+Landroidx/metrics/performance/FrameDataApi31;
+Landroidx/metrics/performance/JankStats$OnFrameListener;
+Landroidx/metrics/performance/JankStats;
+Landroidx/metrics/performance/JankStatsApi16Impl$onFrameListenerDelegate$1;
+Landroidx/metrics/performance/JankStatsApi16Impl;
+Landroidx/metrics/performance/JankStatsApi22Impl;
+Landroidx/metrics/performance/JankStatsApi24Impl$$ExternalSyntheticLambda0;
+Landroidx/metrics/performance/JankStatsApi24Impl;
+Landroidx/metrics/performance/JankStatsApi26Impl;
+Landroidx/metrics/performance/JankStatsApi31Impl;
+Landroidx/metrics/performance/JankStatsBaseImpl;
+Landroidx/metrics/performance/PerformanceMetricsState$Holder;
+Landroidx/metrics/performance/PerformanceMetricsState;
+Landroidx/metrics/performance/R$id;
+Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;
+Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;
+Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;
+Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;
+Landroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;
+Landroidx/profileinstaller/ProfileInstallerInitializer$Result;
+Landroidx/profileinstaller/ProfileInstallerInitializer;
+Landroidx/savedstate/Recreator;
+Landroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;
+Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;
+Landroidx/savedstate/SavedStateRegistry;
+Landroidx/savedstate/SavedStateRegistryController;
+Landroidx/savedstate/SavedStateRegistryOwner;
+Landroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;
+Landroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$2;
+Landroidx/startup/AppInitializer;
+Landroidx/startup/InitializationProvider;
+Landroidx/startup/Initializer;
+Landroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;
+Landroidx/tracing/Trace;
+Landroidx/tv/foundation/ContentInViewModifier$modifier$1;
+Landroidx/tv/foundation/ContentInViewModifier;
+Landroidx/tv/foundation/PivotOffsets;
+Landroidx/tv/foundation/ScrollableWithPivotKt$scrollableNestedScrollConnection$1;
+Landroidx/tv/foundation/ScrollableWithPivotKt$scrollableWithPivot$2;
+Landroidx/tv/foundation/ScrollableWithPivotKt;
+Landroidx/tv/foundation/ScrollingLogic;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticState;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$indexForKeyMapping$1;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1;
+Landroidx/tv/foundation/lazy/layout/LazyLayoutSemanticsKt;
+Landroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier$waitForFirstLayout$1;
+Landroidx/tv/foundation/lazy/list/AwaitFirstLayoutModifier;
+Landroidx/tv/foundation/lazy/list/DataIndex;
+Landroidx/tv/foundation/lazy/list/EmptyLazyListLayoutInfo;
+Landroidx/tv/foundation/lazy/list/ItemInfo;
+Landroidx/tv/foundation/lazy/list/LazyDslKt;
+Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo$Interval;
+Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo;
+Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal$Companion$emptyBeyondBoundsScope$1;
+Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal$layout$2;
+Landroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal;
+Landroidx/tv/foundation/lazy/list/LazyListIntervalContent;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator$getAnimatedOffset$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator$onMeasured$$inlined$sortBy$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator$onMeasured$$inlined$sortBy$2;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator$onMeasured$$inlined$sortByDescending$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator$onMeasured$$inlined$sortByDescending$2;
+Landroidx/tv/foundation/lazy/list/LazyListItemPlacementAnimator;
+Landroidx/tv/foundation/lazy/list/LazyListItemProvider;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderImpl$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderImpl;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$1$itemProviderState$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$2;
+Landroidx/tv/foundation/lazy/list/LazyListItemProviderKt$rememberLazyListItemProvider$nearestItemsRangeState$3;
+Landroidx/tv/foundation/lazy/list/LazyListKt$ScrollPositionUpdater$1;
+Landroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;
+Landroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;
+Landroidx/tv/foundation/lazy/list/LazyListKt$rememberLazyListMeasurePolicy$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListKt;
+Landroidx/tv/foundation/lazy/list/LazyListMeasureKt$measureLazyList$1;
+Landroidx/tv/foundation/lazy/list/LazyListMeasureKt$measureLazyList$5;
+Landroidx/tv/foundation/lazy/list/LazyListMeasureKt;
+Landroidx/tv/foundation/lazy/list/LazyListMeasureResult;
+Landroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1$invoke$$inlined$onDispose$1;
+Landroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt$LazyListPinnableContainerProvider$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListPinnableContainerProviderKt;
+Landroidx/tv/foundation/lazy/list/LazyListPinnableItem;
+Landroidx/tv/foundation/lazy/list/LazyListPinnedItem;
+Landroidx/tv/foundation/lazy/list/LazyListPlaceableWrapper;
+Landroidx/tv/foundation/lazy/list/LazyListPositionedItem;
+Landroidx/tv/foundation/lazy/list/LazyListScrollPosition;
+Landroidx/tv/foundation/lazy/list/LazyListStateKt$rememberTvLazyListState$1$1;
+Landroidx/tv/foundation/lazy/list/LazyListStateKt;
+Landroidx/tv/foundation/lazy/list/LazyMeasuredItem;
+Landroidx/tv/foundation/lazy/list/LazyMeasuredItemProvider;
+Landroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$1;
+Landroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1$scrollAxisRange$2;
+Landroidx/tv/foundation/lazy/list/LazySemanticsKt$rememberLazyListSemanticState$1$1;
+Landroidx/tv/foundation/lazy/list/MeasuredItemFactory;
+Landroidx/tv/foundation/lazy/list/PlaceableInfo;
+Landroidx/tv/foundation/lazy/list/TvLazyListItemInfo;
+Landroidx/tv/foundation/lazy/list/TvLazyListItemScope;
+Landroidx/tv/foundation/lazy/list/TvLazyListItemScopeImpl;
+Landroidx/tv/foundation/lazy/list/TvLazyListLayoutInfo;
+Landroidx/tv/foundation/lazy/list/TvLazyListScope$items$1;
+Landroidx/tv/foundation/lazy/list/TvLazyListScope;
+Landroidx/tv/foundation/lazy/list/TvLazyListScopeImpl;
+Landroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$1;
+Landroidx/tv/foundation/lazy/list/TvLazyListState$Companion$Saver$2;
+Landroidx/tv/foundation/lazy/list/TvLazyListState$remeasurementModifier$1;
+Landroidx/tv/foundation/lazy/list/TvLazyListState$scroll$1;
+Landroidx/tv/foundation/lazy/list/TvLazyListState$scrollableState$1;
+Landroidx/tv/foundation/lazy/list/TvLazyListState;
+Landroidx/tv/material3/ColorScheme;
+Landroidx/tv/material3/ColorSchemeKt$LocalColorScheme$1;
+Landroidx/tv/material3/ColorSchemeKt;
+Landroidx/tv/material3/ContentColorKt$LocalContentColor$1;
+Landroidx/tv/material3/ContentColorKt;
+Landroidx/tv/material3/MaterialThemeKt$$ExternalSyntheticOutline0;
+Landroidx/tv/material3/MaterialThemeKt$MaterialTheme$1;
+Landroidx/tv/material3/MaterialThemeKt$MaterialTheme$2;
+Landroidx/tv/material3/MaterialThemeKt;
+Landroidx/tv/material3/ShapeDefaults;
+Landroidx/tv/material3/Shapes;
+Landroidx/tv/material3/ShapesKt$LocalShapes$1;
+Landroidx/tv/material3/ShapesKt;
+Landroidx/tv/material3/TabColors;
+Landroidx/tv/material3/TabKt$Tab$1;
+Landroidx/tv/material3/TabKt$Tab$3$1$1;
+Landroidx/tv/material3/TabKt$Tab$3$2$1;
+Landroidx/tv/material3/TabKt$Tab$3;
+Landroidx/tv/material3/TabKt$Tab$4;
+Landroidx/tv/material3/TabKt;
+Landroidx/tv/material3/TabRowDefaults$PillIndicator$1;
+Landroidx/tv/material3/TabRowDefaults;
+Landroidx/tv/material3/TabRowKt$LocalTabRowHasFocus$1;
+Landroidx/tv/material3/TabRowKt$TabRow$1;
+Landroidx/tv/material3/TabRowKt$TabRow$2$1$1;
+Landroidx/tv/material3/TabRowKt$TabRow$2$2$1$1$2;
+Landroidx/tv/material3/TabRowKt$TabRow$2$2$1$1;
+Landroidx/tv/material3/TabRowKt$TabRow$2$2$1$separators$1;
+Landroidx/tv/material3/TabRowKt$TabRow$2$2$1;
+Landroidx/tv/material3/TabRowKt$TabRow$2;
+Landroidx/tv/material3/TabRowKt$TabRow$3;
+Landroidx/tv/material3/TabRowKt;
+Landroidx/tv/material3/TabRowSlots;
+Landroidx/tv/material3/TextKt$LocalTextStyle$1;
+Landroidx/tv/material3/TextKt$Text$1;
+Landroidx/tv/material3/TextKt$Text$2;
+Landroidx/tv/material3/TextKt;
+Landroidx/tv/material3/Typography;
+Landroidx/tv/material3/TypographyKt$LocalTypography$1;
+Landroidx/tv/material3/TypographyKt;
+Landroidx/tv/material3/tokens/ColorDarkTokens;
+Landroidx/tv/material3/tokens/PaletteTokens;
+Landroidx/tv/material3/tokens/ShapeTokens;
+Landroidx/tv/material3/tokens/TypeScaleTokens;
+Landroidx/tv/material3/tokens/TypefaceTokens;
+Landroidx/tv/material3/tokens/TypographyTokens;
+Lcoil/base/R$id;
+Lcoil/request/ViewTargetDisposable;
+Lcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt$lambda-1$1;
+Lcom/example/tvcomposebasedtests/ComposableSingletons$MainActivityKt;
+Lcom/example/tvcomposebasedtests/JankStatsAggregator$OnJankReportListener;
+Lcom/example/tvcomposebasedtests/JankStatsAggregator$listener$1;
+Lcom/example/tvcomposebasedtests/JankStatsAggregator;
+Lcom/example/tvcomposebasedtests/MainActivity$jankReportListener$1;
+Lcom/example/tvcomposebasedtests/MainActivity$startFrameMetrics$listener$1;
+Lcom/example/tvcomposebasedtests/MainActivity;
+Lcom/example/tvcomposebasedtests/UtilsKt;
+Lcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1$1$1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/AppKt$App$1;
+Lcom/example/tvcomposebasedtests/tvComponents/AppKt;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-2$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-3$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt$lambda-4$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$LazyContainersKt;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-2$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-3$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-4$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-5$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-6$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-7$1;
+Lcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt;
+Lcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleCardItem$2;
+Lcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyRow$1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$drawBorderAndScaleOnFocus$1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;
+Lcom/example/tvcomposebasedtests/tvComponents/Navigation;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$1$1;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1$1$2;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$PillIndicatorTabRow$1;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$2$1;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$3$1;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$4;
+Lcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt;
+Lcom/google/gson/internal/ObjectConstructor;
+Lkotlin/ExceptionsKt;
+Lkotlin/Function;
+Lkotlin/Lazy;
+Lkotlin/LazyKt__LazyJVMKt;
+Lkotlin/NoWhenBranchMatchedException;
+Lkotlin/Pair;
+Lkotlin/Result$Failure;
+Lkotlin/Result;
+Lkotlin/ResultKt;
+Lkotlin/SynchronizedLazyImpl;
+Lkotlin/UNINITIALIZED_VALUE;
+Lkotlin/Unit;
+Lkotlin/UnsafeLazyImpl;
+Lkotlin/UnsignedKt;
+Lkotlin/collections/AbstractCollection;
+Lkotlin/collections/AbstractList;
+Lkotlin/collections/AbstractMap;
+Lkotlin/collections/AbstractMutableList;
+Lkotlin/collections/AbstractMutableMap;
+Lkotlin/collections/AbstractSet;
+Lkotlin/collections/ArrayDeque;
+Lkotlin/collections/ArraysKt__ArraysKt;
+Lkotlin/collections/ArraysKt___ArraysKt;
+Lkotlin/collections/CollectionsKt__CollectionsKt;
+Lkotlin/collections/CollectionsKt__IteratorsJVMKt;
+Lkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;
+Lkotlin/collections/CollectionsKt__ReversedViewsKt;
+Lkotlin/collections/CollectionsKt___CollectionsKt;
+Lkotlin/collections/EmptyList;
+Lkotlin/collections/EmptyMap;
+Lkotlin/collections/IntIterator;
+Lkotlin/collections/MapsKt___MapsJvmKt;
+Lkotlin/collections/SetsKt__SetsKt;
+Lkotlin/coroutines/AbstractCoroutineContextElement;
+Lkotlin/coroutines/AbstractCoroutineContextKey;
+Lkotlin/coroutines/CombinedContext;
+Lkotlin/coroutines/Continuation;
+Lkotlin/coroutines/ContinuationInterceptor$Key;
+Lkotlin/coroutines/ContinuationInterceptor;
+Lkotlin/coroutines/ContinuationKt;
+Lkotlin/coroutines/CoroutineContext$DefaultImpls;
+Lkotlin/coroutines/CoroutineContext$Element$DefaultImpls;
+Lkotlin/coroutines/CoroutineContext$Element;
+Lkotlin/coroutines/CoroutineContext$Key;
+Lkotlin/coroutines/CoroutineContext$plus$1;
+Lkotlin/coroutines/CoroutineContext;
+Lkotlin/coroutines/EmptyCoroutineContext;
+Lkotlin/coroutines/SafeContinuation;
+Lkotlin/coroutines/intrinsics/CoroutineSingletons;
+Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;
+Lkotlin/coroutines/jvm/internal/CompletedContinuation;
+Lkotlin/coroutines/jvm/internal/ContinuationImpl;
+Lkotlin/coroutines/jvm/internal/CoroutineStackFrame;
+Lkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;
+Lkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;
+Lkotlin/coroutines/jvm/internal/SuspendLambda;
+Lkotlin/internal/ProgressionUtilKt;
+Lkotlin/jvm/JvmClassMappingKt;
+Lkotlin/jvm/functions/Function0;
+Lkotlin/jvm/functions/Function10;
+Lkotlin/jvm/functions/Function11;
+Lkotlin/jvm/functions/Function12;
+Lkotlin/jvm/functions/Function13;
+Lkotlin/jvm/functions/Function14;
+Lkotlin/jvm/functions/Function15;
+Lkotlin/jvm/functions/Function16;
+Lkotlin/jvm/functions/Function17;
+Lkotlin/jvm/functions/Function18;
+Lkotlin/jvm/functions/Function19;
+Lkotlin/jvm/functions/Function1;
+Lkotlin/jvm/functions/Function20;
+Lkotlin/jvm/functions/Function21;
+Lkotlin/jvm/functions/Function22;
+Lkotlin/jvm/functions/Function2;
+Lkotlin/jvm/functions/Function3;
+Lkotlin/jvm/functions/Function4;
+Lkotlin/jvm/functions/Function5;
+Lkotlin/jvm/functions/Function6;
+Lkotlin/jvm/functions/Function7;
+Lkotlin/jvm/functions/Function8;
+Lkotlin/jvm/functions/Function9;
+Lkotlin/jvm/internal/CallableReference$NoReceiver;
+Lkotlin/jvm/internal/CallableReference;
+Lkotlin/jvm/internal/ClassBasedDeclarationContainer;
+Lkotlin/jvm/internal/ClassReference;
+Lkotlin/jvm/internal/CollectionToArray;
+Lkotlin/jvm/internal/FunctionBase;
+Lkotlin/jvm/internal/FunctionReference;
+Lkotlin/jvm/internal/FunctionReferenceImpl;
+Lkotlin/jvm/internal/Intrinsics$$ExternalSyntheticCheckNotZero0;
+Lkotlin/jvm/internal/Intrinsics$Kotlin;
+Lkotlin/jvm/internal/Intrinsics;
+Lkotlin/jvm/internal/Lambda;
+Lkotlin/jvm/internal/MutablePropertyReference1;
+Lkotlin/jvm/internal/MutablePropertyReference1Impl;
+Lkotlin/jvm/internal/MutablePropertyReference;
+Lkotlin/jvm/internal/PropertyReference;
+Lkotlin/jvm/internal/Ref$BooleanRef;
+Lkotlin/jvm/internal/Ref$FloatRef;
+Lkotlin/jvm/internal/Ref$ObjectRef;
+Lkotlin/jvm/internal/Reflection;
+Lkotlin/jvm/internal/ReflectionFactory;
+Lkotlin/jvm/internal/TypeIntrinsics;
+Lkotlin/jvm/internal/markers/KMappedMarker;
+Lkotlin/jvm/internal/markers/KMutableCollection;
+Lkotlin/jvm/internal/markers/KMutableMap;
+Lkotlin/math/MathKt;
+Lkotlin/math/MathKt__MathJVMKt;
+Lkotlin/ranges/ClosedRange;
+Lkotlin/ranges/IntProgression;
+Lkotlin/ranges/IntProgressionIterator;
+Lkotlin/ranges/IntRange;
+Lkotlin/ranges/RangesKt___RangesKt;
+Lkotlin/reflect/KCallable;
+Lkotlin/reflect/KClass;
+Lkotlin/reflect/KFunction;
+Lkotlin/reflect/KMutableProperty1;
+Lkotlin/reflect/KProperty1;
+Lkotlin/reflect/KProperty;
+Lkotlin/sequences/ConstrainedOnceSequence;
+Lkotlin/sequences/FilteringSequence$iterator$1;
+Lkotlin/sequences/FilteringSequence;
+Lkotlin/sequences/GeneratorSequence$iterator$1;
+Lkotlin/sequences/GeneratorSequence;
+Lkotlin/sequences/Sequence;
+Lkotlin/sequences/SequencesKt__SequencesJVMKt;
+Lkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;
+Lkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;
+Lkotlin/sequences/SequencesKt__SequencesKt;
+Lkotlin/sequences/SequencesKt___SequencesJvmKt;
+Lkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;
+Lkotlin/sequences/SequencesKt___SequencesKt;
+Lkotlin/sequences/TransformingSequence$iterator$1;
+Lkotlin/sequences/TransformingSequence;
+Lkotlin/text/CharsKt__CharKt;
+Lkotlin/text/StringsKt__AppendableKt;
+Lkotlin/text/StringsKt__IndentKt;
+Lkotlin/text/StringsKt__RegexExtensionsKt;
+Lkotlin/text/StringsKt__StringBuilderKt;
+Lkotlin/text/StringsKt__StringNumberConversionsKt;
+Lkotlin/text/StringsKt__StringsJVMKt;
+Lkotlin/text/StringsKt__StringsKt;
+Lkotlinx/coroutines/AbstractCoroutine;
+Lkotlinx/coroutines/Active;
+Lkotlinx/coroutines/BeforeResumeCancelHandler;
+Lkotlinx/coroutines/BlockingCoroutine;
+Lkotlinx/coroutines/BlockingEventLoop;
+Lkotlinx/coroutines/BuildersKt;
+Lkotlinx/coroutines/CancelHandler;
+Lkotlinx/coroutines/CancelHandlerBase;
+Lkotlinx/coroutines/CancellableContinuation;
+Lkotlinx/coroutines/CancellableContinuationImpl;
+Lkotlinx/coroutines/CancellableContinuationImplKt;
+Lkotlinx/coroutines/CancellableContinuationKt;
+Lkotlinx/coroutines/CancelledContinuation;
+Lkotlinx/coroutines/ChildContinuation;
+Lkotlinx/coroutines/ChildHandle;
+Lkotlinx/coroutines/ChildHandleNode;
+Lkotlinx/coroutines/ChildJob;
+Lkotlinx/coroutines/CompletableDeferredImpl;
+Lkotlinx/coroutines/CompletedContinuation;
+Lkotlinx/coroutines/CompletedExceptionally;
+Lkotlinx/coroutines/CompletedWithCancellation;
+Lkotlinx/coroutines/CompletionHandlerBase;
+Lkotlinx/coroutines/CompletionHandlerException;
+Lkotlinx/coroutines/CompletionStateKt;
+Lkotlinx/coroutines/CopyableThreadContextElement;
+Lkotlinx/coroutines/CoroutineContextKt$foldCopies$1;
+Lkotlinx/coroutines/CoroutineContextKt$foldCopies$folded$1;
+Lkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;
+Lkotlinx/coroutines/CoroutineContextKt;
+Lkotlinx/coroutines/CoroutineDispatcher$Key$1;
+Lkotlinx/coroutines/CoroutineDispatcher$Key;
+Lkotlinx/coroutines/CoroutineDispatcher;
+Lkotlinx/coroutines/CoroutineExceptionHandler$Key;
+Lkotlinx/coroutines/CoroutineExceptionHandler;
+Lkotlinx/coroutines/CoroutineScope;
+Lkotlinx/coroutines/CoroutineScopeKt;
+Lkotlinx/coroutines/DefaultExecutor;
+Lkotlinx/coroutines/DefaultExecutorKt;
+Lkotlinx/coroutines/Delay;
+Lkotlinx/coroutines/DispatchedTask;
+Lkotlinx/coroutines/DispatchedTaskKt;
+Lkotlinx/coroutines/Dispatchers;
+Lkotlinx/coroutines/DisposableHandle;
+Lkotlinx/coroutines/Empty;
+Lkotlinx/coroutines/EventLoop;
+Lkotlinx/coroutines/EventLoopImplBase;
+Lkotlinx/coroutines/EventLoopImplPlatform;
+Lkotlinx/coroutines/ExecutorCoroutineDispatcher;
+Lkotlinx/coroutines/GlobalScope;
+Lkotlinx/coroutines/InactiveNodeList;
+Lkotlinx/coroutines/Incomplete;
+Lkotlinx/coroutines/IncompleteStateBox;
+Lkotlinx/coroutines/InvokeOnCancel;
+Lkotlinx/coroutines/InvokeOnCancelling;
+Lkotlinx/coroutines/InvokeOnCompletion;
+Lkotlinx/coroutines/Job$DefaultImpls;
+Lkotlinx/coroutines/Job$Key;
+Lkotlinx/coroutines/Job;
+Lkotlinx/coroutines/JobCancellationException;
+Lkotlinx/coroutines/JobCancellingNode;
+Lkotlinx/coroutines/JobImpl;
+Lkotlinx/coroutines/JobKt;
+Lkotlinx/coroutines/JobNode;
+Lkotlinx/coroutines/JobSupport$ChildCompletion;
+Lkotlinx/coroutines/JobSupport$Finishing;
+Lkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;
+Lkotlinx/coroutines/JobSupport;
+Lkotlinx/coroutines/JobSupportKt;
+Lkotlinx/coroutines/MainCoroutineDispatcher;
+Lkotlinx/coroutines/NodeList;
+Lkotlinx/coroutines/NonDisposableHandle;
+Lkotlinx/coroutines/NotCompleted;
+Lkotlinx/coroutines/ParentJob;
+Lkotlinx/coroutines/RemoveOnCancel;
+Lkotlinx/coroutines/StandaloneCoroutine;
+Lkotlinx/coroutines/SupervisorJobImpl;
+Lkotlinx/coroutines/ThreadContextElement;
+Lkotlinx/coroutines/ThreadLocalEventLoop;
+Lkotlinx/coroutines/TimeoutCancellationException;
+Lkotlinx/coroutines/Unconfined;
+Lkotlinx/coroutines/UndispatchedCoroutine;
+Lkotlinx/coroutines/UndispatchedMarker;
+Lkotlinx/coroutines/android/AndroidDispatcherFactory;
+Lkotlinx/coroutines/android/HandlerContext;
+Lkotlinx/coroutines/android/HandlerDispatcher;
+Lkotlinx/coroutines/android/HandlerDispatcherKt;
+Lkotlinx/coroutines/channels/AbstractChannel$Itr;
+Lkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;
+Lkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;
+Lkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;
+Lkotlinx/coroutines/channels/AbstractChannel$enqueueReceiveInternal$$inlined$addLastIfPrevAndIf$1;
+Lkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;
+Lkotlinx/coroutines/channels/AbstractChannel;
+Lkotlinx/coroutines/channels/AbstractChannelKt;
+Lkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;
+Lkotlinx/coroutines/channels/AbstractSendChannel;
+Lkotlinx/coroutines/channels/ArrayChannel;
+Lkotlinx/coroutines/channels/BufferOverflow;
+Lkotlinx/coroutines/channels/Channel$Factory;
+Lkotlinx/coroutines/channels/Channel;
+Lkotlinx/coroutines/channels/ChannelCoroutine;
+Lkotlinx/coroutines/channels/ChannelIterator;
+Lkotlinx/coroutines/channels/ChannelKt;
+Lkotlinx/coroutines/channels/ChannelResult$Closed;
+Lkotlinx/coroutines/channels/ChannelResult$Failed;
+Lkotlinx/coroutines/channels/ChannelResult;
+Lkotlinx/coroutines/channels/Closed;
+Lkotlinx/coroutines/channels/ClosedSendChannelException;
+Lkotlinx/coroutines/channels/ConflatedChannel;
+Lkotlinx/coroutines/channels/LinkedListChannel;
+Lkotlinx/coroutines/channels/ProducerCoroutine;
+Lkotlinx/coroutines/channels/ProducerScope;
+Lkotlinx/coroutines/channels/Receive;
+Lkotlinx/coroutines/channels/ReceiveChannel;
+Lkotlinx/coroutines/channels/ReceiveOrClosed;
+Lkotlinx/coroutines/channels/RendezvousChannel;
+Lkotlinx/coroutines/channels/Send;
+Lkotlinx/coroutines/channels/SendChannel;
+Lkotlinx/coroutines/flow/AbstractFlow$collect$1;
+Lkotlinx/coroutines/flow/AbstractFlow;
+Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;
+Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;
+Lkotlinx/coroutines/flow/DistinctFlowImpl;
+Lkotlinx/coroutines/flow/Flow;
+Lkotlinx/coroutines/flow/FlowCollector;
+Lkotlinx/coroutines/flow/FlowKt;
+Lkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;
+Lkotlinx/coroutines/flow/FlowKt__ChannelsKt;
+Lkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;
+Lkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;
+Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;
+Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;
+Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;
+Lkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;
+Lkotlinx/coroutines/flow/FlowKt__MergeKt;
+Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;
+Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;
+Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;
+Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;
+Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;
+Lkotlinx/coroutines/flow/MutableSharedFlow;
+Lkotlinx/coroutines/flow/MutableStateFlow;
+Lkotlinx/coroutines/flow/ReadonlyStateFlow;
+Lkotlinx/coroutines/flow/SafeFlow;
+Lkotlinx/coroutines/flow/SharedFlow;
+Lkotlinx/coroutines/flow/SharedFlowImpl$Emitter;
+Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1;
+Lkotlinx/coroutines/flow/SharedFlowImpl;
+Lkotlinx/coroutines/flow/SharedFlowKt;
+Lkotlinx/coroutines/flow/SharedFlowSlot;
+Lkotlinx/coroutines/flow/SharingCommand;
+Lkotlinx/coroutines/flow/SharingConfig;
+Lkotlinx/coroutines/flow/SharingStarted$Companion;
+Lkotlinx/coroutines/flow/SharingStarted;
+Lkotlinx/coroutines/flow/StartedEagerly;
+Lkotlinx/coroutines/flow/StartedLazily;
+Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;
+Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;
+Lkotlinx/coroutines/flow/StartedWhileSubscribed;
+Lkotlinx/coroutines/flow/StateFlow;
+Lkotlinx/coroutines/flow/StateFlowImpl$collect$1;
+Lkotlinx/coroutines/flow/StateFlowImpl;
+Lkotlinx/coroutines/flow/StateFlowKt;
+Lkotlinx/coroutines/flow/StateFlowSlot;
+Lkotlinx/coroutines/flow/SubscribedFlowCollector;
+Lkotlinx/coroutines/flow/ThrowingCollector;
+Lkotlinx/coroutines/flow/internal/AbortFlowException;
+Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;
+Lkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;
+Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;
+Lkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;
+Lkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;
+Lkotlinx/coroutines/flow/internal/ChannelFlow;
+Lkotlinx/coroutines/flow/internal/ChannelFlowOperator;
+Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;
+Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;
+Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;
+Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;
+Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;
+Lkotlinx/coroutines/flow/internal/DownstreamExceptionContext;
+Lkotlinx/coroutines/flow/internal/FusibleFlow;
+Lkotlinx/coroutines/flow/internal/NoOpContinuation;
+Lkotlinx/coroutines/flow/internal/NopCollector;
+Lkotlinx/coroutines/flow/internal/NullSurrogateKt;
+Lkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;
+Lkotlinx/coroutines/flow/internal/SafeCollector;
+Lkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;
+Lkotlinx/coroutines/flow/internal/SafeCollectorKt;
+Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;
+Lkotlinx/coroutines/flow/internal/SendingCollector;
+Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;
+Lkotlinx/coroutines/internal/AtomicKt;
+Lkotlinx/coroutines/internal/AtomicOp;
+Lkotlinx/coroutines/internal/ContextScope;
+Lkotlinx/coroutines/internal/DispatchedContinuation;
+Lkotlinx/coroutines/internal/DispatchedContinuationKt;
+Lkotlinx/coroutines/internal/LimitedDispatcher;
+Lkotlinx/coroutines/internal/LockFreeLinkedListHead;
+Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;
+Lkotlinx/coroutines/internal/LockFreeLinkedListNode;
+Lkotlinx/coroutines/internal/LockFreeTaskQueue;
+Lkotlinx/coroutines/internal/LockFreeTaskQueueCore;
+Lkotlinx/coroutines/internal/MainDispatcherFactory;
+Lkotlinx/coroutines/internal/MainDispatcherLoader$$ExternalSyntheticServiceLoad0;
+Lkotlinx/coroutines/internal/MainDispatcherLoader;
+Lkotlinx/coroutines/internal/OnUndeliveredElementKt$bindCancellationFun$1;
+Lkotlinx/coroutines/internal/OnUndeliveredElementKt;
+Lkotlinx/coroutines/internal/OpDescriptor;
+Lkotlinx/coroutines/internal/Removed;
+Lkotlinx/coroutines/internal/ResizableAtomicArray;
+Lkotlinx/coroutines/internal/ScopeCoroutine;
+Lkotlinx/coroutines/internal/StackTraceRecoveryKt;
+Lkotlinx/coroutines/internal/Symbol;
+Lkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;
+Lkotlinx/coroutines/internal/ThreadContextKt$countAll$1;
+Lkotlinx/coroutines/internal/ThreadContextKt;
+Lkotlinx/coroutines/intrinsics/UndispatchedKt;
+Lkotlinx/coroutines/scheduling/CoroutineScheduler;
+Lkotlinx/coroutines/scheduling/DefaultIoScheduler;
+Lkotlinx/coroutines/scheduling/DefaultScheduler;
+Lkotlinx/coroutines/scheduling/GlobalQueue;
+Lkotlinx/coroutines/scheduling/NanoTimeSource;
+Lkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;
+Lkotlinx/coroutines/scheduling/SchedulerTimeSource;
+Lkotlinx/coroutines/scheduling/Task;
+Lkotlinx/coroutines/scheduling/TaskContext;
+Lkotlinx/coroutines/scheduling/TaskContextImpl;
+Lkotlinx/coroutines/scheduling/TasksKt;
+Lkotlinx/coroutines/scheduling/UnlimitedIoScheduler;
+Lkotlinx/coroutines/sync/Empty;
+Lkotlinx/coroutines/sync/Mutex;
+Lkotlinx/coroutines/sync/MutexImpl$LockCont$tryResumeLockWaiter$1;
+Lkotlinx/coroutines/sync/MutexImpl$LockCont;
+Lkotlinx/coroutines/sync/MutexImpl$LockWaiter;
+Lkotlinx/coroutines/sync/MutexImpl$LockedQueue;
+Lkotlinx/coroutines/sync/MutexImpl$UnlockOp;
+Lkotlinx/coroutines/sync/MutexImpl;
+Lkotlinx/coroutines/sync/MutexKt;
+PLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
+PLandroidx/arch/core/internal/SafeIterableMap$DescendingIterator;->forward(Landroidx/arch/core/internal/SafeIterableMap$Entry;)Landroidx/arch/core/internal/SafeIterableMap$Entry;
+PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object;
+PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;-><init>(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function4;II)V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$4;-><clinit>()V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$4;-><init>()V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$3;-><init>(Ljava/lang/Object;)V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateList;Ljava/lang/Object;Landroidx/compose/animation/AnimatedContentScope;)V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$5$1;-><init>(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Landroidx/compose/animation/AnimatedContentScope;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/snapshots/SnapshotStateList;)V
+PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;-><clinit>()V
+PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;-><init>()V
+PLandroidx/compose/animation/AnimatedContentMeasurePolicy;-><init>(Landroidx/compose/animation/AnimatedContentScope;)V
+PLandroidx/compose/animation/AnimatedContentScope$ChildData;-><init>(Z)V
+PLandroidx/compose/animation/AnimatedContentScope$ChildData;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/animation/AnimatedContentScope$ChildData;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$1;-><init>(JLandroidx/compose/ui/layout/Placeable;)V
+PLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$size$1;-><init>(Landroidx/compose/animation/AnimatedContentScope;Landroidx/compose/animation/AnimatedContentScope$SizeModifier;)V
+PLandroidx/compose/animation/AnimatedContentScope$SizeModifier$measure$size$2;-><init>(Landroidx/compose/animation/AnimatedContentScope;)V
+PLandroidx/compose/animation/AnimatedContentScope$SizeModifier;-><init>(Landroidx/compose/animation/AnimatedContentScope;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/runtime/MutableState;)V
+PLandroidx/compose/animation/AnimatedContentScope;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/unit/LayoutDirection;)V
+PLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy$measure$1;-><init>(Ljava/util/ArrayList;)V
+PLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;-><init>(Landroidx/compose/animation/AnimatedVisibilityScopeImpl;)V
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1$1;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1$2;-><init>(Landroidx/compose/runtime/MutableState;)V
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$7;-><clinit>()V
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$7;-><init>()V
+PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$7;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->getTransition()Landroidx/compose/animation/core/Transition;
+PLandroidx/compose/animation/EnterExitState;-><clinit>()V
+PLandroidx/compose/animation/EnterExitState;-><init>(ILjava/lang/String;)V
+PLandroidx/compose/animation/EnterExitTransitionKt$TransformOriginVectorConverter$1;-><clinit>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$TransformOriginVectorConverter$1;-><init>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$TransformOriginVectorConverter$2;-><clinit>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$TransformOriginVectorConverter$2;-><init>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$createModifier$2$1;-><init>(Landroidx/compose/runtime/State;)V
+PLandroidx/compose/animation/EnterExitTransitionKt$slideInHorizontally$2;-><init>(Lkotlin/jvm/functions/Function1;)V
+PLandroidx/compose/animation/EnterExitTransitionKt$slideOutHorizontally$1;-><clinit>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$slideOutHorizontally$1;-><init>()V
+PLandroidx/compose/animation/EnterExitTransitionKt$slideOutHorizontally$2;-><init>(Lkotlin/jvm/functions/Function1;)V
+PLandroidx/compose/animation/EnterExitTransitionKt;-><clinit>()V
+PLandroidx/compose/animation/EnterExitTransitionKt;->fadeIn$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/EnterTransitionImpl;
+PLandroidx/compose/animation/EnterExitTransitionKt;->fadeOut$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/ExitTransitionImpl;
+PLandroidx/compose/animation/EnterTransition;-><clinit>()V
+PLandroidx/compose/animation/EnterTransition;-><init>()V
+PLandroidx/compose/animation/EnterTransitionImpl;-><init>(Landroidx/compose/animation/TransitionData;)V
+PLandroidx/compose/animation/ExitTransition;-><clinit>()V
+PLandroidx/compose/animation/ExitTransition;-><init>()V
+PLandroidx/compose/animation/ExitTransitionImpl;-><init>(Landroidx/compose/animation/TransitionData;)V
+PLandroidx/compose/animation/Fade;-><init>(FLandroidx/compose/animation/core/FiniteAnimationSpec;)V
+PLandroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics;-><init>()V
+PLandroidx/compose/animation/SizeTransformImpl;-><init>(ZLkotlin/jvm/functions/Function2;)V
+PLandroidx/compose/animation/SizeTransformImpl;->getClip()Z
+PLandroidx/compose/animation/Slide;-><init>(Landroidx/compose/animation/core/FiniteAnimationSpec;Lkotlin/jvm/functions/Function1;)V
+PLandroidx/compose/animation/Slide;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/animation/SlideModifier$measure$1;-><init>(Landroidx/compose/animation/SlideModifier;Landroidx/compose/ui/layout/Placeable;J)V
+PLandroidx/compose/animation/SlideModifier$transitionSpec$1;-><init>(Landroidx/compose/animation/SlideModifier;)V
+PLandroidx/compose/animation/TransitionData;-><init>(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;)V
+PLandroidx/compose/animation/TransitionData;-><init>(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;I)V
+PLandroidx/compose/animation/TransitionData;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/animation/core/Animatable;-><init>(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Float;I)V
+PLandroidx/compose/animation/core/AnimationVector2D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector;
+PLandroidx/compose/animation/core/CubicBezierEasing;-><init>(F)V
+PLandroidx/compose/animation/core/CubicBezierEasing;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/animation/core/EasingKt$LinearEasing$1;-><clinit>()V
+PLandroidx/compose/animation/core/EasingKt$LinearEasing$1;-><init>()V
+PLandroidx/compose/animation/core/EasingKt;-><clinit>()V
+PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;-><init>(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$TransitionAnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+PLandroidx/compose/animation/core/Transition$animateTo$1$1;-><init>(Landroidx/compose/animation/core/Transition;Lkotlin/coroutines/Continuation;)V
+PLandroidx/compose/animation/core/Transition$animateTo$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/animation/core/Transition$animateTo$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/Transition$totalDurationNanos$2;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/Transition$updateTarget$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/TransitionKt$createChildTransitionInternal$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$createChildTransitionInternal$1$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$createDeferredAnimation$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;)V
+PLandroidx/compose/animation/core/TransitionKt$createDeferredAnimation$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;)V
+PLandroidx/compose/animation/core/TransitionKt$createDeferredAnimation$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/TransitionKt$createTransitionAnimation$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V
+PLandroidx/compose/animation/core/TransitionKt$createTransitionAnimation$1$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/animation/core/TransitionKt$createTransitionAnimation$1$1;-><init>(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$2$1$invoke$$inlined$onDispose$1;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$2$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$2$1;-><init>(Landroidx/compose/animation/core/Transition;)V
+PLandroidx/compose/animation/core/TransitionKt$updateTransition$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/TweenSpec;-><init>(IILandroidx/compose/animation/core/Easing;)V
+PLandroidx/compose/animation/core/TweenSpec;-><init>(ILandroidx/compose/animation/core/Easing;I)V
+PLandroidx/compose/animation/core/TweenSpec;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/animation/core/VectorConvertersKt$IntOffsetToVector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/VectorConvertersKt$IntSizeToVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/animation/core/VectorizedFiniteAnimationSpec;->isInfinite()V
+PLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;-><init>(Landroidx/compose/animation/core/FloatAnimationSpec;)V
+PLandroidx/compose/foundation/BorderKt;->shrink-Kibmq7A(FJ)J
+PLandroidx/compose/foundation/ClickableKt$PressedInteractionSourceDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/foundation/HoverableKt$hoverable$2$1$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/foundation/gestures/DraggableKt$draggable$9$1$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/foundation/gestures/ScrollableKt$awaitScrollEvent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/foundation/interaction/PressInteraction$Press;-><init>(J)V
+PLandroidx/compose/foundation/layout/BoxChildData;-><init>(Landroidx/compose/ui/BiasAlignment;)V
+PLandroidx/compose/foundation/layout/BoxChildData;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/foundation/layout/BoxChildData;->modifyParentData(Landroidx/compose/ui/unit/Density;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/foundation/layout/BoxScopeInstance;-><clinit>()V
+PLandroidx/compose/foundation/layout/BoxScopeInstance;-><init>()V
+PLandroidx/compose/foundation/layout/BoxScopeInstance;->align()Landroidx/compose/ui/Modifier;
+PLandroidx/compose/foundation/layout/PaddingValuesImpl;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/foundation/layout/PaddingValuesModifier$measure$2;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/PaddingValuesModifier;)V
+PLandroidx/compose/foundation/layout/PaddingValuesModifier;-><init>(Landroidx/compose/foundation/layout/PaddingValues;)V
+PLandroidx/compose/foundation/layout/PaddingValuesModifier;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/foundation/layout/SizeKt;->fillMaxSize$default()Landroidx/compose/ui/Modifier;
+PLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;)V
+PLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier;-><init>(FF)V
+PLandroidx/compose/foundation/layout/UnspecifiedConstraintsModifier;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;-><init>(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)V
+PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->dispose()V
+PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onForgotten()V
+PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onRemembered()V
+PLandroidx/compose/material/ripple/DebugRippleTheme;-><clinit>()V
+PLandroidx/compose/material/ripple/DebugRippleTheme;-><init>()V
+PLandroidx/compose/material/ripple/DebugRippleTheme;->defaultColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J
+PLandroidx/compose/material/ripple/DebugRippleTheme;->rippleAlpha(Landroidx/compose/runtime/Composer;)Landroidx/compose/material/ripple/RippleAlpha;
+PLandroidx/compose/material/ripple/PlatformRipple;-><init>(ZFLandroidx/compose/runtime/MutableState;)V
+PLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$invokeSuspend$$inlined$collect$1;-><init>(Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlinx/coroutines/CoroutineScope;)V
+PLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$invokeSuspend$$inlined$collect$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+PLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;-><init>(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlin/coroutines/Continuation;)V
+PLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/material/ripple/Ripple;-><init>(ZFLandroidx/compose/runtime/MutableState;)V
+PLandroidx/compose/material/ripple/Ripple;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/material/ripple/RippleAlpha;-><init>(FFFF)V
+PLandroidx/compose/material/ripple/RippleAlpha;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/material/ripple/RippleAnimationKt;-><clinit>()V
+PLandroidx/compose/material/ripple/RippleAnimationKt;->getRippleEndRadius-cSwnlzA(Landroidx/compose/ui/unit/Density;ZJ)F
+PLandroidx/compose/material/ripple/RippleContainer;-><init>(Landroid/content/Context;)V
+PLandroidx/compose/material/ripple/RippleHostMap;-><init>()V
+PLandroidx/compose/material/ripple/RippleHostView;-><clinit>()V
+PLandroidx/compose/material/ripple/RippleHostView;-><init>(Landroid/content/Context;)V
+PLandroidx/compose/material/ripple/RippleHostView;->refreshDrawableState()V
+PLandroidx/compose/material/ripple/RippleIndicationInstance;-><init>(Landroidx/compose/runtime/MutableState;Z)V
+PLandroidx/compose/material/ripple/RippleKt;-><clinit>()V
+PLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;-><clinit>()V
+PLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;-><init>()V
+PLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material/ripple/RippleThemeKt;-><clinit>()V
+PLandroidx/compose/material/ripple/StateLayer;-><init>(Landroidx/compose/runtime/MutableState;Z)V
+PLandroidx/compose/material3/ButtonColors;-><init>(JJJJ)V
+PLandroidx/compose/material3/ButtonDefaults;-><clinit>()V
+PLandroidx/compose/material3/ButtonElevation$animateElevation$1$1$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotStateList;)V
+PLandroidx/compose/material3/ButtonElevation$animateElevation$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+PLandroidx/compose/material3/ButtonElevation$animateElevation$1$1;-><init>(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/coroutines/Continuation;)V
+PLandroidx/compose/material3/ButtonElevation$animateElevation$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/material3/ButtonElevation$animateElevation$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/material3/ButtonElevation;-><init>(FFFFF)V
+PLandroidx/compose/material3/ButtonKt$Button$2$1$1;-><init>(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;I)V
+PLandroidx/compose/material3/ButtonKt$Button$2$1;-><init>(Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;I)V
+PLandroidx/compose/material3/ButtonKt$Button$2;-><init>(JLandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;I)V
+PLandroidx/compose/material3/ColorScheme;-><init>(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)V
+PLandroidx/compose/material3/ColorScheme;->getSurface-0d7_KjU()J
+PLandroidx/compose/material3/ColorSchemeKt$LocalColorScheme$1;-><clinit>()V
+PLandroidx/compose/material3/ColorSchemeKt$LocalColorScheme$1;-><init>()V
+PLandroidx/compose/material3/ColorSchemeKt$LocalColorScheme$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material3/ColorSchemeKt;-><clinit>()V
+PLandroidx/compose/material3/ContentColorKt$LocalContentColor$1;-><clinit>()V
+PLandroidx/compose/material3/ContentColorKt$LocalContentColor$1;-><init>()V
+PLandroidx/compose/material3/ContentColorKt;-><clinit>()V
+PLandroidx/compose/material3/ElevationKt;-><clinit>()V
+PLandroidx/compose/material3/MinimumTouchTargetModifier$measure$1;-><init>(ILandroidx/compose/ui/layout/Placeable;I)V
+PLandroidx/compose/material3/MinimumTouchTargetModifier;-><init>(J)V
+PLandroidx/compose/material3/MinimumTouchTargetModifier;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/material3/ShapeDefaults;-><clinit>()V
+PLandroidx/compose/material3/Shapes;-><init>(I)V
+PLandroidx/compose/material3/ShapesKt$LocalShapes$1;-><clinit>()V
+PLandroidx/compose/material3/ShapesKt$LocalShapes$1;-><init>()V
+PLandroidx/compose/material3/ShapesKt$LocalShapes$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material3/ShapesKt;-><clinit>()V
+PLandroidx/compose/material3/SurfaceKt$LocalAbsoluteTonalElevation$1;-><clinit>()V
+PLandroidx/compose/material3/SurfaceKt$LocalAbsoluteTonalElevation$1;-><init>()V
+PLandroidx/compose/material3/SurfaceKt$LocalAbsoluteTonalElevation$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material3/SurfaceKt;-><clinit>()V
+PLandroidx/compose/material3/TouchTargetKt$LocalMinimumTouchTargetEnforcement$1;-><clinit>()V
+PLandroidx/compose/material3/TouchTargetKt$LocalMinimumTouchTargetEnforcement$1;-><init>()V
+PLandroidx/compose/material3/TouchTargetKt$LocalMinimumTouchTargetEnforcement$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material3/TouchTargetKt$minimumTouchTargetSize$2;-><clinit>()V
+PLandroidx/compose/material3/TouchTargetKt$minimumTouchTargetSize$2;-><init>()V
+PLandroidx/compose/material3/TouchTargetKt;-><clinit>()V
+PLandroidx/compose/material3/Typography;-><init>(I)V
+PLandroidx/compose/material3/TypographyKt$LocalTypography$1;-><clinit>()V
+PLandroidx/compose/material3/TypographyKt$LocalTypography$1;-><init>()V
+PLandroidx/compose/material3/TypographyKt$LocalTypography$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/material3/TypographyKt;-><clinit>()V
+PLandroidx/compose/material3/tokens/ColorLightTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/ElevationTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/FilledButtonTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/PaletteTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/ShapeTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/TypeScaleTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/TypefaceTokens;-><clinit>()V
+PLandroidx/compose/material3/tokens/TypographyTokens;-><clinit>()V
+PLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onForgotten()V
+PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->dispose()V
+PLandroidx/compose/runtime/ComposerImpl$realizeMovement$1;-><init>(II)V
+PLandroidx/compose/runtime/ComposerImpl$start$2;-><init>(I)V
+PLandroidx/compose/runtime/ComposerImpl;->reportAllMovableContent()V
+PLandroidx/compose/runtime/CompositionContext;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V
+PLandroidx/compose/runtime/JoinedKey;-><init>(Ljava/lang/Integer;Ljava/lang/Object;)V
+PLandroidx/compose/runtime/JoinedKey;->equals(Ljava/lang/Object;)Z
+PLandroidx/compose/runtime/Recomposer$effectJob$1$1$1$1;-><init>(Landroidx/compose/runtime/Recomposer;Ljava/lang/Throwable;)V
+PLandroidx/compose/runtime/Recomposer$effectJob$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/runtime/Recomposer$effectJob$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/runtime/Recomposer;->cancel()V
+PLandroidx/compose/runtime/collection/IdentityScopeMap;->clear()V
+PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->contains(Ljava/lang/Object;)Z
+PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->addAll(Ljava/util/Collection;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;
+PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->remove(IILjava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;
+PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->remove(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;
+PLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;-><init>(Landroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/coroutines/Continuation;)V
+PLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->iterator()Ljava/util/Iterator;
+PLandroidx/compose/runtime/snapshots/SnapshotStateList;->addAll(Ljava/util/Collection;)Z
+PLandroidx/compose/runtime/snapshots/SnapshotStateList;->clear()V
+PLandroidx/compose/runtime/snapshots/SnapshotStateList;->contains(Ljava/lang/Object;)Z
+PLandroidx/compose/runtime/snapshots/SnapshotStateList;->isEmpty()Z
+PLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->access$validateRange(II)V
+PLandroidx/compose/ui/Modifier$Node;->isValid()Z
+PLandroidx/compose/ui/autofill/AutofillCallback;->unregister(Landroidx/compose/ui/autofill/AndroidAutofill;)V
+PLandroidx/compose/ui/focus/FocusOwnerImpl;->clearFocus(ZZ)V
+PLandroidx/compose/ui/focus/FocusOwnerImpl;->getFocusRect()Landroidx/compose/ui/geometry/Rect;
+PLandroidx/compose/ui/focus/FocusPropertiesImpl;->getCanFocus()Z
+PLandroidx/compose/ui/focus/FocusRequester$requestFocus$2;-><clinit>()V
+PLandroidx/compose/ui/focus/FocusRequester$requestFocus$2;-><init>()V
+PLandroidx/compose/ui/focus/FocusRequester$requestFocus$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/ui/focus/FocusRequester;->requestFocus()V
+PLandroidx/compose/ui/focus/FocusTargetModifierNode$invalidateFocus$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/compose/ui/focus/FocusTargetModifierNode;)V
+PLandroidx/compose/ui/focus/FocusTargetModifierNode$invalidateFocus$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/ui/focus/FocusTargetModifierNode;->scheduleInvalidationForFocusEvents$ui_release()V
+PLandroidx/compose/ui/geometry/Offset;->getDistance-impl(J)F
+PLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;-><init>(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/graphics/BlockGraphicsLayerModifier;)V
+PLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;-><init>(Lkotlin/jvm/functions/Function1;)V
+PLandroidx/compose/ui/graphics/GraphicsLayerModifierKt$graphicsLayer$$inlined$modifierElementOf$1;->create()Landroidx/compose/ui/Modifier$Node;
+PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDensity()F
+PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRoundRect-ZuiqVtQ$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Brush;JJJLandroidx/compose/ui/graphics/drawscope/Stroke;I)V
+PLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierLocal;->getValue()Ljava/lang/Object;
+PLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$PointerEventHandlerCoroutine;->resumeWith(Ljava/lang/Object;)V
+PLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilter$awaitPointerEventScope$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/ui/layout/ContentScale$Companion$FillBounds$1;->computeScaleFactor-H7hwNQA(JJ)J
+PLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;-><init>(Landroidx/compose/ui/modifier/ModifierLocalManager;)V
+PLandroidx/compose/ui/modifier/ModifierLocalManager;->invalidate()V
+PLandroidx/compose/ui/node/BackwardsCompatNodeKt$updateModifierLocalConsumer$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/ui/node/LayoutNode;->isPlacedInLookahead()Ljava/lang/Boolean;
+PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/arch/core/executor/TaskExecutor;Landroidx/compose/ui/graphics/ColorFilter;I)V
+PLandroidx/compose/ui/node/LayoutNodeDrawScope;->toPx-0680j_4(F)F
+PLandroidx/compose/ui/node/LayoutNodeKt;->Animatable$default()Landroidx/compose/animation/core/Animatable;
+PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getCanAffectParentInLookahead(Landroidx/compose/ui/node/LayoutNode;)Z
+PLandroidx/compose/ui/node/NodeChainKt$fillVector$1;-><init>(Landroidx/compose/runtime/collection/MutableVector;)V
+PLandroidx/compose/ui/node/NodeKind;->tween$default(IILandroidx/compose/animation/core/Easing;I)Landroidx/compose/animation/core/TweenSpec;
+PLandroidx/compose/ui/node/UiApplier;->remove(II)V
+PLandroidx/compose/ui/platform/AndroidComposeView;->getModifierLocalManager()Landroidx/compose/ui/modifier/ModifierLocalManager;
+PLandroidx/compose/ui/platform/AndroidComposeView;->onDetachedFromWindow()V
+PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewDetachedFromWindow(Landroid/view/View;)V
+PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;->dispose()V
+PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->invoke()Ljava/lang/Object;
+PLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$listener$1;->onViewDetachedFromWindow(Landroid/view/View;)V
+PLandroidx/compose/ui/platform/ViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J
+PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V
+PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V
+PLandroidx/compose/ui/platform/WrappedComposition;->dispose()V
+PLandroidx/compose/ui/text/input/TextInputServiceAndroid$textInputCommandEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/compose/ui/unit/Constraints$Companion;->fixedHeight-OenEA2s(I)J
+PLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J
+PLandroidx/compose/ui/unit/DpSize;-><clinit>()V
+PLandroidx/compose/ui/unit/DpSize;->getHeight-D9Ej5fM(J)F
+PLandroidx/compose/ui/unit/DpSize;->getWidth-D9Ej5fM(J)F
+PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;-><init>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;-><clinit>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;-><init>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;-><init>(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casListeners(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Z
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casValue(Landroidx/concurrent/futures/AbstractResolvableFuture;Ljava/lang/Object;Ljava/lang/Object;)Z
+PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casWaiters(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)Z
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;-><clinit>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;-><init>(I)V
+PLandroidx/concurrent/futures/AbstractResolvableFuture;-><clinit>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture;-><init>()V
+PLandroidx/concurrent/futures/AbstractResolvableFuture;->complete(Landroidx/concurrent/futures/AbstractResolvableFuture;)V
+PLandroidx/concurrent/futures/ResolvableFuture;-><init>()V
+PLandroidx/core/R$styleable;-><clinit>()V
+PLandroidx/core/R$styleable;->yield(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object;
+PLandroidx/core/view/ViewKt$ancestors$1;-><clinit>()V
+PLandroidx/core/view/ViewKt$ancestors$1;-><init>()V
+PLandroidx/core/view/ViewKt$ancestors$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/lifecycle/DefaultLifecycleObserver;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V
+PLandroidx/lifecycle/DefaultLifecycleObserver;->onStop(Landroidx/lifecycle/LifecycleOwner;)V
+PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V
+PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V
+PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V
+PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityStopped(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPaused(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityStopped(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V
+PLandroidx/lifecycle/ReportFragment;->onDestroy()V
+PLandroidx/lifecycle/ReportFragment;->onPause()V
+PLandroidx/lifecycle/ReportFragment;->onStop()V
+PLandroidx/metrics/performance/JankStatsApi24Impl;->removeFrameMetricsListenerDelegate(Landroidx/metrics/performance/JankStatsApi24Impl$$ExternalSyntheticLambda0;Landroid/view/Window;)V
+PLandroidx/profileinstaller/ProfileInstallReceiver$$ExternalSyntheticLambda0;-><init>()V
+PLandroidx/profileinstaller/ProfileInstaller$1;-><init>()V
+PLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Object;)V
+PLandroidx/profileinstaller/ProfileInstaller$2;-><init>()V
+PLandroidx/profileinstaller/ProfileInstaller;-><clinit>()V
+PLandroidx/profileinstaller/ProfileInstaller;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V
+PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->run()V
+PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;-><init>(Landroid/content/Context;)V
+PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda2;->run()V
+PLandroidx/profileinstaller/ProfileVerifier$Cache;-><init>(IIJJ)V
+PLandroidx/profileinstaller/ProfileVerifier$Cache;->writeOnFile(Ljava/io/File;)V
+PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;-><init>()V
+PLandroidx/profileinstaller/ProfileVerifier;-><clinit>()V
+PLandroidx/profileinstaller/ProfileVerifier;->getPackageLastUpdateTime(Landroid/content/Context;)J
+PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZ)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus;
+PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)V
+PLandroidx/tv/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt$lambda-1$1;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/ComposableSingletons$LazyGridItemProviderKt;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/EmptyTvLazyGridLayoutInfo;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/EmptyTvLazyGridLayoutInfo;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/ItemIndex;-><init>(I)V
+PLandroidx/tv/foundation/lazy/grid/ItemIndex;->equals(Ljava/lang/Object;)Z
+PLandroidx/tv/foundation/lazy/grid/LazyGridDslKt$rememberColumnWidthSums$1$1;-><init>(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/tv/foundation/lazy/grid/TvGridCells;Landroidx/compose/foundation/layout/Arrangement$Horizontal;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridDslKt$rememberRowHeightSums$1$1;-><init>(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/tv/foundation/lazy/grid/TvGridCells;Landroidx/compose/foundation/layout/Arrangement$Vertical;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridDslKt;->TvLazyHorizontalGrid(IILandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/PivotOffsets;Landroidx/tv/foundation/lazy/grid/TvGridCells;Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Lkotlin/jvm/functions/Function1;ZZ)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridDslKt;->TvLazyVerticalGrid(IILandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/PivotOffsets;Landroidx/tv/foundation/lazy/grid/TvGridCells;Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Lkotlin/jvm/functions/Function1;ZZ)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridIntervalContent;-><init>(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator;-><init>(Lkotlinx/coroutines/CoroutineScope;Z)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;-><init>(Landroidx/compose/foundation/lazy/layout/MutableIntervalList;ZLkotlin/ranges/IntRange;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderImpl;->getSpanLayoutProvider()Landroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;-><init>(Landroidx/compose/runtime/DerivedSnapshotState;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$itemProviderState$1;-><init>(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$itemProviderState$1;->invoke()Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$1$1;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$1$1;->invoke()Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$2;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$2;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$2;->invoke()Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$3;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$3;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$nearestItemsRangeState$3;->invoke()Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/LazyGridKt$ScrollPositionUpdater$1;-><init>(Landroidx/tv/foundation/lazy/grid/LazyGridItemProvider;Landroidx/tv/foundation/lazy/grid/TvLazyGridState;I)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridKt$rememberLazyGridMeasurePolicy$1$1;-><init>(ZLandroidx/compose/foundation/layout/PaddingValues;ZLandroidx/tv/foundation/lazy/grid/TvLazyGridState;Landroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/tv/foundation/lazy/grid/LazyGridItemPlacementAnimator;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridKt;->ScrollPositionUpdater(Landroidx/tv/foundation/lazy/grid/LazyGridItemProvider;Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Landroidx/compose/runtime/Composer;I)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridMeasureKt$measureLazyGrid$3;-><init>(Ljava/util/ArrayList;)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;->getColumn()I
+PLandroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;->getIndex()I
+PLandroidx/tv/foundation/lazy/grid/LazyGridPositionedItem;->getRow()I
+PLandroidx/tv/foundation/lazy/grid/LazyGridScrollPosition;-><init>(II)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider$Bucket;-><init>(II)V
+PLandroidx/tv/foundation/lazy/grid/LazyGridSpanLayoutProvider;-><init>(Landroidx/tv/foundation/lazy/grid/LazyGridItemProvider;)V
+PLandroidx/tv/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1$scrollAxisRange$1;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;)V
+PLandroidx/tv/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1$scrollAxisRange$2;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;)V
+PLandroidx/tv/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1;-><init>(ZLandroidx/tv/foundation/lazy/grid/TvLazyGridState;Landroidx/tv/foundation/lazy/grid/LazyGridItemProviderKt$rememberLazyGridItemProvider$1$1;)V
+PLandroidx/tv/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo;
+PLandroidx/tv/foundation/lazy/grid/LazySemanticsKt$rememberLazyGridSemanticState$1$1;->scrollAxisRange()Landroidx/compose/ui/semantics/ScrollAxisRange;
+PLandroidx/tv/foundation/lazy/grid/LineIndex;-><init>(I)V
+PLandroidx/tv/foundation/lazy/grid/TvGridCells$Fixed;-><init>(I)V
+PLandroidx/tv/foundation/lazy/grid/TvGridItemSpan;-><init>(J)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridItemScopeImpl;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridItemScopeImpl;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->getAlignmentLines()Ljava/util/Map;
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->getHeight()I
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->getTotalItemsCount()I
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->getVisibleItemsInfo()Ljava/util/List;
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->getWidth()I
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridMeasureResult;->placeChildren()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScope$items$1;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScope$items$1;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScope;->items$default(Landroidx/tv/foundation/lazy/grid/TvLazyGridScope;ILandroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScopeImpl$DefaultSpan$1;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScopeImpl$DefaultSpan$1;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScopeImpl;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridScopeImpl;->items(ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$Companion$Saver$1;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$Companion$Saver$1;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$Companion$Saver$2;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$Companion$Saver$2;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$prefetchInfoRetriever$2;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$prefetchInfoRetriever$2;-><init>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$remeasurementModifier$1;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/layout/Remeasurement;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$scroll$1;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$scroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState$scrollableState$1;-><init>(Landroidx/tv/foundation/lazy/grid/TvLazyGridState;)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState;-><clinit>()V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->getCanScrollBackward()Z
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridState;->getCanScrollForward()Z
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridStateKt$rememberTvLazyGridState$1$1;-><init>(II)V
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridStateKt$rememberTvLazyGridState$1$1;->invoke()Ljava/lang/Object;
+PLandroidx/tv/foundation/lazy/grid/TvLazyGridStateKt;->rememberTvLazyGridState(Landroidx/compose/runtime/Composer;)Landroidx/tv/foundation/lazy/grid/TvLazyGridState;
+PLandroidx/tv/foundation/lazy/list/LazyDslKt;->TvLazyColumn(Landroidx/compose/ui/Modifier;Landroidx/tv/foundation/lazy/list/TvLazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;ZLandroidx/tv/foundation/PivotOffsets;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V
+PLandroidx/tv/foundation/lazy/list/LazyListBeyondBoundsModifierLocal$layout$2;->getHasMoreContent()Z
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;)V
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2$2$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;)V
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2$2$1;->bringChildIntoView(Landroidx/compose/foundation/relocation/BringIntoViewResponderModifier$bringChildIntoView$2$1$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2$2$1;->calculateRectForParent(Landroidx/compose/ui/geometry/Rect;)Landroidx/compose/ui/geometry/Rect;
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2;-><clinit>()V
+PLandroidx/tv/material3/BringIntoViewIfChildrenAreFocusedKt$bringIntoViewIfChildrenAreFocused$2;-><init>()V
+PLandroidx/tv/material3/CarouselDefaults;-><clinit>()V
+PLandroidx/tv/material3/CarouselDefaults;-><init>()V
+PLandroidx/tv/material3/CarouselItemDefaults$OverlayEnterTransition$1;-><clinit>()V
+PLandroidx/tv/material3/CarouselItemDefaults$OverlayEnterTransition$1;-><init>()V
+PLandroidx/tv/material3/CarouselItemDefaults;-><clinit>()V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$1$1;-><init>(Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$1;-><init>(Landroidx/compose/animation/core/MutableTransitionState;Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$2$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$3;-><init>(Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/animation/core/MutableTransitionState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$4$1;-><init>(JLandroidx/compose/animation/core/MutableTransitionState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselItemKt$CarouselItem$4$2;-><init>(ILkotlin/jvm/functions/Function2;)V
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$1;-><init>(Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$2;-><init>(Landroidx/compose/animation/core/MutableTransitionState;)V
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$3;-><init>(Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselItemKt$onAnimationCompletion$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$AutoScrollSideEffect$2$1;-><init>(JLandroidx/tv/material3/CarouselState;ILkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselKt$AutoScrollSideEffect$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselKt$AutoScrollSideEffect$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$Carousel$3$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/material3/CarouselKt$Carousel$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$Carousel$4;-><init>(Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/material3/CarouselKt$Carousel$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$Carousel$5$1$1;-><init>(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)V
+PLandroidx/tv/material3/CarouselKt$Carousel$5$2$1$1;-><init>(Landroidx/compose/ui/focus/FocusRequester;Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselKt$Carousel$5$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$Carousel$5$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$Carousel$5$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselKt$Carousel$5$2;-><init>(Lkotlin/jvm/functions/Function3;ILandroidx/compose/ui/focus/FocusRequester;Landroidx/compose/ui/focus/FocusManager;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V
+PLandroidx/tv/material3/CarouselKt$CarouselStateUpdater$1$1;-><init>(ILandroidx/tv/material3/CarouselState;Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselKt$CarouselStateUpdater$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselKt$CarouselStateUpdater$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$handleKeyEvents$1$showPreviousSlideAndGetKeyEventPropagation$1;-><init>(Landroidx/tv/material3/CarouselState;ILandroidx/compose/ui/focus/FocusRequester;)V
+PLandroidx/tv/material3/CarouselKt$handleKeyEvents$1$showPreviousSlideAndGetKeyEventPropagation$1;->invoke()Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$handleKeyEvents$1;-><init>(Landroidx/compose/ui/focus/FocusManager;ZLandroidx/tv/material3/CarouselState;ILandroidx/compose/ui/focus/FocusRequester;)V
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$1;-><init>(Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$2;-><init>(Landroidx/compose/animation/AnimatedVisibilityScope;)V
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$3;-><init>(Lkotlin/coroutines/Continuation;)V
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt$onAnimationCompletion$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLandroidx/tv/material3/CarouselKt;->AutoScrollSideEffect(JILandroidx/tv/material3/CarouselState;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V
+PLandroidx/tv/material3/CarouselKt;->CarouselStateUpdater(Landroidx/tv/material3/CarouselState;ILandroidx/compose/runtime/Composer;I)V
+PLandroidx/tv/material3/CarouselState;-><init>(I)V
+PLandroidx/tv/material3/CarouselState;->moveToNextSlide$tv_material_release(I)V
+PLandroidx/tv/material3/ComposableSingletons$CarouselKt$lambda-1$1;-><clinit>()V
+PLandroidx/tv/material3/ComposableSingletons$CarouselKt$lambda-1$1;-><init>()V
+PLandroidx/tv/material3/ComposableSingletons$CarouselKt;-><clinit>()V
+PLcom/example/tvcomposebasedtests/MainActivity;->onPause()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-1$1;-><clinit>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-1$1;-><init>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-2$1$1;-><init>(I)V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-2$1;-><clinit>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-2$1;-><init>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-3$1;-><clinit>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt$lambda-3$1;-><init>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$FeaturedCarouselKt;-><clinit>()V
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/ComposableSingletons$TopNavigationKt$lambda-6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$FeaturedCarousel$1;-><init>(IILandroidx/tv/material3/CarouselState;)V
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$1;-><clinit>()V
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$1;-><init>()V
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$2$1;-><init>(Landroidx/compose/runtime/MutableState;)V
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$3;-><init>(I)V
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt$OverlayButton$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/FeaturedCarouselKt;->FeaturedCarousel(ILandroidx/compose/runtime/Composer;I)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyColumn$1$1;-><init>(I)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyColumn$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyHorizontalGrid$1$1;-><init>(I)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyHorizontalGrid$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyVerticalGrid$1$1;-><init>(I)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$SampleTvLazyVerticalGrid$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1$1$1$1;-><init>(II)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1$1$1;-><init>(II)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1$1;-><init>(II)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1;-><init>(III)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt$TvLazyRowsAndColumn$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->SampleTvLazyColumn(ILandroidx/compose/runtime/Composer;I)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->SampleTvLazyHorizontalGrid(IIILandroidx/compose/runtime/Composer;)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->SampleTvLazyVerticalGrid(IIILandroidx/compose/runtime/Composer;)V
+PLcom/example/tvcomposebasedtests/tvComponents/LazyContainersKt;->TvLazyRowsAndColumn(IIILandroidx/compose/runtime/Composer;)V
+PLcom/example/tvcomposebasedtests/tvComponents/TopNavigationKt$TopNavigation$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/google/gson/FieldNamingPolicy$1;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$1;->translateName(Ljava/lang/reflect/Field;)Ljava/lang/String;
+PLcom/google/gson/FieldNamingPolicy$2;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$3;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$4;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$5;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$6;-><init>()V
+PLcom/google/gson/FieldNamingPolicy$7;-><init>()V
+PLcom/google/gson/FieldNamingPolicy;-><clinit>()V
+PLcom/google/gson/FieldNamingPolicy;-><init>(Ljava/lang/String;I)V
+PLcom/google/gson/Gson$1;-><init>()V
+PLcom/google/gson/Gson$2;-><init>()V
+PLcom/google/gson/Gson$4;-><init>(Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/Gson$5;-><init>(Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/Gson$FutureTypeAdapter;-><init>()V
+PLcom/google/gson/Gson;-><init>()V
+PLcom/google/gson/Gson;->newJsonWriter(Ljava/io/Writer;)Lcom/google/gson/stream/JsonWriter;
+PLcom/google/gson/Gson;->toJson(Lcom/google/gson/JsonObject;Lcom/google/gson/stream/JsonWriter;)V
+PLcom/google/gson/JsonArray;->iterator()Ljava/util/Iterator;
+PLcom/google/gson/JsonElement;->getAsJsonPrimitive()Lcom/google/gson/JsonPrimitive;
+PLcom/google/gson/JsonNull;-><clinit>()V
+PLcom/google/gson/JsonNull;-><init>()V
+PLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/String;)V
+PLcom/google/gson/TypeAdapter$1;-><init>(Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;-><init>(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;[Ljava/lang/reflect/Type;)V
+PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getActualTypeArguments()[Ljava/lang/reflect/Type;
+PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getRawType()Ljava/lang/reflect/Type;
+PLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->hashCode()I
+PLcom/google/gson/internal/$Gson$Types;-><clinit>()V
+PLcom/google/gson/internal/$Gson$Types;->checkNotPrimitive(Ljava/lang/reflect/Type;)V
+PLcom/google/gson/internal/$Gson$Types;->equals(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;)Z
+PLcom/google/gson/internal/$Gson$Types;->getGenericSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type;
+PLcom/google/gson/internal/$Gson$Types;->getRawType(Ljava/lang/reflect/Type;)Ljava/lang/Class;
+PLcom/google/gson/internal/$Gson$Types;->getSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type;
+PLcom/google/gson/internal/$Gson$Types;->resolve(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/reflect/Type;Ljava/util/HashMap;)Ljava/lang/reflect/Type;
+PLcom/google/gson/internal/ConstructorConstructor$13;-><init>()V
+PLcom/google/gson/internal/ConstructorConstructor$19;-><init>(Ljava/lang/Class;)V
+PLcom/google/gson/internal/ConstructorConstructor;-><init>(Ljava/util/Map;Ljava/util/List;)V
+PLcom/google/gson/internal/ConstructorConstructor;->checkInstantiable(Ljava/lang/Class;)Ljava/lang/String;
+PLcom/google/gson/internal/ConstructorConstructor;->get(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/internal/ObjectConstructor;
+PLcom/google/gson/internal/Excluder;-><clinit>()V
+PLcom/google/gson/internal/Excluder;-><init>()V
+PLcom/google/gson/internal/Excluder;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/Excluder;->excludeClassChecks(Ljava/lang/Class;)Z
+PLcom/google/gson/internal/Excluder;->excludeClassInStrategy(Ljava/lang/Class;Z)Z
+PLcom/google/gson/internal/Excluder;->isAnonymousOrNonStaticLocal(Ljava/lang/Class;)Z
+PLcom/google/gson/internal/LinkedTreeMap$1;-><init>()V
+PLcom/google/gson/internal/LinkedTreeMap$Node;-><init>(Z)V
+PLcom/google/gson/internal/LinkedTreeMap;-><clinit>()V
+PLcom/google/gson/internal/LinkedTreeMap;->entrySet()Ljava/util/Set;
+PLcom/google/gson/internal/ReflectionAccessFilterHelper;->getFilterResult(Ljava/util/List;Ljava/lang/Class;)I
+PLcom/google/gson/internal/bind/ArrayTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/bind/ArrayTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/ArrayTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/bind/CollectionTypeAdapterFactory$Adapter;-><init>(Lcom/google/gson/Gson;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;-><init>(Lcom/google/gson/internal/ConstructorConstructor;)V
+PLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/DateTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/bind/DateTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/DateTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/bind/DefaultDateTypeAdapter$DateType;-><clinit>()V
+PLcom/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory;-><init>(Lcom/google/gson/internal/ConstructorConstructor;)V
+PLcom/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/JsonTreeWriter$1;-><init>()V
+PLcom/google/gson/internal/bind/JsonTreeWriter;-><clinit>()V
+PLcom/google/gson/internal/bind/MapTypeAdapterFactory;-><init>(Lcom/google/gson/internal/ConstructorConstructor;)V
+PLcom/google/gson/internal/bind/MapTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/NumberTypeAdapter$1;-><init>(Lcom/google/gson/internal/bind/NumberTypeAdapter;)V
+PLcom/google/gson/internal/bind/NumberTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/NumberTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/bind/NumberTypeAdapter;-><init>()V
+PLcom/google/gson/internal/bind/ObjectTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/bind/ObjectTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/ObjectTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$1;-><init>(Ljava/lang/String;Ljava/lang/reflect/Field;ZZZLjava/lang/reflect/Method;ZLcom/google/gson/TypeAdapter;Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;-><init>(Ljava/util/LinkedHashMap;)V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$BoundField;-><init>(Ljava/lang/String;Ljava/lang/reflect/Field;Z)V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$FieldReflectionAdapter;-><init>(Ljava/util/LinkedHashMap;)V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;-><init>(Lcom/google/gson/internal/ConstructorConstructor;Lcom/google/gson/internal/Excluder;Lcom/google/gson/internal/bind/JsonAdapterAnnotationTypeAdapterFactory;Ljava/util/List;)V
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->getBoundFields(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;Ljava/lang/Class;ZZ)Ljava/util/LinkedHashMap;
+PLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->includeField(Ljava/lang/reflect/Field;Z)Z
+PLcom/google/gson/internal/bind/SerializationDelegatingTypeAdapter;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$10;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$11;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$12;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$13;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$14;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$15;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$16;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$17;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$18;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$19;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$1;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$20;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$21;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$22;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$23;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$24;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$25;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$26;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$27;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$28;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$28;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V
+PLcom/google/gson/internal/bind/TypeAdapters$29;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$29;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/TypeAdapters$2;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$31;-><init>(Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/internal/bind/TypeAdapters$31;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/TypeAdapters$32;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/internal/bind/TypeAdapters$32;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/TypeAdapters$33;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/internal/bind/TypeAdapters$26;)V
+PLcom/google/gson/internal/bind/TypeAdapters$33;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/TypeAdapters$34;-><init>(Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)V
+PLcom/google/gson/internal/bind/TypeAdapters$34;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/bind/TypeAdapters$3;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$4;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$5;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$6;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$7;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$8;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters$9;-><init>()V
+PLcom/google/gson/internal/bind/TypeAdapters;-><clinit>()V
+PLcom/google/gson/internal/reflect/ReflectionHelper$RecordHelper;-><init>()V
+PLcom/google/gson/internal/reflect/ReflectionHelper$RecordNotSupportedHelper;-><init>()V
+PLcom/google/gson/internal/reflect/ReflectionHelper$RecordNotSupportedHelper;->isRecord(Ljava/lang/Class;)Z
+PLcom/google/gson/internal/reflect/ReflectionHelper$RecordSupportedHelper;-><init>()V
+PLcom/google/gson/internal/reflect/ReflectionHelper;-><clinit>()V
+PLcom/google/gson/internal/reflect/ReflectionHelper;->makeAccessible(Ljava/lang/reflect/AccessibleObject;)V
+PLcom/google/gson/internal/sql/SqlDateTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/sql/SqlDateTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/sql/SqlDateTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/sql/SqlTimeTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/sql/SqlTimeTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/sql/SqlTimeTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/sql/SqlTimestampTypeAdapter$1;-><init>()V
+PLcom/google/gson/internal/sql/SqlTimestampTypeAdapter$1;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;
+PLcom/google/gson/internal/sql/SqlTimestampTypeAdapter;-><clinit>()V
+PLcom/google/gson/internal/sql/SqlTypesSupport;-><clinit>()V
+PLcom/google/gson/stream/JsonWriter;-><clinit>()V
+PLcom/google/gson/stream/JsonWriter;->endArray()V
+PLcom/google/gson/stream/JsonWriter;->endObject()V
+PLcom/google/gson/stream/JsonWriter;->newline()V
+PLcom/google/gson/stream/JsonWriter;->value(Z)V
+PLkotlin/collections/ArrayAsCollection;-><init>([Ljava/lang/Object;Z)V
+PLkotlin/collections/ArrayAsCollection;->toArray()[Ljava/lang/Object;
+PLkotlin/collections/CollectionsKt__CollectionsKt;->arrayListOf([Ljava/lang/Object;)Ljava/util/ArrayList;
+PLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V
+PLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V
+PLkotlin/jvm/internal/Ref$IntRef;-><init>()V
+PLkotlin/jvm/internal/TypeIntrinsics;->asMutableCollection(Ljava/util/LinkedHashSet;)Ljava/util/Collection;
+PLkotlin/sequences/SequenceBuilderIterator;-><init>()V
+PLkotlin/sequences/SequenceBuilderIterator;->getContext()Lkotlin/coroutines/CoroutineContext;
+PLkotlin/sequences/SequenceBuilderIterator;->hasNext()Z
+PLkotlin/sequences/SequenceBuilderIterator;->next()Ljava/lang/Object;
+PLkotlin/sequences/SequenceBuilderIterator;->resumeWith(Ljava/lang/Object;)V
+PLkotlin/sequences/SequenceBuilderIterator;->yield(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V
+PLkotlin/sequences/SequenceScope;-><init>()V
+PLkotlin/text/Charsets;-><clinit>()V
+PLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/Unit;)V
+PLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V
+PLkotlinx/coroutines/CompletedContinuation;->copy$default(Lkotlinx/coroutines/CompletedContinuation;Lkotlinx/coroutines/CancelHandler;Ljava/util/concurrent/CancellationException;I)Lkotlinx/coroutines/CompletedContinuation;
+PLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V
+PLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V
+PLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread;
+PLkotlinx/coroutines/DefaultExecutor;->run()V
+PLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
+PLkotlinx/coroutines/DisposeOnCancel;-><init>(Lkotlinx/coroutines/DisposableHandle;)V
+PLkotlinx/coroutines/DisposeOnCancel;->invoke(Ljava/lang/Throwable;)V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;-><init>(Lkotlinx/coroutines/EventLoopImplBase;JLkotlinx/coroutines/CancellableContinuationImpl;)V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->run()V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;-><init>(J)V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->dispose()V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->scheduleTask(JLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;Lkotlinx/coroutines/EventLoopImplBase;)I
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setHeap(Lkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;)V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setIndex(I)V
+PLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;-><init>(J)V
+PLkotlinx/coroutines/EventLoopImplBase;->access$isCompleted(Lkotlinx/coroutines/EventLoopImplBase;)Z
+PLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z
+PLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z
+PLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J
+PLkotlinx/coroutines/EventLoopImplBase;->schedule(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V
+PLkotlinx/coroutines/EventLoopImplBase;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuationImpl;)V
+PLkotlinx/coroutines/EventLoop_commonKt;-><clinit>()V
+PLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V
+PLkotlinx/coroutines/JobKt;->access$removeEntryAtIndex([Ljava/lang/Object;I)[Ljava/lang/Object;
+PLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z
+PLkotlinx/coroutines/JobSupport;->getChildJobCancellationCause()Ljava/util/concurrent/CancellationException;
+PLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+PLkotlinx/coroutines/JobSupport;->parentCancelled(Lkotlinx/coroutines/JobSupport;)V
+PLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V
+PLkotlinx/coroutines/flow/FlowKt__ContextKt;->checkArgument(Z)V
+PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
+PLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlin/coroutines/Continuation;
+PLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlin/coroutines/Continuation;
+PLkotlinx/coroutines/flow/internal/AbortFlowException;-><init>(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;)V
+PLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable;
+PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V
+PLkotlinx/coroutines/flow/internal/ChildCancelledException;-><init>()V
+PLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable;
+PLkotlinx/coroutines/flow/internal/DownstreamExceptionContext;-><init>(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V
+PLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext;
+PLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V
+PLkotlinx/coroutines/internal/ThreadSafeHeap;-><init>()V
+PLkotlinx/coroutines/internal/ThreadSafeHeap;->addImpl(Lkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V
+PLkotlinx/coroutines/internal/ThreadSafeHeap;->isEmpty()Z
+PLkotlinx/coroutines/internal/ThreadSafeHeap;->removeAtImpl(I)Lkotlinx/coroutines/internal/ThreadSafeHeapNode;
+PLkotlinx/coroutines/internal/ThreadSafeHeap;->siftUpFrom(I)V
\ No newline at end of file
diff --git a/tv/tv-foundation/api/current.txt b/tv/tv-foundation/api/current.txt
index 9a5eb4c..06738d6 100644
--- a/tv/tv-foundation/api/current.txt
+++ b/tv/tv-foundation/api/current.txt
@@ -9,9 +9,6 @@
     property public final float parentFraction;
   }
 
-  public final class ScrollableWithPivotKt {
-  }
-
 }
 
 package androidx.tv.foundation.lazy.grid {
@@ -25,28 +22,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.grid.TvLazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.tv.foundation.lazy.grid.TvGridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
-  public final class LazyGridKt {
-  }
-
-  public final class LazyGridMeasureKt {
-  }
-
-  public final class LazyGridScrollPositionKt {
-  }
-
   public final class LazyGridSpanKt {
     method public static long TvGridItemSpan(int currentLineSpan);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   @androidx.compose.runtime.Stable public interface TvGridCells {
     method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
   }
@@ -161,21 +140,8 @@
 
 }
 
-package androidx.tv.foundation.lazy.layout {
-
-  public final class LazyAnimateScrollKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
-}
-
 package androidx.tv.foundation.lazy.list {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   public final class LazyDslKt {
     method @androidx.compose.runtime.Composable public static void TvLazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void TvLazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
@@ -185,34 +151,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.list.TvLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.list.TvLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
-  public final class LazyListMeasureKt {
-  }
-
-  public final class LazyListPinnableContainerProviderKt {
-  }
-
-  public final class LazyListScrollPositionKt {
-  }
-
   public final class LazyListStateKt {
     method @androidx.compose.runtime.Composable public static androidx.tv.foundation.lazy.list.TvLazyListState rememberTvLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   public interface TvLazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
diff --git a/tv/tv-foundation/api/public_plus_experimental_current.txt b/tv/tv-foundation/api/public_plus_experimental_current.txt
index 950c887..480863c 100644
--- a/tv/tv-foundation/api/public_plus_experimental_current.txt
+++ b/tv/tv-foundation/api/public_plus_experimental_current.txt
@@ -29,28 +29,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.grid.TvLazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.tv.foundation.lazy.grid.TvGridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
-  public final class LazyGridKt {
-  }
-
-  public final class LazyGridMeasureKt {
-  }
-
-  public final class LazyGridScrollPositionKt {
-  }
-
   public final class LazyGridSpanKt {
     method public static long TvGridItemSpan(int currentLineSpan);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   @androidx.compose.runtime.Stable public interface TvGridCells {
     method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
   }
@@ -167,21 +149,8 @@
 
 }
 
-package androidx.tv.foundation.lazy.layout {
-
-  public final class LazyAnimateScrollKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
-}
-
 package androidx.tv.foundation.lazy.list {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   public final class LazyDslKt {
     method @androidx.compose.runtime.Composable public static void TvLazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void TvLazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
@@ -191,34 +160,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.list.TvLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.list.TvLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
-  public final class LazyListMeasureKt {
-  }
-
-  public final class LazyListPinnableContainerProviderKt {
-  }
-
-  public final class LazyListScrollPositionKt {
-  }
-
   public final class LazyListStateKt {
     method @androidx.compose.runtime.Composable public static androidx.tv.foundation.lazy.list.TvLazyListState rememberTvLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   public interface TvLazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
diff --git a/tv/tv-foundation/api/restricted_current.txt b/tv/tv-foundation/api/restricted_current.txt
index 9a5eb4c..06738d6 100644
--- a/tv/tv-foundation/api/restricted_current.txt
+++ b/tv/tv-foundation/api/restricted_current.txt
@@ -9,9 +9,6 @@
     property public final float parentFraction;
   }
 
-  public final class ScrollableWithPivotKt {
-  }
-
 }
 
 package androidx.tv.foundation.lazy.grid {
@@ -25,28 +22,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.grid.TvLazyGridScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemSpanScope,? super java.lang.Integer,? super T,androidx.tv.foundation.lazy.grid.TvGridItemSpan>? span, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.grid.TvLazyGridItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyGridItemPlacementAnimatorKt {
-  }
-
-  public final class LazyGridItemProviderKt {
-  }
-
-  public final class LazyGridKt {
-  }
-
-  public final class LazyGridMeasureKt {
-  }
-
-  public final class LazyGridScrollPositionKt {
-  }
-
   public final class LazyGridSpanKt {
     method public static long TvGridItemSpan(int currentLineSpan);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   @androidx.compose.runtime.Stable public interface TvGridCells {
     method public java.util.List<java.lang.Integer> calculateCrossAxisCellSizes(androidx.compose.ui.unit.Density, int availableSize, int spacing);
   }
@@ -161,21 +140,8 @@
 
 }
 
-package androidx.tv.foundation.lazy.layout {
-
-  public final class LazyAnimateScrollKt {
-  }
-
-  public final class LazyLayoutSemanticsKt {
-  }
-
-}
-
 package androidx.tv.foundation.lazy.list {
 
-  public final class LazyBeyondBoundsModifierKt {
-  }
-
   public final class LazyDslKt {
     method @androidx.compose.runtime.Composable public static void TvLazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void TvLazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.tv.foundation.lazy.list.TvLazyListState 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 boolean userScrollEnabled, optional androidx.tv.foundation.PivotOffsets pivotOffsets, kotlin.jvm.functions.Function1<? super androidx.tv.foundation.lazy.list.TvLazyListScope,kotlin.Unit> content);
@@ -185,34 +151,10 @@
     method public static inline <T> void itemsIndexed(androidx.tv.foundation.lazy.list.TvLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.tv.foundation.lazy.list.TvLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class LazyListHeadersKt {
-  }
-
-  public final class LazyListItemPlacementAnimatorKt {
-  }
-
-  public final class LazyListItemProviderKt {
-  }
-
-  public final class LazyListKt {
-  }
-
-  public final class LazyListMeasureKt {
-  }
-
-  public final class LazyListPinnableContainerProviderKt {
-  }
-
-  public final class LazyListScrollPositionKt {
-  }
-
   public final class LazyListStateKt {
     method @androidx.compose.runtime.Composable public static androidx.tv.foundation.lazy.list.TvLazyListState rememberTvLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
   }
 
-  public final class LazySemanticsKt {
-  }
-
   public interface TvLazyListItemInfo {
     method public int getIndex();
     method public Object getKey();
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
index 914a8d7..513df79 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
@@ -85,6 +85,7 @@
         }
 
         waitForPrefetch(4)
+        waitForPrefetch(5)
 
         rule.onNodeWithTag("4")
             .assertExists()
@@ -105,6 +106,7 @@
         }
 
         waitForPrefetch(2)
+        waitForPrefetch(3)
 
         rule.onNodeWithTag("2")
             .assertExists()
@@ -125,6 +127,7 @@
         }
 
         waitForPrefetch(6)
+        waitForPrefetch(7)
 
         rule.onNodeWithTag("6")
             .assertExists()
@@ -141,6 +144,7 @@
         }
 
         waitForPrefetch(0)
+        waitForPrefetch(1)
 
         rule.onNodeWithTag("0")
             .assertExists()
@@ -221,6 +225,7 @@
         }
 
         waitForPrefetch(6)
+        waitForPrefetch(7)
 
         rule.onNodeWithTag("6")
             .assertExists()
@@ -239,6 +244,7 @@
         }
 
         waitForPrefetch(0)
+        waitForPrefetch(1)
 
         rule.onNodeWithTag("0")
             .assertExists()
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyScrollAccessibilityTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
index a7bed08..aa11fda 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyScrollAccessibilityTest.kt
@@ -32,7 +32,6 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
@@ -41,15 +40,15 @@
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.dp
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
 import androidx.test.filters.MediumTest
 import com.google.common.truth.IterableSubject
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -100,6 +99,22 @@
                 .provider as AccessibilityNodeProvider
         }
 
+    private val itemSize = 21
+    private var itemSizeDp: Dp = Dp.Unspecified
+    private val containerSize = 200
+    private var containerSizeDp: Dp = Dp.Unspecified
+    private val contentPadding = 50
+    private var contentPaddingDp: Dp = Dp.Unspecified
+
+    @Before
+    fun before() {
+        with(rule.density) {
+            itemSizeDp = itemSize.toDp()
+            containerSizeDp = containerSize.toDp()
+            contentPaddingDp = contentPadding.toDp()
+        }
+    }
+
     @Test
     fun scrollForward() {
         testRelativeDirection(58, ACTION_SCROLL_FORWARD)
@@ -148,7 +163,6 @@
         )
     }
 
-    @Ignore // b/242180919
     @Test
     fun verifyScrollActionsAtEnd() {
         createScrollableContent_StartAtEnd()
@@ -277,13 +291,13 @@
     private fun createScrollableContent_StartInMiddle() {
         createScrollableContent {
             // Start at the middle:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> centered when 1000dp on either side, which is 47 items + 13dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> centered when 1000 on either side, which is 47 items + 13
             rememberTvLazyGridState(
                 47,
-                with(LocalDensity.current) { 13.dp.roundToPx() }
+                13
             )
         }
     }
@@ -294,19 +308,19 @@
     private fun createScrollableContent_StartAtEnd() {
         createScrollableContent {
             // Start at the end:
-            // Content size: 100 items * 21dp per item = 2100dp
-            // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
-            // Content outside viewport: 2100dp - 100dp = 2000dp
-            // -> at the end when offset at 2000dp, which is 95 items + 5dp
+            // Content size: 100 items * 21 per item = 2100
+            // Viewport size: 200 rect - 50 padding on both sides = 100
+            // Content outside viewport: 2100 - 100 = 2000
+            // -> at the end when offset at 2000, which is 95 items + 5
             rememberTvLazyGridState(
                 95,
-                with(LocalDensity.current) { 5.dp.roundToPx() }
+                5
             )
         }
     }
 
     /**
-     * Creates a grid with a viewport of 100.dp, containing 100 items each 17.dp in size.
+     * Creates a grid with a viewport of 100 px, containing 100 items each 21 px in size.
      * The items have a text with their index (ASC), and where the viewport starts is determined
      * by the given [lambda][rememberTvLazyGridState]. All properties from [config] are applied.
      * The viewport has padding around it to make sure scroll distance doesn't include padding.
@@ -319,18 +333,18 @@
 
             val state = rememberTvLazyGridState()
 
-            Box(Modifier.requiredSize(200.dp).background(Color.White)) {
+            Box(Modifier.requiredSize(containerSizeDp).background(Color.White)) {
                 val direction = if (config.rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
                 CompositionLocalProvider(LocalLayoutDirection provides direction) {
                     LazyGrid(
                         cells = 1,
                         modifier = Modifier.testTag(scrollerTag).matchParentSize(),
                         state = state,
-                        contentPadding = PaddingValues(50.dp),
+                        contentPadding = PaddingValues(contentPaddingDp),
                         reverseLayout = config.reversed
                     ) {
                         items(100) {
-                            Box(Modifier.requiredSize(21.dp).background(Color.Yellow)) {
+                            Box(Modifier.requiredSize(itemSizeDp).background(Color.Yellow)) {
                                 BasicText("$it", Modifier.align(Alignment.Center))
                             }
                         }
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyColumnTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyColumnTest.kt
index d9f8e64..db1f1eb 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyColumnTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyColumnTest.kt
@@ -45,13 +45,11 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.assertCountEquals
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.unit.dp
@@ -174,42 +172,28 @@
 
     @Test
     fun removeItemsTest() {
-        val startingNumItems = 3
-        var numItems = startingNumItems
-        var numItemsModel by mutableStateOf(numItems)
+        var itemCount by mutableStateOf(3)
         val tag = "List"
         rule.setContentWithTestViewConfiguration {
-            TvLazyColumn(
-                Modifier.testTag(tag),
-                pivotOffsets = PivotOffsets(parentFraction = 0f)
-            ) {
-                items((1..numItemsModel).toList()) {
+            TvLazyColumn(Modifier.testTag(tag)) {
+                items((0 until itemCount).toList()) {
                     BasicText("$it")
                 }
             }
         }
 
-        while (numItems >= 0) {
-            // Confirm the number of children to ensure there are no extra items
-            rule.onNodeWithTag(tag)
-                .onChildren()
-                .assertCountEquals(numItems)
-
+        while (itemCount >= 0) {
             // Confirm the children's content
-            for (i in 1..3) {
+            for (i in 0 until 3) {
                 rule.onNodeWithText("$i").apply {
-                    if (i <= numItems) {
-                        assertExists()
+                    if (i < itemCount) {
+                        assertIsPlaced()
                     } else {
-                        assertDoesNotExist()
+                        assertIsNotPlaced()
                     }
                 }
             }
-            numItems--
-            if (numItems >= 0) {
-                // Don't set the model to -1
-                rule.runOnIdle { numItemsModel = numItems }
-            }
+            itemCount--
         }
     }
 
@@ -268,15 +252,13 @@
         for (data in dataLists) {
             rule.runOnIdle { dataModel = data }
 
-            // Confirm the number of children to ensure there are no extra items
-            val numItems = data.size
-            rule.onNodeWithTag(tag)
-                .onChildren()
-                .assertCountEquals(numItems)
-
             // Confirm the children's content
-            for (item in data) {
-                rule.onNodeWithText("$item").assertExists()
+            for (index in 1..8) {
+                if (index in data) {
+                    rule.onNodeWithText("$index").assertIsDisplayed()
+                } else {
+                    rule.onNodeWithText("$index").assertIsNotPlaced()
+                }
             }
         }
     }
@@ -376,7 +358,7 @@
             .assertIsDisplayed()
 
         rule.onNodeWithTag("3")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListTest.kt
index 876b8eb..51f87fd 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListTest.kt
@@ -84,7 +84,6 @@
 import java.util.concurrent.CountDownLatch
 import kotlin.math.roundToInt
 import kotlinx.coroutines.runBlocking
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -647,7 +646,6 @@
             .assertStartPositionIsAlmost(0.dp)
     }
 
-    @Ignore("b/266124027")
     @Test
     fun whenItemsBecameEmpty() {
         var items by mutableStateOf((1..10).toList())
@@ -676,9 +674,9 @@
 
         // and has no children
         rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
         rule.onNodeWithTag("2")
-            .assertDoesNotExist()
+            .assertIsNotPlaced()
     }
 
     @Test
diff --git a/tv/tv-material/api/current.txt b/tv/tv-material/api/current.txt
index 1c7d493..ad9374e 100644
--- a/tv/tv-material/api/current.txt
+++ b/tv/tv-material/api/current.txt
@@ -1,29 +1,11 @@
 // Signature format: 4.0
 package androidx.tv.material3 {
 
-  public final class BringIntoViewIfChildrenAreFocusedKt {
-  }
-
-  public final class CarouselItemKt {
-  }
-
-  public final class CarouselKt {
-  }
-
-  public final class ColorSchemeKt {
-  }
-
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
-  public final class ImmersiveListKt {
-  }
-
-  public final class KeyEventUtilsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ColorScheme getColorScheme();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.Shapes getShapes();
@@ -33,9 +15,6 @@
     field public static final androidx.tv.material3.MaterialTheme INSTANCE;
   }
 
-  public final class MaterialThemeKt {
-  }
-
   public final class ShapeDefaults {
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
@@ -65,20 +44,11 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SurfaceKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
   }
 
-  public final class TabKt {
-  }
-
-  public final class TabRowKt {
-  }
-
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
@@ -122,8 +92,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
 }
 
diff --git a/tv/tv-material/api/public_plus_experimental_current.txt b/tv/tv-material/api/public_plus_experimental_current.txt
index 4afda2a..27d2332 100644
--- a/tv/tv-material/api/public_plus_experimental_current.txt
+++ b/tv/tv-material/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.tv.material3 {
 
-  public final class BringIntoViewIfChildrenAreFocusedKt {
-  }
-
   @androidx.tv.material3.ExperimentalTvMaterial3Api public final class CarouselDefaults {
     method @androidx.compose.runtime.Composable @androidx.tv.material3.ExperimentalTvMaterial3Api public void IndicatorRow(int slideCount, int activeSlideIndex, optional androidx.compose.ui.Modifier modifier, optional float spacing, optional kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> indicator);
     method @androidx.compose.runtime.Composable public androidx.compose.animation.ContentTransform getContentTransform();
@@ -24,9 +21,6 @@
     field public static final androidx.tv.material3.CarouselItemDefaults INSTANCE;
   }
 
-  public final class CarouselItemKt {
-  }
-
   public final class CarouselKt {
     method @androidx.compose.runtime.Composable @androidx.tv.material3.ExperimentalTvMaterial3Api public static void Carousel(int slideCount, optional androidx.compose.ui.Modifier modifier, optional androidx.tv.material3.CarouselState carouselState, optional long autoScrollDurationMillis, optional androidx.compose.animation.ContentTransform contentTransformForward, optional androidx.compose.animation.ContentTransform contentTransformBackward, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> carouselIndicator, kotlin.jvm.functions.Function2<? super androidx.tv.material3.CarouselScope,? super java.lang.Integer,kotlin.Unit> content);
   }
@@ -142,9 +136,6 @@
     method public androidx.compose.ui.Modifier immersiveListItem(androidx.compose.ui.Modifier, int index);
   }
 
-  public final class KeyEventUtilsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ColorScheme getColorScheme();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.Shapes getShapes();
@@ -192,9 +183,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable @androidx.tv.material3.ExperimentalTvMaterial3Api public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float tonalElevation, optional androidx.compose.ui.semantics.Role? role, optional float shadowElevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
@@ -271,8 +259,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
 }
 
diff --git a/tv/tv-material/api/restricted_current.txt b/tv/tv-material/api/restricted_current.txt
index 1c7d493..ad9374e 100644
--- a/tv/tv-material/api/restricted_current.txt
+++ b/tv/tv-material/api/restricted_current.txt
@@ -1,29 +1,11 @@
 // Signature format: 4.0
 package androidx.tv.material3 {
 
-  public final class BringIntoViewIfChildrenAreFocusedKt {
-  }
-
-  public final class CarouselItemKt {
-  }
-
-  public final class CarouselKt {
-  }
-
-  public final class ColorSchemeKt {
-  }
-
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
-  public final class ImmersiveListKt {
-  }
-
-  public final class KeyEventUtilsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.ColorScheme getColorScheme();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.tv.material3.Shapes getShapes();
@@ -33,9 +15,6 @@
     field public static final androidx.tv.material3.MaterialTheme INSTANCE;
   }
 
-  public final class MaterialThemeKt {
-  }
-
   public final class ShapeDefaults {
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraLarge();
     method public androidx.compose.foundation.shape.CornerBasedShape getExtraSmall();
@@ -65,20 +44,11 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SurfaceKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
   }
 
-  public final class TabKt {
-  }
-
-  public final class TabRowKt {
-  }
-
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
@@ -122,8 +92,5 @@
     property public final androidx.compose.ui.text.TextStyle titleSmall;
   }
 
-  public final class TypographyKt {
-  }
-
 }
 
diff --git a/vectordrawable/integration-tests/testapp/OWNERS b/vectordrawable/integration-tests/testapp/OWNERS
index 9995116..f2f8b9c 100644
--- a/vectordrawable/integration-tests/testapp/OWNERS
+++ b/vectordrawable/integration-tests/testapp/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461333
 tianliu@google.com
 yaraki@google.com
diff --git a/vectordrawable/vectordrawable-seekable/OWNERS b/vectordrawable/vectordrawable-seekable/OWNERS
index 9995116..f2f8b9c 100644
--- a/vectordrawable/vectordrawable-seekable/OWNERS
+++ b/vectordrawable/vectordrawable-seekable/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 461333
 tianliu@google.com
 yaraki@google.com
diff --git a/viewpager2/integration-tests/testapp/OWNERS b/viewpager2/integration-tests/testapp/OWNERS
index e24ee8b..b0972b6c 100644
--- a/viewpager2/integration-tests/testapp/OWNERS
+++ b/viewpager2/integration-tests/testapp/OWNERS
@@ -1 +1,2 @@
+# Bug components: 607924
 jgielzak@google.com
\ No newline at end of file
diff --git a/wear/benchmark/OWNERS b/wear/benchmark/OWNERS
index d4f73cd..a094aed 100644
--- a/wear/benchmark/OWNERS
+++ b/wear/benchmark/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1235285
 jnichol@google.com
 stevebower@google.com
diff --git a/wear/compose/compose-foundation/api/current.ignore b/wear/compose/compose-foundation/api/current.ignore
new file mode 100644
index 0000000..714dc1c
--- /dev/null
+++ b/wear/compose/compose-foundation/api/current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.compose.foundation.CurvedModifierKt:
+    Removed class androidx.wear.compose.foundation.CurvedModifierKt
+RemovedClass: androidx.wear.compose.foundation.CurvedTextStyleKt:
+    Removed class androidx.wear.compose.foundation.CurvedTextStyleKt
diff --git a/wear/compose/compose-foundation/api/current.txt b/wear/compose/compose-foundation/api/current.txt
index 9f9bb95..4e9e434 100644
--- a/wear/compose/compose-foundation/api/current.txt
+++ b/wear/compose/compose-foundation/api/current.txt
@@ -114,9 +114,6 @@
   public static final class CurvedModifier.Companion implements androidx.wear.compose.foundation.CurvedModifier {
   }
 
-  public final class CurvedModifierKt {
-  }
-
   public final class CurvedPaddingKt {
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(optional float outer, optional float inner, optional float before, optional float after);
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(float all);
@@ -170,9 +167,6 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
   }
 
-  public final class CurvedTextStyleKt {
-  }
-
   public final class HierarchicalFocusCoordinatorKt {
     method @androidx.compose.runtime.Composable public static void HierarchicalFocusCoordinator(kotlin.jvm.functions.Function0<java.lang.Boolean> requiresFocus, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void OnFocusChange(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Boolean,kotlin.Unit> onFocusChanged);
@@ -202,9 +196,6 @@
     method public static inline <T> void itemsIndexed(androidx.wear.compose.foundation.lazy.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.foundation.lazy.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field public static final androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType.Companion Companion;
   }
diff --git a/wear/compose/compose-foundation/api/public_plus_experimental_current.txt b/wear/compose/compose-foundation/api/public_plus_experimental_current.txt
index 9f9bb95..4e9e434 100644
--- a/wear/compose/compose-foundation/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-foundation/api/public_plus_experimental_current.txt
@@ -114,9 +114,6 @@
   public static final class CurvedModifier.Companion implements androidx.wear.compose.foundation.CurvedModifier {
   }
 
-  public final class CurvedModifierKt {
-  }
-
   public final class CurvedPaddingKt {
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(optional float outer, optional float inner, optional float before, optional float after);
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(float all);
@@ -170,9 +167,6 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
   }
 
-  public final class CurvedTextStyleKt {
-  }
-
   public final class HierarchicalFocusCoordinatorKt {
     method @androidx.compose.runtime.Composable public static void HierarchicalFocusCoordinator(kotlin.jvm.functions.Function0<java.lang.Boolean> requiresFocus, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void OnFocusChange(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Boolean,kotlin.Unit> onFocusChanged);
@@ -202,9 +196,6 @@
     method public static inline <T> void itemsIndexed(androidx.wear.compose.foundation.lazy.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.foundation.lazy.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field public static final androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType.Companion Companion;
   }
diff --git a/wear/compose/compose-foundation/api/restricted_current.ignore b/wear/compose/compose-foundation/api/restricted_current.ignore
new file mode 100644
index 0000000..714dc1c
--- /dev/null
+++ b/wear/compose/compose-foundation/api/restricted_current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.compose.foundation.CurvedModifierKt:
+    Removed class androidx.wear.compose.foundation.CurvedModifierKt
+RemovedClass: androidx.wear.compose.foundation.CurvedTextStyleKt:
+    Removed class androidx.wear.compose.foundation.CurvedTextStyleKt
diff --git a/wear/compose/compose-foundation/api/restricted_current.txt b/wear/compose/compose-foundation/api/restricted_current.txt
index 9f9bb95..4e9e434 100644
--- a/wear/compose/compose-foundation/api/restricted_current.txt
+++ b/wear/compose/compose-foundation/api/restricted_current.txt
@@ -114,9 +114,6 @@
   public static final class CurvedModifier.Companion implements androidx.wear.compose.foundation.CurvedModifier {
   }
 
-  public final class CurvedModifierKt {
-  }
-
   public final class CurvedPaddingKt {
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(optional float outer, optional float inner, optional float before, optional float after);
     method public static androidx.wear.compose.foundation.ArcPaddingValues ArcPaddingValues(float all);
@@ -170,9 +167,6 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
   }
 
-  public final class CurvedTextStyleKt {
-  }
-
   public final class HierarchicalFocusCoordinatorKt {
     method @androidx.compose.runtime.Composable public static void HierarchicalFocusCoordinator(kotlin.jvm.functions.Function0<java.lang.Boolean> requiresFocus, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void OnFocusChange(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Boolean,kotlin.Unit> onFocusChanged);
@@ -202,9 +196,6 @@
     method public static inline <T> void itemsIndexed(androidx.wear.compose.foundation.lazy.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.foundation.lazy.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field public static final androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType.Companion Companion;
   }
diff --git a/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyListLayoutInfoTest.kt b/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyListLayoutInfoTest.kt
index 913c3ce7..9f42158 100644
--- a/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyListLayoutInfoTest.kt
+++ b/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyListLayoutInfoTest.kt
@@ -49,7 +49,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import kotlin.math.roundToInt
-import org.junit.Ignore
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
@@ -70,7 +69,6 @@
         }
     }
 
-    @Ignore("Awaiting fix for b/236217874")
     @Test
     fun visibleItemsAreCorrect() {
         lateinit var state: ScalingLazyListState
diff --git a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
index ac02f9e..a5bdaaf 100644
--- a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
+++ b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
@@ -53,6 +53,7 @@
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.offset
@@ -418,17 +419,21 @@
                 // vertical spacing between items.
                 if (autoCentering != null) {
                     item {
-                        Spacer(
-                            modifier = Modifier.height(state.topAutoCenteringItemSizePx.toDp())
-                        )
+                        Spacer(modifier = remember(state) {
+                            Modifier.autoCenteringHeight {
+                                state.topAutoCenteringItemSizePx
+                            }
+                        })
                     }
                 }
                 scope.content()
                 if (autoCentering != null) {
                     item {
-                        Spacer(
-                            modifier = Modifier.height(state.bottomAutoCenteringItemSizePx.toDp())
-                        )
+                        Spacer(modifier = remember(state) {
+                            Modifier.autoCenteringHeight {
+                                state.bottomAutoCenteringItemSizePx
+                            }
+                        })
                     }
                 }
             }
@@ -736,3 +741,15 @@
         placeable.place(0, -extraPadding.roundToPx())
     }
 }
+
+private fun Modifier.autoCenteringHeight(getHeight: () -> Int) =
+    layout { measurable, constraints ->
+        val height = getHeight()
+        val placeable = measurable.measure(
+            constraints.copy(minHeight = height, maxHeight = height)
+        )
+
+        layout(placeable.width, placeable.height) {
+            placeable.place(IntOffset.Zero)
+        }
+    }
diff --git a/wear/compose/compose-material-core/api/current.txt b/wear/compose/compose-material-core/api/current.txt
index d039d22..e6f50d0 100644
--- a/wear/compose/compose-material-core/api/current.txt
+++ b/wear/compose/compose-material-core/api/current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.compose.materialcore {
-
-  public final class ButtonKt {
-  }
-
-}
-
diff --git a/wear/compose/compose-material-core/api/public_plus_experimental_current.txt b/wear/compose/compose-material-core/api/public_plus_experimental_current.txt
index d039d22..e6f50d0 100644
--- a/wear/compose/compose-material-core/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material-core/api/public_plus_experimental_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.compose.materialcore {
-
-  public final class ButtonKt {
-  }
-
-}
-
diff --git a/wear/compose/compose-material-core/api/restricted_current.txt b/wear/compose/compose-material-core/api/restricted_current.txt
index d039d22..e6f50d0 100644
--- a/wear/compose/compose-material-core/api/restricted_current.txt
+++ b/wear/compose/compose-material-core/api/restricted_current.txt
@@ -1,8 +1 @@
 // Signature format: 4.0
-package androidx.wear.compose.materialcore {
-
-  public final class ButtonKt {
-  }
-
-}
-
diff --git a/wear/compose/compose-material/api/current.ignore b/wear/compose/compose-material/api/current.ignore
index 05e58f9..7b452d1 100644
--- a/wear/compose/compose-material/api/current.ignore
+++ b/wear/compose/compose-material/api/current.ignore
@@ -1,3 +1,25 @@
 // Baseline format: 1.0
 ChangedValue: androidx.wear.compose.material.TimeTextDefaults#TimeFormat12Hours:
     Field androidx.wear.compose.material.TimeTextDefaults.TimeFormat12Hours has changed value from h:mm a to h:mm
+
+
+RemovedClass: androidx.wear.compose.material.AnimationKt:
+    Removed class androidx.wear.compose.material.AnimationKt
+RemovedClass: androidx.wear.compose.material.DefaultTimeSourceKt:
+    Removed class androidx.wear.compose.material.DefaultTimeSourceKt
+RemovedClass: androidx.wear.compose.material.MaterialTextSelectionColorsKt:
+    Removed class androidx.wear.compose.material.MaterialTextSelectionColorsKt
+RemovedClass: androidx.wear.compose.material.PlaceholderKt:
+    Removed class androidx.wear.compose.material.PlaceholderKt
+RemovedClass: androidx.wear.compose.material.RangeDefaultsKt:
+    Removed class androidx.wear.compose.material.RangeDefaultsKt
+RemovedClass: androidx.wear.compose.material.Resources_androidKt:
+    Removed class androidx.wear.compose.material.Resources_androidKt
+RemovedClass: androidx.wear.compose.material.ScalingLazyColumnMeasureKt:
+    Removed class androidx.wear.compose.material.ScalingLazyColumnMeasureKt
+RemovedClass: androidx.wear.compose.material.ShapesKt:
+    Removed class androidx.wear.compose.material.ShapesKt
+RemovedClass: androidx.wear.compose.material.SwipeableKt:
+    Removed class androidx.wear.compose.material.SwipeableKt
+RemovedClass: androidx.wear.compose.material.TypographyKt:
+    Removed class androidx.wear.compose.material.TypographyKt
diff --git a/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index 8a1701e..fca0d12 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.compose.material {
 
-  public final class AnimationKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable public final class AutoCenteringParams {
     ctor @Deprecated public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
@@ -187,9 +184,6 @@
     method @Deprecated public static void curvedText(androidx.wear.compose.foundation.CurvedScope, String text, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional long background, optional long color, optional long fontSize, optional androidx.wear.compose.foundation.CurvedTextStyle? style, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, optional int overflow);
   }
 
-  public final class DefaultTimeSourceKt {
-  }
-
   public final class HorizontalPageIndicatorKt {
     method @androidx.compose.runtime.Composable public static void HorizontalPageIndicator(androidx.wear.compose.material.PageIndicatorState pageIndicatorState, optional androidx.compose.ui.Modifier modifier, optional int indicatorStyle, optional long selectedColor, optional long unselectedColor, optional float indicatorSize, optional float spacing, optional androidx.compose.ui.graphics.Shape indicatorShape);
   }
@@ -219,9 +213,6 @@
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
-  public final class MaterialTextSelectionColorsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Colors getColors();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Shapes getShapes();
@@ -321,6 +312,7 @@
 
   @androidx.compose.runtime.Stable public final class PickerState implements androidx.compose.foundation.gestures.ScrollableState {
     ctor public PickerState(int initialNumberOfOptions, optional int initiallySelectedOption, optional boolean repeatItems);
+    method public suspend Object? animateScrollToOption(int index, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public float dispatchRawDelta(float delta);
     method public int getNumberOfOptions();
     method public boolean getRepeatItems();
@@ -343,9 +335,6 @@
     property public final androidx.compose.runtime.saveable.Saver<androidx.wear.compose.material.PickerState,java.lang.Object> Saver;
   }
 
-  public final class PlaceholderKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class PositionIndicatorAlignment {
     field public static final androidx.wear.compose.material.PositionIndicatorAlignment.Companion Companion;
   }
@@ -413,12 +402,6 @@
     field public static final androidx.wear.compose.material.RadioButtonDefaults INSTANCE;
   }
 
-  public final class RangeDefaultsKt {
-  }
-
-  public final class Resources_androidKt {
-  }
-
   public final class ScaffoldKt {
     method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? vignette, optional kotlin.jvm.functions.Function0<kotlin.Unit>? positionIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? pageIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? timeText, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -437,9 +420,6 @@
     method @Deprecated public static inline <T> void itemsIndexed(androidx.wear.compose.material.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.material.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field @Deprecated public static final androidx.wear.compose.material.ScalingLazyListAnchorType.Companion Companion;
   }
@@ -573,9 +553,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
     method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, kotlin.ranges.IntProgression valueProgression, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
@@ -644,9 +621,6 @@
     enum_constant public static final androidx.wear.compose.material.SwipeToDismissValue Dismissed;
   }
 
-  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);
@@ -787,9 +761,6 @@
     property public final androidx.compose.ui.text.TextStyle title3;
   }
 
-  public final class TypographyKt {
-  }
-
   public final class VignetteKt {
     method @androidx.compose.runtime.Composable public static void Vignette(int vignettePosition, optional androidx.compose.ui.Modifier modifier);
   }
diff --git a/wear/compose/compose-material/api/public_plus_experimental_current.txt b/wear/compose/compose-material/api/public_plus_experimental_current.txt
index 8cc12b4..863b8a2 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.compose.material {
 
-  public final class AnimationKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable public final class AutoCenteringParams {
     ctor @Deprecated public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
@@ -188,9 +185,6 @@
     method @Deprecated public static void curvedText(androidx.wear.compose.foundation.CurvedScope, String text, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional long background, optional long color, optional long fontSize, optional androidx.wear.compose.foundation.CurvedTextStyle? style, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, optional int overflow);
   }
 
-  public final class DefaultTimeSourceKt {
-  }
-
   @kotlin.RequiresOptIn(message="This Wear Material API is experimental and is likely to change or to be removed in" + " the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalWearMaterialApi {
   }
 
@@ -235,9 +229,6 @@
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
-  public final class MaterialTextSelectionColorsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Colors getColors();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Shapes getShapes();
@@ -337,6 +328,7 @@
 
   @androidx.compose.runtime.Stable public final class PickerState implements androidx.compose.foundation.gestures.ScrollableState {
     ctor public PickerState(int initialNumberOfOptions, optional int initiallySelectedOption, optional boolean repeatItems);
+    method public suspend Object? animateScrollToOption(int index, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public float dispatchRawDelta(float delta);
     method public int getNumberOfOptions();
     method public boolean getRepeatItems();
@@ -450,9 +442,6 @@
     field public static final androidx.wear.compose.material.RadioButtonDefaults INSTANCE;
   }
 
-  public final class RangeDefaultsKt {
-  }
-
   @androidx.compose.runtime.Immutable @androidx.wear.compose.material.ExperimentalWearMaterialApi public final class ResistanceConfig {
     ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
     method public float computeResistance(float overflow);
@@ -464,9 +453,6 @@
     property public final float factorAtMin;
   }
 
-  public final class Resources_androidKt {
-  }
-
   public final class ScaffoldKt {
     method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? vignette, optional kotlin.jvm.functions.Function0<kotlin.Unit>? positionIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? pageIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? timeText, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -485,9 +471,6 @@
     method @Deprecated public static inline <T> void itemsIndexed(androidx.wear.compose.material.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.material.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field @Deprecated public static final androidx.wear.compose.material.ScalingLazyListAnchorType.Companion Companion;
   }
@@ -621,9 +604,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
     method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, kotlin.ranges.IntProgression valueProgression, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
@@ -888,9 +868,6 @@
     property public final androidx.compose.ui.text.TextStyle title3;
   }
 
-  public final class TypographyKt {
-  }
-
   public final class VignetteKt {
     method @androidx.compose.runtime.Composable public static void Vignette(int vignettePosition, optional androidx.compose.ui.Modifier modifier);
   }
diff --git a/wear/compose/compose-material/api/restricted_current.ignore b/wear/compose/compose-material/api/restricted_current.ignore
index 05e58f9..7b452d1 100644
--- a/wear/compose/compose-material/api/restricted_current.ignore
+++ b/wear/compose/compose-material/api/restricted_current.ignore
@@ -1,3 +1,25 @@
 // Baseline format: 1.0
 ChangedValue: androidx.wear.compose.material.TimeTextDefaults#TimeFormat12Hours:
     Field androidx.wear.compose.material.TimeTextDefaults.TimeFormat12Hours has changed value from h:mm a to h:mm
+
+
+RemovedClass: androidx.wear.compose.material.AnimationKt:
+    Removed class androidx.wear.compose.material.AnimationKt
+RemovedClass: androidx.wear.compose.material.DefaultTimeSourceKt:
+    Removed class androidx.wear.compose.material.DefaultTimeSourceKt
+RemovedClass: androidx.wear.compose.material.MaterialTextSelectionColorsKt:
+    Removed class androidx.wear.compose.material.MaterialTextSelectionColorsKt
+RemovedClass: androidx.wear.compose.material.PlaceholderKt:
+    Removed class androidx.wear.compose.material.PlaceholderKt
+RemovedClass: androidx.wear.compose.material.RangeDefaultsKt:
+    Removed class androidx.wear.compose.material.RangeDefaultsKt
+RemovedClass: androidx.wear.compose.material.Resources_androidKt:
+    Removed class androidx.wear.compose.material.Resources_androidKt
+RemovedClass: androidx.wear.compose.material.ScalingLazyColumnMeasureKt:
+    Removed class androidx.wear.compose.material.ScalingLazyColumnMeasureKt
+RemovedClass: androidx.wear.compose.material.ShapesKt:
+    Removed class androidx.wear.compose.material.ShapesKt
+RemovedClass: androidx.wear.compose.material.SwipeableKt:
+    Removed class androidx.wear.compose.material.SwipeableKt
+RemovedClass: androidx.wear.compose.material.TypographyKt:
+    Removed class androidx.wear.compose.material.TypographyKt
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index 8a1701e..fca0d12 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.compose.material {
 
-  public final class AnimationKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable public final class AutoCenteringParams {
     ctor @Deprecated public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
@@ -187,9 +184,6 @@
     method @Deprecated public static void curvedText(androidx.wear.compose.foundation.CurvedScope, String text, optional androidx.wear.compose.foundation.CurvedModifier modifier, optional long background, optional long color, optional long fontSize, optional androidx.wear.compose.foundation.CurvedTextStyle? style, optional androidx.wear.compose.foundation.CurvedDirection.Angular? angularDirection, optional int overflow);
   }
 
-  public final class DefaultTimeSourceKt {
-  }
-
   public final class HorizontalPageIndicatorKt {
     method @androidx.compose.runtime.Composable public static void HorizontalPageIndicator(androidx.wear.compose.material.PageIndicatorState pageIndicatorState, optional androidx.compose.ui.Modifier modifier, optional int indicatorStyle, optional long selectedColor, optional long unselectedColor, optional float indicatorSize, optional float spacing, optional androidx.compose.ui.graphics.Shape indicatorShape);
   }
@@ -219,9 +213,6 @@
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
-  public final class MaterialTextSelectionColorsKt {
-  }
-
   public final class MaterialTheme {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Colors getColors();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.wear.compose.material.Shapes getShapes();
@@ -321,6 +312,7 @@
 
   @androidx.compose.runtime.Stable public final class PickerState implements androidx.compose.foundation.gestures.ScrollableState {
     ctor public PickerState(int initialNumberOfOptions, optional int initiallySelectedOption, optional boolean repeatItems);
+    method public suspend Object? animateScrollToOption(int index, kotlin.coroutines.Continuation<? super kotlin.Unit>);
     method public float dispatchRawDelta(float delta);
     method public int getNumberOfOptions();
     method public boolean getRepeatItems();
@@ -343,9 +335,6 @@
     property public final androidx.compose.runtime.saveable.Saver<androidx.wear.compose.material.PickerState,java.lang.Object> Saver;
   }
 
-  public final class PlaceholderKt {
-  }
-
   @kotlin.jvm.JvmInline public final value class PositionIndicatorAlignment {
     field public static final androidx.wear.compose.material.PositionIndicatorAlignment.Companion Companion;
   }
@@ -413,12 +402,6 @@
     field public static final androidx.wear.compose.material.RadioButtonDefaults INSTANCE;
   }
 
-  public final class RangeDefaultsKt {
-  }
-
-  public final class Resources_androidKt {
-  }
-
   public final class ScaffoldKt {
     method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? vignette, optional kotlin.jvm.functions.Function0<kotlin.Unit>? positionIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? pageIndicator, optional kotlin.jvm.functions.Function0<kotlin.Unit>? timeText, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -437,9 +420,6 @@
     method @Deprecated public static inline <T> void itemsIndexed(androidx.wear.compose.material.ScalingLazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.wear.compose.material.ScalingLazyListItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
   }
 
-  public final class ScalingLazyColumnMeasureKt {
-  }
-
   @Deprecated @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScalingLazyListAnchorType {
     field @Deprecated public static final androidx.wear.compose.material.ScalingLazyListAnchorType.Companion Companion;
   }
@@ -573,9 +553,6 @@
     property public final androidx.compose.foundation.shape.CornerBasedShape small;
   }
 
-  public final class ShapesKt {
-  }
-
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
     method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, kotlin.ranges.IntProgression valueProgression, kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean segmented, optional androidx.wear.compose.material.InlineSliderColors colors);
@@ -644,9 +621,6 @@
     enum_constant public static final androidx.wear.compose.material.SwipeToDismissValue Dismissed;
   }
 
-  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);
@@ -787,9 +761,6 @@
     property public final androidx.compose.ui.text.TextStyle title3;
   }
 
-  public final class TypographyKt {
-  }
-
   public final class VignetteKt {
     method @androidx.compose.runtime.Composable public static void Vignette(int vignettePosition, optional androidx.compose.ui.Modifier modifier);
   }
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/PickerSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/PickerSample.kt
index b9315ce..4e0485a 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/PickerSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/PickerSample.kt
@@ -92,6 +92,34 @@
     }
 }
 
+@Sampled
+@Composable
+fun AnimateOptionChangePicker() {
+    val coroutineScope = rememberCoroutineScope()
+    val state = rememberPickerState(initialNumberOfOptions = 10)
+    val contentDescription by remember { derivedStateOf { "${state.selectedOption + 1}" } }
+
+    Box(
+        modifier = Modifier.fillMaxSize(),
+        contentAlignment = Alignment.Center
+    ) {
+        Picker(
+            state = state,
+            separation = 4.dp,
+            contentDescription = contentDescription,
+        ) {
+            Chip(
+                onClick = {
+                    coroutineScope.launch { state.animateScrollToOption(it) }
+                },
+                label = {
+                    Text("$it")
+                }
+            )
+        }
+    }
+}
+
 @OptIn(ExperimentalComposeUiApi::class)
 @Sampled
 @Composable
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PickerTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PickerTest.kt
index 7829b10..74c63e1 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PickerTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PickerTest.kt
@@ -45,6 +45,8 @@
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.junit.Before
@@ -246,6 +248,118 @@
     }
 
     @Test
+    fun scroll_to_next_item_with_animation() {
+        animateScrollTo(
+            initialOption = 2,
+            targetOption = 3,
+            totalOptions = 10,
+            expectedItemsScrolled = 1,
+        )
+    }
+
+    @Test
+    fun scroll_forward_by_two_items_with_animation() {
+        animateScrollTo(
+            initialOption = 2,
+            targetOption = 4,
+            totalOptions = 10,
+            expectedItemsScrolled = 2,
+        )
+    }
+
+    @Test
+    fun scroll_to_prev_item_with_animation() {
+        animateScrollTo(
+            initialOption = 2,
+            targetOption = 1,
+            totalOptions = 5,
+            expectedItemsScrolled = -1,
+        )
+    }
+
+    @Test
+    fun scroll_backward_by_two_items_with_animation() {
+        animateScrollTo(
+            initialOption = 3,
+            targetOption = 1,
+            totalOptions = 5,
+            expectedItemsScrolled = -2,
+        )
+    }
+
+    @Test
+    fun scroll_forward_to_repeated_items_with_animation() {
+        animateScrollTo(
+            initialOption = 8,
+            targetOption = 2,
+            totalOptions = 10,
+            expectedItemsScrolled = 4,
+        )
+    }
+
+    @Test
+    fun scroll_backward_to_repeated_items_with_animation() {
+        animateScrollTo(
+            initialOption = 2,
+            targetOption = 8,
+            totalOptions = 10,
+            expectedItemsScrolled = -4,
+        )
+    }
+
+    @Test
+    fun scroll_to_the_closest_item_with_animation() {
+        animateScrollTo(
+            initialOption = 2,
+            targetOption = 0,
+            totalOptions = 4,
+            expectedItemsScrolled = -2,
+        )
+    }
+
+    @Test
+    fun animate_scroll_cancels_previous_animation() {
+        val initialOption = 5
+        val totalOptions = 10
+        val firstTarget = 7
+        val secondTarget = 9
+
+        val targetDelta = 4
+
+        lateinit var state: PickerState
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            state = rememberPickerState(
+                initialNumberOfOptions = totalOptions,
+                initiallySelectedOption = initialOption
+            )
+            SimplePicker(state)
+        }
+        val initialItemIndex = state.scalingLazyListState.centerItemIndex
+
+        // The first animation starts, but before it's finished - a second animation starts,
+        // which cancels the first animation. In the end it doesn't matter how far picker was
+        // scrolled during first animation, because the second animation should bring
+        // picker to its final target.
+        rule.runOnIdle {
+            scope.launch {
+                async {
+                    state.animateScrollToOption(firstTarget)
+                }
+                delay(100) // a short delay so that the first async will be triggered first
+                async {
+                    state.animateScrollToOption(secondTarget)
+                }
+            }
+        }
+        rule.waitForIdle()
+        assertThat(state.selectedOption).isEqualTo(secondTarget)
+        assertThat(state.scalingLazyListState.centerItemIndex)
+            .isEqualTo(initialItemIndex + targetDelta)
+    }
+
+    @Test
     fun scrolls_with_negative_separation() = scrolls_to_index_correctly(-1, 3)
 
     @Test
@@ -289,6 +403,7 @@
             }
         }
 
+        val initialItemIndex = state.scalingLazyListState.centerItemIndex
         rule.runOnIdle {
             runBlocking {
                 state.numberOfOptions = 31
@@ -298,6 +413,7 @@
         rule.waitForIdle()
 
         assertThat(state.selectedOption).isEqualTo(initialOption)
+        assertThat(state.scalingLazyListState.centerItemIndex).isEqualTo(initialItemIndex)
     }
 
     @Test
@@ -581,6 +697,49 @@
         rule.onNodeWithText("2").assertExists()
     }
 
+    private fun animateScrollTo(
+        initialOption: Int,
+        targetOption: Int,
+        totalOptions: Int,
+        expectedItemsScrolled: Int,
+    ) {
+        lateinit var state: PickerState
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            state = rememberPickerState(
+                initialNumberOfOptions = totalOptions,
+                initiallySelectedOption = initialOption
+            )
+            SimplePicker(state)
+        }
+
+        val initialItemIndex = state.scalingLazyListState.centerItemIndex
+        rule.runOnIdle {
+            scope.launch {
+                async {
+                    state.animateScrollToOption(targetOption)
+                }
+            }
+        }
+        rule.waitForIdle()
+        assertThat(state.selectedOption).isEqualTo(targetOption)
+        assertThat(state.scalingLazyListState.centerItemIndex)
+            .isEqualTo(initialItemIndex + expectedItemsScrolled)
+    }
+
+    @Composable
+    private fun SimplePicker(state: PickerState) {
+        WithTouchSlop(0f) {
+            Picker(
+                state = state,
+                contentDescription = CONTENT_DESCRIPTION,
+            ) {
+                Box(Modifier.requiredSize(itemSizeDp))
+            }
+        }
+    }
+
     private fun scroll_snaps(
         separationSign: Int = 0,
         touchInput: (TouchInjectionScope).() -> Unit,
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Picker.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Picker.kt
index 31db6b9..963051d 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Picker.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Picker.kt
@@ -494,7 +494,7 @@
             verifyNumberOfOptions(newNumberOfOptions)
             // We need to maintain the mapping between the currently selected item and the
             // currently selected option.
-            optionsOffset = positiveModule(
+            optionsOffset = positiveModulo(
                 selectedOption.coerceAtMost(newNumberOfOptions - 1) -
                     scalingLazyListState.centerItemIndex,
                 newNumberOfOptions
@@ -537,18 +537,29 @@
      * @param index The index of the option to scroll to.
      */
     public suspend fun scrollToOption(index: Int) {
-        val itemIndex =
-            if (!repeatItems) {
-                index
-            } else {
-                // Pick the itemIndex closest to the current one, that it's congruent modulo
-                // numberOfOptions with index - optionOffset.
-                // This is to try to work around http://b/230582961
-                val minTargetIndex = scalingLazyListState.centerItemIndex - numberOfOptions / 2
-                minTargetIndex + positiveModule(index - minTargetIndex, numberOfOptions) -
-                    optionsOffset
-            }
-        scalingLazyListState.scrollToItem(itemIndex, 0)
+        scalingLazyListState.scrollToItem(getClosestTargetItemIndex(index), 0)
+    }
+
+    /**
+     * Animate (smooth scroll) to the given item at [index]
+     *
+     * A smooth scroll always happens to the closest item if PickerState has repeatItems=true.
+     * For example, picker values are :
+     * 0 1 2 3 0 1 2 [3] 0 1 2 3
+     * Target value is [0].
+     * 0 1 2 3 >0< 1 2 [3] >0< 1 2 3
+     * Picker can be scrolled forwards or backwards. To get to the target 0 it requires 1 step to
+     * scroll forwards and 3 steps to scroll backwards. Picker will be scrolled forwards
+     * as this is the closest destination.
+     *
+     * If the distance between possible targets is the same, picker will be scrolled backwards.
+     *
+     * @sample androidx.wear.compose.material.samples.AnimateOptionChangePicker
+     *
+     * @param index The index of the option to scroll to.
+     */
+    public suspend fun animateScrollToOption(index: Int) {
+        scalingLazyListState.animateScrollToItem(getClosestTargetItemIndex(index), 0)
     }
 
     public companion object {
@@ -593,6 +604,21 @@
     override val canScrollBackward: Boolean
         get() = scalingLazyListState.canScrollBackward
 
+    /**
+     * Function which calculates the real position of an option
+     */
+    private fun getClosestTargetItemIndex(option: Int): Int =
+        if (!repeatItems) {
+            option
+        } else {
+            // Calculating the distance to the target option in front or back.
+            // The minimum distance is then selected and picker is scrolled in that direction.
+            val stepsPrev = positiveModulo(selectedOption - option, numberOfOptions)
+            val stepsNext = positiveModulo(option - selectedOption, numberOfOptions)
+            scalingLazyListState.centerItemIndex +
+                if (stepsPrev <= stepsNext) -stepsPrev else stepsNext
+        }
+
     private fun verifyNumberOfOptions(numberOfOptions: Int) {
         require(numberOfOptions > 0) { "The picker should have at least one item." }
         require(numberOfOptions < LARGE_NUMBER_OF_ITEMS / 3) {
@@ -704,7 +730,7 @@
     public val selectedOption: Int
 }
 
-private fun positiveModule(n: Int, mod: Int) = ((n % mod) + mod) % mod
+private fun positiveModulo(n: Int, mod: Int) = ((n % mod) + mod) % mod
 
 private fun convertToDefaultFoundationScalingParams(
     @Suppress("DEPRECATION")
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyColumn.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyColumn.kt
index d9f36e0..3c93e35 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyColumn.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyColumn.kt
@@ -31,7 +31,6 @@
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.calculateEndPadding
 import androidx.compose.foundation.layout.calculateStartPadding
-import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyListScope
 import androidx.compose.runtime.Composable
@@ -46,12 +45,14 @@
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.offset
 import androidx.wear.compose.foundation.lazy.CombinedPaddingValues
@@ -434,7 +435,11 @@
                 if (autoCentering != null) {
                     item {
                         Spacer(
-                            modifier = Modifier.height(state.topAutoCenteringItemSizePx.toDp())
+                            modifier = remember(state) {
+                                Modifier.autoCenteringHeight {
+                                    state.topAutoCenteringItemSizePx
+                                }
+                            }
                         )
                     }
                 }
@@ -442,7 +447,11 @@
                 if (autoCentering != null) {
                     item {
                         Spacer(
-                            modifier = Modifier.height(state.bottomAutoCenteringItemSizePx.toDp())
+                            modifier = remember(state) {
+                                Modifier.autoCenteringHeight {
+                                    state.bottomAutoCenteringItemSizePx
+                                }
+                            }
                         )
                     }
                 }
@@ -689,3 +698,15 @@
         itemScope.content()
     }
 }
+
+private fun Modifier.autoCenteringHeight(getHeight: () -> Int) =
+    layout { measurable, constraints ->
+        val height = getHeight()
+        val placeable = measurable.measure(
+            constraints.copy(minHeight = height, maxHeight = height)
+        )
+
+        layout(placeable.width, placeable.height) {
+            placeable.place(IntOffset.Zero)
+        }
+    }
diff --git a/wear/compose/compose-navigation/build.gradle b/wear/compose/compose-navigation/build.gradle
index 4d48f3b..0cfac0c 100644
--- a/wear/compose/compose-navigation/build.gradle
+++ b/wear/compose/compose-navigation/build.gradle
@@ -27,14 +27,14 @@
 
     api(project(":compose:ui:ui"))
     api(project(":compose:runtime:runtime"))
-    api("androidx.navigation:navigation-runtime:2.4.0")
+    api("androidx.navigation:navigation-runtime:2.5.3")
     api(project(":wear:compose:compose-material"))
     api(project(":activity:activity-compose"))
     api(project(":lifecycle:lifecycle-viewmodel-compose"))
 
     implementation(libs.kotlinStdlib)
     implementation(project(":navigation:navigation-common"))
-    implementation("androidx.navigation:navigation-compose:2.4.0")
+    implementation("androidx.navigation:navigation-compose:2.5.3")
     implementation("androidx.profileinstaller:profileinstaller:1.2.0")
 
     androidTestImplementation(project(":compose:test-utils"))
@@ -44,7 +44,7 @@
     androidTestImplementation(project(":wear:compose:compose-material"))
     androidTestImplementation(project(":wear:compose:compose-navigation-samples"))
     androidTestImplementation(libs.truth)
-    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
+    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.5.1")
 
     samples(project(":wear:compose:compose-navigation-samples"))
 }
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
index d2edf1d..2c06dbd 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
@@ -30,6 +30,7 @@
 import androidx.wear.compose.material.samples.AlertDialogSample
 import androidx.wear.compose.material.samples.AlertWithButtons
 import androidx.wear.compose.material.samples.AlertWithChips
+import androidx.wear.compose.material.samples.AnimateOptionChangePicker
 import androidx.wear.compose.material.samples.AppCardWithIcon
 import androidx.wear.compose.material.samples.ButtonWithIcon
 import androidx.wear.compose.material.samples.ButtonWithText
@@ -210,6 +211,7 @@
                     },
                     ComposableDemo("Simple Picker") { SimplePicker() },
                     ComposableDemo("No gradient") { PickerWithoutGradient() },
+                    ComposableDemo("Animate picker change") { AnimateOptionChangePicker() },
                 )
             } else {
                 listOf(
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/PickerDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/PickerDemo.kt
index 1eebca8..9e68e8f 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/PickerDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/PickerDemo.kt
@@ -583,6 +583,9 @@
                 datePickerState.monthState.numberOfOptions = datePickerState.numOfMonths
             }
             if (datePickerState.numOfDays != datePickerState.dayState.numberOfOptions) {
+                if (datePickerState.dayState.selectedOption >= datePickerState.numOfDays) {
+                    datePickerState.dayState.animateScrollToOption(datePickerState.numOfDays - 1)
+                }
                 datePickerState.dayState.numberOfOptions = datePickerState.numOfDays
             }
         }
@@ -595,7 +598,8 @@
                     datePickerState.currentYear(),
                     "${datePickerState.currentYear()}"
                 )
-            } }
+            }
+        }
         val monthContentDescription by remember(focusedElement, datePickerState.currentMonth()) {
             derivedStateOf {
                 createDescriptionDatePicker(
diff --git a/wear/compose/integration-tests/navigation/build.gradle b/wear/compose/integration-tests/navigation/build.gradle
index 245f2a7..c07992c 100644
--- a/wear/compose/integration-tests/navigation/build.gradle
+++ b/wear/compose/integration-tests/navigation/build.gradle
@@ -44,7 +44,7 @@
 
 dependencies {
 
-    implementation("androidx.activity:activity-compose:1.3.1")
+    implementation("androidx.activity:activity-compose:1.5.1")
     implementation(project(":compose:ui:ui"))
     implementation(project(':compose:integration-tests:demos:common'))
     implementation(project(":compose:foundation:foundation"))
diff --git a/wear/protolayout/OWNERS b/wear/protolayout/OWNERS
index bc950d4..e9f1fd8 100644
--- a/wear/protolayout/OWNERS
+++ b/wear/protolayout/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1235285
 msab@google.com
 
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/current.txt b/wear/protolayout/protolayout-expression-pipeline/api/current.txt
index 654b5cb..6f6c05a 100644
--- a/wear/protolayout/protolayout-expression-pipeline/api/current.txt
+++ b/wear/protolayout/protolayout-expression-pipeline/api/current.txt
@@ -24,8 +24,8 @@
   }
 
   public class ObservableStateStore {
-    ctor public ObservableStateStore(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
-    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
+    method public static androidx.wear.protolayout.expression.pipeline.ObservableStateStore create(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
+    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
   }
 
   public interface QuotaManager {
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/public_plus_experimental_current.txt b/wear/protolayout/protolayout-expression-pipeline/api/public_plus_experimental_current.txt
index 654b5cb..6f6c05a 100644
--- a/wear/protolayout/protolayout-expression-pipeline/api/public_plus_experimental_current.txt
+++ b/wear/protolayout/protolayout-expression-pipeline/api/public_plus_experimental_current.txt
@@ -24,8 +24,8 @@
   }
 
   public class ObservableStateStore {
-    ctor public ObservableStateStore(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
-    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
+    method public static androidx.wear.protolayout.expression.pipeline.ObservableStateStore create(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
+    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
   }
 
   public interface QuotaManager {
diff --git a/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt b/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
index 25b65f7..25399f3 100644
--- a/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
+++ b/wear/protolayout/protolayout-expression-pipeline/api/restricted_current.txt
@@ -24,8 +24,10 @@
   }
 
   public class ObservableStateStore {
-    ctor public ObservableStateStore(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
-    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ObservableStateStore(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
+    method public static androidx.wear.protolayout.expression.pipeline.ObservableStateStore create(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
+    method @UiThread public void setStateEntryValues(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @UiThread public void setStateEntryValuesProto(java.util.Map<java.lang.String!,androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue!>);
   }
 
   public interface QuotaManager {
diff --git a/wear/protolayout/protolayout-expression-pipeline/build.gradle b/wear/protolayout/protolayout-expression-pipeline/build.gradle
index 24961ce..8769b62 100644
--- a/wear/protolayout/protolayout-expression-pipeline/build.gradle
+++ b/wear/protolayout/protolayout-expression-pipeline/build.gradle
@@ -32,6 +32,7 @@
 
     compileOnly(libs.kotlinStdlib) // For annotation-experimental
 
+    testImplementation(libs.mockitoCore4)
     testImplementation(libs.testExtJunit)
     testImplementation(libs.testExtTruth)
     testImplementation(libs.testRunner)
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/AnimatableNode.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/AnimatableNode.java
index c36521a..d4fd9ef 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/AnimatableNode.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/AnimatableNode.java
@@ -16,15 +16,12 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
-import android.annotation.SuppressLint;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.UiThread;
 import androidx.annotation.VisibleForTesting;
 
 /** Data animatable source node within a dynamic data pipeline. */
 abstract class AnimatableNode {
-
     private boolean mIsVisible = false;
     @NonNull final QuotaAwareAnimator mQuotaAwareAnimator;
 
@@ -42,7 +39,6 @@
      * it.
      */
     @UiThread
-    @SuppressLint("CheckResult") // (b/247804720)
     protected void startOrSkipAnimator() {
         if (mIsVisible) {
             mQuotaAwareAnimator.tryStartAnimation();
@@ -67,7 +63,7 @@
         mIsVisible = visible;
         if (mIsVisible) {
             startOrResumeAnimator();
-        } else if (mQuotaAwareAnimator.hasRunningAnimation()) {
+        } else if (mQuotaAwareAnimator.hasRunningOrStartedAnimation()) {
             stopOrPauseAnimator();
         }
     }
@@ -76,14 +72,13 @@
      * Starts or resumes the animator if there is a quota, depending on whether the animation was
      * paused.
      */
-    @SuppressLint("CheckResult") // (b/247804720)
     private void startOrResumeAnimator() {
-        mQuotaAwareAnimator.tryStartOrResumeAnimator();
+        mQuotaAwareAnimator.tryStartOrResumeInfiniteAnimation();
     }
 
     /** Returns whether this node has a running animation. */
-    boolean hasRunningAnimation() {
-        return mQuotaAwareAnimator.hasRunningAnimation();
+    boolean hasRunningOrStartedAnimation() {
+        return mQuotaAwareAnimator.hasRunningOrStartedAnimation();
     }
 
     /** Returns whether the animator in this node has an infinite duration. */
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicType.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicType.java
index af3b6f8..8d51f4e 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicType.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicType.java
@@ -43,7 +43,7 @@
     @UiThread
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-    int getRunningAnimationCount();
+    int getRunningOrStartedAnimationCount();
 
     /** Destroys this dynamic type and it shouldn't be used after this. */
     @UiThread
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
index 4ab8ecd..295a915 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/BoundDynamicTypeImpl.java
@@ -42,11 +42,11 @@
 
     /** Returns how many of {@link AnimatableNode} are running. */
     @Override
-    public int getRunningAnimationCount() {
+    public int getRunningOrStartedAnimationCount() {
         return (int)
                 mNodes.stream()
                         .filter(n -> n instanceof AnimatableNode)
-                        .filter(n -> ((AnimatableNode) n).hasRunningAnimation())
+                        .filter(n -> ((AnimatableNode) n).hasRunningOrStartedAnimation())
                         .count();
     }
 
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluator.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluator.java
index 35936c3..32cca2b 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluator.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluator.java
@@ -66,9 +66,12 @@
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicFloat;
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicInt32;
 import androidx.wear.protolayout.expression.proto.DynamicProto.DynamicString;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedColor;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedFloat;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Executor;
 
 /**
@@ -77,7 +80,7 @@
  * <p>Given a dynamic ProtoLayout data source, this builds up a sequence of {@link DynamicDataNode}
  * instances, which can source the required data, and transform it into its final form.
  *
- * <p>Data source can includes animations which will then emit value transitions.
+ * <p>Data source can include animations which will then emit value transitions.
  *
  * <p>In order to evaluate dynamic types, the caller needs to add any number of pending dynamic
  * types with {@link #bind} methods and then call {@link #processPendingBindings()} to start
@@ -85,6 +88,9 @@
  *
  * <p>It's the callers responsibility to destroy those dynamic types after use, with {@link
  * BoundDynamicType#close()}.
+ *
+ * <p>It's the callers responsibility to destroy those dynamic types after use, with {@link
+ * BoundDynamicType#close()}.
  */
 public class DynamicTypeEvaluator implements AutoCloseable {
     private static final String TAG = "DynamicTypeEvaluator";
@@ -97,17 +103,18 @@
     private final boolean mEnableAnimations;
     @NonNull private final QuotaManager mAnimationQuotaManager;
     @NonNull private final List<DynamicDataNode<?>> mDynamicTypeNodes = new ArrayList<>();
+    private final Handler mUiHandler;
 
     @NonNull
     private static final QuotaManager DISABLED_ANIMATIONS_QUOTA_MANAGER =
             new QuotaManager() {
                 @Override
-                public boolean tryAcquireQuota(int quotaNum) {
+                public boolean tryAcquireQuota(int quota) {
                     return false;
                 }
 
                 @Override
-                public void releaseQuota(int quotaNum) {
+                public void releaseQuota(int quota) {
                     throw new IllegalStateException(
                             "releaseQuota method is called when no quota is acquired!");
                 }
@@ -185,10 +192,9 @@
             @NonNull ObservableStateStore stateStore,
             boolean enableAnimations,
             @NonNull QuotaManager animationQuotaManager) {
-
         this.mSensorGateway = sensorGateway;
-        Handler uiHandler = new Handler(Looper.getMainLooper());
-        Executor uiExecutor = new MainThreadExecutor(uiHandler);
+        mUiHandler = new Handler(Looper.getMainLooper());
+        Executor uiExecutor = new MainThreadExecutor(mUiHandler);
         if (this.mSensorGateway != null) {
             if (platformDataSourcesInitiallyEnabled) {
                 this.mSensorGateway.enableUpdates();
@@ -201,7 +207,7 @@
             this.mSensorGatewayDataSource = null;
         }
 
-        this.mTimeGateway = new TimeGatewayImpl(uiHandler, platformDataSourcesInitiallyEnabled);
+        this.mTimeGateway = new TimeGatewayImpl(mUiHandler, platformDataSourcesInitiallyEnabled);
         this.mTimeDataSource = new EpochTimePlatformDataSource(uiExecutor, mTimeGateway);
 
         this.mEnableAnimations = enableAnimations;
@@ -284,7 +290,7 @@
             @NonNull DynamicTypeValueReceiver<String> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
         bindRecursively(stringSource.toDynamicStringProto(), consumer, locale, resultBuilder);
-        processBindings(resultBuilder);
+        mUiHandler.post(() -> processBindings(resultBuilder));
         return new BoundDynamicTypeImpl(resultBuilder);
     }
 
@@ -335,7 +341,7 @@
             @NonNull DynamicTypeValueReceiver<Integer> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
         bindRecursively(int32Source.toDynamicInt32Proto(), consumer, resultBuilder);
-        processBindings(resultBuilder);
+        mUiHandler.post(() -> processBindings(resultBuilder));
         return new BoundDynamicTypeImpl(resultBuilder);
     }
 
@@ -383,8 +389,37 @@
             @NonNull DynamicBuilders.DynamicFloat floatSource,
             @NonNull DynamicTypeValueReceiver<Float> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(floatSource.toDynamicFloatProto(), consumer, resultBuilder);
-        processBindings(resultBuilder);
+        bindRecursively(
+                floatSource.toDynamicFloatProto(), consumer, resultBuilder, Optional.empty());
+        mUiHandler.post(() -> processBindings(resultBuilder));
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds pending dynamic type from the given {@link DynamicFloat} for future evaluation.
+     *
+     * <p>Evaluation of this dynamic type will start when {@link #processPendingBindings} is called.
+     *
+     * <p>While the {@link BoundDynamicType} is not destroyed with {@link BoundDynamicType#close()}
+     * by caller, results of evaluation will be sent through the given {@link
+     * DynamicTypeValueReceiver}.
+     *
+     * @param floatSource The given float dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     *     UI thread.
+     * @param animationFallbackValue The value used if the given {@link DynamicFloat} is animatable
+     *     and animation are disabled.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public BoundDynamicType bind(
+            @NonNull DynamicFloat floatSource,
+            @NonNull DynamicTypeValueReceiver<Float> consumer,
+            float animationFallbackValue) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(floatSource, consumer, resultBuilder, Optional.of(animationFallbackValue));
+        mDynamicTypeNodes.addAll(resultBuilder);
         return new BoundDynamicTypeImpl(resultBuilder);
     }
 
@@ -407,7 +442,7 @@
     public BoundDynamicType bind(
             @NonNull DynamicFloat floatSource, @NonNull DynamicTypeValueReceiver<Float> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(floatSource, consumer, resultBuilder);
+        bindRecursively(floatSource, consumer, resultBuilder, Optional.empty());
         mDynamicTypeNodes.addAll(resultBuilder);
         return new BoundDynamicTypeImpl(resultBuilder);
     }
@@ -431,8 +466,9 @@
             @NonNull DynamicBuilders.DynamicColor colorSource,
             @NonNull DynamicTypeValueReceiver<Integer> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(colorSource.toDynamicColorProto(), consumer, resultBuilder);
-        processBindings(resultBuilder);
+        bindRecursively(
+                colorSource.toDynamicColorProto(), consumer, resultBuilder, Optional.empty());
+        mUiHandler.post(() -> processBindings(resultBuilder));
         return new BoundDynamicTypeImpl(resultBuilder);
     }
 
@@ -456,7 +492,35 @@
             @NonNull DynamicColor colorSource,
             @NonNull DynamicTypeValueReceiver<Integer> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
-        bindRecursively(colorSource, consumer, resultBuilder);
+        bindRecursively(colorSource, consumer, resultBuilder, Optional.empty());
+        mDynamicTypeNodes.addAll(resultBuilder);
+        return new BoundDynamicTypeImpl(resultBuilder);
+    }
+
+    /**
+     * Adds pending dynamic type from the given {@link DynamicColor} for future evaluation.
+     *
+     * <p>Evaluation of this dynamic type will start when {@link #processPendingBindings} is called.
+     *
+     * <p>While the {@link BoundDynamicType} is not destroyed with {@link BoundDynamicType#close()}
+     * by caller, results of evaluation will be sent through the given {@link
+     * DynamicTypeValueReceiver}.
+     *
+     * @param colorSource The given color dynamic type that should be evaluated.
+     * @param consumer The registered consumer for results of the evaluation. It will be called from
+     *     UI thread.
+     * @param animationFallbackValue The value used if the given {@link DynamicFloat} is animatable
+     *     and animation are disabled.
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public BoundDynamicType bind(
+            @NonNull DynamicColor colorSource,
+            @NonNull DynamicTypeValueReceiver<Integer> consumer,
+            int animationFallbackValue) {
+        List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
+        bindRecursively(colorSource, consumer, resultBuilder, Optional.of(animationFallbackValue));
         mDynamicTypeNodes.addAll(resultBuilder);
         return new BoundDynamicTypeImpl(resultBuilder);
     }
@@ -481,7 +545,7 @@
             @NonNull DynamicTypeValueReceiver<Boolean> consumer) {
         List<DynamicDataNode<?>> resultBuilder = new ArrayList<>();
         bindRecursively(boolSource.toDynamicBoolProto(), consumer, resultBuilder);
-        processBindings(resultBuilder);
+        mUiHandler.post(() -> processBindings(resultBuilder));
         return new BoundDynamicTypeImpl(resultBuilder);
     }
 
@@ -546,7 +610,8 @@
                     bindRecursively(
                             stringSource.getFloatFormatOp().getInput(),
                             floatFormatNode.getIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     break;
                 }
             case STATE_SOURCE:
@@ -605,8 +670,9 @@
     }
 
     /**
-     * Same as {@link #bind(DynamicBuilders.DynamicInt32, DynamicTypeValueReceiver)}, all {@link
-     * DynamicDataNode} produced by evaluating given dynamic type are added to the given list.
+     * Same as {@link #bind(DynamicBuilders.DynamicInt32, DynamicTypeValueReceiver)}, but instead of
+     * returning one {@link BoundDynamicType}, all {@link DynamicDataNode} produced by evaluating
+     * given dynamic type are added to the given list.
      */
     private void bindRecursively(
             @NonNull DynamicInt32 int32Source,
@@ -680,7 +746,8 @@
                     bindRecursively(
                             int32Source.getFloatToInt().getInput(),
                             conversionNode.getIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     break;
                 }
             case INNER_NOT_SET:
@@ -693,13 +760,15 @@
     }
 
     /**
-     * Same as {@link #bind(DynamicBuilders.DynamicFloat, DynamicTypeValueReceiver)}, all {@link
-     * DynamicDataNode} produced by evaluating given dynamic type are added to the given list.
+     * Same as {@link #bind(DynamicBuilders.DynamicFloat, DynamicTypeValueReceiver)}, but instead of
+     * returning one {@link BoundDynamicType}, all {@link DynamicDataNode} produced by evaluating
+     * given dynamic type are added to the given list.
      */
     private void bindRecursively(
             @NonNull DynamicFloat floatSource,
             @NonNull DynamicTypeValueReceiver<Float> consumer,
-            @NonNull List<DynamicDataNode<?>> resultBuilder) {
+            @NonNull List<DynamicDataNode<?>> resultBuilder,
+            @NonNull Optional<Float> animationFallbackValue) {
         DynamicDataNode<?> node;
 
         switch (floatSource.getInnerCase()) {
@@ -720,11 +789,13 @@
                     bindRecursively(
                             floatSource.getArithmeticOperation().getInputLhs(),
                             arithmeticNode.getLhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             floatSource.getArithmeticOperation().getInputRhs(),
                             arithmeticNode.getRhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     break;
                 }
@@ -751,49 +822,66 @@
                     bindRecursively(
                             op.getValueIfTrue(),
                             conditionalNode.getTrueValueIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             op.getValueIfFalse(),
                             conditionalNode.getFalseValueIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     node = conditionalNode;
                     break;
                 }
             case ANIMATABLE_FIXED:
-                {
-                    if (mEnableAnimations) {
-                        node =
-                                new AnimatableFixedFloatNode(
-                                        floatSource.getAnimatableFixed(),
-                                        consumer,
-                                        mAnimationQuotaManager);
-                    } else {
-                        throw new IllegalStateException(
-                                "Cannot translate static_animated_float; animations are disabled.");
-                    }
-                    break;
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedFloatNode(
+                                    FixedFloat.newBuilder()
+                                            .setValue(animationFallbackValue.get())
+                                            .build(),
+                                    consumer);
+                } else {
+                    // We don't have to check if enableAnimations is true, because if it's false and
+                    // we didn't have static value set, constructor has put QuotaManager that don't
+                    // have any quota, so animations won't be played and they would jump to the end
+                    // value.
+                    node =
+                            new AnimatableFixedFloatNode(
+                                    floatSource.getAnimatableFixed(),
+                                    consumer,
+                                    mAnimationQuotaManager);
                 }
+                break;
             case ANIMATABLE_DYNAMIC:
-                {
-                    if (mEnableAnimations) {
-                        AnimatableDynamicFloat dynamicNode = floatSource.getAnimatableDynamic();
-                        DynamicAnimatedFloatNode animationNode =
-                                new DynamicAnimatedFloatNode(
-                                        consumer, dynamicNode.getSpec(), mAnimationQuotaManager);
-                        node = animationNode;
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedFloatNode(
+                                    FixedFloat.newBuilder()
+                                            .setValue(animationFallbackValue.get())
+                                            .build(),
+                                    consumer);
 
-                        bindRecursively(
-                                dynamicNode.getInput(),
-                                animationNode.getInputCallback(),
-                                resultBuilder);
-                    } else {
-                        throw new IllegalStateException(
-                                "Cannot translate dynamic_animated_float; animations are"
-                                        + " disabled.");
-                    }
-                    break;
+                } else {
+                    // We don't have to check if enableAnimations is true, because if it's false and
+                    // we didn't have static value set, constructor has put QuotaManager that don't
+                    // have any quota, so animations won't be played and they would jump to the end
+                    // value.
+                    AnimatableDynamicFloat dynamicNode = floatSource.getAnimatableDynamic();
+                    DynamicAnimatedFloatNode animationNode =
+                            new DynamicAnimatedFloatNode(
+                                    consumer, dynamicNode.getSpec(), mAnimationQuotaManager);
+                    node = animationNode;
+
+                    bindRecursively(
+                            dynamicNode.getInput(),
+                            animationNode.getInputCallback(),
+                            resultBuilder,
+                            animationFallbackValue);
                 }
+                break;
 
             case INNER_NOT_SET:
                 throw new IllegalArgumentException("DynamicFloat has no inner source set");
@@ -805,13 +893,15 @@
     }
 
     /**
-     * Same as {@link #bind(DynamicBuilders.DynamicColor, DynamicTypeValueReceiver)}, all {@link
-     * DynamicDataNode} produced by evaluating given dynamic type are added to the given list.
+     * Same as {@link #bind(DynamicBuilders.DynamicColor, DynamicTypeValueReceiver)}, but instead of
+     * returning one {@link BoundDynamicType}, all {@link DynamicDataNode} produced by evaluating
+     * given dynamic type are added to the given list.
      */
     private void bindRecursively(
             @NonNull DynamicColor colorSource,
             @NonNull DynamicTypeValueReceiver<Integer> consumer,
-            @NonNull List<DynamicDataNode<?>> resultBuilder) {
+            @NonNull List<DynamicDataNode<?>> resultBuilder,
+            @NonNull Optional<Integer> animationFallbackValue) {
         DynamicDataNode<?> node;
 
         switch (colorSource.getInnerCase()) {
@@ -824,19 +914,42 @@
                                 mStateStore, colorSource.getStateSource(), consumer);
                 break;
             case ANIMATABLE_FIXED:
-                if (mEnableAnimations) {
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedColorNode(
+                                    FixedColor.newBuilder()
+                                            .setArgb(animationFallbackValue.get())
+                                            .build(),
+                                    consumer);
+
+                } else {
+                    // We don't have to check if enableAnimations is true, because if it's false and
+                    // we didn't have static value set, constructor has put QuotaManager that don't
+                    // have any quota, so animations won't be played and they would jump to the end
+                    // value.
                     node =
                             new AnimatableFixedColorNode(
                                     colorSource.getAnimatableFixed(),
                                     consumer,
                                     mAnimationQuotaManager);
-                } else {
-                    throw new IllegalStateException(
-                            "Cannot translate animatable_fixed color; animations are disabled.");
                 }
                 break;
             case ANIMATABLE_DYNAMIC:
-                if (mEnableAnimations) {
+                if (!mEnableAnimations && animationFallbackValue.isPresent()) {
+                    // Just assign static value if animations are disabled.
+                    node =
+                            new FixedColorNode(
+                                    FixedColor.newBuilder()
+                                            .setArgb(animationFallbackValue.get())
+                                            .build(),
+                                    consumer);
+
+                } else {
+                    // We don't have to check if enableAnimations is true, because if it's false and
+                    // we didn't have static value set, constructor has put QuotaManager that don't
+                    // have any quota, so animations won't be played and they would jump to the end
+                    // value.
                     AnimatableDynamicColor dynamicNode = colorSource.getAnimatableDynamic();
                     DynamicAnimatedColorNode animationNode =
                             new DynamicAnimatedColorNode(
@@ -846,10 +959,8 @@
                     bindRecursively(
                             dynamicNode.getInput(),
                             animationNode.getInputCallback(),
-                            resultBuilder);
-                } else {
-                    throw new IllegalStateException(
-                            "Cannot translate dynamic_animated_float; animations are disabled.");
+                            resultBuilder,
+                            animationFallbackValue);
                 }
                 break;
             case INNER_NOT_SET:
@@ -862,8 +973,9 @@
     }
 
     /**
-     * Same as {@link #bind(DynamicBuilders.DynamicBool, DynamicTypeValueReceiver)}, all {@link
-     * DynamicDataNode} produced by evaluating given dynamic type are added to the given list.
+     * Same as {@link #bind(DynamicBuilders.DynamicBool, DynamicTypeValueReceiver)}, but instead of
+     * returning one {@link BoundDynamicType}, all {@link DynamicDataNode} produced by evaluating
+     * given dynamic type are added to the given list.
      */
     private void bindRecursively(
             @NonNull DynamicBool boolSource,
@@ -931,11 +1043,13 @@
                     bindRecursively(
                             boolSource.getFloatComparison().getInputLhs(),
                             compNode.getLhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
                     bindRecursively(
                             boolSource.getFloatComparison().getInputRhs(),
                             compNode.getRhsIncomingCallback(),
-                            resultBuilder);
+                            resultBuilder,
+                            Optional.empty());
 
                     break;
                 }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStore.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStore.java
index 8155cb2..5eefdd1 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStore.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStore.java
@@ -16,20 +16,22 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
+import static java.util.stream.Collectors.toMap;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.UiThread;
 import androidx.collection.ArrayMap;
 import androidx.collection.ArraySet;
+import androidx.wear.protolayout.expression.StateEntryBuilders;
 import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.stream.Stream;
 
 /**
  * State storage for ProtoLayout, which also supports sending callback when data items change.
@@ -39,48 +41,69 @@
  * must only be used from the UI thread.
  */
 public class ObservableStateStore {
-    @NonNull private final Map<String, StateEntryValue> mCurrentState = new ArrayMap<>();
+    @NonNull
+    private final Map<String, StateEntryValue> mCurrentState = new ArrayMap<>();
 
     @NonNull
     private final Map<String, Set<DynamicTypeValueReceiver<StateEntryValue>>> mRegisteredCallbacks =
             new ArrayMap<>();
 
+    /** Creates a {@link ObservableStateStore}. */
+    @NonNull
+    public static ObservableStateStore create(
+            @NonNull Map<String, StateEntryBuilders.StateEntryValue> initialState) {
+        return new ObservableStateStore(toProto(initialState));
+    }
+
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public ObservableStateStore(@NonNull Map<String, StateEntryValue> initialState) {
         mCurrentState.putAll(initialState);
     }
 
     /**
-     * Sets the given state into a storage. It replaces the current state with the new map and
-     * informs the registered listeners for changed values.
+     * Sets the given state, replacing the current state.
+     *
+     * <p>Informs registered listeners of changed values, invalidates removed values.
      */
     @UiThread
-    public void setStateEntryValues(@NonNull Map<String, StateEntryValue> newState) {
-        // Figure out which nodes have actually changed.
-        List<String> changedKeys = new ArrayList<>();
-        for (Entry<String, StateEntryValue> newEntry : newState.entrySet()) {
-            StateEntryValue currentEntry = mCurrentState.get(newEntry.getKey());
-            if (currentEntry == null || !currentEntry.equals(newEntry.getValue())) {
-                changedKeys.add(newEntry.getKey());
-            }
-        }
+    public void setStateEntryValues(
+            @NonNull Map<String, StateEntryBuilders.StateEntryValue> newState) {
+        setStateEntryValuesProto(toProto(newState));
+    }
 
-        for (String key : changedKeys) {
-            for (DynamicTypeValueReceiver<StateEntryValue> callback :
-                    mRegisteredCallbacks.getOrDefault(key, Collections.emptySet())) {
-                callback.onPreUpdate();
-            }
-        }
+    /**
+     * Sets the given state, replacing the current state.
+     *
+     * <p>Informs registered listeners of changed values, invalidates removed values.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    @UiThread
+    public void setStateEntryValuesProto(@NonNull Map<String, StateEntryValue> newState) {
+        // Figure out which nodes have actually changed.
+        Set<String> removedKeys = getRemovedKeys(newState);
+        Map<String, StateEntryValue> changedEntries = getChangedEntries(newState);
+
+        Stream.concat(removedKeys.stream(), changedEntries.keySet().stream())
+                .forEach(key -> {
+                    for (DynamicTypeValueReceiver<StateEntryValue> callback :
+                            mRegisteredCallbacks.getOrDefault(key, Collections.emptySet())) {
+                        callback.onPreUpdate();
+                    }
+                });
 
         mCurrentState.clear();
         mCurrentState.putAll(newState);
 
-        for (String key : changedKeys) {
+        for (String key : removedKeys) {
             for (DynamicTypeValueReceiver<StateEntryValue> callback :
                     mRegisteredCallbacks.getOrDefault(key, Collections.emptySet())) {
-                if (newState.containsKey(key)) {
-                    // The keys come from newState, so this should never be null.
-                    callback.onData(newState.get(key));
-                }
+                callback.onInvalidated();
+            }
+        }
+        for (Entry<String, StateEntryValue> entry : changedEntries.entrySet()) {
+            for (DynamicTypeValueReceiver<StateEntryValue> callback :
+                    mRegisteredCallbacks.getOrDefault(entry.getKey(), Collections.emptySet())) {
+                callback.onData(entry.getValue());
             }
         }
     }
@@ -93,7 +116,7 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @UiThread
     @Nullable
-    public StateEntryValue getStateEntryValues(@NonNull String key) {
+    public StateEntryValue getStateEntryValuesProto(@NonNull String key) {
         return mCurrentState.get(key);
     }
 
@@ -105,7 +128,6 @@
     @UiThread
     void registerCallback(
             @NonNull String key, @NonNull DynamicTypeValueReceiver<StateEntryValue> callback) {
-        new MainThreadExecutor();
         mRegisteredCallbacks.computeIfAbsent(key, k -> new ArraySet<>()).add(callback);
     }
 
@@ -118,4 +140,31 @@
             callbackSet.remove(callback);
         }
     }
+
+    @NonNull
+    private static Map<String, StateEntryValue> toProto(
+            @NonNull Map<String, StateEntryBuilders.StateEntryValue> value) {
+        return value.entrySet().stream()
+                .collect(toMap(Entry::getKey, entry -> entry.getValue().toStateEntryValueProto()));
+    }
+
+    @NonNull
+    private Set<String> getRemovedKeys(@NonNull Map<String, StateEntryValue> newState) {
+        Set<String> result = new ArraySet<>(mCurrentState.keySet());
+        result.removeAll(newState.keySet());
+        return result;
+    }
+
+    @NonNull
+    private Map<String, StateEntryValue> getChangedEntries(
+            @NonNull Map<String, StateEntryValue> newState) {
+        Map<String, StateEntryValue> result = new ArrayMap<>();
+        for (Entry<String, StateEntryValue> newEntry : newState.entrySet()) {
+            StateEntryValue currentEntry = mCurrentState.get(newEntry.getKey());
+            if (currentEntry == null || !currentEntry.equals(newEntry.getValue())) {
+                result.put(newEntry.getKey(), newEntry.getValue());
+            }
+        }
+        return result;
+    }
 }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/PlatformDataSources.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/PlatformDataSources.java
index d2c2a6b..0f86713 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/PlatformDataSources.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/PlatformDataSources.java
@@ -16,6 +16,11 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.RequiresApi;
 import androidx.collection.ArrayMap;
 import androidx.collection.SimpleArrayMap;
 import androidx.wear.protolayout.expression.pipeline.TimeGateway.TimeCallback;
@@ -99,12 +104,24 @@
                 case PLATFORM_INT32_SOURCE_TYPE_CURRENT_HEART_RATE:
                     return SensorGateway.SENSOR_DATA_TYPE_HEART_RATE;
                 case PLATFORM_INT32_SOURCE_TYPE_DAILY_STEP_COUNT:
-                    return SensorGateway.SENSOR_DATA_TYPE_DAILY_STEP_COUNT;
+                    if (VERSION.SDK_INT >= VERSION_CODES.Q) {
+                        return Api29Impl.getSensorDataTypeDailyStepCount();
+                    } else {
+                        return SensorGateway.SENSOR_DATA_TYPE_INVALID;
+                    }
                 default:
                     throw new IllegalArgumentException("Unknown PlatformSourceType");
             }
         }
 
+        @RequiresApi(VERSION_CODES.Q)
+        private static class Api29Impl {
+            @DoNotInline
+            static int getSensorDataTypeDailyStepCount() {
+                return SensorGateway.SENSOR_DATA_TYPE_DAILY_STEP_COUNT;
+            }
+        }
+
         @Override
         @SuppressWarnings("ExecutorTaskName")
         public void registerForData(
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaAwareAnimator.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaAwareAnimator.java
index 413b885..db26283 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaAwareAnimator.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaAwareAnimator.java
@@ -24,19 +24,20 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.UiThread;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 /**
  * Wrapper for Animator that is aware of quota. Animator's animations will be played only if given
- * quota manager allows. If not, non infinite animation will jump to an end.
+ * quota manager allows. If not, non infinite animation will jump to an end. Any existing listeners
+ * on wrapped {@link Animator} will be replaced.
  */
 class QuotaAwareAnimator {
     @Nullable private ValueAnimator mAnimator;
 
-    @NonNull private final QuotaManager mQuotaManager;
     @NonNull private final QuotaReleasingAnimatorListener mListener;
 
     QuotaAwareAnimator(@Nullable ValueAnimator animator, @NonNull QuotaManager quotaManager) {
         this.mAnimator = animator;
-        this.mQuotaManager = quotaManager;
         this.mListener = new QuotaReleasingAnimatorListener(quotaManager);
 
         if (this.mAnimator != null) {
@@ -53,6 +54,7 @@
 
         this.mAnimator = animator;
         this.mAnimator.addListener(mListener);
+        this.mAnimator.addPauseListener(mListener);
     }
 
     /** Resets the animator to null. Previous animator will be canceled. */
@@ -63,54 +65,37 @@
     }
 
     /**
-     * Tries to start animation. Returns true if quota allows the animator to start. Otherwise, it
-     * returns false.
+     * Tries to start animation. This method will call start on animation, but when animation is due
+     * to start (i.e. after the given delay), listener will check the quota and allow/disallow
+     * animation to be played.
      */
     @UiThread
-    boolean tryStartAnimation() {
+    void tryStartAnimation() {
         if (mAnimator == null) {
-            return false;
+            return;
         }
-        ValueAnimator localAnimator = mAnimator;
-        if (mQuotaManager.tryAcquireQuota(1)) {
-            startAnimator(localAnimator);
-            return true;
-        } else {
-            if (!isInfiniteAnimator()) {
-                localAnimator.end();
-            }
-            return false;
-        }
+
+        mAnimator.start();
     }
 
     /**
-     * Tries to start/resume infinite animation. Returns true if quota allows the animator to
-     * start/resume. Otherwise, it returns false.
+     * Tries to start/resume infinite animation. This method will call start/resume on animation,
+     * but when animation is due to start (i.e. after the given delay), listener will check the
+     * quota and allow/disallow animation to be played.
      */
     @UiThread
-    boolean tryStartOrResumeAnimator() {
+    void tryStartOrResumeInfiniteAnimation() {
         if (mAnimator == null) {
-            return false;
+            return;
         }
         ValueAnimator localAnimator = mAnimator;
-        if (localAnimator.isPaused() && mQuotaManager.tryAcquireQuota(1)) {
-            resumeAnimator(localAnimator);
-        } else if (isInfiniteAnimator() && mQuotaManager.tryAcquireQuota(1)) {
+        if (localAnimator.isPaused()) {
+            localAnimator.resume();
+        } else if (isInfiniteAnimator()) {
             // Infinite animators created when this node was invisible have not started yet.
-            startAnimator(localAnimator);
+            localAnimator.start();
         }
         // No need to jump to an end of animation if it can't be played as they are infinite.
-        return false;
-    }
-
-    private void resumeAnimator(ValueAnimator localAnimator) {
-        localAnimator.resume();
-        mListener.mIsUsingQuota = true;
-    }
-
-    private void startAnimator(ValueAnimator localAnimator) {
-        localAnimator.start();
-        mListener.mIsUsingQuota = true;
     }
 
     /**
@@ -149,6 +134,7 @@
         // This calls both onCancel and onEnd methods from listener.
         mAnimator.cancel();
         mAnimator.removeListener(mListener);
+        mAnimator.removePauseListener(mListener);
     }
 
     /** Returns whether the animator in this class has an infinite duration. */
@@ -156,14 +142,21 @@
         return mAnimator != null && mAnimator.getTotalDuration() == Animator.DURATION_INFINITE;
     }
 
-    /** Returns whether this node has a running animation. */
-    boolean hasRunningAnimation() {
-        return mAnimator != null && mAnimator.isRunning();
+    /**
+     * Returns whether this node has a running or started animation. Started means that animation is
+     * scheduled to run, but it has set time delay.
+     */
+    boolean hasRunningOrStartedAnimation() {
+        return mAnimator != null
+                && (mAnimator.isRunning() || /* delayed animation */ mAnimator.isStarted());
     }
 
     /**
      * The listener used for animatable nodes to release quota when the animation is finished or
-     * paused.
+     * paused. Additionally, when {@link
+     * android.animation.Animator.AnimatorListener#onAnimationStart(Animator)} is called, this
+     * listener will check quota, and if there isn't any available, it will jump to an end of
+     * animation.
      */
     private static final class QuotaReleasingAnimatorListener extends AnimatorListenerAdapter {
         @NonNull private final QuotaManager mQuotaManager;
@@ -173,33 +166,55 @@
         // inner ValueAnimator implementation (i.e., when calling end() on animator to assign it end
         // value, ValueAnimator will call start first if animation is not running to get it to the
         // end state.
-        boolean mIsUsingQuota = false;
+        @NonNull final AtomicBoolean mIsUsingQuota = new AtomicBoolean(false);
 
         QuotaReleasingAnimatorListener(@NonNull QuotaManager quotaManager) {
             this.mQuotaManager = quotaManager;
         }
 
         @Override
-        public void onAnimationStart(Animator animation) {}
+        public void onAnimationStart(Animator animation) {
+            acquireQuota(animation);
+        }
 
         @Override
-        public void onAnimationResume(Animator animation) {}
+        public void onAnimationResume(Animator animation) {
+            acquireQuota(animation);
+        }
 
         @Override
         @UiThread
         public void onAnimationEnd(Animator animation) {
-            if (mIsUsingQuota) {
-                mQuotaManager.releaseQuota(1);
-                mIsUsingQuota = false;
-            }
+            releaseQuota();
         }
 
         @Override
         @UiThread
         public void onAnimationPause(Animator animation) {
-            if (mIsUsingQuota) {
+            releaseQuota();
+        }
+
+        /**
+         * This method will block the given Animator from running animation if there is no enough
+         * quota. In that case, animation will jump to an end.
+         */
+        private void acquireQuota(Animator animation) {
+            if (!mQuotaManager.tryAcquireQuota(1)) {
+                mIsUsingQuota.set(false);
+                animation.end();
+                // End will fire end value via UpdateListener. We don't want any new updates to be
+                // pushed to the callback.
+                if (animation instanceof ValueAnimator) {
+                    ((ValueAnimator) animation).removeAllUpdateListeners();
+                }
+            } else {
+                mIsUsingQuota.set(true);
+            }
+        }
+
+        private void releaseQuota() {
+            if (mIsUsingQuota.compareAndSet(true, false)) {
                 mQuotaManager.releaseQuota(1);
-                mIsUsingQuota = false;
             }
         }
     }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaManager.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaManager.java
index fa8d642..1a43ad8 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaManager.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/QuotaManager.java
@@ -16,7 +16,6 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
-
 /**
  * Interface responsible for managing quota. Before initiating some action (e.g. starting an
  * animation) that uses a limited resource, {@link #tryAcquireQuota} should be called to see if the
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/StateSourceNode.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/StateSourceNode.java
index 8d14ff8..bb032f5 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/StateSourceNode.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/StateSourceNode.java
@@ -16,7 +16,7 @@
 
 package androidx.wear.protolayout.expression.pipeline;
 
-import androidx.annotation.Nullable;
+import androidx.annotation.NonNull;
 import androidx.annotation.UiThread;
 import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
 
@@ -50,7 +50,7 @@
     @UiThread
     public void init() {
         mObservableStateStore.registerCallback(mBindKey, this);
-        StateEntryValue item = mObservableStateStore.getStateEntryValues(mBindKey);
+        StateEntryValue item = mObservableStateStore.getStateEntryValuesProto(mBindKey);
 
         if (item != null) {
             this.onData(item);
@@ -71,7 +71,7 @@
     }
 
     @Override
-    public void onData(@Nullable StateEntryValue newData) {
+    public void onData(@NonNull StateEntryValue newData) {
         T actualValue = mStateExtractor.apply(newData);
         mDownstream.onData(actualValue);
     }
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImpl.java b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImpl.java
index 4c6a3e5..d3de886 100644
--- a/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImpl.java
+++ b/wear/protolayout/protolayout-expression-pipeline/src/main/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImpl.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
 
 import android.os.Handler;
@@ -18,7 +34,7 @@
  * @hide
  */
 @RestrictTo(Scope.LIBRARY_GROUP)
-public class TimeGatewayImpl implements TimeGateway, AutoCloseable {
+public final class TimeGatewayImpl implements TimeGateway, AutoCloseable {
     private final Handler uiHandler;
     private final Map<TimeCallback, Executor> registeredCallbacks = new ArrayMap<>();
     private boolean updatesEnabled;
@@ -29,8 +45,8 @@
     // Suppress warning on "onTick = this::notifyNextSecond". This happens because notifyNextSecond
     // is @UnderInitialization here, but onTick needs to be @Initialized. This is safe though;  the
     // only time that onTick can be invoked is in the other methods on this class, which can only be
-    // called after initialization is complete. This class is also final, so those methods cannot
-    // be called from a sub-constructor either.
+    // called after initialization is complete. This class is also final, so those methods cannot be
+    // called from a sub-constructor either.
     @SuppressWarnings("methodref.receiver.bound")
     public TimeGatewayImpl(@NonNull Handler uiHandler, boolean updatesEnabled) {
         this.uiHandler = uiHandler;
@@ -50,6 +66,12 @@
             lastScheduleTimeMillis = SystemClock.uptimeMillis() + 1000;
             uiHandler.postAtTime(this.onTick, this, lastScheduleTimeMillis);
         }
+
+        // Send first update to initialize clients that are using this TimeGateway
+        if (updatesEnabled) {
+            callback.onPreUpdate();
+            callback.onData();
+        }
     }
 
     /** See {@link TimeGateway#unregisterForUpdates(TimeCallback)}. */
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/AddToListCallback.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/AddToListCallback.java
new file mode 100644
index 0000000..80093d3
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/AddToListCallback.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+public class AddToListCallback<T> implements DynamicTypeValueReceiver<T> {
+    private final List<T> mListToUpdate;
+    @Nullable private final List<Boolean> mInvalidListToUpdate;
+
+    public AddToListCallback(List<T> list) {
+        this.mListToUpdate = list;
+        this.mInvalidListToUpdate = null;
+    }
+
+    public AddToListCallback(List<T> list, @Nullable List<Boolean> invalidList) {
+        this.mListToUpdate = list;
+        this.mInvalidListToUpdate = invalidList;
+    }
+
+    @Override
+    public void onPreUpdate() {}
+
+    @Override
+    public void onData(T newData) {
+        mListToUpdate.add(newData);
+    }
+
+    @Override
+    public void onInvalidated() {
+        if (mInvalidListToUpdate != null) {
+            mInvalidListToUpdate.add(true);
+        }
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ColorNodesTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ColorNodesTest.java
new file mode 100644
index 0000000..ffdfcca
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ColorNodesTest.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.Shadows.shadowOf;
+
+import android.os.Looper;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.pipeline.ColorNodes.AnimatableFixedColorNode;
+import androidx.wear.protolayout.expression.pipeline.ColorNodes.DynamicAnimatedColorNode;
+import androidx.wear.protolayout.expression.pipeline.ColorNodes.FixedColorNode;
+import androidx.wear.protolayout.expression.pipeline.ColorNodes.StateColorSourceNode;
+import androidx.wear.protolayout.expression.proto.AnimationParameterProto.AnimationSpec;
+import androidx.wear.protolayout.expression.proto.DynamicProto.AnimatableFixedColor;
+import androidx.wear.protolayout.expression.proto.DynamicProto.StateColorSource;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedColor;
+import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class ColorNodesTest {
+
+    private static final int FROM_COLOR = 0xFF00FF00;
+    private static final int TO_COLOR = 0xFFFF00FF;
+
+    @Test
+    public void fixedColorNode() {
+        List<Integer> results = new ArrayList<>();
+
+        FixedColor protoNode = FixedColor.newBuilder().setArgb(FROM_COLOR).build();
+        FixedColorNode node = new FixedColorNode(protoNode, new AddToListCallback<>(results));
+
+        node.init();
+
+        assertThat(results).containsExactly(FROM_COLOR);
+    }
+
+    @Test
+    public void stateColorSourceNode_worksWithFixedColor() {
+        List<Integer> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setColorVal(FixedColor.newBuilder().setArgb(FROM_COLOR))
+                                        .build()));
+
+        StateColorSource protoNode = StateColorSource.newBuilder().setSourceKey("foo").build();
+        StateColorSourceNode node =
+                new StateColorSourceNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        assertThat(results).containsExactly(FROM_COLOR);
+    }
+
+    @Test
+    public void stateColorSourceNode_updatesWithStateChanges() {
+        List<Integer> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setColorVal(FixedColor.newBuilder().setArgb(FROM_COLOR))
+                                        .build()));
+        StateColorSource protoNode = StateColorSource.newBuilder().setSourceKey("foo").build();
+        StateColorSourceNode node =
+                new StateColorSourceNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setColorVal(FixedColor.newBuilder().setArgb(TO_COLOR))
+                                .build()));
+
+        assertThat(results).containsExactly(FROM_COLOR, TO_COLOR).inOrder();
+    }
+
+    @Test
+    public void stateColorSourceNode_noUpdatesAfterDestroy() {
+        List<Integer> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setColorVal(FixedColor.newBuilder().setArgb(FROM_COLOR))
+                                        .build()));
+        StateColorSource protoNode = StateColorSource.newBuilder().setSourceKey("foo").build();
+        StateColorSourceNode node =
+                new StateColorSourceNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+        assertThat(results).containsExactly(FROM_COLOR);
+
+        results.clear();
+        node.destroy();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setColorVal(FixedColor.newBuilder().setArgb(TO_COLOR))
+                                .build()));
+        assertThat(results).isEmpty();
+    }
+
+    @Test
+    public void animatableFixedColor_animates() {
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        AnimatableFixedColor protoNode =
+                AnimatableFixedColor.newBuilder()
+                        .setFromArgb(FROM_COLOR)
+                        .setToArgb(TO_COLOR)
+                        .build();
+        AnimatableFixedColorNode node =
+                new AnimatableFixedColorNode(
+                        protoNode, new AddToListCallback<>(results), quotaManager
+                );
+        node.setVisibility(true);
+
+        node.init();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results.size()).isGreaterThan(2);
+        assertThat(results.get(0)).isEqualTo(FROM_COLOR);
+        assertThat(Iterables.getLast(results)).isEqualTo(TO_COLOR);
+    }
+
+    @Test
+    public void animatableFixedColor_whenInvisible_skipsToEnd() {
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        AnimatableFixedColor protoNode =
+                AnimatableFixedColor
+                        .newBuilder()
+                        .setFromArgb(FROM_COLOR)
+                        .setToArgb(TO_COLOR)
+                        .build();
+        AnimatableFixedColorNode node =
+                new AnimatableFixedColorNode(
+                        protoNode, new AddToListCallback<>(results), quotaManager
+                );
+        node.setVisibility(false);
+
+        node.init();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results).hasSize(1);
+        assertThat(results).containsExactly(TO_COLOR);
+    }
+
+    @Test
+    public void dynamicAnimatedColor_animatesWithStateChange() {
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setColorVal(
+                                                FixedColor.newBuilder().setArgb(FROM_COLOR).build()
+                                        )
+                                        .build()));
+        DynamicAnimatedColorNode colorNode =
+                new DynamicAnimatedColorNode(
+                        new AddToListCallback<>(results),
+                        AnimationSpec.getDefaultInstance(),
+                        quotaManager
+                );
+        colorNode.setVisibility(true);
+        StateColorSourceNode stateNode =
+                new StateColorSourceNode(
+                        oss,
+                        StateColorSource.newBuilder().setSourceKey("foo").build(),
+                        colorNode.getInputCallback());
+
+        stateNode.preInit();
+        stateNode.init();
+
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setColorVal(FixedColor.newBuilder().setArgb(TO_COLOR))
+                                .build()));
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertThat(results.size()).isGreaterThan(2);
+        assertThat(results.get(0)).isEqualTo(FROM_COLOR);
+        assertThat(Iterables.getLast(results)).isEqualTo(TO_COLOR);
+    }
+
+    @Test
+    public void dynamicAnimatedColor_onlyAnimateWhenVisible() {
+        int color1 = FROM_COLOR;
+        int color2 = TO_COLOR;
+        int color3 = 0xFFFFFFFF;
+        List<Integer> results = new ArrayList<>();
+        QuotaManager quotaManager = new UnlimitedQuotaManager();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setColorVal(
+                                                FixedColor.newBuilder().setArgb(color1).build()
+                                        )
+                                        .build()));
+        DynamicAnimatedColorNode colorNode =
+                new DynamicAnimatedColorNode(
+                        new AddToListCallback<>(results),
+                        AnimationSpec.getDefaultInstance(),
+                        quotaManager
+                );
+        colorNode.setVisibility(false);
+        StateColorSourceNode stateNode =
+                new StateColorSourceNode(
+                        oss,
+                        StateColorSource.newBuilder().setSourceKey("foo").build(),
+                        colorNode.getInputCallback());
+
+        stateNode.preInit();
+        stateNode.init();
+
+        results.clear();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setColorVal(FixedColor.newBuilder().setArgb(color2))
+                                .build()));
+        shadowOf(Looper.getMainLooper()).idle();
+
+        // Only contains last value.
+        assertThat(results).hasSize(1);
+        assertThat(results).containsExactly(color2);
+
+        colorNode.setVisibility(true);
+        results.clear();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setColorVal(FixedColor.newBuilder().setArgb(color3))
+                                .build()));
+        shadowOf(Looper.getMainLooper()).idle();
+
+        // Contains intermediate values besides the initial and last.
+        assertThat(results.size()).isGreaterThan(2);
+        assertThat(results.get(0)).isEqualTo(color2);
+        assertThat(Iterables.getLast(results)).isEqualTo(color3);
+        assertThat(results).isInOrder();
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ConditionalOpNodeTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ConditionalOpNodeTest.java
new file mode 100644
index 0000000..25f16ac
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ConditionalOpNodeTest.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class ConditionalOpNodeTest {
+    private static final String TRUE_STRING = "TRUE";
+    private static final String FALSE_STRING = "FALSE";
+
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Mock private DynamicTypeValueReceiver<String> mUpdateCallback;
+
+    private ConditionalOpNode<String> mOpUnderTest;
+
+    private void standardSetup(boolean initialConditionValue) {
+        mOpUnderTest.getConditionIncomingCallback().onPreUpdate();
+        mOpUnderTest.getTrueValueIncomingCallback().onPreUpdate();
+        mOpUnderTest.getFalseValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getConditionIncomingCallback().onData(initialConditionValue);
+        mOpUnderTest.getTrueValueIncomingCallback().onData(TRUE_STRING);
+        mOpUnderTest.getFalseValueIncomingCallback().onData(FALSE_STRING);
+    }
+
+    @Before
+    public void setUp() {
+        mOpUnderTest = new ConditionalOpNode<>(mUpdateCallback);
+    }
+
+    @Test
+    public void testWhenTrue_picksTrueValue() {
+        standardSetup(true);
+
+        verify(mUpdateCallback).onData(TRUE_STRING);
+    }
+
+    @Test
+    public void testWhenTrue_picksFalseValue() {
+        standardSetup(false);
+
+        verify(mUpdateCallback).onData(FALSE_STRING);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenConditionChanges_updatesValue() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getConditionIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getConditionIncomingCallback().onData(false);
+        verify(mUpdateCallback).onData(FALSE_STRING);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenTrueValueChangesAndConditionTrue_updatesValue() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getTrueValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getTrueValueIncomingCallback().onData("testtest");
+        verify(mUpdateCallback).onData("testtest");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenTrueValueChangesAndConditionFalse_valueRetained() {
+        standardSetup(false);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getTrueValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getTrueValueIncomingCallback().onData("testtest");
+        verify(mUpdateCallback).onData(FALSE_STRING);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenFalseValueChangesAndConditionFalse_updatesValue() {
+        standardSetup(false);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getFalseValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getFalseValueIncomingCallback().onData("testtest");
+        verify(mUpdateCallback).onData("testtest");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenFalseValueChangesAndConditionTrue_valueRetained() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getFalseValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getFalseValueIncomingCallback().onData("testtest");
+        verify(mUpdateCallback).onData(TRUE_STRING);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenConditionalValueInvalid_proxiesInvalid() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getConditionIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getConditionIncomingCallback().onInvalidated();
+        verify(mUpdateCallback).onInvalidated();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenTrueValueInvalid_proxiesInvalid() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getTrueValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getTrueValueIncomingCallback().onInvalidated();
+        verify(mUpdateCallback).onInvalidated();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenFalseValueInvalid_proxiesInvalid() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getFalseValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getFalseValueIncomingCallback().onInvalidated();
+        verify(mUpdateCallback).onInvalidated();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testWhenConditionAndValueChangesSimultaneously_givesExpectedResult() {
+        standardSetup(true);
+        reset(mUpdateCallback);
+
+        mOpUnderTest.getConditionIncomingCallback().onPreUpdate();
+        mOpUnderTest.getTrueValueIncomingCallback().onPreUpdate();
+        verify(mUpdateCallback).onPreUpdate();
+
+        mOpUnderTest.getConditionIncomingCallback().onData(false);
+        mOpUnderTest.getTrueValueIncomingCallback().onData("World");
+        verify(mUpdateCallback).onData(FALSE_STRING);
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicDataBiTransformNodeTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicDataBiTransformNodeTest.java
new file mode 100644
index 0000000..16c8a43
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicDataBiTransformNodeTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class DynamicDataBiTransformNodeTest {
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Mock private DynamicTypeValueReceiver<Integer> mMockCallback;
+
+    private DynamicDataBiTransformNode<Integer, Integer, Integer> mNodeUnderTest;
+
+    @Before
+    public void setUp() {
+        mNodeUnderTest = new DynamicDataBiTransformNode<>(mMockCallback, Integer::sum);
+    }
+
+    @Test
+    public void onPreStateUpdate_propagatesOnce() {
+        mNodeUnderTest.getLhsIncomingCallback().onPreUpdate();
+        verify(mMockCallback).onPreUpdate();
+
+        // Next call should not cause another call to be passed through.
+        mNodeUnderTest.getRhsIncomingCallback().onPreUpdate();
+        verify(mMockCallback).onPreUpdate();
+    }
+
+    @Test
+    public void onStateUpdate_invokesCallback() {
+        mNodeUnderTest.getLhsIncomingCallback().onPreUpdate();
+        mNodeUnderTest.getRhsIncomingCallback().onPreUpdate();
+
+        mNodeUnderTest.getLhsIncomingCallback().onData(5);
+        mNodeUnderTest.getRhsIncomingCallback().onData(6);
+
+        verify(mMockCallback).onData(11);
+    }
+
+    @Test
+    public void onStateUpdate_onlyOneSide_doesntInvokeCallback() {
+        // Note: RHS has *not* been seeded with any data here...
+        mNodeUnderTest.getLhsIncomingCallback().onPreUpdate();
+        mNodeUnderTest.getLhsIncomingCallback().onData(5);
+
+        verify(mMockCallback, never()).onData(any());
+    }
+
+    @Test
+    public void onStateUpdate_onPreStateUpdateNotCalled_stillPropagatesData() {
+        mNodeUnderTest.getLhsIncomingCallback().onData(5);
+        mNodeUnderTest.getRhsIncomingCallback().onData(6);
+        verify(mMockCallback, never()).onPreUpdate();
+        verify(mMockCallback).onData(11);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void onStateUpdate_onStateUpdate_eachSidePendingUpdateHandledSeparately() {
+        // Seed with some real data
+        mNodeUnderTest.getLhsIncomingCallback().onData(5);
+        mNodeUnderTest.getRhsIncomingCallback().onData(6);
+        reset(mMockCallback);
+
+        mNodeUnderTest.getLhsIncomingCallback().onPreUpdate();
+        mNodeUnderTest.getRhsIncomingCallback().onData(10);
+
+        // The "is update pending" counters should be evaluated separately here, so the incoming
+        // update on the RHS should not count towards the state update from the LHS
+        verify(mMockCallback, never()).onData(any());
+
+        // And now, fulfilling the LHS should still cause an update to be fired.
+        mNodeUnderTest.getLhsIncomingCallback().onData(20);
+        verify(mMockCallback).onData(30);
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java
new file mode 100644
index 0000000..7f9e3cb
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/DynamicTypeEvaluatorTest.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static androidx.wear.protolayout.expression.DynamicBuilders.DynamicString.constant;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.Shadows.shadowOf;
+
+import android.icu.util.ULocale;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicBool;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat.FloatFormatter;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicInt32.IntFormatter;
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicString;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedBool;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedFloat;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedInt32;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedString;
+import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+@RunWith(ParameterizedRobolectricTestRunner.class)
+public class DynamicTypeEvaluatorTest {
+    @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
+    public static ImmutableList<Object[]> params() {
+        DynamicTypeEvaluatorTest.TestCase<?>[] testCases = {
+                test(constant("hello"), "hello"),
+                test(DynamicString.fromState("state_hello_world"), "hello_world"),
+                test(DynamicInt32.constant(5).format(), "5"),
+                test(DynamicInt32.constant(10), 10),
+                test(DynamicInt32.fromState("state_int_15"), 15),
+                test(DynamicInt32.fromState("state_int_15").plus(DynamicInt32.constant(2)), 17),
+                test(DynamicInt32.fromState("state_int_15").minus(DynamicInt32.constant(5)), 10),
+                test(DynamicInt32.fromState("state_int_15").times(DynamicInt32.constant(2)), 30),
+                test(DynamicInt32.fromState("state_int_15").div(DynamicInt32.constant(3)), 5),
+                test(DynamicInt32.fromState("state_int_15").rem(DynamicInt32.constant(2)), 1),
+                test(DynamicInt32.fromState("state_int_15").plus(2), 17),
+                test(DynamicInt32.fromState("state_int_15").minus(5), 10),
+                test(DynamicInt32.fromState("state_int_15").times(2), 30),
+                test(DynamicInt32.fromState("state_int_15").div(3), 5),
+                test(DynamicInt32.fromState("state_int_15").rem(2), 1),
+                test(DynamicInt32.fromState("state_int_15").plus(2.5f), 17.5f),
+                test(DynamicInt32.fromState("state_int_15").minus(5.5f), 9.5f),
+                test(DynamicInt32.fromState("state_int_15").times(2.5f), 37.5f),
+                test(DynamicInt32.fromState("state_int_15").div(2.0f), 7.5f),
+                test(DynamicInt32.fromState("state_int_15").rem(4.5f), 1.5f),
+                test(DynamicInt32.fromState("state_int_15").plus(DynamicFloat.constant(2.5f)),
+                        17.5f),
+                test(DynamicInt32.fromState("state_int_15").minus(DynamicFloat.constant(5.5f)),
+                        9.5f),
+                test(DynamicInt32.fromState("state_int_15").times(DynamicFloat.constant(2.5f)),
+                        37.5f),
+                test(DynamicInt32.fromState("state_int_15").div(DynamicFloat.constant(2.0f)), 7.5f),
+                test(DynamicInt32.fromState("state_int_15").rem(DynamicFloat.constant(4.5f)), 1.5f),
+                test(DynamicFloat.constant(5.0f), 5.0f),
+                test(DynamicFloat.fromState("state_float_1.5"), 1.5f),
+                test(DynamicFloat.constant(1234.567f).asInt(), 1234),
+                test(DynamicFloat.constant(0.967f).asInt(), 0),
+                test(DynamicFloat.constant(-1234.967f).asInt(), -1235),
+                test(DynamicFloat.constant(-0.967f).asInt(), -1),
+                test(DynamicFloat.constant(Float.MIN_VALUE).asInt(), 0),
+                test(DynamicFloat.constant(Float.MAX_VALUE).asInt(), (int) Float.MAX_VALUE),
+                test(DynamicInt32.constant(100).asFloat(), 100.0f),
+                test(DynamicInt32.constant(Integer.MIN_VALUE).asFloat(),
+                        Float.valueOf(Integer.MIN_VALUE)),
+                test(DynamicInt32.constant(Integer.MAX_VALUE).asFloat(),
+                        Float.valueOf(Integer.MAX_VALUE)),
+                test(DynamicFloat.constant(100f).plus(DynamicFloat.constant(2f)), 102f),
+                test(DynamicFloat.constant(100f).minus(DynamicFloat.constant(5.5f)), 94.5f),
+                test(DynamicFloat.constant(5.5f).times(DynamicFloat.constant(2f)), 11f),
+                test(DynamicFloat.constant(5f).div(DynamicFloat.constant(2f)), 2.5f),
+                test(DynamicFloat.constant(5f).rem(DynamicFloat.constant(2f)), 1f),
+                test(DynamicFloat.constant(100f).plus(2f), 102f),
+                test(DynamicFloat.constant(100f).minus(5.5f), 94.5f),
+                test(DynamicFloat.constant(5.5f).times(2f), 11f),
+                test(DynamicFloat.constant(5f).div(2f), 2.5f),
+                test(DynamicFloat.constant(5f).rem(2f), 1f),
+                test(DynamicFloat.constant(0.12345622f).eq(0.12345688f), true),
+                test(DynamicFloat.constant(0.123455f).ne(0.123457f), true),
+                test(DynamicFloat.constant(0.12345622f).ne(0.12345688f), false),
+                test(DynamicFloat.constant(0.123455f).eq(0.123457f), false),
+                test(DynamicFloat.constant(0.4f).lt(0.6f), true),
+                test(DynamicFloat.constant(0.4f).lt(0.2f), false),
+                test(DynamicFloat.constant(0.1234568f).lt(0.1234562f), false),
+                test(DynamicFloat.constant(0.4f).lte(0.6f), true),
+                test(DynamicFloat.constant(0.1234568f).lte(0.1234562f), true),
+                test(DynamicFloat.constant(0.6f).gt(0.4f), true),
+                test(DynamicFloat.constant(0.4f).gt(0.6f), false),
+                test(DynamicFloat.constant(0.1234568f).gt(0.1234562f), false),
+                test(DynamicFloat.constant(0.6f).gte(0.4f), true),
+                test(DynamicFloat.constant(0.1234568f).gte(0.1234562f), true),
+                test(DynamicBool.constant(true), true),
+                test(DynamicBool.constant(true).isTrue(), true),
+                test(DynamicBool.constant(false).isTrue(), false),
+                test(DynamicBool.constant(true).isFalse(), false),
+                test(DynamicBool.constant(false).isFalse(), true),
+                test(DynamicBool.constant(true).and(DynamicBool.constant(true)), true),
+                test(DynamicBool.constant(true).and(DynamicBool.constant(false)), false),
+                test(DynamicBool.constant(false).and(DynamicBool.constant(true)), false),
+                test(DynamicBool.constant(false).and(DynamicBool.constant(false)), false),
+                test(DynamicBool.constant(true).or(DynamicBool.constant(true)), true),
+                test(DynamicBool.constant(true).or(DynamicBool.constant(false)), true),
+                test(DynamicBool.constant(false).or(DynamicBool.constant(true)), true),
+                test(DynamicBool.constant(false).or(DynamicBool.constant(false)), false),
+                test(DynamicBool.fromState("state_bool_true"), true),
+                test(DynamicBool.constant(false), false),
+                test(DynamicBool.fromState("state_bool_false"), false),
+                test(DynamicInt32.constant(5).eq(DynamicInt32.constant(5)), true),
+                test(DynamicInt32.constant(5).eq(DynamicInt32.constant(6)), false),
+                test(DynamicInt32.constant(5).ne(DynamicInt32.constant(5)), false),
+                test(DynamicInt32.constant(5).ne(DynamicInt32.constant(6)), true),
+                test(DynamicInt32.constant(10).lt(11), true),
+                test(DynamicInt32.constant(10).lt(10), false),
+                test(DynamicInt32.constant(10).lt(5), false),
+                test(DynamicInt32.constant(10).lte(11), true),
+                test(DynamicInt32.constant(10).lte(10), true),
+                test(DynamicInt32.constant(10).lte(5), false),
+                test(DynamicInt32.constant(10).gt(11), false),
+                test(DynamicInt32.constant(10).gt(10), false),
+                test(DynamicInt32.constant(10).gt(5), true),
+                test(DynamicInt32.constant(10).gte(11), false),
+                test(DynamicInt32.constant(10).gte(10), true),
+                test(DynamicInt32.constant(10).gte(5), true),
+                test(
+                        DynamicString.onCondition(DynamicBool.constant(true))
+                                .use(constant("Hello"))
+                                .elseUse(constant("World")),
+                        "Hello"),
+                test(
+                        DynamicString.onCondition(DynamicBool.constant(false))
+                                .use(constant("Hello"))
+                                .elseUse(constant("World")),
+                        "World"),
+                test(
+                        DynamicString.fromState("state_hello_world").concat(
+                                DynamicString.constant("_test")),
+                        "hello_world_test"),
+                test(
+                        DynamicString.constant("this ")
+                                .concat(DynamicString.constant("is "))
+                                .concat(DynamicString.constant("a test")),
+                        "this is a test"),
+                test(
+                        DynamicInt32.onCondition(DynamicBool.constant(true))
+                                .use(DynamicInt32.constant(1))
+                                .elseUse(DynamicInt32.constant(10)),
+                        1),
+                test(
+                        DynamicInt32.onCondition(DynamicBool.constant(false))
+                                .use(DynamicInt32.constant(1))
+                                .elseUse(DynamicInt32.constant(10)),
+                        10),
+                test(
+                        DynamicFloat.constant(12.345f)
+                                .format(
+                                        FloatFormatter.with()
+                                                .maxFractionDigits(2)
+                                                .minIntegerDigits(4)
+                                                .groupingUsed(true)),
+                        "0,012.35"),
+                test(
+                        DynamicFloat.constant(12.345f)
+                                .format(
+                                        FloatFormatter.with()
+                                                .minFractionDigits(4)
+                                                .minIntegerDigits(4)
+                                                .groupingUsed(false)),
+                        "0012.3450"),
+                test(
+                        DynamicFloat.constant(12.345f)
+                                .format(FloatFormatter.with().maxFractionDigits(1).groupingUsed(
+                                        true))
+                                .concat(DynamicString.constant("°")),
+                        "12.3°"),
+                test(
+                        DynamicFloat.constant(12.345678f)
+                                .format(
+                                        FloatFormatter.with()
+                                                .minFractionDigits(4)
+                                                .maxFractionDigits(2)
+                                                .groupingUsed(true)),
+                        "12.3457"),
+                test(
+                        DynamicFloat.constant(12.345678f)
+                                .format(FloatFormatter.with().minFractionDigits(2).groupingUsed(
+                                        true)),
+                        "12.346"),
+                test(DynamicFloat.constant(12.3456f).format(FloatFormatter.with()), "12.346"),
+                test(
+                        DynamicInt32.constant(12)
+                                .format(IntFormatter.with().minIntegerDigits(4).groupingUsed(true)),
+                        "0,012"),
+                test(DynamicInt32.constant(12).format(IntFormatter.with()), "12")
+        };
+        ImmutableList.Builder<Object[]> immutableListBuilder = new ImmutableList.Builder<>();
+        for (DynamicTypeEvaluatorTest.TestCase<?> testCase : testCases) {
+            immutableListBuilder.add(new Object[]{testCase});
+        }
+        return immutableListBuilder.build();
+    }
+
+    private final DynamicTypeEvaluatorTest.TestCase<?> mTestCase;
+
+    public DynamicTypeEvaluatorTest(DynamicTypeEvaluatorTest.TestCase<?> testCase) {
+        this.mTestCase = testCase;
+    }
+
+    @Test
+    public void runTest() {
+        ObservableStateStore stateStore = new ObservableStateStore(generateExampleState());
+
+        DynamicTypeEvaluator evaluator =
+                new DynamicTypeEvaluator(
+                        /* platformDataSourcesInitiallyEnabled= */ true,
+                        /* sensorGateway= */ null,
+                        stateStore,
+                        new UnlimitedQuotaManager());
+
+        mTestCase.runTest(evaluator);
+    }
+
+    private static DynamicTypeEvaluatorTest.TestCase<String> test(
+            DynamicString bindUnderTest, String expectedValue) {
+        return new DynamicTypeEvaluatorTest.TestCase<>(
+                bindUnderTest.toDynamicStringProto().toString(),
+                (evaluator, cb) -> {
+                    evaluator.bind(bindUnderTest, ULocale.getDefault(), cb);
+                    evaluator.processPendingBindings();
+                },
+                expectedValue);
+    }
+
+    private static DynamicTypeEvaluatorTest.TestCase<Integer> test(
+            DynamicInt32 bindUnderTest, Integer expectedValue) {
+        return new DynamicTypeEvaluatorTest.TestCase<>(
+                bindUnderTest.toDynamicInt32Proto().toString(),
+                (evaluator, cb) -> {
+                    evaluator.bind(bindUnderTest, cb);
+                    evaluator.processPendingBindings();
+                },
+                expectedValue);
+    }
+
+    private static DynamicTypeEvaluatorTest.TestCase<Float> test(
+            DynamicFloat bindUnderTest, Float expectedValue) {
+        return new DynamicTypeEvaluatorTest.TestCase<>(
+                bindUnderTest.toDynamicFloatProto().toString(),
+                (evaluator, cb) -> {
+                    evaluator.bind(bindUnderTest, cb);
+                    evaluator.processPendingBindings();
+                },
+                expectedValue);
+    }
+
+    private static DynamicTypeEvaluatorTest.TestCase<Boolean> test(
+            DynamicBool bindUnderTest, Boolean expectedValue) {
+        return new DynamicTypeEvaluatorTest.TestCase<>(
+                bindUnderTest.toDynamicBoolProto().toString(),
+                (evaluator, cb) -> {
+                    evaluator.bind(bindUnderTest, cb);
+                    evaluator.processPendingBindings();
+                },
+                expectedValue);
+    }
+
+    private static class TestCase<T> {
+        private final String mName;
+        private final BiConsumer<DynamicTypeEvaluator, DynamicTypeValueReceiver<T>>
+                mExpressionEvaluator;
+        private final T mExpectedValue;
+
+        TestCase(
+                String name,
+                BiConsumer<DynamicTypeEvaluator, DynamicTypeValueReceiver<T>> expressionEvaluator,
+                T expectedValue) {
+            this.mName = name;
+            this.mExpressionEvaluator = expressionEvaluator;
+            this.mExpectedValue = expectedValue;
+        }
+
+        public void runTest(DynamicTypeEvaluator evaluator) {
+            List<T> results = new ArrayList<>();
+
+            DynamicTypeValueReceiver<T> callback =
+                    new DynamicTypeValueReceiver<T>() {
+                        @Override
+                        public void onPreUpdate() {
+                        }
+
+                        @Override
+                        public void onData(@NonNull T newData) {
+                            results.add(newData);
+                        }
+
+                        @Override
+                        public void onInvalidated() {
+                        }
+                    };
+
+            this.mExpressionEvaluator.accept(evaluator, callback);
+            shadowOf(Looper.getMainLooper()).idle();
+
+            assertThat(results).hasSize(1);
+            assertThat(results).containsExactly(mExpectedValue);
+        }
+
+        @Override
+        @NonNull
+        public String toString() {
+            return mName + " = " + mExpectedValue;
+        }
+    }
+
+    private static ImmutableMap<String, StateEntryValue> generateExampleState() {
+        return ImmutableMap.of(
+                "state_hello_world",
+                StateEntryValue.newBuilder()
+                        .setStringVal(FixedString.newBuilder().setValue("hello_world"))
+                        .build(),
+                "state_int_15",
+                StateEntryValue.newBuilder().setInt32Val(
+                        FixedInt32.newBuilder().setValue(15)).build(),
+                "state_float_1.5",
+                StateEntryValue.newBuilder().setFloatVal(
+                        FixedFloat.newBuilder().setValue(1.5f)).build(),
+                "state_bool_true",
+                StateEntryValue.newBuilder().setBoolVal(
+                        FixedBool.newBuilder().setValue(true)).build(),
+                "state_bool_false",
+                StateEntryValue.newBuilder().setBoolVal(
+                        FixedBool.newBuilder().setValue(false)).build());
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/Int32NodesTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/Int32NodesTest.java
new file mode 100644
index 0000000..dc0d8d4
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/Int32NodesTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.FixedInt32Node;
+import androidx.wear.protolayout.expression.pipeline.Int32Nodes.StateInt32SourceNode;
+import androidx.wear.protolayout.expression.proto.DynamicProto.StateInt32Source;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedInt32;
+import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class Int32NodesTest {
+    @Test
+    public void testFixedInt32Node() {
+        List<Integer> results = new ArrayList<>();
+
+        FixedInt32 protoNode = FixedInt32.newBuilder().setValue(56).build();
+        FixedInt32Node node = new FixedInt32Node(protoNode, new AddToListCallback<>(results));
+
+        node.init();
+
+        assertThat(results).containsExactly(56);
+    }
+
+    @Test
+    public void stateInt32NodeTest() {
+        List<Integer> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setInt32Val(FixedInt32.newBuilder().setValue(65))
+                                        .build()));
+
+        StateInt32Source protoNode = StateInt32Source.newBuilder().setSourceKey("foo").build();
+        StateInt32SourceNode node =
+                new StateInt32SourceNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        assertThat(results).containsExactly(65);
+    }
+
+    @Test
+    public void stateInt32UpdatesWithStateChanges() {
+        List<Integer> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setInt32Val(FixedInt32.newBuilder().setValue(65))
+                                        .build()));
+
+        StateInt32Source protoNode = StateInt32Source.newBuilder().setSourceKey("foo").build();
+        StateInt32SourceNode node =
+                new StateInt32SourceNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        results.clear();
+
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setInt32Val(FixedInt32.newBuilder().setValue(12))
+                                .build()));
+
+        assertThat(results).containsExactly(12);
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/NumberFormatterTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/NumberFormatterTest.java
new file mode 100644
index 0000000..6ddbc5a
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/NumberFormatterTest.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static android.os.Build.VERSION_CODES.P;
+import static android.os.Build.VERSION_CODES.R;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.icu.util.ULocale;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.proto.DynamicProto.FloatFormatOp;
+import androidx.wear.protolayout.expression.proto.DynamicProto.Int32FormatOp;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+@Config(sdk = {P, R})
+@RunWith(AndroidJUnit4.class)
+public class NumberFormatterTest {
+
+    @Test
+    public void formatInt_default() {
+        Int32FormatOp formatOp = Int32FormatOp.newBuilder().build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5)).isEqualTo("5");
+    }
+
+    @Test
+    public void formatInt_grouping() {
+        Int32FormatOp formatOp =
+                Int32FormatOp.newBuilder().setMinIntegerDigits(5).setGroupingUsed(true).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5)).isEqualTo("00,005");
+    }
+
+    @Test
+    public void formatInt_noGrouping() {
+        Int32FormatOp formatOp =
+                Int32FormatOp.newBuilder().setMinIntegerDigits(5).setGroupingUsed(false).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5)).isEqualTo("00005");
+    }
+
+    @Test
+    public void formatInt_grouping_noMinIntegerDigits() {
+        Int32FormatOp formatOp = Int32FormatOp.newBuilder().setGroupingUsed(false).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(1234)).isEqualTo("1234");
+    }
+
+    @Test
+    public void formatInt_floatInput() {
+        Int32FormatOp formatOp =
+                Int32FormatOp.newBuilder().setMinIntegerDigits(5).setGroupingUsed(true).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.123f)).isEqualTo("00,005");
+    }
+
+    @Test
+    public void formatFloat_default() {
+        FloatFormatOp formatOp = FloatFormatOp.newBuilder().build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.123456f)).isEqualTo("5.123");
+    }
+
+    @Test
+    public void formatFloat_noGrouping() {
+        FloatFormatOp formatOp = FloatFormatOp.newBuilder().setMinIntegerDigits(5).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("00005.123");
+    }
+
+    @Test
+    public void formatFloat_grouping() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder()
+                        .setMinIntegerDigits(5)
+                        .setMinFractionDigits(5)
+                        .setGroupingUsed(true)
+                        .build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("00,005.12340");
+    }
+
+    @Test
+    public void formatFloat_grouping_noMinIntegerDigits() {
+        FloatFormatOp formatOp = FloatFormatOp.newBuilder().setGroupingUsed(true).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("5.123");
+    }
+
+    @Test
+    public void formatFloat_maxFractionDigits() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder().setMaxFractionDigits(2).setGroupingUsed(true).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("5.12");
+    }
+
+    @Test
+    public void formatFloat_minFractionDigits() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder().setMinFractionDigits(6).setGroupingUsed(true).build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("5.123400");
+    }
+
+    @Test
+    public void formatFloat_minFractionDigitsLargerThanMinFractionDigits() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder()
+                        .setMaxFractionDigits(4)
+                        .setMinFractionDigits(6)
+                        .setGroupingUsed(true)
+                        .build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(5.1234f)).isEqualTo("5.123400");
+    }
+
+    @Test
+    public void formatFloat_intInput() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder()
+                        .setMinIntegerDigits(5)
+                        .setMinFractionDigits(5)
+                        .setGroupingUsed(true)
+                        .build();
+        NumberFormatter numberFormatter = new NumberFormatter(formatOp, ULocale.UK);
+        assertThat(numberFormatter.format(12)).isEqualTo("00,012.00000");
+    }
+
+    @Test
+    public void numberFormatter_localChanged() {
+        FloatFormatOp formatOp =
+                FloatFormatOp.newBuilder()
+                        .setMinIntegerDigits(5)
+                        .setMinFractionDigits(5)
+                        .setGroupingUsed(true)
+                        .build();
+        assertThat(new NumberFormatter(formatOp, ULocale.UK).format(12.345f))
+                .isEqualTo("00,012.34500");
+        assertThat(new NumberFormatter(formatOp, ULocale.ITALY).format(12.345f))
+                .isEqualTo("00.012,34500");
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStoreTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStoreTest.java
new file mode 100644
index 0000000..e6612d6
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/ObservableStateStoreTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.StateEntryBuilders;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedString;
+import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.truth.Expect;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+@RunWith(AndroidJUnit4.class)
+public class ObservableStateStoreTest {
+    @Rule public Expect mExpect = Expect.create();
+
+    private final ObservableStateStore mStateStoreUnderTest =
+            new ObservableStateStore(
+                    ImmutableMap.of(
+                            "foo", buildStateEntry("bar"),
+                            "baz", buildStateEntry("foobar")));
+
+    @Test
+    public void setBuilderApi() {
+        mStateStoreUnderTest.setStateEntryValues(
+                ImmutableMap.of("foo", StateEntryBuilders.StateEntryValue.fromString("baz")));
+
+        mExpect
+                .that(mStateStoreUnderTest.getStateEntryValuesProto("foo"))
+                .isEqualTo(buildStateEntry("baz"));
+    }
+
+    @Test
+    public void canReadInitialState() {
+        mExpect.that(mStateStoreUnderTest.getStateEntryValuesProto("foo"))
+                .isEqualTo(buildStateEntry("bar"));
+        mExpect
+                .that(mStateStoreUnderTest.getStateEntryValuesProto("baz"))
+                .isEqualTo(buildStateEntry("foobar"));
+    }
+
+    @Test
+    public void unsetStateReturnsNull() {
+        mExpect.that(mStateStoreUnderTest.getStateEntryValuesProto("AAAAAA")).isNull();
+    }
+
+    @Test
+    public void canSetNewState() {
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo", buildStateEntry("test"),
+                        "newKey", buildStateEntry("testNewKey")));
+
+        mExpect.that(mStateStoreUnderTest.getStateEntryValuesProto("foo"))
+                .isEqualTo(buildStateEntry("test"));
+        mExpect
+                .that(mStateStoreUnderTest.getStateEntryValuesProto("newKey"))
+                .isEqualTo(buildStateEntry("testNewKey"));
+
+        // This should have been cleared...
+        mExpect.that(mStateStoreUnderTest.getStateEntryValuesProto("baz")).isNull();
+    }
+
+    @Test
+    public void setStateFiresListeners() {
+        DynamicTypeValueReceiver<StateEntryValue> cb = buildStateUpdateCallbackMock();
+        mStateStoreUnderTest.registerCallback("foo", cb);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of("foo", buildStateEntry("test")));
+
+        verify(cb).onPreUpdate();
+        verify(cb).onData(buildStateEntry("test"));
+    }
+
+    @Test
+    public void setStateFiresOnPreStateUpdateFirst() {
+        DynamicTypeValueReceiver<StateEntryValue> cb = buildStateUpdateCallbackMock();
+
+        InOrder inOrder = Mockito.inOrder(cb);
+
+        mStateStoreUnderTest.registerCallback("foo", cb);
+        mStateStoreUnderTest.registerCallback("baz", cb);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo", buildStateEntry("testFoo"),
+                        "baz", buildStateEntry("testBaz")));
+
+        inOrder.verify(cb, times(2)).onPreUpdate();
+        inOrder.verify(cb, times(2)).onData(any());
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void setStateOnlyFiresListenersForChangedData() {
+        DynamicTypeValueReceiver<StateEntryValue> cbFoo = buildStateUpdateCallbackMock();
+        DynamicTypeValueReceiver<StateEntryValue> cbBaz = buildStateUpdateCallbackMock();
+        mStateStoreUnderTest.registerCallback("foo", cbFoo);
+        mStateStoreUnderTest.registerCallback("baz", cbBaz);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo", buildStateEntry("test"),
+                        "baz", buildStateEntry("foobar")));
+
+        verify(cbFoo).onPreUpdate();
+        verify(cbFoo).onData(buildStateEntry("test"));
+        verify(cbBaz, never()).onPreUpdate();
+        verify(cbBaz, never()).onData(buildStateEntry("test"));
+    }
+
+    @Test
+    public void removeStateFiresInvalidated() {
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "invalidated", buildStateEntry("value"),
+                        "notInvalidated", buildStateEntry("value")));
+        DynamicTypeValueReceiver<StateEntryValue> invalidated = buildStateUpdateCallbackMock();
+        DynamicTypeValueReceiver<StateEntryValue> notInvalidated = buildStateUpdateCallbackMock();
+        mStateStoreUnderTest.registerCallback("invalidated", invalidated);
+        mStateStoreUnderTest.registerCallback("notInvalidated", notInvalidated);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of("notInvalidated", buildStateEntry("value")));
+
+        verify(invalidated).onPreUpdate();
+        verify(invalidated).onInvalidated();
+        verify(invalidated, never()).onData(any());
+        verifyNoInteractions(notInvalidated);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void canUnregisterListeners() {
+        DynamicTypeValueReceiver<StateEntryValue> cb = buildStateUpdateCallbackMock();
+        mStateStoreUnderTest.registerCallback("foo", cb);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of("foo", buildStateEntry("test")));
+
+        reset(cb);
+        mStateStoreUnderTest.unregisterCallback("foo", cb);
+
+        mStateStoreUnderTest.setStateEntryValuesProto(
+                ImmutableMap.of("foo", buildStateEntry("testAgain"))
+        );
+
+        verifyNoInteractions(cb);
+    }
+
+    @SuppressWarnings("unchecked")
+    private DynamicTypeValueReceiver<StateEntryValue> buildStateUpdateCallbackMock() {
+        // This needs an unchecked cast because of the generic; this method just centralizes the
+        // warning suppression.
+        return mock(DynamicTypeValueReceiver.class);
+    }
+
+    private StateEntryValue buildStateEntry(String value) {
+        return StateEntryValue.newBuilder()
+                .setStringVal(FixedString.newBuilder().setValue(value))
+                .build();
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/StringNodesTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/StringNodesTest.java
new file mode 100644
index 0000000..1883c8e
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/StringNodesTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.icu.util.ULocale;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.pipeline.StringNodes.FixedStringNode;
+import androidx.wear.protolayout.expression.pipeline.StringNodes.Int32FormatNode;
+import androidx.wear.protolayout.expression.pipeline.StringNodes.StateStringNode;
+import androidx.wear.protolayout.expression.proto.DynamicProto.Int32FormatOp;
+import androidx.wear.protolayout.expression.proto.DynamicProto.StateStringSource;
+import androidx.wear.protolayout.expression.proto.FixedProto.FixedString;
+import androidx.wear.protolayout.expression.proto.StateEntryProto.StateEntryValue;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class StringNodesTest {
+    @Test
+    public void fixedStringNodeTest() {
+        List<String> results = new ArrayList<>();
+
+        FixedString protoNode = FixedString.newBuilder().setValue("Hello World").build();
+        FixedStringNode node = new FixedStringNode(protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        assertThat(results).containsExactly("Hello World");
+    }
+
+    @Test
+    public void int32FormatNodeTest() {
+        List<String> results = new ArrayList<>();
+        NumberFormatter formatter =
+                new NumberFormatter(
+                        Int32FormatOp.newBuilder()
+                                .setGroupingUsed(true)
+                                .setMinIntegerDigits(4)
+                                .build(),
+                        ULocale.UK
+                );
+        Int32FormatNode node = new Int32FormatNode(formatter, new AddToListCallback<>(results));
+        node.getIncomingCallback().onPreUpdate();
+        node.getIncomingCallback().onData(32);
+
+        assertThat(results).containsExactly("0,032");
+    }
+
+    @Test
+    public void stateStringNodeTest() {
+        List<String> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setStringVal(FixedString.newBuilder().setValue("bar"))
+                                        .build()));
+
+        StateStringSource protoNode = StateStringSource.newBuilder().setSourceKey("foo").build();
+        StateStringNode node =
+                new StateStringNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        assertThat(results).containsExactly("bar");
+    }
+
+    @Test
+    public void stateStringUpdatesWithStateChanges() {
+        List<String> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setStringVal(FixedString.newBuilder().setValue("bar"))
+                                        .build()));
+
+        StateStringSource protoNode = StateStringSource.newBuilder().setSourceKey("foo").build();
+        StateStringNode node =
+                new StateStringNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+
+        results.clear();
+
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setStringVal(FixedString.newBuilder().setValue("baz"))
+                                .build()));
+
+        assertThat(results).containsExactly("baz");
+    }
+
+    @Test
+    public void stateStringNoUpdatesAfterDestroy() {
+        List<String> results = new ArrayList<>();
+        ObservableStateStore oss =
+                new ObservableStateStore(
+                        ImmutableMap.of(
+                                "foo",
+                                StateEntryValue.newBuilder()
+                                        .setStringVal(FixedString.newBuilder().setValue("bar"))
+                                        .build()));
+
+        StateStringSource protoNode = StateStringSource.newBuilder().setSourceKey("foo").build();
+        StateStringNode node =
+                new StateStringNode(oss, protoNode, new AddToListCallback<>(results));
+
+        node.preInit();
+        node.init();
+        assertThat(results).containsExactly("bar");
+
+        results.clear();
+        node.destroy();
+        oss.setStateEntryValuesProto(
+                ImmutableMap.of(
+                        "foo",
+                        StateEntryValue.newBuilder()
+                                .setStringVal(FixedString.newBuilder().setValue("baz"))
+                                .build()));
+        assertThat(results).isEmpty();
+    }
+}
diff --git a/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImplTest.java b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImplTest.java
new file mode 100644
index 0000000..c1384ae
--- /dev/null
+++ b/wear/protolayout/protolayout-expression-pipeline/src/test/java/androidx/wear/protolayout/expression/pipeline/TimeGatewayImplTest.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.protolayout.expression.pipeline;
+
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.wear.protolayout.expression.pipeline.TimeGateway.TimeCallback;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.shadows.ShadowLooper;
+
+import java.time.Duration;
+import java.util.concurrent.Executor;
+
+@RunWith(AndroidJUnit4.class)
+public class TimeGatewayImplTest {
+    @Rule public MockitoRule mMockRule = MockitoJUnit.rule();
+
+    private final ShadowLooper mMainLooper = ShadowLooper.shadowMainLooper();
+    private final Handler mTestHandler = new Handler(Looper.getMainLooper());
+    private final Executor mImmediateExecutor = Runnable::run;
+    @Mock private TimeCallback mCallback;
+
+    private final TimeGatewayImpl mGatewayUnderTest =
+            new TimeGatewayImpl(mTestHandler, /* updatesEnabled= */ false);
+
+    @Test
+    public void registerForUpdates_callsCallbackEverySecondWhenEnabled() {
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // First callback to initialize clients
+        verify(mCallback).onPreUpdate();
+        verify(mCallback).onData();
+        reset(mCallback);
+
+        for (int i = 0; i < 5; i++) {
+            runFor(500);
+            verifyNoInteractions(mCallback);
+            runFor(500);
+
+            verify(mCallback).onPreUpdate();
+            verify(mCallback).onData();
+            reset(mCallback);
+        }
+    }
+
+    @Test
+    public void disableUpdates_stopsCallingCallback() {
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // Run a little so it gets set up.
+        runFor(2500);
+        reset(mCallback);
+
+        mGatewayUnderTest.disableUpdates();
+        runFor(1000);
+
+        verifyNoInteractions(mCallback);
+    }
+
+    @Test
+    public void enableUpdates_reenablesCallback() {
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // Run a little so it gets set up.
+        runFor(2500);
+        reset(mCallback);
+
+        mGatewayUnderTest.disableUpdates();
+        runFor(1000);
+
+        mGatewayUnderTest.enableUpdates();
+        runFor(500);
+        verifyNoInteractions(mCallback);
+        runFor(500);
+        verify(mCallback).onPreUpdate();
+        verify(mCallback).onData();
+    }
+
+    @Test
+    public void close_stopsUpdates() throws Exception {
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // Run a little so it gets set up.
+        runFor(2500);
+        reset(mCallback);
+
+        mGatewayUnderTest.close();
+
+        runFor(2000);
+        verifyNoInteractions(mCallback);
+    }
+
+    @Test
+    public void unregisterForUpdates() {
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // Run a little so it gets set up.
+        runFor(2500);
+        reset(mCallback);
+
+        mGatewayUnderTest.unregisterForUpdates(mCallback);
+
+        runFor(2000);
+        verifyNoInteractions(mCallback);
+    }
+
+    @Test
+    public void missedUpdate_schedulesAgainInFuture() throws Exception {
+        // This test is a tad fragile, and needs to know about the implementation details of
+        // Looper and ShadowLooper. Looper will call SystemClock.uptimeMillis internally to see what
+        // is schedulable. ShadowLooper also uses this in idleFor; it will do something similar
+        // to runFor; find the next time, advance SystemClock.setCurrentTimeMillis by that
+        // amount, call idle(), then keep going. Note though that it pulls the current time via
+        // SystemClock.uptimeMillis, but sets the current time via SystemClock
+        // .setCurrentTimeMillis. It appears that to Robolectric, the two are aliased (and
+        // getting the current time using System.getCurrentTimeMillis() gets the **actual**
+        // current time).
+        //
+        // This means that we can fake this behaviour to simulate a "missed" call; just advance the
+        // system clock, then call ShadowLooper#idle() to trigger any tasks that should have been
+        // dispatched in that time.
+        mGatewayUnderTest.enableUpdates();
+        mGatewayUnderTest.registerForUpdates(mImmediateExecutor, mCallback);
+        mMainLooper.idle();
+
+        // First callback to initialize clients
+        verify(mCallback).onPreUpdate();
+        verify(mCallback).onData();
+        reset(mCallback);
+
+        // Advance by a few seconds...
+        long advanceBy = 5500;
+        long nextTimeMillis = SystemClock.uptimeMillis() + advanceBy;
+        SystemClock.setCurrentTimeMillis(nextTimeMillis);
+
+        mMainLooper.idle();
+
+        // The callback should have fired **once**, and another single callback scheduled in 500ms
+        // time.
+        verify(mCallback).onPreUpdate();
+        verify(mCallback).onData();
+
+        reset(mCallback);
+
+        runFor(500);
+
+        verify(mCallback).onPreUpdate();
+        verify(mCallback).onData();
+    }
+
+    private void runFor(long runMillis) {
+        mMainLooper.idleFor(Duration.ofMillis(runMillis));
+    }
+}
diff --git a/wear/protolayout/protolayout-material/api/current.txt b/wear/protolayout/protolayout-material/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/protolayout/protolayout-material/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material/api/public_plus_experimental_current.txt b/wear/protolayout/protolayout-material/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/protolayout/protolayout-material/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material/api/res-current.txt b/wear/protolayout/protolayout-material/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wear/protolayout/protolayout-material/api/res-current.txt
diff --git a/wear/protolayout/protolayout-material/api/restricted_current.txt b/wear/protolayout/protolayout-material/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/protolayout/protolayout-material/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/protolayout/protolayout-material/build.gradle b/wear/protolayout/protolayout-material/build.gradle
new file mode 100644
index 0000000..7241009
--- /dev/null
+++ b/wear/protolayout/protolayout-material/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    annotationProcessor(libs.nullaway)
+    // Add dependencies here
+}
+
+android {
+    namespace "androidx.wear.protolayout.material"
+}
+
+androidx {
+    name = "androidx.wear.protolayout:protolayout-material"
+    type = LibraryType.PUBLISHED_LIBRARY
+    inceptionYear = "2023"
+    description = "Material components library for ProtoLayout."
+}
diff --git a/wear/tiles/tiles-tooling/api/current.txt b/wear/tiles/tiles-tooling/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/tiles/tiles-tooling/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt b/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/tiles/tiles-tooling/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/tiles/tiles-tooling/api/res-current.txt b/wear/tiles/tiles-tooling/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wear/tiles/tiles-tooling/api/res-current.txt
diff --git a/wear/tiles/tiles-tooling/api/restricted_current.txt b/wear/tiles/tiles-tooling/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/tiles/tiles-tooling/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/tiles/tiles-tooling/build.gradle b/wear/tiles/tiles-tooling/build.gradle
new file mode 100644
index 0000000..4f8794a
--- /dev/null
+++ b/wear/tiles/tiles-tooling/build.gradle
@@ -0,0 +1,49 @@
+import androidx.build.LibraryType
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+dependencies {
+    implementation(project(":wear:tiles:tiles"))
+    implementation(project(":wear:tiles:tiles-renderer"))
+
+    implementation(libs.kotlinStdlib)
+
+    implementation("androidx.core:core:1.1.0")
+
+    testImplementation(libs.junit)
+
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.guava)
+    // To fix Failed resolution of: Landroidx/wear/tiles/proto/RequestProto$TileRequest;
+    // Caused by:
+    //   java.lang.ClassNotFoundException: androidx.wear.tiles.proto.RequestProto$TileRequest
+    // Caused by:
+    //   java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/protobuf/GeneratedMessageLite;
+    // Caused by:
+    //   java.lang.ClassNotFoundException: Didn't find class "com.google.protobuf.GeneratedMessageLite"
+    //   on path: DexPathList[ ... ]
+    androidTestRuntimeOnly(project(path: ":wear:tiles:tiles-proto", configuration: "shadow"))
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 26
+    }
+
+    namespace "androidx.wear.tiles.tooling"
+}
+
+androidx {
+    name = "Android Wear Tiles Tooling"
+    type = LibraryType.PUBLISHED_LIBRARY
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    inceptionYear = "2023"
+    description = "A set of tools that are used to preview TilesService in Android Studio"
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/androidTest/AndroidManifest.xml b/wear/tiles/tiles-tooling/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..c460b20
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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">
+    <application
+        android:debuggable="true"
+        tools:ignore="HardcodedDebugMode">
+        <activity
+            android:name="androidx.wear.tiles.tooling.TileServiceViewAdapterTest$Companion$TestActivity"
+            android:theme="@style/TestTheme" />
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TestTileService.kt b/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TestTileService.kt
new file mode 100644
index 0000000..ca72654
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TestTileService.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.tooling
+
+import androidx.wear.tiles.ColorBuilders.argb
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.RequestBuilders
+import androidx.wear.tiles.ResourceBuilders
+import androidx.wear.tiles.TileBuilders
+import androidx.wear.tiles.TileService
+import androidx.wear.tiles.TimelineBuilders
+import com.google.common.util.concurrent.Futures
+
+private val RESOURCES_VERSION = "1"
+
+class TestTileService : TileService() {
+    override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
+        Futures.immediateFuture(
+            TileBuilders.Tile.Builder()
+            .setResourcesVersion(RESOURCES_VERSION)
+            .setTimeline(
+                TimelineBuilders.Timeline.Builder().addTimelineEntry(
+                    TimelineBuilders.TimelineEntry.Builder().setLayout(
+                        LayoutElementBuilders.Layout.Builder().setRoot(
+                            LayoutElementBuilders.Text.Builder()
+                                .setText("Hello world!")
+                                .setFontStyle(
+                                    LayoutElementBuilders.FontStyle.Builder()
+                                        .setColor(argb(0xFF000000.toInt()))
+                                        .build()
+                                ).build()
+                        ).build()
+                    ).build()
+                ).build()
+            ).build()
+        )
+
+    override fun onResourcesRequest(requestParams: RequestBuilders.ResourcesRequest) =
+        Futures.immediateFuture(
+            ResourceBuilders.Resources.Builder()
+            .setVersion(RESOURCES_VERSION)
+            .build()
+        )
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TileServiceViewAdapterTest.kt b/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TileServiceViewAdapterTest.kt
new file mode 100644
index 0000000..40ef142
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/androidTest/java/androidx/wear/tiles/tooling/TileServiceViewAdapterTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.tooling
+
+import androidx.wear.tiles.tooling.test.R
+import android.app.Activity
+import android.os.Bundle
+import android.widget.TextView
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+class TileServiceViewAdapterTest {
+    @Suppress("DEPRECATION")
+    @get:Rule
+    val activityTestRule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
+
+    private lateinit var tileServiceViewAdapter: TileServiceViewAdapter
+
+    @Before
+    fun setup() {
+        tileServiceViewAdapter =
+            activityTestRule.activity.findViewById(R.id.tile_service_view_adapter)
+    }
+
+    private fun initAndInflate(
+        className: String,
+    ) {
+        activityTestRule.runOnUiThread {
+            tileServiceViewAdapter.init(className)
+            tileServiceViewAdapter.requestLayout()
+        }
+    }
+
+    @Test
+    fun testTileServiceViewAdapter() {
+        initAndInflate("androidx.wear.tiles.tooling.TestTileService")
+
+        activityTestRule.runOnUiThread {
+            val textView = tileServiceViewAdapter.getChildAt(0) as TextView
+            assertNotNull(textView)
+            assertEquals("Hello world!", textView.text.toString())
+        }
+    }
+
+    companion object {
+        class TestActivity : Activity() {
+            override fun onCreate(savedInstanceState: Bundle?) {
+                super.onCreate(savedInstanceState)
+                setContentView(R.layout.tile_service_adapter_test)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/androidTest/res/layout/tile_service_adapter_test.xml b/wear/tiles/tiles-tooling/src/androidTest/res/layout/tile_service_adapter_test.xml
new file mode 100644
index 0000000..caa66cd
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/androidTest/res/layout/tile_service_adapter_test.xml
@@ -0,0 +1,22 @@
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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.wear.tiles.tooling.TileServiceViewAdapter
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tile_service_view_adapter"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/androidTest/res/values/styles.xml b/wear/tiles/tiles-tooling/src/androidTest/res/values/styles.xml
new file mode 100644
index 0000000..171bddf
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/androidTest/res/values/styles.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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="TestTheme" parent="@android:style/Theme.Material.Light.NoActionBar">
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowAnimationStyle">@null</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowNoTitle">true</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt b/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt
new file mode 100644
index 0000000..9ec2000
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/main/java/androidx/wear/tiles/tooling/TileServiceViewAdapter.kt
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.tooling
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.view.Gravity
+import android.widget.FrameLayout
+import androidx.core.content.ContextCompat
+import androidx.wear.tiles.DeviceParametersBuilders
+import androidx.wear.tiles.LayoutElementBuilders
+import androidx.wear.tiles.RequestBuilders
+import androidx.wear.tiles.ResourceBuilders
+import androidx.wear.tiles.StateBuilders
+import androidx.wear.tiles.TileBuilders
+import androidx.wear.tiles.TileService
+import androidx.wear.tiles.TimelineBuilders
+import androidx.wear.tiles.renderer.TileRenderer
+import androidx.wear.tiles.timeline.TilesTimelineCache
+import com.google.common.util.concurrent.ListenableFuture
+import java.lang.reflect.Method
+import java.util.concurrent.TimeUnit
+import kotlin.math.roundToInt
+
+private const val TOOLS_NS_URI = "http://schemas.android.com/tools"
+
+/**
+ * A method extending functionality of [Class.getDeclaredMethod] allowing to finding the methods
+ * (including non-public) declared in the superclasses as well.
+ */
+internal fun Class<out Any>.findMethod(
+    name: String,
+    vararg parameterTypes: Class<out Any>
+): Method {
+    var currentClass: Class<out Any>? = this
+    while (currentClass != null) {
+        try {
+            return currentClass.getDeclaredMethod(name, *parameterTypes)
+        } catch (_: NoSuchMethodException) { }
+        currentClass = currentClass.superclass
+    }
+    val methodSignature = "$name(${parameterTypes.joinToString { ", " }})"
+    throw NoSuchMethodException(
+        "Could not find method $methodSignature neither in $this nor in its superclasses.")
+}
+
+/**
+ * View adapter that renders a class inheriting [TileService]. The class is found by reading the
+ * `tools:tileServiceName` attribute that contains the FQCN.
+ */
+internal class TileServiceViewAdapter(context: Context, attrs: AttributeSet) :
+    FrameLayout(context, attrs) {
+    init {
+        init(attrs)
+    }
+
+    private fun init(attrs: AttributeSet) {
+        val tileServiceName = attrs.getAttributeValue(TOOLS_NS_URI, "tileServiceName") ?: return
+
+        init(tileServiceName)
+    }
+
+    @SuppressLint("BanUncheckedReflection")
+    @Suppress("UNCHECKED_CAST")
+    internal fun init(tileServiceName: String) {
+        val tileServiceClass = Class.forName(tileServiceName)
+
+        // val tileService = <TileServiceClassName>()
+        val tileService = tileServiceClass.getConstructor().newInstance() as TileService
+
+        // tileService.attachBaseContext(context)
+        val attachBaseContextMethod =
+            tileServiceClass
+                .findMethod("attachBaseContext", Context::class.java)
+                .apply { isAccessible = true }
+        attachBaseContextMethod.invoke(tileService, context)
+
+        val deviceParams = context.buildDeviceParameters()
+        val tileRequest = RequestBuilders.TileRequest
+            .Builder()
+            .setState(StateBuilders.State.Builder().build())
+            .setDeviceParameters(deviceParams)
+            .build()
+
+        // val tile = tileService.onTileRequest(tileRequest)
+        val onTileRequestMethod =
+            tileServiceClass
+                .findMethod("onTileRequest", RequestBuilders.TileRequest::class.java)
+                .apply { isAccessible = true }
+        val tile =
+            (onTileRequestMethod.invoke(tileService, tileRequest) as
+                ListenableFuture<TileBuilders.Tile>).get(1, TimeUnit.SECONDS)
+
+        val resourceRequest = RequestBuilders.ResourcesRequest
+            .Builder()
+            .setVersion(tile.resourcesVersion)
+            .setDeviceParameters(deviceParams)
+            .build()
+
+        // val resources = tileService.onResourcesRequest(resourceRequest).get(1, TimeUnit.SECONDS)
+        val onResourcesRequestMethod =
+            tileServiceClass
+                .findMethod("onResourcesRequest", RequestBuilders.ResourcesRequest::class.java)
+                .apply { isAccessible = true }
+        val resources =
+            (onResourcesRequestMethod.invoke(tileService, resourceRequest) as
+                ListenableFuture<ResourceBuilders.Resources>).get(1, TimeUnit.SECONDS)
+
+        val layout = tile.timeline?.getCurrentLayout()
+        if (layout != null) {
+            val renderer = TileRenderer(
+                context,
+                layout,
+                resources,
+                ContextCompat.getMainExecutor(context)
+            ) { }
+            renderer.inflate(this)?.apply {
+                (layoutParams as FrameLayout.LayoutParams).gravity = Gravity.CENTER
+            }
+        }
+    }
+}
+
+internal fun TimelineBuilders.Timeline?.getCurrentLayout(): LayoutElementBuilders.Layout? {
+    val now = System.currentTimeMillis()
+    return this?.let {
+        val cache = TilesTimelineCache(it)
+        cache.findTimelineEntryForTime(now) ?: cache.findClosestTimelineEntry(now)
+    }?.layout
+}
+
+/**
+ * Creates an instance of [DeviceParametersBuilders.DeviceParameters] from the [Context].
+ */
+internal fun Context.buildDeviceParameters(): DeviceParametersBuilders.DeviceParameters {
+    val displayMetrics = resources.displayMetrics
+    val isScreenRound = resources.configuration.isScreenRound
+    return DeviceParametersBuilders.DeviceParameters.Builder()
+        .setScreenWidthDp(
+            (displayMetrics.widthPixels / displayMetrics.density).roundToInt())
+        .setScreenHeightDp(
+            (displayMetrics.heightPixels / displayMetrics.density).roundToInt())
+        .setScreenDensity(displayMetrics.density)
+        .setScreenShape(
+            if (isScreenRound) DeviceParametersBuilders.SCREEN_SHAPE_ROUND
+            else DeviceParametersBuilders.SCREEN_SHAPE_RECT
+        )
+        .setDevicePlatform(DeviceParametersBuilders.DEVICE_PLATFORM_WEAR_OS)
+        .build()
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles-tooling/src/test/java/androidx/wear/tiles/tooling/FindMethodTest.kt b/wear/tiles/tiles-tooling/src/test/java/androidx/wear/tiles/tooling/FindMethodTest.kt
new file mode 100644
index 0000000..05337da
--- /dev/null
+++ b/wear/tiles/tiles-tooling/src/test/java/androidx/wear/tiles/tooling/FindMethodTest.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.tooling
+
+import org.junit.Test
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.fail
+
+@Suppress("unused")
+open class A {
+    open fun aOpen(): String { return "aOpen" }
+
+    fun aFinal(): String { return "aFinal" }
+
+    protected open fun aOpenProtected(): String { return "aOpenProtected" }
+
+    protected fun aFinalProtected(): String { return "aFinalProtected" }
+
+    protected open fun aOpenProtected2(): String { return "aOpenProtected2" }
+}
+
+@Suppress("unused")
+class B : A() {
+    override fun aOpen(): String { return "bOpen" }
+
+    override fun aOpenProtected(): String { return "bOpenProtected" }
+}
+
+class FindMethodTest {
+    @Test
+    fun testFindMethod() {
+        val a = A()
+        assertEquals("aOpen", A::class.java.findMethod("aOpen").invoke(a))
+        assertEquals("aFinal", A::class.java.findMethod("aFinal").invoke(a))
+        assertEquals("aOpenProtected", A::class.java.findMethod("aOpenProtected").invoke(a))
+        assertEquals("aFinalProtected", A::class.java.findMethod("aFinalProtected").invoke(a))
+        try {
+            A::class.java.findMethod("noSuchMethod")
+            fail()
+        } catch (_: NoSuchMethodException) { }
+
+        val b = B()
+        assertEquals("bOpen", B::class.java.findMethod("aOpen").invoke(b))
+        assertEquals("bOpenProtected", B::class.java.findMethod("aOpenProtected").invoke(b))
+        assertEquals("aFinal", B::class.java.findMethod("aFinal").invoke(b))
+        assertEquals("aOpenProtected2", B::class.java.findMethod("aOpenProtected2").invoke(b))
+    }
+}
\ No newline at end of file
diff --git a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
index 6495a7f..4801d04 100644
--- a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceControlClientTest.kt
@@ -40,6 +40,8 @@
 import com.google.common.truth.Truth.assertThat
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import org.junit.Assert
 import org.junit.Assert.assertNull
 import org.junit.Before
 import org.junit.Test
@@ -47,8 +49,6 @@
 import org.mockito.Mock
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
-import java.util.concurrent.TimeUnit
-import org.junit.Assert
 
 private const val TIMEOUT_MS = 500L
 
@@ -56,41 +56,36 @@
 @MediumTest
 public class ListenableWatchFaceControlClientTest {
 
-    @Mock
-    private lateinit var surfaceHolder: SurfaceHolder
-    @Mock
-    private lateinit var surface: Surface
+    @Mock private lateinit var surfaceHolder: SurfaceHolder
+    @Mock private lateinit var surface: Surface
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
 
     @Before
     public fun setUp() {
         MockitoAnnotations.initMocks(this)
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
+        Mockito.`when`(surfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 400, 400))
         Mockito.`when`(surfaceHolder.surface).thenReturn(surface)
     }
 
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun headlessSchemaSettingIds() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
-        val headlessInstance = client.createHeadlessWatchFaceClient(
-            "id",
-            ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            400,
-            400
-        )!!
+        val headlessInstance =
+            client.createHeadlessWatchFaceClient(
+                "id",
+                ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
+                DeviceConfig(false, false, 0, 0),
+                400,
+                400
+            )!!
 
         assertThat(headlessInstance.userStyleSchema.userStyleSettings.map { it.id.value })
             .containsExactly(
@@ -107,21 +102,18 @@
 
     @Test
     public fun createHeadlessWatchFaceClient_nonExistentWatchFaceComponentName() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         assertNull(
             client.createHeadlessWatchFaceClient(
                 "id",
                 ComponentName("?", "i.do.not.exist"),
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 400,
                 400
             )
@@ -132,37 +124,37 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun listenableGetOrCreateWallpaperServiceBackedInteractiveWatchFaceWcsClient() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 null,
                 null
             )
 
-        val service = object : ExampleCanvasAnalogWatchFaceService() {
-            init {
-                attachBaseContext(context)
+        val service =
+            object : ExampleCanvasAnalogWatchFaceService() {
+                init {
+                    attachBaseContext(context)
+                }
             }
-        }
-        service.onCreateEngine().onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        service
+            .onCreateEngine()
+            .onSurfaceChanged(
+                surfaceHolder,
+                0,
+                surfaceHolder.surfaceFrame.width(),
+                surfaceHolder.surfaceFrame.height()
+            )
 
         val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         assertThat(interactiveInstance.userStyleSchema.userStyleSettings.map { it.id.value })
@@ -180,49 +172,39 @@
 
     @Test
     public fun createMultipleHeadlessInstances() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
-        val headlessInstance1 = client.createHeadlessWatchFaceClient(
-            "id1",
-            ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            400,
-            400
-        )!!
+        val headlessInstance1 =
+            client.createHeadlessWatchFaceClient(
+                "id1",
+                ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
+                DeviceConfig(false, false, 0, 0),
+                400,
+                400
+            )!!
 
-        val headlessInstance2 = client.createHeadlessWatchFaceClient(
-            "id2",
-            ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            400,
-            400
-        )!!
+        val headlessInstance2 =
+            client.createHeadlessWatchFaceClient(
+                "id2",
+                ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
+                DeviceConfig(false, false, 0, 0),
+                400,
+                400
+            )!!
 
-        val headlessInstance3 = client.createHeadlessWatchFaceClient(
-            "id3",
-            ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            400,
-            400
-        )!!
+        val headlessInstance3 =
+            client.createHeadlessWatchFaceClient(
+                "id3",
+                ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
+                DeviceConfig(false, false, 0, 0),
+                400,
+                400
+            )!!
 
         headlessInstance3.close()
         headlessInstance2.close()
@@ -232,51 +214,47 @@
 
     @Test
     public fun createInteractiveAndHeadlessInstances() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 null,
                 null
             )
 
-        val service = object : ExampleCanvasAnalogWatchFaceService() {
-            init {
-                attachBaseContext(context)
+        val service =
+            object : ExampleCanvasAnalogWatchFaceService() {
+                init {
+                    attachBaseContext(context)
+                }
             }
-        }
-        service.onCreateEngine().onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        service
+            .onCreateEngine()
+            .onSurfaceChanged(
+                surfaceHolder,
+                0,
+                surfaceHolder.surfaceFrame.width(),
+                surfaceHolder.surfaceFrame.height()
+            )
 
         val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
-        val headlessInstance1 = client.createHeadlessWatchFaceClient(
-            "id",
-            ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            400,
-            400
-        )!!
+        val headlessInstance1 =
+            client.createHeadlessWatchFaceClient(
+                "id",
+                ComponentName(context, ExampleCanvasAnalogWatchFaceService::class.java),
+                DeviceConfig(false, false, 0, 0),
+                400,
+                400
+            )!!
 
         headlessInstance1.close()
         interactiveInstance.close()
@@ -285,77 +263,76 @@
 
     @Test
     public fun getInteractiveWatchFaceInstanceSysUI_notExist() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         assertNull(client.getInteractiveWatchFaceClientInstance("I do not exist"))
     }
 
     @Test
     public fun createWatchFaceControlClient_cancel() {
-        ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).cancel(true)
+        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)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         assertThat(client).isNotNull()
         client.close()
     }
 
     @Test
     public fun listenableGetOrCreateInteractiveWatchFaceClient_cancel() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         @Suppress("deprecation")
-        client.listenableGetOrCreateInteractiveWatchFaceClient(
-            "listenableTestId",
-            DeviceConfig(
-                false,
-                false,
-                0,
-                0
-            ),
-            WatchUiState(false, 0),
-            null,
-            null
-        ).cancel(true)
+        client
+            .listenableGetOrCreateInteractiveWatchFaceClient(
+                "listenableTestId",
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                null,
+                null
+            )
+            .cancel(true)
 
         // Canceling should not prevent a subsequent listenableGetOrCreateInteractiveWatchFaceClient
         @Suppress("deprecation")
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 null,
                 null
             )
-        val service = object : ExampleCanvasAnalogWatchFaceService() {
-            init {
-                attachBaseContext(context)
+        val service =
+            object : ExampleCanvasAnalogWatchFaceService() {
+                init {
+                    attachBaseContext(context)
+                }
             }
-        }
-        service.onCreateEngine().onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        service
+            .onCreateEngine()
+            .onSurfaceChanged(
+                surfaceHolder,
+                0,
+                surfaceHolder.surfaceFrame.width(),
+                surfaceHolder.surfaceFrame.height()
+            )
 
         val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         assertThat(interactiveInstance).isNotNull()
@@ -365,21 +342,18 @@
 
     @Test
     public fun previewImageUpdateRequestedListener() {
-        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
-            context,
-            context.packageName
-        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val client =
+            ListenableWatchFaceControlClient.createWatchFaceControlClient(
+                    context,
+                    context.packageName
+                )
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
 
         var lastPreviewImageUpdateRequestedId = ""
         val interactiveInstanceFuture =
             client.listenableGetOrCreateInteractiveWatchFaceClient(
                 "listenableTestId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 null,
                 null,
@@ -388,12 +362,14 @@
             )
 
         val service = TestWatchFaceServiceWithPreviewImageUpdateRequest(context, surfaceHolder)
-        service.onCreateEngine().onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        service
+            .onCreateEngine()
+            .onSurfaceChanged(
+                surfaceHolder,
+                0,
+                surfaceHolder.surfaceFrame.width(),
+                surfaceHolder.surfaceFrame.height()
+            )
 
         val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         Assert.assertTrue(service.rendererInitializedLatch.await(500, TimeUnit.MILLISECONDS))
@@ -418,8 +394,7 @@
 
     override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
 
-    @Suppress("deprecation")
-    private lateinit var renderer: Renderer.CanvasRenderer
+    @Suppress("deprecation") private lateinit var renderer: Renderer.CanvasRenderer
 
     fun triggerPreviewImageUpdateRequest() {
         renderer.sendPreviewImageNeedsUpdateRequest()
@@ -432,25 +407,27 @@
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
         @Suppress("deprecation")
-        renderer = object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override suspend fun init() {
-                rendererInitializedLatch.countDown()
+        renderer =
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override suspend fun init() {
+                    rendererInitializedLatch.countDown()
+                }
+
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
-
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {}
-        }
         return WatchFace(WatchFaceType.DIGITAL, renderer)
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt
index 3a57183..15ed3af 100644
--- a/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt
+++ b/wear/watchface/watchface-client-guava/src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt
@@ -32,10 +32,10 @@
 import androidx.wear.watchface.control.IWatchFaceInstanceServiceStub
 import androidx.wear.watchface.control.WatchFaceControlService
 import com.google.common.truth.Truth
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.MainScope
+import org.junit.Test
+import org.junit.runner.RunWith
 
 private const val TIMEOUT_MS = 500L
 
@@ -45,11 +45,12 @@
  */
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 public class WatchFaceControlTestService : WatchFaceControlService() {
-    private val realService = object : WatchFaceControlService() {
-        @SuppressLint("NewApi")
-        override fun createServiceStub(): IWatchFaceInstanceServiceStub =
-            IWatchFaceInstanceServiceStub(this@WatchFaceControlTestService, MainScope())
-    }
+    private val realService =
+        object : WatchFaceControlService() {
+            @SuppressLint("NewApi")
+            override fun createServiceStub(): IWatchFaceInstanceServiceStub =
+                IWatchFaceInstanceServiceStub(this@WatchFaceControlTestService, MainScope())
+        }
 
     @SuppressLint("NewApi")
     override fun onBind(intent: Intent?): IBinder? = realService.onBind(intent)
@@ -59,10 +60,11 @@
 @MediumTest
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 public class ListenableWatchFaceMetadataClientTest {
-    private val exampleWatchFaceComponentName = ComponentName(
-        "androidx.wear.watchface.samples.test",
-        "androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService"
-    )
+    private val exampleWatchFaceComponentName =
+        ComponentName(
+            "androidx.wear.watchface.samples.test",
+            "androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService"
+        )
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
 
@@ -88,20 +90,14 @@
         val schema = watchFaceMetadataClient.getUserStyleSchema()
 
         Truth.assertThat(schema.userStyleSettings.size).isEqualTo(5)
-        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo(
-            "color_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[1].id.value).isEqualTo(
-            "draw_hour_pips_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[2].id.value).isEqualTo(
-            "watch_hand_length_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[3].id.value).isEqualTo(
-            "complications_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[4].id.value).isEqualTo(
-            "hours_draw_freq_style_setting"
-        )
+        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo("color_style_setting")
+        Truth.assertThat(schema.userStyleSettings[1].id.value)
+            .isEqualTo("draw_hour_pips_style_setting")
+        Truth.assertThat(schema.userStyleSettings[2].id.value)
+            .isEqualTo("watch_hand_length_style_setting")
+        Truth.assertThat(schema.userStyleSettings[3].id.value)
+            .isEqualTo("complications_style_setting")
+        Truth.assertThat(schema.userStyleSettings[4].id.value)
+            .isEqualTo("hours_draw_freq_style_setting")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
index 48ded1d..338f592 100644
--- a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
+++ b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
@@ -20,19 +20,19 @@
 import android.content.Context
 import androidx.concurrent.futures.ResolvableFuture
 import androidx.wear.watchface.Renderer
-import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.utility.AsyncTraceEvent
 import androidx.wear.watchface.client.WatchFaceControlClient.ServiceNotBoundException
+import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.style.UserStyleData
+import androidx.wear.watchface.utility.AsyncTraceEvent
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
 import java.util.function.Consumer
+import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Runnable
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
-import kotlin.coroutines.CoroutineContext
 
 /**
  * [ListenableFuture]-based compatibility wrapper around [WatchFaceControlClient]'s suspending
@@ -47,13 +47,14 @@
         watchFaceControlClient.getInteractiveWatchFaceClientInstance(instanceId)
 
     public companion object {
-        internal fun createImmediateCoroutineScope() = CoroutineScope(
-            object : CoroutineDispatcher() {
-                override fun dispatch(context: CoroutineContext, block: Runnable) {
-                    block.run()
+        internal fun createImmediateCoroutineScope() =
+            CoroutineScope(
+                object : CoroutineDispatcher() {
+                    override fun dispatch(context: CoroutineContext, block: Runnable) {
+                        block.run()
+                    }
                 }
-            }
-        )
+            )
 
         /**
          * Launches a coroutine with a new scope and returns a future that correctly handles
@@ -97,11 +98,11 @@
          * 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.
+         * @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.
+         *   to a [ListenableWatchFaceControlClient] or throws a [ServiceNotBoundException] if the
+         *   watch face control service can not be bound.
          */
         @JvmStatic
         public fun createWatchFaceControlClient(
@@ -152,17 +153,17 @@
 
     /**
      * [ListenableFuture] wrapper around
-     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient].
-     * This is open to allow mocking.
+     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]. This is open to allow
+     * mocking.
      *
      * @param id The Id of the interactive instance to get or create.
      * @param deviceConfig The [DeviceConfig] of the interactive instance (only used when creating)
      * @param watchUiState The initial [WatchUiState] for the wearable.
      * @param userStyle Optional [UserStyleData] to apply to the instance (whether or not it's
-     * created). If `null` then the pre-existing user style is preserved (if the instance is created
-     * this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
+     *   created). If `null` then the pre-existing user style is preserved (if the instance is
+     *   created this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
      * @param slotIdToComplicationData The initial [androidx.wear.watchface.ComplicationSlot] data,
-     * or `null` if unavailable.
+     *   or `null` if unavailable.
      * @return a [ListenableFuture] for the [InteractiveWatchFaceClient].
      */
     @Suppress("AsyncSuffixFuture")
@@ -196,29 +197,29 @@
 
     /**
      * [ListenableFuture] wrapper around
-     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient].
-     * This is open to allow mocking.
+     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]. This is open to allow
+     * mocking.
      *
      * @param id The Id of the interactive instance to get or create.
      * @param deviceConfig The [DeviceConfig] of the interactive instance (only used when creating)
      * @param watchUiState The initial [WatchUiState] for the wearable.
      * @param userStyle Optional [UserStyleData] to apply to the instance (whether or not it's
-     * created). If `null` then the pre-existing user style is preserved (if the instance is created
-     * this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
+     *   created). If `null` then the pre-existing user style is preserved (if the instance is
+     *   created this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
      * @param slotIdToComplicationData The initial [androidx.wear.watchface.ComplicationSlot] data,
-     * or `null` if unavailable.
+     *   or `null` if unavailable.
      * @param previewImageUpdateRequestedExecutor The [Executor] on which to run
-     * [previewImageUpdateRequestedListener] if the watch face calls
-     * [Renderer.sendPreviewImageNeedsUpdateRequest].
+     *   [previewImageUpdateRequestedListener] if the watch face calls
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest].
      * @param previewImageUpdateRequestedListener The [Consumer] fires when the watch face calls
-     * [Renderer.sendPreviewImageNeedsUpdateRequest], indicating that it now looks visually
-     * different. The string passed to the [Consumer] is the ID of the watch face (see [id] passed
-     * into [getOrCreateInteractiveWatchFaceClient]) requesting the update. This will usually
-     * match the current watch face but it could also be from a previous watch face if
-     * [InteractiveWatchFaceClient.updateWatchFaceInstance] is called shortly after
-     * [Renderer.sendPreviewImageNeedsUpdateRequest].
-     * The [Consumer] should Schedule creation of a headless instance to render a new preview image
-     * for the instanceId. This is likely an expensive operation and should be rate limited.
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest], indicating that it now looks visually
+     *   different. The string passed to the [Consumer] is the ID of the watch face (see [id] passed
+     *   into [getOrCreateInteractiveWatchFaceClient]) requesting the update. This will usually
+     *   match the current watch face but it could also be from a previous watch face if
+     *   [InteractiveWatchFaceClient.updateWatchFaceInstance] is called shortly after
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest]. The [Consumer] should Schedule creation of a
+     *   headless instance to render a new preview image for the instanceId. This is likely an
+     *   expensive operation and should be rate limited.
      * @return a [ListenableFuture] for the [InteractiveWatchFaceClient].
      */
     @Suppress("AsyncSuffixFuture")
@@ -247,10 +248,12 @@
 
     @Deprecated(
         "Use an overload that specifies a Consumer<String>",
-        replaceWith = ReplaceWith(
-            "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState," +
-                " UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
-                "Consumer<String>)")
+        replaceWith =
+            ReplaceWith(
+                "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState," +
+                    " UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
+                    "Consumer<String>)"
+            )
     )
     @Suppress("deprecation")
     override suspend fun getOrCreateInteractiveWatchFaceClient(
diff --git a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceMetadataClient.kt b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceMetadataClient.kt
index 6a1d13b..6d25efd 100644
--- a/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceMetadataClient.kt
+++ b/wear/watchface/watchface-client-guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceMetadataClient.kt
@@ -24,9 +24,7 @@
 import androidx.wear.watchface.control.WatchFaceControlService
 import com.google.common.util.concurrent.ListenableFuture
 
-/**
- * [ListenableFuture]-based compatibility wrapper around [WatchFaceMetadataClient.create].
- */
+/** [ListenableFuture]-based compatibility wrapper around [WatchFaceMetadataClient.create]. */
 public class ListenableWatchFaceMetadataClient private constructor() {
     public companion object {
         /**
@@ -36,38 +34,35 @@
          * @param context Calling application's [Context].
          * @param watchFaceName The [ComponentName] of the watch face to fetch meta data from.
          * @return A [ListenableFuture] which resolves with [WatchFaceMetadataClient] if there is
-         * one, otherwise it throws a [ServiceNotBoundException] if the underlying watch face
-         * control service can not be bound or a [ServiceStartFailureException] if the watch face
-         * dies during startup.
+         *   one, otherwise it throws a [ServiceNotBoundException] if the underlying watch face
+         *   control service can not be bound or a [ServiceStartFailureException] if the watch face
+         *   dies during startup.
          */
         @Suppress("AsyncSuffixFuture")
         @JvmStatic
         public fun create(
             context: Context,
             watchFaceName: ComponentName
-        ): ListenableFuture<WatchFaceMetadataClient> = createImpl(
-            context,
-            Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE).apply {
-                setPackage(watchFaceName.packageName)
-            },
-            watchFaceName,
-            WatchFaceMetadataClient.Companion.ParserProvider()
-        )
+        ): ListenableFuture<WatchFaceMetadataClient> =
+            createImpl(
+                context,
+                Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE).apply {
+                    setPackage(watchFaceName.packageName)
+                },
+                watchFaceName,
+                WatchFaceMetadataClient.Companion.ParserProvider()
+            )
 
         internal fun createImpl(
             context: Context,
             intent: Intent,
             watchFaceName: ComponentName,
             parserProvider: WatchFaceMetadataClient.Companion.ParserProvider
-        ) = ListenableWatchFaceControlClient.launchFutureCoroutine(
-            "ListenableWatchFaceMetadataClient.listenableCreateWatchFaceMetadataClient"
-        ) {
-            WatchFaceMetadataClient.createImpl(
-                context,
-                intent,
-                watchFaceName,
-                parserProvider
-            )
-        }
+        ) =
+            ListenableWatchFaceControlClient.launchFutureCoroutine(
+                "ListenableWatchFaceMetadataClient.listenableCreateWatchFaceMetadataClient"
+            ) {
+                WatchFaceMetadataClient.createImpl(context, intent, watchFaceName, parserProvider)
+            }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/api/current.ignore b/wear/watchface/watchface-client/api/current.ignore
index 8c1c73c..203d029 100644
--- a/wear/watchface/watchface-client/api/current.ignore
+++ b/wear/watchface/watchface-client/api/current.ignore
@@ -21,3 +21,11 @@
     Method androidx.wear.watchface.client.InteractiveWatchFaceClient.getPreviewReferenceInstant added thrown exception android.os.RemoteException
 ChangedThrows: androidx.wear.watchface.client.InteractiveWatchFaceClient#getUserStyleSchema():
     Method androidx.wear.watchface.client.InteractiveWatchFaceClient.getUserStyleSchema added thrown exception android.os.RemoteException
+
+
+RemovedClass: androidx.wear.watchface.client.DeviceConfigKt:
+    Removed class androidx.wear.watchface.client.DeviceConfigKt
+RemovedClass: androidx.wear.watchface.client.EditorStateKt:
+    Removed class androidx.wear.watchface.client.EditorStateKt
+RemovedClass: androidx.wear.watchface.client.WatchFaceExceptionKt:
+    Removed class androidx.wear.watchface.client.WatchFaceExceptionKt
diff --git a/wear/watchface/watchface-client/api/current.txt b/wear/watchface/watchface-client/api/current.txt
index 4e6173b..b7a6bc0 100644
--- a/wear/watchface/watchface-client/api/current.txt
+++ b/wear/watchface/watchface-client/api/current.txt
@@ -68,9 +68,6 @@
     property public final boolean hasLowBitAmbient;
   }
 
-  public final class DeviceConfigKt {
-  }
-
   public final class DisconnectReasons {
     field public static final int ENGINE_DETACHED = 2; // 0x2
     field public static final int ENGINE_DIED = 1; // 0x1
@@ -100,9 +97,6 @@
     property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
   }
 
-  public final class EditorStateKt {
-  }
-
   public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
     method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
@@ -213,9 +207,6 @@
     ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
-  public final class WatchFaceExceptionKt {
-  }
-
   public final class WatchFaceId {
     ctor public WatchFaceId(String id);
     method public String getId();
diff --git a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
index b48fa19..ff5390c 100644
--- a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
@@ -72,9 +72,6 @@
     property public final boolean hasLowBitAmbient;
   }
 
-  public final class DeviceConfigKt {
-  }
-
   public final class DisconnectReasons {
     field public static final int ENGINE_DETACHED = 2; // 0x2
     field public static final int ENGINE_DIED = 1; // 0x1
@@ -104,9 +101,6 @@
     property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
   }
 
-  public final class EditorStateKt {
-  }
-
   public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
     method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
@@ -222,9 +216,6 @@
     ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
-  public final class WatchFaceExceptionKt {
-  }
-
   public final class WatchFaceId {
     ctor public WatchFaceId(String id);
     method public String getId();
diff --git a/wear/watchface/watchface-client/api/restricted_current.ignore b/wear/watchface/watchface-client/api/restricted_current.ignore
index 8c1c73c..203d029 100644
--- a/wear/watchface/watchface-client/api/restricted_current.ignore
+++ b/wear/watchface/watchface-client/api/restricted_current.ignore
@@ -21,3 +21,11 @@
     Method androidx.wear.watchface.client.InteractiveWatchFaceClient.getPreviewReferenceInstant added thrown exception android.os.RemoteException
 ChangedThrows: androidx.wear.watchface.client.InteractiveWatchFaceClient#getUserStyleSchema():
     Method androidx.wear.watchface.client.InteractiveWatchFaceClient.getUserStyleSchema added thrown exception android.os.RemoteException
+
+
+RemovedClass: androidx.wear.watchface.client.DeviceConfigKt:
+    Removed class androidx.wear.watchface.client.DeviceConfigKt
+RemovedClass: androidx.wear.watchface.client.EditorStateKt:
+    Removed class androidx.wear.watchface.client.EditorStateKt
+RemovedClass: androidx.wear.watchface.client.WatchFaceExceptionKt:
+    Removed class androidx.wear.watchface.client.WatchFaceExceptionKt
diff --git a/wear/watchface/watchface-client/api/restricted_current.txt b/wear/watchface/watchface-client/api/restricted_current.txt
index 4e6173b..b7a6bc0 100644
--- a/wear/watchface/watchface-client/api/restricted_current.txt
+++ b/wear/watchface/watchface-client/api/restricted_current.txt
@@ -68,9 +68,6 @@
     property public final boolean hasLowBitAmbient;
   }
 
-  public final class DeviceConfigKt {
-  }
-
   public final class DisconnectReasons {
     field public static final int ENGINE_DETACHED = 2; // 0x2
     field public static final int ENGINE_DIED = 1; // 0x1
@@ -100,9 +97,6 @@
     property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
   }
 
-  public final class EditorStateKt {
-  }
-
   public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
     method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
@@ -213,9 +207,6 @@
     ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
-  public final class WatchFaceExceptionKt {
-  }
-
   public final class WatchFaceId {
     ctor public WatchFaceId(String id);
     method public String getId();
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
index 549cbff..8d38cfd 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
@@ -37,11 +37,12 @@
     @Test
     public fun registerObserver() {
         lateinit var observedEditorState: EditorState
-        val observer = object : EditorListener {
-            override fun onEditorStateChanged(editorState: EditorState) {
-                observedEditorState = editorState
+        val observer =
+            object : EditorListener {
+                override fun onEditorStateChanged(editorState: EditorState) {
+                    observedEditorState = editorState
+                }
             }
-        }
         editorServiceClient.addListener(observer) { runnable -> runnable.run() }
 
         val watchFaceInstanceId = "id-1"
@@ -71,4 +72,4 @@
         assertThat(editorStateString).contains("{color=red, size=small}")
         assertThat(editorStateString).contains("shouldCommitChanges: true")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/HeadlessWatchFaceClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/HeadlessWatchFaceClientTest.kt
index 7bdb9f6..d6c8fb5 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/HeadlessWatchFaceClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/HeadlessWatchFaceClientTest.kt
@@ -68,13 +68,7 @@
     protected fun createHeadlessWatchFaceClient(
         componentName: ComponentName = exampleCanvasAnalogWatchFaceComponentName
     ): HeadlessWatchFaceClient {
-        return service.createHeadlessWatchFaceClient(
-            "id",
-            componentName,
-            deviceConfig,
-            400,
-            400
-        )!!
+        return service.createHeadlessWatchFaceClient("id", componentName, deviceConfig, 400, 400)!!
     }
 
     protected val exampleCanvasAnalogWatchFaceComponentName =
@@ -83,12 +77,13 @@
     protected val exampleOpenGLWatchFaceComponentName =
         componentOf<ExampleOpenGLBackgroundInitWatchFaceService>()
 
-    protected val deviceConfig = DeviceConfig(
-        hasLowBitAmbient = false,
-        hasBurnInProtection = false,
-        analogPreviewReferenceTimeMillis = 0,
-        digitalPreviewReferenceTimeMillis = 0
-    )
+    protected val deviceConfig =
+        DeviceConfig(
+            hasLowBitAmbient = false,
+            hasBurnInProtection = false,
+            analogPreviewReferenceTimeMillis = 0,
+            digitalPreviewReferenceTimeMillis = 0
+        )
 }
 
 @RunWith(AndroidJUnit4::class)
@@ -102,54 +97,47 @@
 
         Truth.assertThat(headlessInstance.complicationSlotsState.size).isEqualTo(2)
 
-        val leftComplicationDetails = headlessInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-        ]!!
+        val leftComplicationDetails =
+            headlessInstance.complicationSlotsState[EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
         Truth.assertThat(leftComplicationDetails.bounds).isEqualTo(Rect(80, 160, 160, 240))
         Truth.assertThat(leftComplicationDetails.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-        Truth.assertThat(
-            leftComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(
-            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK
-        )
-        Truth.assertThat(leftComplicationDetails.defaultDataSourceType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
-        Truth.assertThat(leftComplicationDetails.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+        Truth.assertThat(leftComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK)
+        Truth.assertThat(leftComplicationDetails.defaultDataSourceType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        Truth.assertThat(leftComplicationDetails.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
         Assert.assertTrue(leftComplicationDetails.isEnabled)
 
-        val rightComplicationDetails = headlessInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        ]!!
+        val rightComplicationDetails =
+            headlessInstance.complicationSlotsState[
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
         Truth.assertThat(rightComplicationDetails.bounds).isEqualTo(Rect(240, 160, 320, 240))
         Truth.assertThat(rightComplicationDetails.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-        Truth.assertThat(
-            rightComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(
-            SystemDataSources.DATA_SOURCE_STEP_COUNT
-        )
-        Truth.assertThat(rightComplicationDetails.defaultDataSourceType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
-        Truth.assertThat(rightComplicationDetails.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+        Truth.assertThat(rightComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_STEP_COUNT)
+        Truth.assertThat(rightComplicationDetails.defaultDataSourceType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        Truth.assertThat(rightComplicationDetails.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
 
         Truth.assertThat(rightComplicationDetails.isEnabled).isTrue()
 
@@ -162,21 +150,16 @@
         val headlessInstance = createHeadlessWatchFaceClient()
 
         Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings.size).isEqualTo(5)
-        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[0].id.value).isEqualTo(
-            "color_style_setting"
-        )
-        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[1].id.value).isEqualTo(
-            "draw_hour_pips_style_setting"
-        )
-        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[2].id.value).isEqualTo(
-            "watch_hand_length_style_setting"
-        )
-        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[3].id.value).isEqualTo(
-            "complications_style_setting"
-        )
-        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[4].id.value).isEqualTo(
-            "hours_draw_freq_style_setting"
-        )
+        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[0].id.value)
+            .isEqualTo("color_style_setting")
+        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[1].id.value)
+            .isEqualTo("draw_hour_pips_style_setting")
+        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[2].id.value)
+            .isEqualTo("watch_hand_length_style_setting")
+        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[3].id.value)
+            .isEqualTo("complications_style_setting")
+        Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings[4].id.value)
+            .isEqualTo("hours_draw_freq_style_setting")
 
         headlessInstance.close()
     }
@@ -190,10 +173,12 @@
         Truth.assertThat(flavorA.id).isEqualTo("exampleFlavor")
         Truth.assertThat(flavorA.style.userStyleMap.containsKey("color_style_setting"))
         Truth.assertThat(flavorA.style.userStyleMap.containsKey("watch_hand_length_style_setting"))
-        Truth.assertThat(flavorA.complications
-            .containsKey(EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID))
-        Truth.assertThat(flavorA.complications
-            .containsKey(EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID))
+        Truth.assertThat(
+            flavorA.complications.containsKey(EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID)
+        )
+        Truth.assertThat(
+            flavorA.complications.containsKey(EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID)
+        )
 
         headlessInstance.close()
     }
@@ -201,50 +186,49 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     fun headlessToBundleAndCreateFromBundle() {
-        val headlessInstance = HeadlessWatchFaceClient.createFromBundle(
-            service.createHeadlessWatchFaceClient(
-                "id",
-                exampleCanvasAnalogWatchFaceComponentName,
-                deviceConfig,
-                400,
-                400
-            )!!.toBundle()
-        )
+        val headlessInstance =
+            HeadlessWatchFaceClient.createFromBundle(
+                service
+                    .createHeadlessWatchFaceClient(
+                        "id",
+                        exampleCanvasAnalogWatchFaceComponentName,
+                        deviceConfig,
+                        400,
+                        400
+                    )!!
+                    .toBundle()
+            )
 
         Truth.assertThat(headlessInstance.userStyleSchema.userStyleSettings.size).isEqualTo(5)
     }
 
     @Test
     fun computeUserStyleSchemaDigestHash() {
-        val headlessInstance1 = createHeadlessWatchFaceClient(
-            exampleCanvasAnalogWatchFaceComponentName
-        )
+        val headlessInstance1 =
+            createHeadlessWatchFaceClient(exampleCanvasAnalogWatchFaceComponentName)
 
-        val headlessInstance2 = createHeadlessWatchFaceClient(
-            exampleOpenGLWatchFaceComponentName
-        )
+        val headlessInstance2 = createHeadlessWatchFaceClient(exampleOpenGLWatchFaceComponentName)
 
-        Truth.assertThat(headlessInstance1.getUserStyleSchemaDigestHash()).isNotEqualTo(
-            headlessInstance2.getUserStyleSchemaDigestHash()
-        )
+        Truth.assertThat(headlessInstance1.getUserStyleSchemaDigestHash())
+            .isNotEqualTo(headlessInstance2.getUserStyleSchemaDigestHash())
     }
 
     @Test
     fun headlessLifeCycle() {
-        val headlessInstance = createHeadlessWatchFaceClient(
-            componentOf<TestLifeCycleWatchFaceService>()
-        )
+        val headlessInstance =
+            createHeadlessWatchFaceClient(componentOf<TestLifeCycleWatchFaceService>())
 
         // Blocks until the headless instance has been fully constructed.
         headlessInstance.previewReferenceInstant
         headlessInstance.close()
 
-        Truth.assertThat(TestLifeCycleWatchFaceService.lifeCycleEvents).containsExactly(
-            "WatchFaceService.onCreate",
-            "Renderer.constructed",
-            "Renderer.onDestroy",
-            "WatchFaceService.onDestroy"
-        )
+        Truth.assertThat(TestLifeCycleWatchFaceService.lifeCycleEvents)
+            .containsExactly(
+                "WatchFaceService.onCreate",
+                "Renderer.constructed",
+                "Renderer.onDestroy",
+                "WatchFaceService.onDestroy"
+            )
     }
 }
 
@@ -263,16 +247,13 @@
     fun headlessScreenshot() {
         val headlessInstance = createHeadlessWatchFaceClient()
 
-        val bitmap = headlessInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            headlessInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         bitmap.assertAgainstGolden(screenshotRule, "headlessScreenshot")
 
@@ -284,20 +265,21 @@
     fun yellowComplicationHighlights() {
         val headlessInstance = createHeadlessWatchFaceClient()
 
-        val bitmap = headlessInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                RenderParameters.HighlightLayer(
-                    RenderParameters.HighlightedElement.AllComplicationSlots,
-                    Color.YELLOW,
-                    Color.argb(128, 0, 0, 0) // Darken everything else.
-                )
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            headlessInstance.renderWatchFaceToBitmap(
+                RenderParameters(
+                    DrawMode.INTERACTIVE,
+                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                    RenderParameters.HighlightLayer(
+                        RenderParameters.HighlightedElement.AllComplicationSlots,
+                        Color.YELLOW,
+                        Color.argb(128, 0, 0, 0) // Darken everything else.
+                    )
+                ),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         bitmap.assertAgainstGolden(screenshotRule, "yellowComplicationHighlights")
 
@@ -309,20 +291,21 @@
     fun highlightOnlyLayer() {
         val headlessInstance = createHeadlessWatchFaceClient()
 
-        val bitmap = headlessInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                emptySet(),
-                RenderParameters.HighlightLayer(
-                    RenderParameters.HighlightedElement.AllComplicationSlots,
-                    Color.YELLOW,
-                    Color.argb(128, 0, 0, 0) // Darken everything else.
-                )
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            headlessInstance.renderWatchFaceToBitmap(
+                RenderParameters(
+                    DrawMode.INTERACTIVE,
+                    emptySet(),
+                    RenderParameters.HighlightLayer(
+                        RenderParameters.HighlightedElement.AllComplicationSlots,
+                        Color.YELLOW,
+                        Color.argb(128, 0, 0, 0) // Darken everything else.
+                    )
+                ),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         bitmap.assertAgainstGolden(screenshotRule, "highlightOnlyLayer")
 
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/ObservableServices.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/ObservableServices.kt
index 864dba7..4ed6b51 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/ObservableServices.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/ObservableServices.kt
@@ -48,6 +48,7 @@
 
         /**
          * Awaits for up to [maxDurationMillis] milliseconds the service to be bound.
+         *
          * @return True if the service is bound before the time runs out, or false otherwise.
          */
         fun awaitForServiceToBeBound(maxDurationMillis: Long): Boolean =
@@ -57,12 +58,13 @@
             latch = CountDownLatch(1)
         }
 
-        fun createPendingIntent(context: Context) = PendingIntent.getService(
-            context,
-            101,
-            Intent(context, ObservableServiceA::class.java),
-            PendingIntent.FLAG_IMMUTABLE
-        )
+        fun createPendingIntent(context: Context) =
+            PendingIntent.getService(
+                context,
+                101,
+                Intent(context, ObservableServiceA::class.java),
+                PendingIntent.FLAG_IMMUTABLE
+            )
     }
 }
 
@@ -72,6 +74,7 @@
 
         /**
          * Awaits for up to [maxDurationMillis] milliseconds the service to be bound.
+         *
          * @return True if the service is bound before the time runs out, or false otherwise.
          */
         fun awaitForServiceToBeBound(maxDurationMillis: Long): Boolean =
@@ -81,12 +84,13 @@
             latch = CountDownLatch(1)
         }
 
-        fun createPendingIntent(context: Context) = PendingIntent.getService(
-            context,
-            101,
-            Intent(context, ObservableServiceB::class.java),
-            PendingIntent.FLAG_IMMUTABLE
-        )
+        fun createPendingIntent(context: Context) =
+            PendingIntent.getService(
+                context,
+                101,
+                Intent(context, ObservableServiceB::class.java),
+                PendingIntent.FLAG_IMMUTABLE
+            )
     }
 }
 
@@ -96,6 +100,7 @@
 
         /**
          * Awaits for up to [maxDurationMillis] milliseconds the service to be bound.
+         *
          * @return True if the service is bound before the time runs out, or false otherwise.
          */
         fun awaitForServiceToBeBound(maxDurationMillis: Long): Boolean =
@@ -105,11 +110,12 @@
             latch = CountDownLatch(1)
         }
 
-        fun createPendingIntent(context: Context) = PendingIntent.getService(
-            context,
-            101,
-            Intent(context, ObservableServiceC::class.java),
-            PendingIntent.FLAG_IMMUTABLE
-        )
+        fun createPendingIntent(context: Context) =
+            PendingIntent.getService(
+                context,
+                101,
+                Intent(context, ObservableServiceC::class.java),
+                PendingIntent.FLAG_IMMUTABLE
+            )
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/OutdatedWatchFaceControlTestService.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/OutdatedWatchFaceControlTestService.kt
index aa19f94..47251b0 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/OutdatedWatchFaceControlTestService.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/OutdatedWatchFaceControlTestService.kt
@@ -20,9 +20,7 @@
 import android.content.Intent
 import android.os.IBinder
 
-/**
- * Test WatchFaceControlService which has obsolete XML version in manifest.
- */
+/** Test WatchFaceControlService which has obsolete XML version in manifest. */
 public class OutdatedWatchFaceControlTestService : Service() {
     override fun onBind(p0: Intent?): IBinder? {
         // It is not assumed to be called
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt
index 036ae1b..ff8ba4b 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt
@@ -25,32 +25,32 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.wear.watchface.complications.SystemDataSources
-import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.complications.data.LongTextComplicationData
-import androidx.wear.watchface.complications.data.ShortTextComplicationData
-import androidx.wear.watchface.complications.data.toApiComplicationData
+import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.client.ComplicationSlotState
 import androidx.wear.watchface.client.WatchFaceId
 import androidx.wear.watchface.client.asApiEditorState
+import androidx.wear.watchface.complications.SystemDataSources
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.data.LongTextComplicationData
+import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.data.toApiComplicationData
 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.ComplicationSlotBoundsType
 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 java.time.Instant
+import java.util.Base64
 import org.junit.Assume
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.time.Instant
-import java.util.Base64
 
 /** Tests that we can deserialize golden resources correctly to ensure backwards compatibility. */
 @RunWith(AndroidJUnit4::class)
@@ -80,9 +80,10 @@
 
     @Test
     public fun complicationRenderParams() {
-        val deserialized = loadGoldenResource(R.raw.complication_render_params) {
-            ComplicationRenderParams.CREATOR.createFromParcel(it)
-        }
+        val deserialized =
+            loadGoldenResource(R.raw.complication_render_params) {
+                ComplicationRenderParams.CREATOR.createFromParcel(it)
+            }
 
         assertThat(deserialized.complicationSlotId).isEqualTo(123)
         assertThat(RenderParameters(deserialized.renderParametersWireFormat))
@@ -94,9 +95,10 @@
                 )
             )
         assertThat(deserialized.calendarTimeMillis).isEqualTo(123456789)
-        assertThat(UserStyleData(deserialized.userStyle!!)).isEqualTo(
-            UserStyleData(mapOf("COLOR_STYLE_SETTING" to "GREEN_STYLE".encodeToByteArray()))
-        )
+        assertThat(UserStyleData(deserialized.userStyle!!))
+            .isEqualTo(
+                UserStyleData(mapOf("COLOR_STYLE_SETTING" to "GREEN_STYLE".encodeToByteArray()))
+            )
 
         val complication =
             deserialized.complicationData!!.toApiComplicationData() as LongTextComplicationData
@@ -108,9 +110,10 @@
 
     @Test
     public fun headlessWatchFaceInstanceParams() {
-        val deserialized = loadGoldenResource(R.raw.headless_watchface_instance_params) {
-            HeadlessWatchFaceInstanceParams.CREATOR.createFromParcel(it)
-        }
+        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()
@@ -133,7 +136,8 @@
         assertThat(deserialized.idAndComplicationDataWireFormats!![0].id).isEqualTo(1)
 
         val complication =
-            deserialized.idAndComplicationDataWireFormats!![0].complicationData
+            deserialized.idAndComplicationDataWireFormats!![0]
+                .complicationData
                 .toApiComplicationData() as LongTextComplicationData
         assertThat(complication.text.getTextAt(context.resources, Instant.EPOCH))
             .isEqualTo("Test Text")
@@ -146,47 +150,52 @@
         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()
+        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)
-        }
+        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.AllComplicationSlots,
-                    Color.RED,
-                    Color.argb(128, 0, 0, 0)
+        assertThat(RenderParameters(deserialized.renderParametersWireFormat))
+            .isEqualTo(
+                RenderParameters(
+                    DrawMode.INTERACTIVE,
+                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                    RenderParameters.HighlightLayer(
+                        RenderParameters.HighlightedElement.AllComplicationSlots,
+                        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(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
+            deserialized.idAndComplicationDatumWireFormats!![0]
+                .complicationData
                 .toApiComplicationData() as LongTextComplicationData
         assertThat(complicationA.text.getTextAt(context.resources, Instant.EPOCH))
             .isEqualTo("A Text")
@@ -195,7 +204,8 @@
 
         assertThat(deserialized.idAndComplicationDatumWireFormats!![1].id).isEqualTo(2)
         val complicationB =
-            deserialized.idAndComplicationDatumWireFormats!![1].complicationData
+            deserialized.idAndComplicationDatumWireFormats!![1]
+                .complicationData
                 .toApiComplicationData() as ShortTextComplicationData
         assertThat(complicationB.text.getTextAt(context.resources, Instant.EPOCH))
             .isEqualTo("B Text")
@@ -205,21 +215,19 @@
 
     @Test
     public fun complicationState() {
-        val deserialized = loadGoldenResource(R.raw.complication_state) {
-            ComplicationSlotState(ComplicationStateWireFormat.CREATOR.createFromParcel(it))
-        }
+        val deserialized =
+            loadGoldenResource(R.raw.complication_state) {
+                ComplicationSlotState(ComplicationStateWireFormat.CREATOR.createFromParcel(it))
+            }
 
         assertThat(deserialized.bounds).isEqualTo(Rect(1, 2, 3, 4))
         assertThat(deserialized.boundsType).isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-        assertThat(deserialized.supportedTypes).containsExactly(
-            ComplicationType.LONG_TEXT, ComplicationType.SHORT_TEXT
-        )
-        assertThat(deserialized.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-            SystemDataSources.DATA_SOURCE_DAY_AND_DATE
-        )
-        assertThat(deserialized.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
-            ComponentName("a", "b")
-        )
+        assertThat(deserialized.supportedTypes)
+            .containsExactly(ComplicationType.LONG_TEXT, ComplicationType.SHORT_TEXT)
+        assertThat(deserialized.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_AND_DATE)
+        assertThat(deserialized.defaultDataSourcePolicy.primaryDataSource)
+            .isEqualTo(ComponentName("a", "b"))
         assertThat(deserialized.defaultDataSourcePolicy.secondaryDataSource).isNull()
         assertThat(deserialized.currentType).isEqualTo(ComplicationType.SHORT_TEXT)
         assertThat(deserialized.isEnabled).isTrue()
@@ -230,25 +238,26 @@
 
     @Test
     public fun editorState() {
-        val deserialized = loadGoldenResource(R.raw.editor_state) {
-            EditorStateWireFormat.CREATOR.createFromParcel(it).asApiEditorState()
-        }
+        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.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, Instant.EPOCH))
-            .isEqualTo("Mon")
+        assertThat(complicationA.text.getTextAt(context.resources, Instant.EPOCH)).isEqualTo("Mon")
         assertThat(complicationA.title!!.getTextAt(context.resources, Instant.EPOCH))
             .isEqualTo("23rd")
         assertThat(complicationB.text.getTextAt(context.resources, Instant.EPOCH))
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestNopCanvasWatchFaceService.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestNopCanvasWatchFaceService.kt
index 31bca95..2305021 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestNopCanvasWatchFaceService.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestNopCanvasWatchFaceService.kt
@@ -37,33 +37,36 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                // Intentionally empty.
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    // Intentionally empty.
+                }
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                // Intentionally empty.
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    // Intentionally empty.
+                }
             }
+        )
+
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = 123456789L
+
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
         }
-    )
-
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = 123456789L
-
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestWatchFaceServices.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestWatchFaceServices.kt
index 4b7919d..1116fca 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestWatchFaceServices.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/TestWatchFaceServices.kt
@@ -82,29 +82,26 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.GlesRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            16
-        ) {
-            init {
-                lifeCycleEvents.add("Renderer.constructed")
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.GlesRenderer(surfaceHolder, currentUserStyleRepository, watchState, 16) {
+                init {
+                    lifeCycleEvents.add("Renderer.constructed")
+                }
+
+                override fun onDestroy() {
+                    super.onDestroy()
+                    lifeCycleEvents.add("Renderer.onDestroy")
+                }
+
+                override fun render(zonedDateTime: ZonedDateTime) {}
+
+                override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {}
             }
-
-            override fun onDestroy() {
-                super.onDestroy()
-                lifeCycleEvents.add("Renderer.onDestroy")
-            }
-
-            override fun render(zonedDateTime: ZonedDateTime) {}
-
-            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {}
-        }
-    )
+        )
 }
 
 internal class TestExampleCanvasAnalogWatchFaceService(
@@ -125,12 +122,13 @@
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
-        watchFace = super.createWatchFace(
-            surfaceHolder,
-            watchState,
-            complicationSlotsManager,
-            currentUserStyleRepository
-        )
+        watchFace =
+            super.createWatchFace(
+                surfaceHolder,
+                watchState,
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
         return watchFace
     }
 
@@ -138,11 +136,12 @@
         var systemTimeMillis = 1000000000L
     }
 
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = systemTimeMillis
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = systemTimeMillis
 
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
+        }
 }
 
 internal class TestExampleOpenGLBackgroundInitWatchFaceService(
@@ -163,12 +162,13 @@
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
-        watchFace = super.createWatchFace(
-            surfaceHolder,
-            watchState,
-            complicationSlotsManager,
-            currentUserStyleRepository
-        )
+        watchFace =
+            super.createWatchFace(
+                surfaceHolder,
+                watchState,
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
         return watchFace
     }
 }
@@ -185,15 +185,16 @@
         return ComplicationSlotsManager(
             listOf(
                 ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                    COMPLICATION_ID,
-                    { _, _ -> throw Exception("Deliberately crashing") },
-                    listOf(ComplicationType.LONG_TEXT),
-                    DefaultComplicationDataSourcePolicy(
-                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
-                        ComplicationType.LONG_TEXT
-                    ),
-                    ComplicationSlotBounds(RectF(0.1f, 0.1f, 0.4f, 0.4f))
-                ).build()
+                        COMPLICATION_ID,
+                        { _, _ -> throw Exception("Deliberately crashing") },
+                        listOf(ComplicationType.LONG_TEXT),
+                        DefaultComplicationDataSourcePolicy(
+                            SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                            ComplicationType.LONG_TEXT
+                        ),
+                        ComplicationSlotBounds(RectF(0.1f, 0.1f, 0.4f, 0.4f))
+                    )
+                    .build()
             ),
             currentUserStyleRepository
         )
@@ -226,29 +227,36 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                // Actually rendering something isn't required.
-            }
+    ) =
+        WatchFace(
+                WatchFaceType.DIGITAL,
+                @Suppress("deprecation")
+                object :
+                    Renderer.CanvasRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        CanvasType.HARDWARE,
+                        16
+                    ) {
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                        // Actually rendering something isn't required.
+                    }
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                // Actually rendering something isn't required.
-            }
-        }
-    ).setOverlayStyle(watchFaceOverlayStyle)
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                        // Actually rendering something isn't required.
+                    }
+                }
+            )
+            .setOverlayStyle(watchFaceOverlayStyle)
 }
 
 internal class TestAsyncCanvasRenderInitWatchFaceService(
@@ -268,39 +276,42 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override suspend fun init() {
-                initCompletableDeferred.await()
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override suspend fun init() {
+                    initCompletableDeferred.await()
+                }
 
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                // Actually rendering something isn't required.
-            }
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    // Actually rendering something isn't required.
+                }
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                TODO("Not yet implemented")
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    TODO("Not yet implemented")
+                }
             }
+        )
+
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = 123456789L
+
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
         }
-    )
-
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = 123456789L
-
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
 }
 
 internal class TestAsyncGlesRenderInitWatchFaceService(
@@ -322,32 +333,29 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.GlesRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            16
-        ) {
-            override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
-                onUiThreadGlSurfaceCreatedCompletableDeferred.await()
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.GlesRenderer(surfaceHolder, currentUserStyleRepository, watchState, 16) {
+                override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
+                    onUiThreadGlSurfaceCreatedCompletableDeferred.await()
+                }
 
-            override suspend fun onBackgroundThreadGlContextCreated() {
-                onBackgroundThreadGlContextCreatedCompletableDeferred.await()
-            }
+                override suspend fun onBackgroundThreadGlContextCreated() {
+                    onBackgroundThreadGlContextCreatedCompletableDeferred.await()
+                }
 
-            override fun render(zonedDateTime: ZonedDateTime) {
-                // GLES rendering is complicated and not strictly necessary for our test.
-            }
+                override fun render(zonedDateTime: ZonedDateTime) {
+                    // GLES rendering is complicated and not strictly necessary for our test.
+                }
 
-            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
-                TODO("Not yet implemented")
+                override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
+                    TODO("Not yet implemented")
+                }
             }
-        }
-    )
+        )
 }
 
 internal class TestComplicationProviderDefaultsWatchFaceService(
@@ -367,53 +375,48 @@
         return ComplicationSlotsManager(
             listOf(
                 ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                    123,
-                    { _, _ ->
-                        object : CanvasComplication {
-                            override fun render(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                zonedDateTime: ZonedDateTime,
-                                renderParameters: RenderParameters,
-                                slotId: Int
-                            ) {
-                            }
+                        123,
+                        { _, _ ->
+                            object : CanvasComplication {
+                                override fun render(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    zonedDateTime: ZonedDateTime,
+                                    renderParameters: RenderParameters,
+                                    slotId: Int
+                                ) {}
 
-                            override fun drawHighlight(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                boundsType: Int,
-                                zonedDateTime: ZonedDateTime,
-                                color: Int
-                            ) {
-                            }
+                                override fun drawHighlight(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    boundsType: Int,
+                                    zonedDateTime: ZonedDateTime,
+                                    color: Int
+                                ) {}
 
-                            override fun getData() = NoDataComplicationData()
+                                override fun getData() = NoDataComplicationData()
 
-                            override fun loadData(
-                                complicationData: ComplicationData,
-                                loadDrawablesAsynchronous: Boolean
-                            ) {
+                                override fun loadData(
+                                    complicationData: ComplicationData,
+                                    loadDrawablesAsynchronous: Boolean
+                                ) {}
                             }
-                        }
-                    },
-                    listOf(
-                        ComplicationType.PHOTO_IMAGE,
-                        ComplicationType.LONG_TEXT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    DefaultComplicationDataSourcePolicy(
-                        ComponentName("com.package1", "com.app1"),
-                        ComplicationType.PHOTO_IMAGE,
-                        ComponentName("com.package2", "com.app2"),
-                        ComplicationType.LONG_TEXT,
-                        SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    ComplicationSlotBounds(
-                        RectF(0.1f, 0.2f, 0.3f, 0.4f)
+                        },
+                        listOf(
+                            ComplicationType.PHOTO_IMAGE,
+                            ComplicationType.LONG_TEXT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        DefaultComplicationDataSourcePolicy(
+                            ComponentName("com.package1", "com.app1"),
+                            ComplicationType.PHOTO_IMAGE,
+                            ComponentName("com.package2", "com.app2"),
+                            ComplicationType.LONG_TEXT,
+                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        ComplicationSlotBounds(RectF(0.1f, 0.2f, 0.3f, 0.4f))
                     )
-                )
                     .build()
             ),
             currentUserStyleRepository
@@ -425,26 +428,27 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
-    )
+        )
 }
 
 internal class TestEdgeComplicationWatchFaceService(
@@ -465,54 +469,49 @@
         return ComplicationSlotsManager(
             listOf(
                 ComplicationSlot.createEdgeComplicationSlotBuilder(
-                    123,
-                    { _, _ ->
-                        object : CanvasComplication {
-                            override fun render(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                zonedDateTime: ZonedDateTime,
-                                renderParameters: RenderParameters,
-                                slotId: Int
-                            ) {
-                            }
+                        123,
+                        { _, _ ->
+                            object : CanvasComplication {
+                                override fun render(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    zonedDateTime: ZonedDateTime,
+                                    renderParameters: RenderParameters,
+                                    slotId: Int
+                                ) {}
 
-                            override fun drawHighlight(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                boundsType: Int,
-                                zonedDateTime: ZonedDateTime,
-                                color: Int
-                            ) {
-                            }
+                                override fun drawHighlight(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    boundsType: Int,
+                                    zonedDateTime: ZonedDateTime,
+                                    color: Int
+                                ) {}
 
-                            override fun getData() = NoDataComplicationData()
+                                override fun getData() = NoDataComplicationData()
 
-                            override fun loadData(
-                                complicationData: ComplicationData,
-                                loadDrawablesAsynchronous: Boolean
-                            ) {
+                                override fun loadData(
+                                    complicationData: ComplicationData,
+                                    loadDrawablesAsynchronous: Boolean
+                                ) {}
                             }
-                        }
-                    },
-                    listOf(
-                        ComplicationType.PHOTO_IMAGE,
-                        ComplicationType.LONG_TEXT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    DefaultComplicationDataSourcePolicy(
-                        ComponentName("com.package1", "com.app1"),
-                        ComplicationType.PHOTO_IMAGE,
-                        ComponentName("com.package2", "com.app2"),
-                        ComplicationType.LONG_TEXT,
-                        SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    ComplicationSlotBounds(
-                        RectF(0f, 0f, 1f, 1f)
-                    ),
-                    BoundingArc(45f, 90f, 0.1f)
-                )
+                        },
+                        listOf(
+                            ComplicationType.PHOTO_IMAGE,
+                            ComplicationType.LONG_TEXT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        DefaultComplicationDataSourcePolicy(
+                            ComponentName("com.package1", "com.app1"),
+                            ComplicationType.PHOTO_IMAGE,
+                            ComponentName("com.package2", "com.app2"),
+                            ComplicationType.LONG_TEXT,
+                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        ComplicationSlotBounds(RectF(0f, 0f, 1f, 1f)),
+                        BoundingArc(45f, 90f, 0.1f)
+                    )
                     .build()
             ),
             currentUserStyleRepository
@@ -524,26 +523,27 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
-    )
+        )
 }
 
 internal class TestWatchFaceServiceWithPreviewImageUpdateRequest(
@@ -558,8 +558,7 @@
 
     override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
 
-    @Suppress("deprecation")
-    private lateinit var renderer: Renderer.CanvasRenderer
+    @Suppress("deprecation") private lateinit var renderer: Renderer.CanvasRenderer
 
     fun triggerPreviewImageUpdateRequest() {
         renderer.sendPreviewImageNeedsUpdateRequest()
@@ -572,26 +571,27 @@
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
         @Suppress("deprecation")
-        renderer = object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override suspend fun init() {
-                rendererInitializedLatch.countDown()
-            }
+        renderer =
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override suspend fun init() {
+                    rendererInitializedLatch.countDown()
+                }
 
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
         return WatchFace(WatchFaceType.DIGITAL, renderer)
     }
 }
@@ -613,35 +613,35 @@
             R.string.watchface_complications_setting,
             R.string.watchface_complications_setting_description,
             icon = null,
-            complicationConfig = listOf(
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id(NO_COMPLICATIONS),
-                    resources,
-                    R.string.watchface_complications_setting_none,
-                    null,
-                    listOf(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            123,
-                            enabled = false
+            complicationConfig =
+                listOf(
+                    UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id(NO_COMPLICATIONS),
+                        resources,
+                        R.string.watchface_complications_setting_none,
+                        null,
+                        listOf(
+                            UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                .ComplicationSlotOverlay(123, enabled = false)
+                        )
+                    ),
+                    UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id(LEFT_COMPLICATION),
+                        resources,
+                        R.string.watchface_complications_setting_left,
+                        null,
+                        listOf(
+                            UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                .ComplicationSlotOverlay(
+                                    123,
+                                    enabled = true,
+                                    nameResourceId = R.string.left_complication_screen_name,
+                                    screenReaderNameResourceId =
+                                        R.string.left_complication_screen_reader_name
+                                )
                         )
                     )
                 ),
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id(LEFT_COMPLICATION),
-                    resources,
-                    R.string.watchface_complications_setting_left,
-                    null,
-                    listOf(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            123,
-                            enabled = true,
-                            nameResourceId = R.string.left_complication_screen_name,
-                            screenReaderNameResourceId =
-                            R.string.left_complication_screen_reader_name
-                        )
-                    )
-                )
-            ),
             listOf(WatchFaceLayer.COMPLICATIONS)
         )
 
@@ -656,53 +656,49 @@
         return ComplicationSlotsManager(
             listOf(
                 ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                    123,
-                    { _, _ ->
-                        object : CanvasComplication {
-                            override fun render(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                zonedDateTime: ZonedDateTime,
-                                renderParameters: RenderParameters,
-                                slotId: Int
-                            ) {
-                            }
+                        123,
+                        { _, _ ->
+                            object : CanvasComplication {
+                                override fun render(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    zonedDateTime: ZonedDateTime,
+                                    renderParameters: RenderParameters,
+                                    slotId: Int
+                                ) {}
 
-                            override fun drawHighlight(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                boundsType: Int,
-                                zonedDateTime: ZonedDateTime,
-                                color: Int
-                            ) {
-                            }
+                                override fun drawHighlight(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    boundsType: Int,
+                                    zonedDateTime: ZonedDateTime,
+                                    color: Int
+                                ) {}
 
-                            override fun getData() = NoDataComplicationData()
+                                override fun getData() = NoDataComplicationData()
 
-                            override fun loadData(
-                                complicationData: ComplicationData,
-                                loadDrawablesAsynchronous: Boolean
-                            ) {
+                                override fun loadData(
+                                    complicationData: ComplicationData,
+                                    loadDrawablesAsynchronous: Boolean
+                                ) {}
                             }
-                        }
-                    },
-                    listOf(
-                        ComplicationType.PHOTO_IMAGE,
-                        ComplicationType.LONG_TEXT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    DefaultComplicationDataSourcePolicy(
-                        ComponentName("com.package1", "com.app1"),
-                        ComplicationType.PHOTO_IMAGE,
-                        ComponentName("com.package2", "com.app2"),
-                        ComplicationType.LONG_TEXT,
-                        SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    ComplicationSlotBounds(
-                        RectF(0.1f, 0.2f, 0.3f, 0.4f)
+                        },
+                        listOf(
+                            ComplicationType.PHOTO_IMAGE,
+                            ComplicationType.LONG_TEXT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        DefaultComplicationDataSourcePolicy(
+                            ComponentName("com.package1", "com.app1"),
+                            ComplicationType.PHOTO_IMAGE,
+                            ComponentName("com.package2", "com.app2"),
+                            ComplicationType.LONG_TEXT,
+                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        ComplicationSlotBounds(RectF(0.1f, 0.2f, 0.3f, 0.4f))
                     )
-                ).build()
+                    .build()
             ),
             currentUserStyleRepository
         )
@@ -713,26 +709,27 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.ANALOG,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ) =
+        WatchFace(
+            WatchFaceType.ANALOG,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
-    )
+        )
 }
 
 internal class TestCustomTapFilterWatchFaceService(
@@ -753,62 +750,57 @@
         return ComplicationSlotsManager(
             listOf(
                 ComplicationSlot.createEdgeComplicationSlotBuilder(
-                    123,
-                    { _, _ ->
-                        object : CanvasComplication {
-                            override fun render(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                zonedDateTime: ZonedDateTime,
-                                renderParameters: RenderParameters,
-                                slotId: Int
-                            ) {
-                            }
+                        123,
+                        { _, _ ->
+                            object : CanvasComplication {
+                                override fun render(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    zonedDateTime: ZonedDateTime,
+                                    renderParameters: RenderParameters,
+                                    slotId: Int
+                                ) {}
 
-                            override fun drawHighlight(
-                                canvas: Canvas,
-                                bounds: Rect,
-                                boundsType: Int,
-                                zonedDateTime: ZonedDateTime,
-                                color: Int
-                            ) {
-                            }
+                                override fun drawHighlight(
+                                    canvas: Canvas,
+                                    bounds: Rect,
+                                    boundsType: Int,
+                                    zonedDateTime: ZonedDateTime,
+                                    color: Int
+                                ) {}
 
-                            override fun getData() = NoDataComplicationData()
+                                override fun getData() = NoDataComplicationData()
 
-                            override fun loadData(
-                                complicationData: ComplicationData,
-                                loadDrawablesAsynchronous: Boolean
-                            ) {
+                                override fun loadData(
+                                    complicationData: ComplicationData,
+                                    loadDrawablesAsynchronous: Boolean
+                                ) {}
                             }
+                        },
+                        listOf(
+                            ComplicationType.PHOTO_IMAGE,
+                            ComplicationType.LONG_TEXT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        DefaultComplicationDataSourcePolicy(
+                            ComponentName("com.package1", "com.app1"),
+                            ComplicationType.PHOTO_IMAGE,
+                            ComponentName("com.package2", "com.app2"),
+                            ComplicationType.LONG_TEXT,
+                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                            ComplicationType.SHORT_TEXT
+                        ),
+                        ComplicationSlotBounds(RectF(0f, 0f, 1f, 1f)),
+                        object : ComplicationTapFilter {
+                            override fun hitTest(
+                                complicationSlot: ComplicationSlot,
+                                screenBounds: Rect,
+                                @Px x: Int,
+                                @Px y: Int,
+                                includeMargins: Boolean
+                            ): Boolean = (x % 2 == 0) && (y % 2 == 0)
                         }
-                    },
-                    listOf(
-                        ComplicationType.PHOTO_IMAGE,
-                        ComplicationType.LONG_TEXT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    DefaultComplicationDataSourcePolicy(
-                        ComponentName("com.package1", "com.app1"),
-                        ComplicationType.PHOTO_IMAGE,
-                        ComponentName("com.package2", "com.app2"),
-                        ComplicationType.LONG_TEXT,
-                        SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                        ComplicationType.SHORT_TEXT
-                    ),
-                    ComplicationSlotBounds(
-                        RectF(0f, 0f, 1f, 1f)
-                    ),
-                    object : ComplicationTapFilter {
-                        override fun hitTest(
-                            complicationSlot: ComplicationSlot,
-                            screenBounds: Rect,
-                            @Px x: Int,
-                            @Px y: Int,
-                            includeMargins: Boolean
-                        ): Boolean = (x % 2 == 0) && (y % 2 == 0)
-                    }
-                )
+                    )
                     .build()
             ),
             currentUserStyleRepository
@@ -820,58 +812,65 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
-    )
+        )
 }
 
 internal object TestServicesHelpers {
-    fun createTestComplications(context: Context) = mapOf(
-        ExampleCanvasAnalogWatchFaceService.EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("ID").build(),
-                ComplicationText.EMPTY
-            ).setTitle(PlainComplicationText.Builder("Left").build())
-                .setTapAction(
-                    PendingIntent.getActivity(context, 0, Intent("left"),
-                        PendingIntent.FLAG_IMMUTABLE
+    fun createTestComplications(context: Context) =
+        mapOf(
+            ExampleCanvasAnalogWatchFaceService.EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("ID").build(),
+                        ComplicationText.EMPTY
                     )
-                )
-                .build(),
-        ExampleCanvasAnalogWatchFaceService.EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("ID").build(),
-                ComplicationText.EMPTY
-            ).setTitle(PlainComplicationText.Builder("Right").build())
-                .setTapAction(
-                    PendingIntent.getActivity(context, 0, Intent("right"),
-                        PendingIntent.FLAG_IMMUTABLE
+                    .setTitle(PlainComplicationText.Builder("Left").build())
+                    .setTapAction(
+                        PendingIntent.getActivity(
+                            context,
+                            0,
+                            Intent("left"),
+                            PendingIntent.FLAG_IMMUTABLE
+                        )
                     )
-                )
-                .build()
-    )
-
-    inline fun <reified T>componentOf(): ComponentName {
-        return ComponentName(
-            T::class.java.`package`?.name!!,
-            T::class.java.name
+                    .build(),
+            ExampleCanvasAnalogWatchFaceService.EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("ID").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .setTitle(PlainComplicationText.Builder("Right").build())
+                    .setTapAction(
+                        PendingIntent.getActivity(
+                            context,
+                            0,
+                            Intent("right"),
+                            PendingIntent.FLAG_IMMUTABLE
+                        )
+                    )
+                    .build()
         )
+
+    inline fun <reified T> componentOf(): ComponentName {
+        return ComponentName(T::class.java.`package`?.name!!, T::class.java.name)
     }
 }
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index ad4a176..365da36 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -137,14 +137,11 @@
         )
     }
 
-    @Mock
-    protected lateinit var surfaceHolder: SurfaceHolder
+    @Mock protected lateinit var surfaceHolder: SurfaceHolder
 
-    @Mock
-    protected lateinit var surfaceHolder2: SurfaceHolder
+    @Mock protected lateinit var surfaceHolder2: SurfaceHolder
 
-    @Mock
-    private lateinit var surface: Surface
+    @Mock private lateinit var surface: Surface
 
     protected val handler = Handler(Looper.getMainLooper())
     protected val handlerCoroutineScope =
@@ -152,12 +149,13 @@
 
     protected lateinit var engine: WatchFaceService.EngineWrapper
 
-    protected val deviceConfig = DeviceConfig(
-        hasLowBitAmbient = false,
-        hasBurnInProtection = false,
-        analogPreviewReferenceTimeMillis = 0,
-        digitalPreviewReferenceTimeMillis = 0
-    )
+    protected val deviceConfig =
+        DeviceConfig(
+            hasLowBitAmbient = false,
+            hasBurnInProtection = false,
+            analogPreviewReferenceTimeMillis = 0,
+            digitalPreviewReferenceTimeMillis = 0
+        )
 
     protected val systemState = WatchUiState(false, 0)
 
@@ -167,8 +165,7 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
         WatchFaceControlTestService.apiVersionOverride = null
-        Mockito.`when`(surfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
+        Mockito.`when`(surfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 400, 400))
         Mockito.`when`(surfaceHolder.surface).thenReturn(surface)
         Mockito.`when`(surface.isValid).thenReturn(false)
     }
@@ -198,28 +195,29 @@
         previewExecutor: Executor? = null,
         previewListener: Consumer<String>? = null
     ): InteractiveWatchFaceClient {
-        val deferredInteractiveInstance = handlerCoroutineScope.async {
-            if (previewExecutor != null && previewListener != null) {
-                service.getOrCreateInteractiveWatchFaceClient(
-                    instanceId,
-                    deviceConfig,
-                    systemState,
-                    userStyle,
-                    complications,
-                    previewExecutor,
-                    previewListener
-                )
-            } else {
-                @Suppress("deprecation")
-                service.getOrCreateInteractiveWatchFaceClient(
-                    instanceId,
-                    deviceConfig,
-                    systemState,
-                    userStyle,
-                    complications
-                )
+        val deferredInteractiveInstance =
+            handlerCoroutineScope.async {
+                if (previewExecutor != null && previewListener != null) {
+                    service.getOrCreateInteractiveWatchFaceClient(
+                        instanceId,
+                        deviceConfig,
+                        systemState,
+                        userStyle,
+                        complications,
+                        previewExecutor,
+                        previewListener
+                    )
+                } else {
+                    @Suppress("deprecation")
+                    service.getOrCreateInteractiveWatchFaceClient(
+                        instanceId,
+                        deviceConfig,
+                        systemState,
+                        userStyle,
+                        complications
+                    )
+                }
             }
-        }
 
         // Create the engine which triggers construction of the interactive instance.
         handler.post {
@@ -246,10 +244,7 @@
         return value!!
     }
 
-    protected fun tapOnComplication(
-        interactiveInstance: InteractiveWatchFaceClient,
-        slotId: Int
-    ) {
+    protected fun tapOnComplication(interactiveInstance: InteractiveWatchFaceClient, slotId: Int) {
         val leftClickX = interactiveInstance.complicationSlotsState[slotId]!!.bounds.centerX()
         val leftClickY = interactiveInstance.complicationSlotsState[slotId]!!.bounds.centerY()
 
@@ -260,11 +255,11 @@
 
 fun rangedValueComplicationBuilder() =
     RangedValueComplicationData.Builder(
-        value = 50.0f,
-        min = 10.0f,
-        max = 100.0f,
-        ComplicationText.EMPTY
-    )
+            value = 50.0f,
+            min = 10.0f,
+            max = 100.0f,
+            ComplicationText.EMPTY
+        )
         .setText(PlainComplicationText.Builder("Battery").build())
 
 @RunWith(AndroidJUnit4::class)
@@ -285,13 +280,9 @@
 
     @Test
     fun complicationProviderDefaults() {
-        val wallpaperService = TestComplicationProviderDefaultsWatchFaceService(
-            context,
-            surfaceHolder
-        )
-        val interactiveInstance = getOrCreateTestSubject(
-            wallpaperService
-        )
+        val wallpaperService =
+            TestComplicationProviderDefaultsWatchFaceService(context, surfaceHolder)
+        val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
         try {
             assertThat(interactiveInstance.complicationSlotsState.keys).containsExactly(123)
@@ -317,13 +308,9 @@
 
     @Test
     fun unspecifiedComplicationSlotNames() {
-        val wallpaperService = TestComplicationProviderDefaultsWatchFaceService(
-            context,
-            surfaceHolder
-        )
-        val interactiveInstance = getOrCreateTestSubject(
-            wallpaperService
-        )
+        val wallpaperService =
+            TestComplicationProviderDefaultsWatchFaceService(context, surfaceHolder)
+        val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
         try {
             assertThat(interactiveInstance.complicationSlotsState.keys).containsExactly(123)
@@ -339,10 +326,7 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     fun specifiedComplicationSlotNamesThroughComplicationSlotOption() {
-        val wallpaperService = TestComplicationStyleUpdateWatchFaceService(
-            context,
-            surfaceHolder
-        )
+        val wallpaperService = TestComplicationStyleUpdateWatchFaceService(context, surfaceHolder)
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -355,9 +339,7 @@
         interactiveInstance.updateWatchFaceInstance(
             "testId",
             UserStyle(
-                selectedOptions = mapOf(
-                    leftComplicationUserStyleSetting to optionWithNameOverride
-                )
+                selectedOptions = mapOf(leftComplicationUserStyleSetting to optionWithNameOverride)
             )
         )
 
@@ -380,69 +362,59 @@
 
         assertThat(interactiveInstance.complicationSlotsState.size).isEqualTo(2)
 
-        val leftComplicationDetails = interactiveInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-        ]!!
+        val leftComplicationDetails =
+            interactiveInstance.complicationSlotsState[
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
         assertThat(leftComplicationDetails.bounds).isEqualTo(Rect(80, 160, 160, 240))
         assertThat(leftComplicationDetails.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-        assertThat(
-            leftComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(
-            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK
-        )
-        assertThat(leftComplicationDetails.defaultDataSourceType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
-        assertThat(leftComplicationDetails.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+        assertThat(leftComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK)
+        assertThat(leftComplicationDetails.defaultDataSourceType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        assertThat(leftComplicationDetails.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
         assertTrue(leftComplicationDetails.isEnabled)
-        assertThat(leftComplicationDetails.currentType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
+        assertThat(leftComplicationDetails.currentType).isEqualTo(ComplicationType.SHORT_TEXT)
         assertThat(leftComplicationDetails.nameResourceId)
             .isEqualTo(R.string.left_complication_screen_name)
-        assertThat(leftComplicationDetails.screenReaderNameResourceId).isEqualTo(
-            R.string.left_complication_screen_reader_name
-        )
+        assertThat(leftComplicationDetails.screenReaderNameResourceId)
+            .isEqualTo(R.string.left_complication_screen_reader_name)
 
-        val rightComplicationDetails = interactiveInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        ]!!
+        val rightComplicationDetails =
+            interactiveInstance.complicationSlotsState[
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
         assertThat(rightComplicationDetails.bounds).isEqualTo(Rect(240, 160, 320, 240))
         assertThat(rightComplicationDetails.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-        assertThat(
-            rightComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(SystemDataSources.DATA_SOURCE_STEP_COUNT)
-        assertThat(rightComplicationDetails.defaultDataSourceType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
-        assertThat(rightComplicationDetails.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+        assertThat(rightComplicationDetails.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_STEP_COUNT)
+        assertThat(rightComplicationDetails.defaultDataSourceType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        assertThat(rightComplicationDetails.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
         assertTrue(rightComplicationDetails.isEnabled)
-        assertThat(rightComplicationDetails.currentType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
+        assertThat(rightComplicationDetails.currentType).isEqualTo(ComplicationType.SHORT_TEXT)
         assertThat(rightComplicationDetails.nameResourceId)
             .isEqualTo(R.string.right_complication_screen_name)
-        assertThat(rightComplicationDetails.screenReaderNameResourceId).isEqualTo(
-            R.string.right_complication_screen_reader_name
-        )
+        assertThat(rightComplicationDetails.screenReaderNameResourceId)
+            .isEqualTo(R.string.right_complication_screen_reader_name)
 
         interactiveInstance.close()
     }
@@ -457,27 +429,24 @@
                     rangedValueComplicationBuilder().build(),
                 EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
                     LongTextComplicationData.Builder(
-                        PlainComplicationText.Builder("Test").build(),
-                        ComplicationText.EMPTY
-                    ).build()
+                            PlainComplicationText.Builder("Test").build(),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
             )
         )
 
         assertThat(interactiveInstance.complicationSlotsState.size).isEqualTo(2)
 
-        val leftComplicationDetails = interactiveInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-        ]!!
-        val rightComplicationDetails = interactiveInstance.complicationSlotsState[
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        ]!!
+        val leftComplicationDetails =
+            interactiveInstance.complicationSlotsState[
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
+        val rightComplicationDetails =
+            interactiveInstance.complicationSlotsState[
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
 
-        assertThat(leftComplicationDetails.currentType).isEqualTo(
-            ComplicationType.RANGED_VALUE
-        )
-        assertThat(rightComplicationDetails.currentType).isEqualTo(
-            ComplicationType.LONG_TEXT
-        )
+        assertThat(leftComplicationDetails.currentType).isEqualTo(ComplicationType.RANGED_VALUE)
+        assertThat(rightComplicationDetails.currentType).isEqualTo(ComplicationType.LONG_TEXT)
     }
 
     @Test
@@ -486,19 +455,19 @@
 
         getOrCreateTestSubject(watchFaceService)
 
-        val deferredInteractiveInstance2 = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            service.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                deviceConfig,
-                systemState,
-                null,
-                complications
-            )
-        }
+        val deferredInteractiveInstance2 =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                service.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    deviceConfig,
+                    systemState,
+                    null,
+                    complications
+                )
+            }
 
-        assertThat(awaitWithTimeout(deferredInteractiveInstance2).instanceId)
-            .isEqualTo("testId")
+        assertThat(awaitWithTimeout(deferredInteractiveInstance2).instanceId).isEqualTo("testId")
     }
 
     @Test
@@ -513,23 +482,22 @@
         interactiveInstance.close()
 
         // Connect again to the same wallpaperService instance
-        val deferredExistingInstance = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            service.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                deviceConfig,
-                systemState,
-                null,
-                complications
-            )
-        }
+        val deferredExistingInstance =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                service.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    deviceConfig,
+                    systemState,
+                    null,
+                    complications
+                )
+            }
 
         assertFalse(deferredExistingInstance.isCompleted)
 
         // We don't want to leave a pending request or it'll mess up subsequent tests.
-        handler.post {
-            wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
-        }
+        handler.post { wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper }
 
         awaitWithTimeout(deferredExistingInstance)
     }
@@ -541,29 +509,25 @@
         getOrCreateTestSubject(instanceId = testId)
 
         // Get the instance created above
-        val sysUiInterface =
-            service.getInteractiveWatchFaceClientInstance(testId)!!
+        val sysUiInterface = service.getInteractiveWatchFaceClientInstance(testId)!!
 
         val contentDescriptionLabels = sysUiInterface.contentDescriptionLabels
         assertThat(contentDescriptionLabels.size).isEqualTo(3)
         // 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, Instant.EPOCH)
-        ).isNotEqualTo("")
+        assertThat(contentDescriptionLabels[0].getTextAt(context.resources, Instant.EPOCH))
+            .isNotEqualTo("")
 
         // Left complication.
         assertThat(contentDescriptionLabels[1].bounds).isEqualTo(Rect(80, 160, 160, 240))
-        assertThat(
-            contentDescriptionLabels[1].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("ID Left")
+        assertThat(contentDescriptionLabels[1].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("ID Left")
 
         // Right complication.
         assertThat(contentDescriptionLabels[2].bounds).isEqualTo(Rect(240, 160, 320, 240))
-        assertThat(
-            contentDescriptionLabels[2].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("ID Right")
+        assertThat(contentDescriptionLabels[2].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("ID Right")
 
         assertThat(sysUiInterface.overlayStyle.backgroundColor).isNull()
         assertThat(sysUiInterface.overlayStyle.foregroundColor).isNull()
@@ -583,36 +547,31 @@
         interactiveInstance.previewReferenceInstant
 
         // Add some additional ContentDescriptionLabels
-        val pendingIntent1 = PendingIntent.getActivity(
-            context, 0, Intent("One"),
-            PendingIntent.FLAG_IMMUTABLE
-        )
-        val pendingIntent2 = PendingIntent.getActivity(
-            context, 0, Intent("Two"),
-            PendingIntent.FLAG_IMMUTABLE
-        )
-        (wallpaperService)
-            .watchFace.renderer.additionalContentDescriptionLabels = listOf(
-            Pair(
-                0,
-                ContentDescriptionLabel(
-                    PlainComplicationText.Builder("Before").build(),
-                    Rect(10, 10, 20, 20),
-                    pendingIntent1
-                )
-            ),
-            Pair(
-                20000,
-                ContentDescriptionLabel(
-                    PlainComplicationText.Builder("After").build(),
-                    Rect(30, 30, 40, 40),
-                    pendingIntent2
+        val pendingIntent1 =
+            PendingIntent.getActivity(context, 0, Intent("One"), PendingIntent.FLAG_IMMUTABLE)
+        val pendingIntent2 =
+            PendingIntent.getActivity(context, 0, Intent("Two"), PendingIntent.FLAG_IMMUTABLE)
+        (wallpaperService).watchFace.renderer.additionalContentDescriptionLabels =
+            listOf(
+                Pair(
+                    0,
+                    ContentDescriptionLabel(
+                        PlainComplicationText.Builder("Before").build(),
+                        Rect(10, 10, 20, 20),
+                        pendingIntent1
+                    )
+                ),
+                Pair(
+                    20000,
+                    ContentDescriptionLabel(
+                        PlainComplicationText.Builder("After").build(),
+                        Rect(30, 30, 40, 40),
+                        pendingIntent2
+                    )
                 )
             )
-        )
 
-        val sysUiInterface =
-            service.getInteractiveWatchFaceClientInstance("testId")!!
+        val sysUiInterface = service.getInteractiveWatchFaceClientInstance("testId")!!
 
         val contentDescriptionLabels = sysUiInterface.contentDescriptionLabels
         assertThat(contentDescriptionLabels.size).isEqualTo(5)
@@ -620,34 +579,29 @@
         // 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, Instant.EPOCH)
-        ).isNotEqualTo("")
+        assertThat(contentDescriptionLabels[0].getTextAt(context.resources, Instant.EPOCH))
+            .isNotEqualTo("")
 
         // First additional ContentDescriptionLabel.
         assertThat(contentDescriptionLabels[1].bounds).isEqualTo(Rect(10, 10, 20, 20))
-        assertThat(
-            contentDescriptionLabels[1].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("Before")
+        assertThat(contentDescriptionLabels[1].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("Before")
         assertThat(contentDescriptionLabels[1].tapAction).isEqualTo(pendingIntent1)
 
         // Left complication.
         assertThat(contentDescriptionLabels[2].bounds).isEqualTo(Rect(80, 160, 160, 240))
-        assertThat(
-            contentDescriptionLabels[2].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("ID Left")
+        assertThat(contentDescriptionLabels[2].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("ID Left")
 
         // Right complication.
         assertThat(contentDescriptionLabels[3].bounds).isEqualTo(Rect(240, 160, 320, 240))
-        assertThat(
-            contentDescriptionLabels[3].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("ID Right")
+        assertThat(contentDescriptionLabels[3].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("ID Right")
 
         // Second additional ContentDescriptionLabel.
         assertThat(contentDescriptionLabels[4].bounds).isEqualTo(Rect(30, 30, 40, 40))
-        assertThat(
-            contentDescriptionLabels[4].getTextAt(context.resources, Instant.EPOCH)
-        ).isEqualTo("After")
+        assertThat(contentDescriptionLabels[4].getTextAt(context.resources, Instant.EPOCH))
+            .isEqualTo("After")
         assertThat(contentDescriptionLabels[4].tapAction).isEqualTo(pendingIntent2)
     }
 
@@ -665,12 +619,10 @@
         val interactiveInstance = getOrCreateTestSubject()
 
         assertNull(interactiveInstance.getComplicationIdAt(0, 0))
-        assertThat(interactiveInstance.getComplicationIdAt(85, 165)).isEqualTo(
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-        )
-        assertThat(interactiveInstance.getComplicationIdAt(255, 165)).isEqualTo(
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        )
+        assertThat(interactiveInstance.getComplicationIdAt(85, 165))
+            .isEqualTo(EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID)
+        assertThat(interactiveInstance.getComplicationIdAt(255, 165))
+            .isEqualTo(EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID)
         interactiveInstance.close()
     }
 
@@ -693,34 +645,35 @@
     @Test
     fun getDefaultProviderPolicies() {
         assertThat(
-            service.getDefaultComplicationDataSourcePoliciesAndType(
-                exampleCanvasAnalogWatchFaceComponentName
+                service.getDefaultComplicationDataSourcePoliciesAndType(
+                    exampleCanvasAnalogWatchFaceComponentName
+                )
             )
-        ).containsExactlyEntriesIn(
-            mapOf(
-                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
-                    androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
-                        DefaultComplicationDataSourcePolicy(
-                            ComponentName(
-                                CONFIGURABLE_DATA_SOURCE_PKG,
-                                CONFIGURABLE_DATA_SOURCE
+            .containsExactlyEntriesIn(
+                mapOf(
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
+                        androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
+                            DefaultComplicationDataSourcePolicy(
+                                ComponentName(
+                                    CONFIGURABLE_DATA_SOURCE_PKG,
+                                    CONFIGURABLE_DATA_SOURCE
+                                ),
+                                ComplicationType.SHORT_TEXT,
+                                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                                ComplicationType.SHORT_TEXT
                             ),
-                            ComplicationType.SHORT_TEXT,
-                            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
                             ComplicationType.SHORT_TEXT
                         ),
-                        ComplicationType.SHORT_TEXT
-                    ),
-                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
-                    androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
-                        DefaultComplicationDataSourcePolicy(
-                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
+                        androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                                ComplicationType.SHORT_TEXT
+                            ),
                             ComplicationType.SHORT_TEXT
-                        ),
-                        ComplicationType.SHORT_TEXT
-                    )
+                        )
+                )
             )
-        )
     }
 
     @Suppress("DEPRECATION") // DefaultComplicationDataSourcePolicyAndType
@@ -728,34 +681,35 @@
     fun getDefaultProviderPoliciesOldApi() {
         WatchFaceControlTestService.apiVersionOverride = 1
         assertThat(
-            service.getDefaultComplicationDataSourcePoliciesAndType(
-                exampleCanvasAnalogWatchFaceComponentName
+                service.getDefaultComplicationDataSourcePoliciesAndType(
+                    exampleCanvasAnalogWatchFaceComponentName
+                )
             )
-        ).containsExactlyEntriesIn(
-            mapOf(
-                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
-                    androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
-                        DefaultComplicationDataSourcePolicy(
-                            ComponentName(
-                                CONFIGURABLE_DATA_SOURCE_PKG,
-                                CONFIGURABLE_DATA_SOURCE
+            .containsExactlyEntriesIn(
+                mapOf(
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
+                        androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
+                            DefaultComplicationDataSourcePolicy(
+                                ComponentName(
+                                    CONFIGURABLE_DATA_SOURCE_PKG,
+                                    CONFIGURABLE_DATA_SOURCE
+                                ),
+                                ComplicationType.SHORT_TEXT,
+                                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                                ComplicationType.SHORT_TEXT
                             ),
-                            ComplicationType.SHORT_TEXT,
-                            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
                             ComplicationType.SHORT_TEXT
                         ),
-                        ComplicationType.SHORT_TEXT
-                    ),
-                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
-                    androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
-                        DefaultComplicationDataSourcePolicy(
-                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
+                        androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                                ComplicationType.SHORT_TEXT
+                            ),
                             ComplicationType.SHORT_TEXT
-                        ),
-                        ComplicationType.SHORT_TEXT
-                    )
+                        )
+                )
             )
-        )
     }
 
     @Suppress("DEPRECATION") // DefaultComplicationDataSourcePolicyAndType
@@ -764,45 +718,47 @@
         // Tests that we can retrieve the DefaultComplicationDataSourcePolicy without invoking any
         // parts of TestCrashingWatchFaceService that deliberately crash.
         assertThat(
-            service.getDefaultComplicationDataSourcePoliciesAndType(
-                ComponentName(
-                    "androidx.wear.watchface.client.test",
-                    "androidx.wear.watchface.client.test.TestCrashingWatchFaceService"
-
+                service.getDefaultComplicationDataSourcePoliciesAndType(
+                    ComponentName(
+                        "androidx.wear.watchface.client.test",
+                        "androidx.wear.watchface.client.test.TestCrashingWatchFaceService"
+                    )
                 )
             )
-        ).containsExactlyEntriesIn(
-            mapOf(
-                TestCrashingWatchFaceService.COMPLICATION_ID to
-                    androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
-                        DefaultComplicationDataSourcePolicy(
-                            SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+            .containsExactlyEntriesIn(
+                mapOf(
+                    TestCrashingWatchFaceService.COMPLICATION_ID to
+                        androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType(
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                                ComplicationType.LONG_TEXT
+                            ),
                             ComplicationType.LONG_TEXT
-                        ),
-                        ComplicationType.LONG_TEXT
-                    )
+                        )
+                )
             )
-        )
     }
 
     @Test
     fun addWatchFaceReadyListener_canvasRender() {
         val initCompletableDeferred = CompletableDeferred<Unit>()
-        val wallpaperService = TestAsyncCanvasRenderInitWatchFaceService(
-            context,
-            surfaceHolder,
-            initCompletableDeferred
-        )
-        val deferredInteractiveInstance = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            service.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                deviceConfig,
-                systemState,
-                null,
-                complications
+        val wallpaperService =
+            TestAsyncCanvasRenderInitWatchFaceService(
+                context,
+                surfaceHolder,
+                initCompletableDeferred
             )
-        }
+        val deferredInteractiveInstance =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                service.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    deviceConfig,
+                    systemState,
+                    null,
+                    complications
+                )
+            }
 
         val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
         val canvas = Canvas(bitmap)
@@ -836,30 +792,30 @@
     @Test
     fun removeWatchFaceReadyListener_canvasRender() {
         val initCompletableDeferred = CompletableDeferred<Unit>()
-        val wallpaperService = TestAsyncCanvasRenderInitWatchFaceService(
-            context,
-            surfaceHolder,
-            initCompletableDeferred
-        )
-        val deferredInteractiveInstance = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            service.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                deviceConfig,
-                systemState,
-                null,
-                complications
+        val wallpaperService =
+            TestAsyncCanvasRenderInitWatchFaceService(
+                context,
+                surfaceHolder,
+                initCompletableDeferred
             )
-        }
+        val deferredInteractiveInstance =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                service.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    deviceConfig,
+                    systemState,
+                    null,
+                    complications
+                )
+            }
 
         val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
         val canvas = Canvas(bitmap)
         Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
 
         val renderLatch = CountDownLatch(1)
-        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then {
-            renderLatch.countDown()
-        }
+        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then { renderLatch.countDown() }
 
         // Create the engine which triggers creation of the interactive instance.
         handler.post {
@@ -895,17 +851,17 @@
         val surfaceTexture = SurfaceTexture(false)
         surfaceTexture.setDefaultBufferSize(10, 10)
         Mockito.`when`(surfaceHolder2.surface).thenReturn(Surface(surfaceTexture))
-        Mockito.`when`(surfaceHolder2.surfaceFrame)
-            .thenReturn(Rect(0, 0, 10, 10))
+        Mockito.`when`(surfaceHolder2.surfaceFrame).thenReturn(Rect(0, 0, 10, 10))
 
         val onUiThreadGlSurfaceCreatedCompletableDeferred = CompletableDeferred<Unit>()
         val onBackgroundThreadGlContextCreatedCompletableDeferred = CompletableDeferred<Unit>()
-        val wallpaperService = TestAsyncGlesRenderInitWatchFaceService(
-            context,
-            surfaceHolder2,
-            onUiThreadGlSurfaceCreatedCompletableDeferred,
-            onBackgroundThreadGlContextCreatedCompletableDeferred
-        )
+        val wallpaperService =
+            TestAsyncGlesRenderInitWatchFaceService(
+                context,
+                surfaceHolder2,
+                onUiThreadGlSurfaceCreatedCompletableDeferred,
+                onBackgroundThreadGlContextCreatedCompletableDeferred
+            )
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -950,11 +906,12 @@
 
     @Test
     public fun isComplicationDisplayPolicySupported() {
-        val wallpaperService = TestWatchfaceOverlayStyleWatchFaceService(
-            context,
-            surfaceHolder,
-            WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
-        )
+        val wallpaperService =
+            TestWatchfaceOverlayStyleWatchFaceService(
+                context,
+                surfaceHolder,
+                WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
+            )
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
         assertThat(interactiveInstance.isComplicationDisplayPolicySupported()).isTrue()
@@ -967,24 +924,26 @@
         val mockIInteractiveWatchFace = mock(IInteractiveWatchFace::class.java)
         val mockIBinder = mock(IBinder::class.java)
         `when`(mockIInteractiveWatchFace.asBinder()).thenReturn(mockIBinder)
-        `when`(mockIInteractiveWatchFace.apiVersion).thenReturn(6)
+        `when`(mockIInteractiveWatchFace.apiVersion).thenReturn(7)
 
-        val interactiveInstance = InteractiveWatchFaceClientImpl(
-            mockIInteractiveWatchFace,
-            previewImageUpdateRequestedExecutor = null,
-            previewImageUpdateRequestedListener = null
-        )
+        val interactiveInstance =
+            InteractiveWatchFaceClientImpl(
+                mockIInteractiveWatchFace,
+                previewImageUpdateRequestedExecutor = null,
+                previewImageUpdateRequestedListener = null
+            )
 
         assertThat(interactiveInstance.isComplicationDisplayPolicySupported()).isFalse()
     }
 
     @Test
     fun watchfaceOverlayStyle() {
-        val wallpaperService = TestWatchfaceOverlayStyleWatchFaceService(
-            context,
-            surfaceHolder,
-            WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
-        )
+        val wallpaperService =
+            TestWatchfaceOverlayStyleWatchFaceService(
+                context,
+                surfaceHolder,
+                WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
+            )
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -998,11 +957,12 @@
 
     @Test
     fun watchfaceOverlayStyle_after_close() {
-        val wallpaperService = TestWatchfaceOverlayStyleWatchFaceService(
-            context,
-            surfaceHolder,
-            WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
-        )
+        val wallpaperService =
+            TestWatchfaceOverlayStyleWatchFaceService(
+                context,
+                surfaceHolder,
+                WatchFace.OverlayStyle(Color.valueOf(Color.RED), Color.valueOf(Color.BLACK))
+            )
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -1015,10 +975,7 @@
     @Test
     @OptIn(ComplicationExperimental::class)
     fun edgeComplication_boundingArc() {
-        val wallpaperService = TestEdgeComplicationWatchFaceService(
-            context,
-            surfaceHolder
-        )
+        val wallpaperService = TestEdgeComplicationWatchFaceService(context, surfaceHolder)
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -1043,9 +1000,7 @@
             val watchFaceColorsLatch = CountDownLatch(1)
             var watchFaceColors: WatchFaceColors? = null
 
-            interactiveInstance.addOnWatchFaceColorsListener(
-                { runnable -> runnable.run() }
-            ) {
+            interactiveInstance.addOnWatchFaceColorsListener({ runnable -> runnable.run() }) {
                 watchFaceColors = it
                 if (watchFaceColors != null) {
                     watchFaceColorsLatch.countDown()
@@ -1054,13 +1009,14 @@
 
             assertTrue(watchFaceColorsLatch.await(UPDATE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS))
 
-            assertThat(watchFaceColors).isEqualTo(
-                WatchFaceColors(
-                    Color.valueOf(1.0f, 1.0f, 1.0f, 1.0f),
-                    Color.valueOf(0.93333334f, 0.6313726f, 0.6039216f, 1.0f),
-                    Color.valueOf(0.26666668f, 0.26666668f, 0.26666668f, 1.0f)
+            assertThat(watchFaceColors)
+                .isEqualTo(
+                    WatchFaceColors(
+                        Color.valueOf(1.0f, 1.0f, 1.0f, 1.0f),
+                        Color.valueOf(0.93333334f, 0.6313726f, 0.6039216f, 1.0f),
+                        Color.valueOf(0.26666668f, 0.26666668f, 0.26666668f, 1.0f)
+                    )
                 )
-            )
 
             val watchFaceColorsLatch2 = CountDownLatch(1)
             var watchFaceColors2: WatchFaceColors? = null
@@ -1075,9 +1031,7 @@
                 )
             )
 
-            interactiveInstance.addOnWatchFaceColorsListener(
-                { runnable -> runnable.run() }
-            ) {
+            interactiveInstance.addOnWatchFaceColorsListener({ runnable -> runnable.run() }) {
                 watchFaceColors2 = it
                 if (watchFaceColors2 != null) {
                     watchFaceColorsLatch2.countDown()
@@ -1086,13 +1040,14 @@
 
             assertTrue(watchFaceColorsLatch2.await(UPDATE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS))
 
-            assertThat(watchFaceColors2).isEqualTo(
-                WatchFaceColors(
-                    Color.valueOf(0.30980393f, 0.7647059f, 0.96862745f, 1.0f),
-                    Color.valueOf(0.08235294f, 0.39607844f, 0.7529412f, 1.0f),
-                    Color.valueOf(0.26666668f, 0.26666668f, 0.26666668f, 1.0f)
+            assertThat(watchFaceColors2)
+                .isEqualTo(
+                    WatchFaceColors(
+                        Color.valueOf(0.30980393f, 0.7647059f, 0.96862745f, 1.0f),
+                        Color.valueOf(0.08235294f, 0.39607844f, 0.7529412f, 1.0f),
+                        Color.valueOf(0.26666668f, 0.26666668f, 0.26666668f, 1.0f)
+                    )
                 )
-            )
         } finally {
             interactiveInstance.close()
         }
@@ -1104,12 +1059,13 @@
             TestWatchFaceServiceWithPreviewImageUpdateRequest(context, surfaceHolder)
         var lastPreviewImageUpdateRequestedId = ""
 
-        val interactiveInstance = getOrCreateTestSubject(
-            watchFaceService = wallpaperService,
-            instanceId = "wfId-1",
-            previewExecutor = { runnable -> runnable.run() },
-            previewListener = { lastPreviewImageUpdateRequestedId = it }
-        )
+        val interactiveInstance =
+            getOrCreateTestSubject(
+                watchFaceService = wallpaperService,
+                instanceId = "wfId-1",
+                previewExecutor = { runnable -> runnable.run() },
+                previewListener = { lastPreviewImageUpdateRequestedId = it }
+            )
 
         assertTrue(
             wallpaperService.rendererInitializedLatch.await(
@@ -1127,10 +1083,8 @@
 
     @Test
     fun engineDetached() {
-        val wallpaperService = TestComplicationProviderDefaultsWatchFaceService(
-            context,
-            surfaceHolder
-        )
+        val wallpaperService =
+            TestComplicationProviderDefaultsWatchFaceService(context, surfaceHolder)
 
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
 
@@ -1141,7 +1095,9 @@
                     lastDisconnectReason = disconnectReason
                 }
             }
-        ) { it.run() }
+        ) {
+            it.run()
+        }
 
         // Simulate detach.
         engine.onDestroy()
@@ -1151,10 +1107,7 @@
 
     @Test
     fun tapComplication() {
-        val wallpaperService = TestExampleCanvasAnalogWatchFaceService(
-            context,
-            surfaceHolder
-        )
+        val wallpaperService = TestExampleCanvasAnalogWatchFaceService(context, surfaceHolder)
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
         interactiveInstance.updateComplicationData(
             mapOf(
@@ -1167,48 +1120,46 @@
 
         tapOnComplication(interactiveInstance, EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID)
 
-        assertTrue(
-            ObservableServiceA.awaitForServiceToBeBound(UPDATE_TIMEOUT_MILLIS)
-        )
+        assertTrue(ObservableServiceA.awaitForServiceToBeBound(UPDATE_TIMEOUT_MILLIS))
     }
 
     @Test
     fun tapTimelineComplication() {
-        val wallpaperService = TestExampleCanvasAnalogWatchFaceService(
-            context,
-            surfaceHolder
-        )
+        val wallpaperService = TestExampleCanvasAnalogWatchFaceService(context, surfaceHolder)
         val interactiveInstance = getOrCreateTestSubject(wallpaperService)
         val watchFaceImpl = runBlocking { engine.deferredWatchFaceImpl.await() }
 
         // Create a timeline complication with three phases, each with their own tap actions leading
         // to ObservableServiceA, ObservableServiceB & ObservableServiceC getting bound.
-        val timelineComplication = rangedValueComplicationBuilder()
-            .setTapAction(ObservableServiceA.createPendingIntent(context))
-            .build()
-            .asWireComplicationData()
+        val timelineComplication =
+            rangedValueComplicationBuilder()
+                .setTapAction(ObservableServiceA.createPendingIntent(context))
+                .build()
+                .asWireComplicationData()
 
         timelineComplication.setTimelineEntryCollection(
             listOf(
                 ShortTextComplicationData.Builder(
-                    PlainComplicationText.Builder("B").build(),
-                    ComplicationText.EMPTY
-                )
+                        PlainComplicationText.Builder("B").build(),
+                        ComplicationText.EMPTY
+                    )
                     .setTapAction(ObservableServiceB.createPendingIntent(context))
                     .build()
-                    .asWireComplicationData().apply {
+                    .asWireComplicationData()
+                    .apply {
                         timelineStartEpochSecond =
                             10 + TestExampleCanvasAnalogWatchFaceService.systemTimeMillis / 1000
                         timelineEndEpochSecond =
                             20 + TestExampleCanvasAnalogWatchFaceService.systemTimeMillis / 1000
                     },
                 ShortTextComplicationData.Builder(
-                    PlainComplicationText.Builder("C").build(),
-                    ComplicationText.EMPTY
-                )
+                        PlainComplicationText.Builder("C").build(),
+                        ComplicationText.EMPTY
+                    )
                     .setTapAction(ObservableServiceC.createPendingIntent(context))
                     .build()
-                    .asWireComplicationData().apply {
+                    .asWireComplicationData()
+                    .apply {
                         timelineStartEpochSecond =
                             20 + TestExampleCanvasAnalogWatchFaceService.systemTimeMillis / 1000
                         timelineEndEpochSecond =
@@ -1265,16 +1216,13 @@
     fun getOrCreateInteractiveWatchFaceClient() {
         val interactiveInstance = getOrCreateTestSubject()
 
-        val bitmap = interactiveInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            interactiveInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         try {
             bitmap.assertAgainstGolden(screenshotRule, "interactiveScreenshot")
@@ -1286,27 +1234,26 @@
     @SuppressLint("NewApi") // renderWatchFaceToBitmap
     @Test
     fun getOrCreateInteractiveWatchFaceClient_initialStyle() {
-        val interactiveInstance = getOrCreateTestSubject(
-            // An incomplete map which is OK.
-            userStyle = UserStyleData(
-                mapOf(
-                    "color_style_setting" to "green_style".encodeToByteArray(),
-                    "draw_hour_pips_style_setting" to BooleanOption.FALSE.id.value,
-                    "watch_hand_length_style_setting" to DoubleRangeOption(0.8).id.value
-                )
+        val interactiveInstance =
+            getOrCreateTestSubject(
+                // An incomplete map which is OK.
+                userStyle =
+                    UserStyleData(
+                        mapOf(
+                            "color_style_setting" to "green_style".encodeToByteArray(),
+                            "draw_hour_pips_style_setting" to BooleanOption.FALSE.id.value,
+                            "watch_hand_length_style_setting" to DoubleRangeOption(0.8).id.value
+                        )
+                    )
             )
-        )
 
-        val bitmap = interactiveInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            interactiveInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         try {
             bitmap.assertAgainstGolden(screenshotRule, "initialStyle")
@@ -1324,36 +1271,34 @@
 
         getOrCreateTestSubject(watchFaceService, instanceId = testId)
 
-        val deferredInteractiveInstance2 = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            service.getOrCreateInteractiveWatchFaceClient(
-                testId,
-                deviceConfig,
-                systemState,
-                UserStyleData(
-                    mapOf(
-                        "color_style_setting" to "blue_style".encodeToByteArray(),
-                        "draw_hour_pips_style_setting" to BooleanOption.FALSE.id.value,
-                        "watch_hand_length_style_setting" to DoubleRangeOption(0.25).id.value
-                    )
-                ),
-                complications
-            )
-        }
+        val deferredInteractiveInstance2 =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                service.getOrCreateInteractiveWatchFaceClient(
+                    testId,
+                    deviceConfig,
+                    systemState,
+                    UserStyleData(
+                        mapOf(
+                            "color_style_setting" to "blue_style".encodeToByteArray(),
+                            "draw_hour_pips_style_setting" to BooleanOption.FALSE.id.value,
+                            "watch_hand_length_style_setting" to DoubleRangeOption(0.25).id.value
+                        )
+                    ),
+                    complications
+                )
+            }
 
         val interactiveInstance2 = awaitWithTimeout(deferredInteractiveInstance2)
         assertThat(interactiveInstance2.instanceId).isEqualTo("testId")
 
-        val bitmap = interactiveInstance2.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            interactiveInstance2.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         try {
             // Note the hour hand pips and both complicationSlots should be visible in this image.
@@ -1366,16 +1311,18 @@
     @SuppressLint("NewApi") // renderWatchFaceToBitmap
     @Test
     fun updateInstance() {
-        val interactiveInstance = getOrCreateTestSubject(
-            userStyle = UserStyleData(
-                mapOf(
-                    COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray(),
-                    WATCH_HAND_LENGTH_STYLE_SETTING to DoubleRangeOption(0.25).id.value,
-                    DRAW_HOUR_PIPS_STYLE_SETTING to BooleanOption.FALSE.id.value,
-                    COMPLICATIONS_STYLE_SETTING to NO_COMPLICATIONS.encodeToByteArray()
-                )
+        val interactiveInstance =
+            getOrCreateTestSubject(
+                userStyle =
+                    UserStyleData(
+                        mapOf(
+                            COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray(),
+                            WATCH_HAND_LENGTH_STYLE_SETTING to DoubleRangeOption(0.25).id.value,
+                            DRAW_HOUR_PIPS_STYLE_SETTING to BooleanOption.FALSE.id.value,
+                            COMPLICATIONS_STYLE_SETTING to NO_COMPLICATIONS.encodeToByteArray()
+                        )
+                    )
             )
-        )
 
         assertThat(interactiveInstance.instanceId).isEqualTo("testId")
 
@@ -1394,23 +1341,19 @@
         assertThat(interactiveInstance.instanceId).isEqualTo("testId2")
 
         // It should be possible to create an instance with the updated id.
-        val instance =
-            service.getInteractiveWatchFaceClientInstance("testId2")
+        val instance = service.getInteractiveWatchFaceClientInstance("testId2")
         assertThat(instance).isNotNull()
         instance?.close()
 
         // The previous instance should still be usable despite the new instance being closed.
         interactiveInstance.updateComplicationData(complications)
-        val bitmap = interactiveInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            complications
-        )
+        val bitmap =
+            interactiveInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
+                complications
+            )
 
         try {
             // Note the hour hand pips and both complicationSlots should be visible in this image.
@@ -1426,52 +1369,46 @@
         val surfaceTexture = SurfaceTexture(false)
         surfaceTexture.setDefaultBufferSize(400, 400)
         Mockito.`when`(surfaceHolder2.surface).thenReturn(Surface(surfaceTexture))
-        Mockito.`when`(surfaceHolder2.surfaceFrame)
-            .thenReturn(Rect(0, 0, 400, 400))
+        Mockito.`when`(surfaceHolder2.surfaceFrame).thenReturn(Rect(0, 0, 400, 400))
 
         val wallpaperService =
             TestExampleOpenGLBackgroundInitWatchFaceService(context, surfaceHolder2)
 
-        val interactiveInstance = getOrCreateTestSubject(
-            wallpaperService,
-            complications = emptyMap()
-        )
+        val interactiveInstance =
+            getOrCreateTestSubject(wallpaperService, complications = emptyMap())
 
-        val headlessInstance = HeadlessWatchFaceClient.createFromBundle(
-            service.createHeadlessWatchFaceClient(
-                "id",
-                exampleOpenGLWatchFaceComponentName,
-                deviceConfig,
-                200,
-                200
-            )!!.toBundle()
-        )
+        val headlessInstance =
+            HeadlessWatchFaceClient.createFromBundle(
+                service
+                    .createHeadlessWatchFaceClient(
+                        "id",
+                        exampleOpenGLWatchFaceComponentName,
+                        deviceConfig,
+                        200,
+                        200
+                    )!!
+                    .toBundle()
+            )
 
         // Take screenshots from both instances to confirm rendering works as expected despite the
         // watch face using shared SharedAssets.
-        val interactiveBitmap = interactiveInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        val interactiveBitmap =
+            interactiveInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
                 null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            null
-        )
+            )
 
         interactiveBitmap.assertAgainstGolden(screenshotRule, "opengl_interactive")
 
-        val headlessBitmap = headlessInstance.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        val headlessBitmap =
+            headlessInstance.renderWatchFaceToBitmap(
+                RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null),
+                Instant.ofEpochMilli(1234567),
+                null,
                 null
-            ),
-            Instant.ofEpochMilli(1234567),
-            null,
-            null
-        )
+            )
 
         headlessBitmap.assertAgainstGolden(screenshotRule, "opengl_headless")
 
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt
index 41ce537..16ca796 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt
@@ -27,8 +27,8 @@
 import kotlinx.coroutines.MainScope
 
 /**
- * Test shim to allow us to connect to WatchFaceControlService from
- * [WatchFaceControlClientTest] and to optionally override the reported API version.
+ * Test shim to allow us to connect to WatchFaceControlService from [WatchFaceControlClientTest] and
+ * to optionally override the reported API version.
  */
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 public class WatchFaceControlTestService : WatchFaceControlService() {
@@ -44,10 +44,8 @@
         object : WatchFaceControlService() {
             override fun createServiceStub(): IWatchFaceInstanceServiceStub =
                 @RequiresApi(Build.VERSION_CODES.O_MR1)
-                object : IWatchFaceInstanceServiceStub(
-                    this@WatchFaceControlTestService,
-                    MainScope()
-                ) {
+                object :
+                    IWatchFaceInstanceServiceStub(this@WatchFaceControlTestService, MainScope()) {
                     override fun getApiVersion(): Int = apiVersionOverride ?: super.getApiVersion()
                 }
 
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceMetadataServiceTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceMetadataServiceTest.kt
index 7d54fd5..095e36a 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceMetadataServiceTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceMetadataServiceTest.kt
@@ -51,14 +51,16 @@
 @MediumTest
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 public class WatchFaceMetadataServiceTest {
-    private val exampleWatchFaceComponentName = ComponentName(
-        "androidx.wear.watchface.client.test",
-        "androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService"
-    )
-    private val nopCanvasWatchFaceServiceComponentName = ComponentName(
-        "androidx.wear.watchface.client.test",
-        "androidx.wear.watchface.client.test.TestNopCanvasWatchFaceService"
-    )
+    private val exampleWatchFaceComponentName =
+        ComponentName(
+            "androidx.wear.watchface.client.test",
+            "androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService"
+        )
+    private val nopCanvasWatchFaceServiceComponentName =
+        ComponentName(
+            "androidx.wear.watchface.client.test",
+            "androidx.wear.watchface.client.test.TestNopCanvasWatchFaceService"
+        )
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
 
@@ -90,21 +92,15 @@
         val schema = client.getUserStyleSchema()
 
         Truth.assertThat(schema.userStyleSettings.size).isEqualTo(5)
-        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo(
-            "color_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[1].id.value).isEqualTo(
-            "draw_hour_pips_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[2].id.value).isEqualTo(
-            "watch_hand_length_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[3].id.value).isEqualTo(
-            "complications_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[4].id.value).isEqualTo(
-            "hours_draw_freq_style_setting"
-        )
+        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo("color_style_setting")
+        Truth.assertThat(schema.userStyleSettings[1].id.value)
+            .isEqualTo("draw_hour_pips_style_setting")
+        Truth.assertThat(schema.userStyleSettings[2].id.value)
+            .isEqualTo("watch_hand_length_style_setting")
+        Truth.assertThat(schema.userStyleSettings[3].id.value)
+            .isEqualTo("complications_style_setting")
+        Truth.assertThat(schema.userStyleSettings[4].id.value)
+            .isEqualTo("hours_draw_freq_style_setting")
 
         Truth.assertThat(client.isUserStyleSchemaStatic).isFalse()
     }
@@ -117,21 +113,15 @@
         val schema = client.getUserStyleSchema()
 
         Truth.assertThat(schema.userStyleSettings.size).isEqualTo(5)
-        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo(
-            "color_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[1].id.value).isEqualTo(
-            "draw_hour_pips_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[2].id.value).isEqualTo(
-            "watch_hand_length_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[3].id.value).isEqualTo(
-            "complications_style_setting"
-        )
-        Truth.assertThat(schema.userStyleSettings[4].id.value).isEqualTo(
-            "hours_draw_freq_style_setting"
-        )
+        Truth.assertThat(schema.userStyleSettings[0].id.value).isEqualTo("color_style_setting")
+        Truth.assertThat(schema.userStyleSettings[1].id.value)
+            .isEqualTo("draw_hour_pips_style_setting")
+        Truth.assertThat(schema.userStyleSettings[2].id.value)
+            .isEqualTo("watch_hand_length_style_setting")
+        Truth.assertThat(schema.userStyleSettings[3].id.value)
+            .isEqualTo("complications_style_setting")
+        Truth.assertThat(schema.userStyleSettings[4].id.value)
+            .isEqualTo("hours_draw_freq_style_setting")
 
         Truth.assertThat(client.isUserStyleSchemaStatic).isFalse()
     }
@@ -143,57 +133,58 @@
         val complicationSlotMetadataMap = service.getComplicationSlotMetadataMap()
         Truth.assertThat(complicationSlotMetadataMap.size).isEqualTo(2)
 
-        val leftComplicationMetadata = complicationSlotMetadataMap[
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-        ]!!
+        val leftComplicationMetadata =
+            complicationSlotMetadataMap[EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
         Truth.assertThat(
-            leftComplicationMetadata.bounds!!.perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
-        ).isEqualTo(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                leftComplicationMetadata.bounds!!
+                    .perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
+            )
+            .isEqualTo(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         Truth.assertThat(leftComplicationMetadata.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        Truth.assertThat(leftComplicationMetadata.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK)
         Truth.assertThat(
-            leftComplicationMetadata.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK)
-        Truth.assertThat(
-            leftComplicationMetadata.defaultDataSourcePolicy
-                .systemDataSourceFallbackDefaultType
-        ).isEqualTo(ComplicationType.SHORT_TEXT)
-        Truth.assertThat(leftComplicationMetadata.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+                leftComplicationMetadata.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+            )
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        Truth.assertThat(leftComplicationMetadata.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
 
-        val rightComplicationMetadata = complicationSlotMetadataMap[
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        ]!!
+        val rightComplicationMetadata =
+            complicationSlotMetadataMap[EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
         Truth.assertThat(
-            rightComplicationMetadata.bounds!!.perComplicationTypeBounds[
-                ComplicationType.SHORT_TEXT
-            ]
-        ).isEqualTo(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+                rightComplicationMetadata.bounds!!
+                    .perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
+            )
+            .isEqualTo(RectF(0.6f, 0.4f, 0.8f, 0.6f))
         Truth.assertThat(rightComplicationMetadata.boundsType)
             .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        Truth.assertThat(rightComplicationMetadata.defaultDataSourcePolicy.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_STEP_COUNT)
         Truth.assertThat(
-            rightComplicationMetadata.defaultDataSourcePolicy.systemDataSourceFallback
-        ).isEqualTo(SystemDataSources.DATA_SOURCE_STEP_COUNT)
-        Truth.assertThat(
-            rightComplicationMetadata.defaultDataSourcePolicy
-                .systemDataSourceFallbackDefaultType
-        ).isEqualTo(ComplicationType.SHORT_TEXT)
-        Truth.assertThat(rightComplicationMetadata.supportedTypes).containsExactly(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        )
+                rightComplicationMetadata.defaultDataSourcePolicy
+                    .systemDataSourceFallbackDefaultType
+            )
+            .isEqualTo(ComplicationType.SHORT_TEXT)
+        Truth.assertThat(rightComplicationMetadata.supportedTypes)
+            .containsExactly(
+                ComplicationType.RANGED_VALUE,
+                ComplicationType.GOAL_PROGRESS,
+                ComplicationType.WEIGHTED_ELEMENTS,
+                ComplicationType.LONG_TEXT,
+                ComplicationType.SHORT_TEXT,
+                ComplicationType.MONOCHROMATIC_IMAGE,
+                ComplicationType.SMALL_IMAGE
+            )
     }
 
     @Test
@@ -206,24 +197,22 @@
     @Suppress("Deprecation") // userStyleSettings
     public fun userStyleSchema_static_metadata() {
         runBlocking {
-            val client = WatchFaceMetadataClient.createImpl(
-                context,
-                Intent(context, WatchFaceControlTestService::class.java).apply {
-                    action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
-                },
-                exampleWatchFaceComponentName,
-                object : WatchFaceMetadataClient.Companion.ParserProvider() {
-                    override fun getParser(
-                        context: Context,
-                        watchFaceName: ComponentName
-                    ) = context.resources.getXml(R.xml.xml_watchface)
-                }
-            )
+            val client =
+                WatchFaceMetadataClient.createImpl(
+                    context,
+                    Intent(context, WatchFaceControlTestService::class.java).apply {
+                        action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
+                    },
+                    exampleWatchFaceComponentName,
+                    object : WatchFaceMetadataClient.Companion.ParserProvider() {
+                        override fun getParser(context: Context, watchFaceName: ComponentName) =
+                            context.resources.getXml(R.xml.xml_watchface)
+                    }
+                )
             val schema = client.getUserStyleSchema()
 
-            Truth.assertThat(schema.userStyleSettings.toString()).isEqualTo(
-                "[{TimeStyle : minimal, seconds}]"
-            )
+            Truth.assertThat(schema.userStyleSettings.toString())
+                .isEqualTo("[{TimeStyle : minimal, seconds}]")
 
             Truth.assertThat(client.isUserStyleSchemaStatic).isTrue()
         }
@@ -233,19 +222,18 @@
     @OptIn(ComplicationExperimental::class)
     public fun getComplicationSlotMetadataMap_static_metadata() {
         runBlocking {
-            val client = WatchFaceMetadataClient.createImpl(
-                context,
-                Intent(context, WatchFaceControlTestService::class.java).apply {
-                    action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
-                },
-                exampleWatchFaceComponentName,
-                object : WatchFaceMetadataClient.Companion.ParserProvider() {
-                    override fun getParser(
-                        context: Context,
-                        watchFaceName: ComponentName
-                    ) = context.resources.getXml(R.xml.xml_watchface)
-                }
-            )
+            val client =
+                WatchFaceMetadataClient.createImpl(
+                    context,
+                    Intent(context, WatchFaceControlTestService::class.java).apply {
+                        action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
+                    },
+                    exampleWatchFaceComponentName,
+                    object : WatchFaceMetadataClient.Companion.ParserProvider() {
+                        override fun getParser(context: Context, watchFaceName: ComponentName) =
+                            context.resources.getXml(R.xml.xml_watchface)
+                    }
+                )
             val complications = client.getComplicationSlotMetadataMap()
 
             Truth.assertThat(complications.keys).containsExactly(10, 20, 30)
@@ -264,27 +252,32 @@
                 .isEqualTo(ComponentName("com.app.example1", "com.app.example1.Class"))
 
             Truth.assertThat(
-                complications[10]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
-            ).isEqualTo(ComplicationType.SHORT_TEXT)
+                    complications[10]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
+                )
+                .isEqualTo(ComplicationType.SHORT_TEXT)
 
             Truth.assertThat(complications[10]!!.defaultDataSourcePolicy.secondaryDataSource)
                 .isEqualTo(ComponentName("com.app.example2", "com.app.example2.Class"))
 
             Truth.assertThat(
-                complications[10]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
-            ).isEqualTo(ComplicationType.SMALL_IMAGE)
+                    complications[10]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                )
+                .isEqualTo(ComplicationType.SMALL_IMAGE)
 
             Truth.assertThat(complications[10]!!.defaultDataSourcePolicy.systemDataSourceFallback)
                 .isEqualTo(SystemDataSources.DATA_SOURCE_WATCH_BATTERY)
 
             Truth.assertThat(
-                complications[10]!!.defaultDataSourcePolicy
-                    .systemDataSourceFallbackDefaultType
-            ).isEqualTo(ComplicationType.RANGED_VALUE)
+                    complications[10]!!.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                )
+                .isEqualTo(ComplicationType.RANGED_VALUE)
 
             Truth.assertThat(
-                complications[10]!!.bounds!!.perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
-            ).isEqualTo(RectF(0.3f, 0.7f, 0.7f, 0.9f))
+                    complications[10]!!
+                        .bounds!!
+                        .perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
+                )
+                .isEqualTo(RectF(0.3f, 0.7f, 0.7f, 0.9f))
 
             Truth.assertThat(complications[20]!!.boundsType)
                 .isEqualTo(ComplicationSlotBoundsType.BACKGROUND)
@@ -296,23 +289,25 @@
                 .isEqualTo(ComponentName("com.package", "com.app"))
 
             Truth.assertThat(
-                complications[20]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
-            ).isEqualTo(ComplicationType.PHOTO_IMAGE)
+                    complications[20]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
+                )
+                .isEqualTo(ComplicationType.PHOTO_IMAGE)
 
             Truth.assertThat(complications[20]!!.defaultDataSourcePolicy.secondaryDataSource)
                 .isNull()
 
             Truth.assertThat(
-                complications[20]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
-            ).isNull()
+                    complications[20]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                )
+                .isNull()
 
             Truth.assertThat(complications[20]!!.defaultDataSourcePolicy.systemDataSourceFallback)
                 .isEqualTo(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET)
 
             Truth.assertThat(
-                complications[20]!!.defaultDataSourcePolicy
-                    .systemDataSourceFallbackDefaultType
-            ).isEqualTo(ComplicationType.PHOTO_IMAGE)
+                    complications[20]!!.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                )
+                .isEqualTo(ComplicationType.PHOTO_IMAGE)
 
             Truth.assertThat(complications[30]!!.boundsType)
                 .isEqualTo(ComplicationSlotBoundsType.EDGE)
@@ -324,31 +319,35 @@
                 .isEqualTo(ComponentName("com.app.example1", "com.app.example1.Class"))
 
             Truth.assertThat(
-                complications[30]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
-            ).isEqualTo(ComplicationType.SHORT_TEXT)
+                    complications[30]!!.defaultDataSourcePolicy.primaryDataSourceDefaultType
+                )
+                .isEqualTo(ComplicationType.SHORT_TEXT)
 
             Truth.assertThat(complications[30]!!.defaultDataSourcePolicy.secondaryDataSource)
                 .isEqualTo(ComponentName("com.app.example2", "com.app.example2.Class"))
 
             Truth.assertThat(
-                complications[30]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
-            ).isEqualTo(ComplicationType.SMALL_IMAGE)
+                    complications[30]!!.defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                )
+                .isEqualTo(ComplicationType.SMALL_IMAGE)
 
             Truth.assertThat(complications[30]!!.defaultDataSourcePolicy.systemDataSourceFallback)
                 .isEqualTo(SystemDataSources.DATA_SOURCE_WATCH_BATTERY)
 
             Truth.assertThat(
-                complications[30]!!.defaultDataSourcePolicy
-                    .systemDataSourceFallbackDefaultType
-            ).isEqualTo(ComplicationType.RANGED_VALUE)
+                    complications[30]!!.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                )
+                .isEqualTo(ComplicationType.RANGED_VALUE)
 
             Truth.assertThat(
-                complications[30]!!.bounds!!.perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
-            ).isEqualTo(RectF(0.0f, 0.0f, 1.0f, 1.0f))
+                    complications[30]!!
+                        .bounds!!
+                        .perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
+                )
+                .isEqualTo(RectF(0.0f, 0.0f, 1.0f, 1.0f))
 
-            Truth.assertThat(
-                complications[30]!!.getBoundingArc()
-            ).isEqualTo(BoundingArc(-45.0f, 90.0f, 0.1f))
+            Truth.assertThat(complications[30]!!.getBoundingArc())
+                .isEqualTo(BoundingArc(-45.0f, 90.0f, 0.1f))
         }
     }
 
@@ -359,10 +358,10 @@
         val flavors = client.getUserStyleFlavors()
         val schema = client.getUserStyleSchema()
 
-        val metadata = context.packageManager.getServiceInfo(
-            exampleWatchFaceComponentName,
-            PackageManager.GET_META_DATA
-        ).metaData
+        val metadata =
+            context.packageManager
+                .getServiceInfo(exampleWatchFaceComponentName, PackageManager.GET_META_DATA)
+                .metaData
 
         Truth.assertThat(metadata.getBoolean(Constants.META_DATA_FLAVORS_SUPPORTED)).isEqualTo(true)
 
@@ -372,9 +371,8 @@
 
         // check settings' defaults
         val userStyleMap = flavor.style.userStyleMap
-        Truth.assertThat(userStyleMap.keys).containsExactly(
-            "color_style_setting", "watch_hand_length_style_setting"
-        )
+        Truth.assertThat(userStyleMap.keys)
+            .containsExactly("color_style_setting", "watch_hand_length_style_setting")
 
         val userStyle = UserStyle(flavor.style, schema)
         Truth.assertThat(userStyle[UserStyleSetting.Id("color_style_setting")]!!.id)
@@ -383,64 +381,59 @@
         // Check complication slots' defaults
         val complications = flavor.complications
 
-        Truth.assertThat(complications.keys).containsExactly(
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-        )
+        Truth.assertThat(complications.keys)
+            .containsExactly(
+                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
+            )
 
         val left = complications[EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
         val right = complications[EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
 
         Truth.assertThat(left.primaryDataSource).isNull()
         Truth.assertThat(left.secondaryDataSource).isNull()
-        Truth.assertThat(left.systemDataSourceFallback).isEqualTo(
-            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK
-        )
-        Truth.assertThat(left.systemDataSourceFallbackDefaultType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
+        Truth.assertThat(left.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK)
+        Truth.assertThat(left.systemDataSourceFallbackDefaultType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
 
-        Truth.assertThat(right.primaryDataSource).isEqualTo(
-            ComponentName(
-                CONFIGURABLE_DATA_SOURCE_PKG, CONFIGURABLE_DATA_SOURCE
-            )
-        )
-        Truth.assertThat(right.primaryDataSourceDefaultType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
+        Truth.assertThat(right.primaryDataSource)
+            .isEqualTo(ComponentName(CONFIGURABLE_DATA_SOURCE_PKG, CONFIGURABLE_DATA_SOURCE))
+        Truth.assertThat(right.primaryDataSourceDefaultType).isEqualTo(ComplicationType.SHORT_TEXT)
         Truth.assertThat(right.secondaryDataSource).isNull()
-        Truth.assertThat(right.systemDataSourceFallback).isEqualTo(
-            SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
-        )
-        Truth.assertThat(right.systemDataSourceFallbackDefaultType).isEqualTo(
-            ComplicationType.SHORT_TEXT
-        )
+        Truth.assertThat(right.systemDataSourceFallback)
+            .isEqualTo(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET)
+        Truth.assertThat(right.systemDataSourceFallbackDefaultType)
+            .isEqualTo(ComplicationType.SHORT_TEXT)
     }
 
     @Test
     public fun xmlVersionCompatibility() {
         Truth.assertThat(
-            WatchFaceMetadataClient.isXmlVersionCompatible(
-                context,
-                context.resources,
-                context.packageName
+                WatchFaceMetadataClient.isXmlVersionCompatible(
+                    context,
+                    context.resources,
+                    context.packageName
+                )
             )
-        ).isTrue()
+            .isTrue()
         Truth.assertThat(
-            WatchFaceMetadataClient.isXmlVersionCompatible(
-                context,
-                context.resources,
-                context.packageName,
-                OutdatedWatchFaceControlTestService::class.java.name
+                WatchFaceMetadataClient.isXmlVersionCompatible(
+                    context,
+                    context.resources,
+                    context.packageName,
+                    OutdatedWatchFaceControlTestService::class.java.name
+                )
             )
-        ).isFalse()
+            .isFalse()
         Truth.assertThat(
-            WatchFaceMetadataClient.isXmlVersionCompatible(
-                context,
-                context.resources,
-                "non.existing.package",
-                "non.existing.package.Service"
+                WatchFaceMetadataClient.isXmlVersionCompatible(
+                    context,
+                    context.resources,
+                    "non.existing.package",
+                    "non.existing.package.Service"
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/BindHelper.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/BindHelper.kt
index 7871341..0274d30 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/BindHelper.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/BindHelper.kt
@@ -31,9 +31,9 @@
          *
          * @param context The [Context] on which to call [Context.bindService]
          * @param intent The [Intent] to pass to [Context.bindService]
-         * @param serviceConnection The [ServiceConnection] to pass to [Context.bindService].
-         * Note on API 29 and above this will be called on a binder thread, before that it will be
-         * called on the UI thread.
+         * @param serviceConnection The [ServiceConnection] to pass to [Context.bindService]. Note
+         *   on API 29 and above this will be called on a binder thread, before that it will be
+         *   called on the UI thread.
          * @return The result of [Context.bindService]
          */
         fun bindService(
@@ -44,11 +44,7 @@
             return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                 // API 29 lets us specify an executor to avoid a round trip via the potentially
                 // congested UI thread.
-                BindHelper29.bindServiceWithImmediateExecutor(
-                    context,
-                    intent,
-                    serviceConnection
-                )
+                BindHelper29.bindServiceWithImmediateExecutor(context, intent, serviceConnection)
             } else {
                 /** Note serviceConnection will be dispatched on the UI thread. */
                 context.bindService(
@@ -69,11 +65,12 @@
             context: Context,
             intent: Intent,
             serviceConnection: ServiceConnection
-        ) = context.bindService(
-            intent,
-            Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT,
-            { command -> command.run() },
-            serviceConnection
-        )
+        ) =
+            context.bindService(
+                intent,
+                Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT,
+                { command -> command.run() },
+                serviceConnection
+            )
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
index 77a1fcb..012c042 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
@@ -36,8 +36,7 @@
     public val bounds: Rect
 
     /** The type of the complication's bounds. */
-    @ComplicationSlotBoundsType
-    public val boundsType: Int
+    @ComplicationSlotBoundsType public val boundsType: Int
 
     /** The [ComplicationType]s supported by this complication. */
     public val supportedTypes: List<ComplicationType>
@@ -51,16 +50,14 @@
         get() = defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
 
     /** Whether or not the complication is currently enabled (i.e. it should be drawn. */
-    @get:JvmName("isEnabled")
-    public val isEnabled: Boolean
+    @get:JvmName("isEnabled") public val isEnabled: Boolean
 
     /**
      * Whether or not the complication was initially enabled before considering any
      * [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or disable
      * complicationSlots.
      */
-    @get:JvmName("isInitiallyEnabled")
-    public val isInitiallyEnabled: Boolean
+    @get:JvmName("isInitiallyEnabled") public val isInitiallyEnabled: Boolean
 
     /** The [ComplicationType] of the complication's current [ComplicationData]. */
     public val currentType: ComplicationType
@@ -78,45 +75,41 @@
      * The ID of a string resource (or `null` if absent) to identify the complication slot visually
      * in an editor. This is supposed to be short and without the word complication in it.
      */
-    @get:Suppress("AutoBoxing")
-    public val nameResourceId: Int?
+    @get:Suppress("AutoBoxing") public val nameResourceId: Int?
 
     /**
      * The ID of a string resource (or `null` if absent) to identify the complication slot in a
      * screen reader. This is supposed to be a complete sentence.
      */
-    @get:Suppress("AutoBoxing")
-    public val screenReaderNameResourceId: Int?
+    @get:Suppress("AutoBoxing") public val screenReaderNameResourceId: Int?
 
-    @OptIn(ComplicationExperimental::class)
-    private val boundingArc: BoundingArc?
+    @OptIn(ComplicationExperimental::class) private val boundingArc: BoundingArc?
 
     /** Describes the geometry of an edge complication if specified, or `null` otherwise. */
     // TODO(b/230364881): Make this a normal primary property when BoundingArc is no longer
     // experimental.
-    @ComplicationExperimental
-    public fun getBoundingArc(): BoundingArc? = boundingArc
+    @ComplicationExperimental public fun getBoundingArc(): BoundingArc? = boundingArc
 
     /**
      * @param bounds Screen space bounds of the [ComplicationSlot] in pixels.
      * @param boundsType The type of the complication's bounds.
      * @param supportedTypes The [ComplicationType]s supported by this complication.
      * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] for this
-     * complication slot.
+     *   complication slot.
      * @param isEnabled Whether or not the complication is currently enabled (i.e. it should be
-     * drawn).
+     *   drawn).
      * @param isInitiallyEnabled Whether or not the complication was initially enabled before
-     * considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
-     * disable complicationSlots.
+     *   considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
+     *   disable complicationSlots.
      * @param currentType The [ComplicationType] of the complication's current [ComplicationData].
      * @param fixedComplicationDataSource Whether or not the complication data source is fixed (i.e
-     * the user can't configure it).
+     *   the user can't configure it).
      * @param complicationConfigExtras Extras to be merged into the Intent sent when invoking the
-     * complication data source chooser activity.
+     *   complication data source chooser activity.
      * @param nameResourceId The ID of a string resource (or `null` if absent) to visually identify
-     * the complication slot in an editor.
+     *   the complication slot in an editor.
      * @param screenReaderNameResourceId The ID of a string resource (or `null` if absent) to
-     * identify the complication slot in a screen reader.
+     *   identify the complication slot in a screen reader.
      */
     public constructor(
         bounds: Rect,
@@ -128,10 +121,8 @@
         currentType: ComplicationType,
         fixedComplicationDataSource: Boolean,
         complicationConfigExtras: Bundle,
-        @Suppress("AutoBoxing")
-        nameResourceId: Int?,
-        @Suppress("AutoBoxing")
-        screenReaderNameResourceId: Int?
+        @Suppress("AutoBoxing") nameResourceId: Int?,
+        @Suppress("AutoBoxing") screenReaderNameResourceId: Int?
     ) {
         this.bounds = bounds
         this.boundsType = boundsType
@@ -154,23 +145,23 @@
      * @param boundsType The type of the complication's bounds.
      * @param supportedTypes The [ComplicationType]s supported by this complication.
      * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] for this
-     * complication slot.
+     *   complication slot.
      * @param isEnabled Whether or not the complication is currently enabled (i.e. it should be
-     * drawn).
+     *   drawn).
      * @param isInitiallyEnabled Whether or not the complication was initially enabled before
-     * considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
-     * disable complicationSlots.
+     *   considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
+     *   disable complicationSlots.
      * @param currentType The [ComplicationType] of the complication's current [ComplicationData].
      * @param fixedComplicationDataSource Whether or not the complication data source is fixed (i.e
-     * the user can't configure it).
+     *   the user can't configure it).
      * @param complicationConfigExtras Extras to be merged into the Intent sent when invoking the
-     * complication data source chooser activity.
+     *   complication data source chooser activity.
      * @param nameResourceId The ID of a string resource (or `null` if absent) to visually identify
-     * the complication slot in an editor.
+     *   the complication slot in an editor.
      * @param screenReaderNameResourceId The ID of a string resource (or `null` if absent) to
-     * identify the complication slot in a screen reader.
+     *   identify the complication slot in a screen reader.
      * @param edgeComplicationBoundingArc The [BoundingArc] describing the geometry of an edge
-     * complication if specified, or `null` otherwise.
+     *   complication if specified, or `null` otherwise.
      */
     @ComplicationExperimental
     public constructor(
@@ -183,10 +174,8 @@
         currentType: ComplicationType,
         fixedComplicationDataSource: Boolean,
         complicationConfigExtras: Bundle,
-        @Suppress("AutoBoxing")
-        nameResourceId: Int?,
-        @Suppress("AutoBoxing")
-        screenReaderNameResourceId: Int?,
+        @Suppress("AutoBoxing") nameResourceId: Int?,
+        @Suppress("AutoBoxing") screenReaderNameResourceId: Int?,
         edgeComplicationBoundingArc: BoundingArc?
     ) {
         this.bounds = bounds
@@ -208,21 +197,22 @@
      * @param boundsType The type of the complication's bounds.
      * @param supportedTypes The [ComplicationType]s supported by this complication.
      * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] for this
-     * complication slot.
+     *   complication slot.
      * @param defaultDataSourceType The default [ComplicationType] for this complication.
      * @param isEnabled Whether or not the complication is currently enabled (i.e. it should be
-     * drawn).
+     *   drawn).
      * @param isInitiallyEnabled Whether or not the complication was initially enabled before
-     * considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
-     * disable complicationSlots.
+     *   considering any [ComplicationSlotsOption] whose [ComplicationSlotOverlay]s may enable or
+     *   disable complicationSlots.
      * @param currentType The [ComplicationType] of the complication's current [ComplicationData].
      * @param fixedComplicationDataSource Whether or not the complication data source is fixed (i.e
-     * the user can't configure it).
+     *   the user can't configure it).
      * @param complicationConfigExtras Extras to be merged into the Intent sent when invoking the
-     * complication data source chooser activity.
+     *   complication data source chooser activity.
      */
     @Deprecated(
-        "defaultDataSourceType is depreciated", ReplaceWith(
+        "defaultDataSourceType is depreciated",
+        ReplaceWith(
             "ComplicationSlotState(Rect, Int, List<ComplicationType>, " +
                 "DefaultComplicationDataSourcePolicy, Boolean, Boolean, ComplicationType, Boolean" +
                 ", Bundle)"
@@ -243,33 +233,33 @@
         this.bounds = bounds
         this.boundsType = boundsType
         this.supportedTypes = supportedTypes
-        this.defaultDataSourcePolicy = when {
-            defaultDataSourcePolicy.secondaryDataSource != null ->
-                DefaultComplicationDataSourcePolicy(
-                    defaultDataSourcePolicy.primaryDataSource!!,
-                    defaultDataSourcePolicy.primaryDataSourceDefaultType
-                        ?: defaultDataSourceType,
-                    defaultDataSourcePolicy.secondaryDataSource!!,
-                    defaultDataSourcePolicy.secondaryDataSourceDefaultType
-                        ?: defaultDataSourceType,
-                    defaultDataSourcePolicy.systemDataSourceFallback,
-                    defaultDataSourceType
-                )
-
-            defaultDataSourcePolicy.primaryDataSource != null ->
-                DefaultComplicationDataSourcePolicy(
-                    defaultDataSourcePolicy.primaryDataSource!!,
-                    defaultDataSourcePolicy.primaryDataSourceDefaultType
-                        ?: defaultDataSourceType,
-                    defaultDataSourcePolicy.systemDataSourceFallback,
-                    defaultDataSourceType
-                )
-
-            else -> DefaultComplicationDataSourcePolicy(
-                defaultDataSourcePolicy.systemDataSourceFallback,
-                defaultDataSourceType
-            )
-        }
+        this.defaultDataSourcePolicy =
+            when {
+                defaultDataSourcePolicy.secondaryDataSource != null ->
+                    DefaultComplicationDataSourcePolicy(
+                        defaultDataSourcePolicy.primaryDataSource!!,
+                        defaultDataSourcePolicy.primaryDataSourceDefaultType
+                            ?: defaultDataSourceType,
+                        defaultDataSourcePolicy.secondaryDataSource!!,
+                        defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                            ?: defaultDataSourceType,
+                        defaultDataSourcePolicy.systemDataSourceFallback,
+                        defaultDataSourceType
+                    )
+                defaultDataSourcePolicy.primaryDataSource != null ->
+                    DefaultComplicationDataSourcePolicy(
+                        defaultDataSourcePolicy.primaryDataSource!!,
+                        defaultDataSourcePolicy.primaryDataSourceDefaultType
+                            ?: defaultDataSourceType,
+                        defaultDataSourcePolicy.systemDataSourceFallback,
+                        defaultDataSourceType
+                    )
+                else ->
+                    DefaultComplicationDataSourcePolicy(
+                        defaultDataSourcePolicy.systemDataSourceFallback,
+                        defaultDataSourceType
+                    )
+            }
         this.isEnabled = isEnabled
         this.isInitiallyEnabled = isInitiallyEnabled
         this.currentType = currentType
@@ -293,9 +283,7 @@
         DefaultComplicationDataSourcePolicy(
             complicationStateWireFormat.defaultDataSourcesToTry ?: emptyList(),
             complicationStateWireFormat.fallbackSystemProvider,
-            ComplicationType.fromWireType(
-                complicationStateWireFormat.primaryDataSourceDefaultType
-            ),
+            ComplicationType.fromWireType(complicationStateWireFormat.primaryDataSourceDefaultType),
             ComplicationType.fromWireType(
                 complicationStateWireFormat.secondaryDataSourceDefaultType
             ),
@@ -348,8 +336,7 @@
         if (complicationConfigExtras != other.complicationConfigExtras) return false
         if (nameResourceId != other.nameResourceId) return false
         if (screenReaderNameResourceId != other.screenReaderNameResourceId) return false
-        @OptIn(ComplicationExperimental::class)
-        if (boundingArc != other.boundingArc) return false
+        @OptIn(ComplicationExperimental::class) if (boundingArc != other.boundingArc) return false
 
         return true
     }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
index bc924c6..f9498e4 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
@@ -16,8 +16,8 @@
 
 package androidx.wear.watchface.client
 
-import androidx.wear.watchface.data.DeviceConfig as WireDeviceConfig
 import androidx.annotation.RestrictTo
+import androidx.wear.watchface.data.DeviceConfig as WireDeviceConfig
 
 /**
  * Describes the hardware configuration of the device the watch face is running on.
@@ -25,26 +25,25 @@
  * @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")
-    public val hasLowBitAmbient: Boolean,
-    @get:JvmName("hasBurnInProtection")
-    public val hasBurnInProtection: Boolean,
+    @get:JvmName("hasLowBitAmbient") public val hasLowBitAmbient: Boolean,
+    @get:JvmName("hasBurnInProtection") public val hasBurnInProtection: Boolean,
     public val analogPreviewReferenceTimeMillis: Long,
     public val digitalPreviewReferenceTimeMillis: Long
 ) {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun asWireDeviceConfig(): WireDeviceConfig = WireDeviceConfig(
-        hasLowBitAmbient,
-        hasBurnInProtection,
-        analogPreviewReferenceTimeMillis,
-        digitalPreviewReferenceTimeMillis
-    )
+    public fun asWireDeviceConfig(): WireDeviceConfig =
+        WireDeviceConfig(
+            hasLowBitAmbient,
+            hasBurnInProtection,
+            analogPreviewReferenceTimeMillis,
+            digitalPreviewReferenceTimeMillis
+        )
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -85,9 +84,10 @@
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public fun WireDeviceConfig.asApiDeviceConfig(): DeviceConfig = DeviceConfig(
-    hasLowBitAmbient,
-    hasBurnInProtection,
-    analogPreviewReferenceTimeMillis,
-    digitalPreviewReferenceTimeMillis
-)
\ No newline at end of file
+public fun WireDeviceConfig.asApiDeviceConfig(): DeviceConfig =
+    DeviceConfig(
+        hasLowBitAmbient,
+        hasBurnInProtection,
+        analogPreviewReferenceTimeMillis,
+        digitalPreviewReferenceTimeMillis
+    )
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorServiceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorServiceClient.kt
index 9a2c34f..9ebde74 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorServiceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorServiceClient.kt
@@ -35,45 +35,39 @@
      */
     public fun addListener(editorListener: EditorListener, listenerExecutor: Executor)
 
-    /** Unregisters an [EditorListener] previously registered via [addListener].  */
+    /** Unregisters an [EditorListener] previously registered via [addListener]. */
     public fun removeListener(editorListener: EditorListener)
 
     /** Instructs any open editor to close. */
-    @Throws(RemoteException::class)
-    public fun closeEditor()
+    @Throws(RemoteException::class) public fun closeEditor()
 }
 
 /** Observes state changes in [androidx.wear.watchface.editor.EditorSession]. */
 public interface EditorListener {
-    /** Called in response to [androidx.wear.watchface.editor.EditorSession.close] .*/
+    /** Called in response to [androidx.wear.watchface.editor.EditorSession.close] . */
     public fun onEditorStateChanged(editorState: EditorState)
 }
 
-internal class EditorServiceClientImpl(
-    private val iEditorService: IEditorService
-) : EditorServiceClient {
+internal class EditorServiceClientImpl(private val iEditorService: IEditorService) :
+    EditorServiceClient {
     private val lock = Any()
     private val editorMap = HashMap<EditorListener, Int>()
 
-    override fun addListener(
-        editorListener: EditorListener,
-        listenerExecutor: Executor
-    ) {
-        val observer = object : IEditorObserver.Stub() {
-            override fun getApiVersion() = IEditorObserver.API_VERSION
+    override fun addListener(editorListener: EditorListener, listenerExecutor: Executor) {
+        val observer =
+            object : IEditorObserver.Stub() {
+                override fun getApiVersion() = IEditorObserver.API_VERSION
 
-            override fun onEditorStateChange(editorStateWireFormat: EditorStateWireFormat) {
-                listenerExecutor.execute {
-                    editorListener.onEditorStateChanged(
-                        editorStateWireFormat.asApiEditorState()
-                    )
+                override fun onEditorStateChange(editorStateWireFormat: EditorStateWireFormat) {
+                    listenerExecutor.execute {
+                        editorListener.onEditorStateChanged(
+                            editorStateWireFormat.asApiEditorState()
+                        )
+                    }
                 }
             }
-        }
 
-        synchronized(lock) {
-            editorMap[editorListener] = iEditorService.registerObserver(observer)
-        }
+        synchronized(lock) { editorMap[editorListener] = iEditorService.registerObserver(observer) }
     }
 
     override fun removeListener(editorListener: EditorListener) {
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
index 77f5f87..379ca96 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
@@ -35,8 +35,8 @@
  * watch faces and editors should not need to do anything special because of this.
  *
  * @param id The system's id for a watch face being edited. This is passed in from
- * [androidx.wear.watchface.EditorRequest.watchFaceId] and matches the value passed to
- * [androidx.wear.watchface.WatchState.watchFaceInstanceId].
+ *   [androidx.wear.watchface.EditorRequest.watchFaceId] and matches the value passed to
+ *   [androidx.wear.watchface.WatchState.watchFaceInstanceId].
  */
 public class WatchFaceId(public val id: String) {
     override fun equals(other: Any?): Boolean {
@@ -65,23 +65,24 @@
  * @param watchFaceId The system's watch face instance ID. See [WatchFaceId] for details.
  * @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 data source 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 data source changes)
+ *   should be abandoned. There's no need to resend the style to the watchface because the library
+ *   will have restored the previous style.
  * @param previewImage If `non-null` this [Bitmap] contains a preview image of the watch face
- * rendered with the final style and complications and the
- * [androidx.wear.watchface.editor.PreviewScreenshotParams] specified in the
- * [androidx.wear.watchface.editor.EditorRequest]. If [shouldCommitChanges] is `false` then this
- * will also be `null` (see implementation of [androidx.wear.watchface.editor.EditorSession.close]).
+ *   rendered with the final style and complications and the
+ *   [androidx.wear.watchface.editor.PreviewScreenshotParams] specified in the
+ *   [androidx.wear.watchface.editor.EditorRequest]. If [shouldCommitChanges] is `false` then this
+ *   will also be `null` (see implementation of
+ *   [androidx.wear.watchface.editor.EditorSession.close]).
  */
-public class EditorState internal constructor(
+public class EditorState
+internal constructor(
     public val watchFaceId: WatchFaceId,
     public val userStyle: UserStyleData,
     public val previewComplicationsData: Map<Int, ComplicationData>,
-    @get:JvmName("shouldCommitChanges")
-    public val shouldCommitChanges: Boolean,
+    @get:JvmName("shouldCommitChanges") public val shouldCommitChanges: Boolean,
     public val previewImage: Bitmap?
 ) {
     override fun toString(): String =
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
index e7ef0ef..6094a6b 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
@@ -23,11 +23,10 @@
 import android.support.wearable.watchface.SharedMemoryImage
 import androidx.annotation.AnyThread
 import androidx.annotation.RequiresApi
-import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.ComplicationSlot
 import androidx.wear.watchface.ComplicationSlotsManager
 import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.control.IHeadlessWatchFace
 import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
@@ -36,12 +35,13 @@
 import androidx.wear.watchface.style.UserStyleFlavors
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
+import androidx.wear.watchface.utility.TraceEvent
 import java.security.MessageDigest
 import java.time.Instant
 import java.util.concurrent.Executor
 
 /**
- * Controls a stateless remote headless watch face.  This is mostly intended for use by watch face
+ * Controls a stateless remote headless watch face. This is mostly intended for use by watch face
  * editor UIs which need to generate screenshots for various styling configurations without
  * affecting the current watchface.
  *
@@ -59,12 +59,10 @@
     }
 
     /** The [Instant] to use when rendering previews. */
-    @get:Throws(RemoteException::class)
-    public val previewReferenceInstant: Instant
+    @get:Throws(RemoteException::class) public val previewReferenceInstant: Instant
 
     /** The watch face's [UserStyleSchema]. */
-    @get:Throws(RemoteException::class)
-    public val userStyleSchema: UserStyleSchema
+    @get:Throws(RemoteException::class) public val userStyleSchema: UserStyleSchema
 
     /**
      * A SHA-1 [MessageDigest] hash of the [UserStyleSchema]. Note that for performance reasons
@@ -82,7 +80,7 @@
      * Returns the watch face's [UserStyleFlavors] if any.
      *
      * @throws [RuntimeException] if the watch face threw an exception while trying to service the
-     * request or there was a communication problem with watch face process.
+     *   request or there was a communication problem with watch face process.
      */
     public fun getUserStyleFlavors(): UserStyleFlavors = UserStyleFlavors()
 
@@ -104,10 +102,10 @@
      * @param instant The [Instant] to render with
      * @param userStyle Optional [UserStyle] to render with, if null the default style is used.
      * @param slotIdToComplicationData Map of [androidx.wear.watchface.ComplicationSlot] ids to
-     * [ComplicationData] to render with, or if `null` [androidx.wear.watchface.ComplicationSlot]
-     * are not rendered.
+     *   [ComplicationData] to render with, or if `null` [androidx.wear.watchface.ComplicationSlot]
+     *   are not rendered.
      * @return A shared memory backed [Bitmap] containing a screenshot of the watch face with the
-     * given settings.
+     *   given settings.
      */
     @RequiresApi(27)
     @Throws(RemoteException::class)
@@ -128,7 +126,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 [complicationSlotId] is unrecognized.
+     *   given settings, or `null` if [complicationSlotId] is unrecognized.
      */
     @RequiresApi(27)
     @Throws(RemoteException::class)
@@ -156,42 +154,37 @@
     /**
      * Removes a [ClientDisconnectListener] previously registered by [addClientDisconnectListener].
      */
-    @AnyThread
-    public fun removeClientDisconnectListener(listener: ClientDisconnectListener)
+    @AnyThread public fun removeClientDisconnectListener(listener: ClientDisconnectListener)
 
     /** Returns true if the connection to the server side is alive. */
-    @AnyThread
-    public fun isConnectionAlive(): Boolean
+    @AnyThread public fun isConnectionAlive(): Boolean
 
     /** Stores the underlying connection in a [Bundle]. */
     public fun toBundle(): Bundle
 }
 
-internal class HeadlessWatchFaceClientImpl internal constructor(
-    private val iHeadlessWatchFace: IHeadlessWatchFace
-) : HeadlessWatchFaceClient {
+internal class HeadlessWatchFaceClientImpl
+internal constructor(private val iHeadlessWatchFace: IHeadlessWatchFace) : HeadlessWatchFaceClient {
 
     private val lock = Any()
     private val listeners = HashMap<HeadlessWatchFaceClient.ClientDisconnectListener, Executor>()
 
     init {
-        iHeadlessWatchFace.asBinder().linkToDeath(
-            {
-                var listenerCopy:
-                    HashMap<HeadlessWatchFaceClient.ClientDisconnectListener, Executor>
+        iHeadlessWatchFace
+            .asBinder()
+            .linkToDeath(
+                {
+                    var listenerCopy:
+                        HashMap<HeadlessWatchFaceClient.ClientDisconnectListener, Executor>
 
-                synchronized(lock) {
-                    listenerCopy = HashMap(listeners)
-                }
+                    synchronized(lock) { listenerCopy = HashMap(listeners) }
 
-                for ((listener, executor) in listenerCopy) {
-                    executor.execute {
-                        listener.onClientDisconnected()
+                    for ((listener, executor) in listenerCopy) {
+                        executor.execute { listener.onClientDisconnected() }
                     }
-                }
-            },
-            0
-        )
+                },
+                0
+            )
     }
 
     override val previewReferenceInstant: Instant
@@ -207,20 +200,20 @@
             userStyleSchema.getDigestHash()
         }
 
-    override fun getUserStyleFlavors(): UserStyleFlavors =
-        callRemote {
-            if (iHeadlessWatchFace.apiVersion >= 3) {
-                UserStyleFlavors(iHeadlessWatchFace.userStyleFlavors)
-            } else {
-                UserStyleFlavors()
-            }
+    override fun getUserStyleFlavors(): UserStyleFlavors = callRemote {
+        if (iHeadlessWatchFace.apiVersion >= 3) {
+            UserStyleFlavors(iHeadlessWatchFace.userStyleFlavors)
+        } else {
+            UserStyleFlavors()
         }
+    }
 
     override val complicationSlotsState: Map<Int, ComplicationSlotState>
-        get() = iHeadlessWatchFace.complicationState.associateBy(
-            { it.id },
-            { ComplicationSlotState(it.complicationState) }
-        )
+        get() =
+            iHeadlessWatchFace.complicationState.associateBy(
+                { it.id },
+                { ComplicationSlotState(it.complicationState) }
+            )
 
     @RequiresApi(27)
     override fun renderWatchFaceToBitmap(
@@ -228,23 +221,24 @@
         instant: Instant,
         userStyle: UserStyle?,
         slotIdToComplicationData: Map<Int, ComplicationData>?
-    ): Bitmap = TraceEvent("HeadlessWatchFaceClientImpl.renderWatchFaceToBitmap").use {
-        SharedMemoryImage.ashmemReadImageBundle(
-            iHeadlessWatchFace.renderWatchFaceToBitmap(
-                WatchFaceRenderParams(
-                    renderParameters.toWireFormat(),
-                    instant.toEpochMilli(),
-                    userStyle?.toWireFormat(),
-                    slotIdToComplicationData?.map {
-                        IdAndComplicationDataWireFormat(
-                            it.key,
-                            it.value.asWireComplicationData()
-                        )
-                    }
+    ): Bitmap =
+        TraceEvent("HeadlessWatchFaceClientImpl.renderWatchFaceToBitmap").use {
+            SharedMemoryImage.ashmemReadImageBundle(
+                iHeadlessWatchFace.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        renderParameters.toWireFormat(),
+                        instant.toEpochMilli(),
+                        userStyle?.toWireFormat(),
+                        slotIdToComplicationData?.map {
+                            IdAndComplicationDataWireFormat(
+                                it.key,
+                                it.value.asWireComplicationData()
+                            )
+                        }
+                    )
                 )
             )
-        )
-    }
+        }
 
     @RequiresApi(27)
     override fun renderComplicationToBitmap(
@@ -253,19 +247,20 @@
         instant: Instant,
         complicationData: ComplicationData,
         userStyle: UserStyle?,
-    ): Bitmap? = TraceEvent("HeadlessWatchFaceClientImpl.renderComplicationToBitmap").use {
-        iHeadlessWatchFace.renderComplicationToBitmap(
-            ComplicationRenderParams(
-                complicationSlotId,
-                renderParameters.toWireFormat(),
-                instant.toEpochMilli(),
-                complicationData.asWireComplicationData(),
-                userStyle?.toWireFormat(),
-            )
-        )?.let {
-            SharedMemoryImage.ashmemReadImageBundle(it)
+    ): Bitmap? =
+        TraceEvent("HeadlessWatchFaceClientImpl.renderComplicationToBitmap").use {
+            iHeadlessWatchFace
+                .renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        complicationSlotId,
+                        renderParameters.toWireFormat(),
+                        instant.toEpochMilli(),
+                        complicationData.asWireComplicationData(),
+                        userStyle?.toWireFormat(),
+                    )
+                )
+                ?.let { SharedMemoryImage.ashmemReadImageBundle(it) }
         }
-    }
 
     override fun addClientDisconnectListener(
         listener: HeadlessWatchFaceClient.ClientDisconnectListener,
@@ -282,18 +277,16 @@
     override fun removeClientDisconnectListener(
         listener: HeadlessWatchFaceClient.ClientDisconnectListener
     ) {
-        synchronized(lock) {
-            listeners.remove(listener)
-        }
+        synchronized(lock) { listeners.remove(listener) }
     }
 
     override fun isConnectionAlive() = iHeadlessWatchFace.asBinder().isBinderAlive
 
-    override fun toBundle() = Bundle().apply {
-        this.putBinder(HeadlessWatchFaceClient.BINDER_KEY, iHeadlessWatchFace.asBinder())
-    }
+    override fun toBundle() =
+        Bundle().apply {
+            this.putBinder(HeadlessWatchFaceClient.BINDER_KEY, iHeadlessWatchFace.asBinder())
+        }
 
-    override fun close() = TraceEvent("HeadlessWatchFaceClientImpl.close").use {
-        iHeadlessWatchFace.release()
-    }
+    override fun close() =
+        TraceEvent("HeadlessWatchFaceClientImpl.close").use { iHeadlessWatchFace.release() }
 }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index 21d7a66..566abd4 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -25,42 +25,37 @@
 import androidx.annotation.IntDef
 import androidx.annotation.Px
 import androidx.annotation.RequiresApi
+import androidx.wear.watchface.ComplicationSlot
+import androidx.wear.watchface.ComplicationSlotBoundsType
+import androidx.wear.watchface.ComplicationSlotsManager
+import androidx.wear.watchface.ContentDescriptionLabel
+import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.Renderer
+import androidx.wear.watchface.TapType
+import androidx.wear.watchface.WatchFaceColors
+import androidx.wear.watchface.WatchFaceExperimental
 import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationDisplayPolicy
 import androidx.wear.watchface.complications.data.toApiComplicationText
-import androidx.wear.watchface.utility.TraceEvent
-import androidx.wear.watchface.ComplicationSlot
-import androidx.wear.watchface.ComplicationSlotsManager
-import androidx.wear.watchface.ContentDescriptionLabel
-import androidx.wear.watchface.Renderer
-import androidx.wear.watchface.RenderParameters
-import androidx.wear.watchface.TapType
-import androidx.wear.watchface.WatchFaceColors
 import androidx.wear.watchface.control.IInteractiveWatchFace
-import androidx.wear.watchface.control.data.WatchFaceRenderParams
-import androidx.wear.watchface.ComplicationSlotBoundsType
-import androidx.wear.watchface.WatchFaceExperimental
 import androidx.wear.watchface.control.IWatchfaceListener
 import androidx.wear.watchface.control.IWatchfaceReadyListener
+import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchFaceColorsWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.UserStyle
+import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
-import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.toApiFormat
+import androidx.wear.watchface.utility.TraceEvent
 import java.time.Instant
 import java.util.concurrent.Executor
 import java.util.function.Consumer
 
 /** @hide */
-@IntDef(
-    value = [
-        DisconnectReasons.ENGINE_DIED,
-        DisconnectReasons.ENGINE_DETACHED
-    ]
-)
+@IntDef(value = [DisconnectReasons.ENGINE_DIED, DisconnectReasons.ENGINE_DETACHED])
 public annotation class DisconnectReason
 
 /**
@@ -70,19 +65,19 @@
 public object DisconnectReasons {
 
     /**
-     * The underlying engine died, probably because the watch face was killed or crashed.
-     * Sometimes this is due to memory pressure and it's not the watch face's fault. Usually in
-     * response a new [InteractiveWatchFaceClient] should be created (see
-     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]), however if this new
-     * client also disconnects due to [ENGINE_DIED] within a few seconds the watchface is
-     * probably bad and it's recommended to switch to a safe system default watch face.
+     * The underlying engine died, probably because the watch face was killed or crashed. Sometimes
+     * this is due to memory pressure and it's not the watch face's fault. Usually in response a new
+     * [InteractiveWatchFaceClient] should be created (see
+     * [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]), however if this new client
+     * also disconnects due to [ENGINE_DIED] within a few seconds the watchface is probably bad and
+     * it's recommended to switch to a safe system default watch face.
      */
     public const val ENGINE_DIED: Int = 1
 
     /**
-     * Wallpaper service detached from the engine, which is now defunct. The watch face itself
-     * has no control over this. Usually in response a new [InteractiveWatchFaceClient]
-     * should be created (see [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]).
+     * Wallpaper service detached from the engine, which is now defunct. The watch face itself has
+     * no control over this. Usually in response a new [InteractiveWatchFaceClient] should be
+     * created (see [WatchFaceControlClient.getOrCreateInteractiveWatchFaceClient]).
      */
     public const val ENGINE_DETACHED: Int = 2
 }
@@ -101,7 +96,7 @@
      * visually clean transition.
      *
      * @param slotIdToComplicationData The [ComplicationData] for each
-     * [androidx.wear.watchface.ComplicationSlot].
+     *   [androidx.wear.watchface.ComplicationSlot].
      */
     @Throws(RemoteException::class)
     public fun updateComplicationData(slotIdToComplicationData: Map<Int, ComplicationData>)
@@ -113,9 +108,9 @@
      * @param instant The [Instant] 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.
-     * @return A shared memory backed [Bitmap] containing a screenshot of the watch  face with the
-     * given settings.
+     *   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.
      */
     @RequiresApi(27)
     @Throws(RemoteException::class)
@@ -127,13 +122,12 @@
     ): Bitmap
 
     /** The UTC reference preview time for this watch face in milliseconds since the epoch. */
-    @get:Throws(RemoteException::class)
-    public val previewReferenceInstant: Instant
+    @get:Throws(RemoteException::class) public val previewReferenceInstant: Instant
 
     /**
-     * The watchface's [OverlayStyle] which configures the system status overlay on
-     * Wear 3.0 and beyond. Note for older watch faces which don't support this, the default value
-     * will be returned.
+     * The watchface's [OverlayStyle] which configures the system status overlay on Wear 3.0 and
+     * beyond. Note for older watch faces which don't support this, the default value will be
+     * returned.
      */
     @get:Throws(RemoteException::class)
     public val overlayStyle: OverlayStyle
@@ -142,9 +136,9 @@
 
     /**
      * Renames this instance to [newInstanceId] (must be unique, usually this would be different
-     * from the old ID but that's not a requirement). Sets the current [UserStyle] and clears
-     * any complication data. Setting the new UserStyle may have a side effect of enabling or
-     * disabling complicationSlots, which will be visible via [ComplicationSlotState.isEnabled].
+     * from the old ID but that's not a requirement). Sets the current [UserStyle] and clears any
+     * complication data. Setting the new UserStyle may have a side effect of enabling or disabling
+     * complicationSlots, which will be visible via [ComplicationSlotState.isEnabled].
      *
      * NB [setWatchUiState] and [updateWatchFaceInstance] can be called in any order.
      */
@@ -154,24 +148,20 @@
     /**
      * Renames this instance to [newInstanceId] (must be unique, usually this would be different
      * from the old ID but that's not a requirement). Sets the current [UserStyle] represented as a
-     * [UserStyleData> and clears any complication data. Setting the new UserStyle may have a
-     * side effect of enabling or disabling complicationSlots, which will be visible via
-     * [ComplicationSlotState.isEnabled].
+     * [UserStyleData> and clears any complication data. Setting the new UserStyle may have a side effect of enabling or disabling complicationSlots, which will be visible via [ComplicationSlotState.isEnabled].
      */
     @Throws(RemoteException::class)
     public fun updateWatchFaceInstance(newInstanceId: String, userStyle: UserStyleData)
 
     /** Returns the ID of this watch face instance. */
-    @get:Throws(RemoteException::class)
-    public val instanceId: String
+    @get:Throws(RemoteException::class) public val instanceId: String
 
     /** The watch face's [UserStyleSchema]. */
-    @get:Throws(RemoteException::class)
-    public val userStyleSchema: UserStyleSchema
+    @get:Throws(RemoteException::class) public val userStyleSchema: UserStyleSchema
 
     /**
      * Map of [androidx.wear.watchface.ComplicationSlot] ids to [ComplicationSlotState] for each
-     * [ComplicationSlot] registered with the  watch face's [ComplicationSlotsManager]. The
+     * [ComplicationSlot] registered with the watch face's [ComplicationSlotsManager]. The
      * ComplicationSlotState is based on the initial state of each
      * [androidx.wear.watchface.ComplicationSlot] plus any overrides from a
      * [ComplicationSlotsUserStyleSetting]. As a consequence ComplicationSlotState may update based
@@ -189,14 +179,18 @@
     @SuppressWarnings("AutoBoxing")
     @Throws(RemoteException::class)
     public fun getComplicationIdAt(@Px x: Int, @Px y: Int): Int? =
-        complicationSlotsState.asSequence().firstOrNull {
-            it.value.isEnabled && when (it.value.boundsType) {
-                ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
-                ComplicationSlotBoundsType.BACKGROUND -> false
-                ComplicationSlotBoundsType.EDGE -> false
-                else -> false
+        complicationSlotsState
+            .asSequence()
+            .firstOrNull {
+                it.value.isEnabled &&
+                    when (it.value.boundsType) {
+                        ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
+                        ComplicationSlotBoundsType.BACKGROUND -> false
+                        ComplicationSlotBoundsType.EDGE -> false
+                        else -> false
+                    }
             }
-        }?.key
+            ?.key
 
     public companion object {
         /** Indicates a "down" touch event on the watch face. */
@@ -241,8 +235,7 @@
     public fun setWatchUiState(watchUiState: androidx.wear.watchface.client.WatchUiState)
 
     /** Triggers watch face rendering into the surface when in ambient mode. */
-    @Throws(RemoteException::class)
-    public fun performAmbientTick()
+    @Throws(RemoteException::class) public fun performAmbientTick()
 
     /**
      * Callback that observes when the client disconnects. Use [addClientDisconnectListener] to
@@ -258,15 +251,11 @@
             "Deprecated, use an overload that passes the disconnectReason",
             ReplaceWith("onClientDisconnected(Int)")
         )
-        public fun onClientDisconnected() {
-        }
+        public fun onClientDisconnected() {}
 
-        /**
-         * The client disconnected, due to [disconnectReason].
-         */
+        /** The client disconnected, due to [disconnectReason]. */
         public fun onClientDisconnected(@DisconnectReason disconnectReason: Int) {
-            @Suppress("DEPRECATION")
-            onClientDisconnected()
+            @Suppress("DEPRECATION") onClientDisconnected()
         }
     }
 
@@ -277,12 +266,10 @@
     /**
      * Removes a [ClientDisconnectListener] previously registered by [addClientDisconnectListener].
      */
-    @AnyThread
-    public fun removeClientDisconnectListener(listener: ClientDisconnectListener)
+    @AnyThread public fun removeClientDisconnectListener(listener: ClientDisconnectListener)
 
     /** Returns true if the connection to the server side is alive. */
-    @AnyThread
-    public fun isConnectionAlive(): Boolean
+    @AnyThread public fun isConnectionAlive(): Boolean
 
     /**
      * Interface passed to [addOnWatchFaceReadyListener] which calls
@@ -311,9 +298,7 @@
      */
     public fun addOnWatchFaceReadyListener(executor: Executor, listener: OnWatchFaceReadyListener)
 
-    /**
-     * Stops listening for events registered by [addOnWatchFaceReadyListener].
-     */
+    /** Stops listening for events registered by [addOnWatchFaceReadyListener]. */
     public fun removeOnWatchFaceReadyListener(listener: OnWatchFaceReadyListener)
 
     /**
@@ -322,20 +307,17 @@
      * face's [Renderer.watchfaceColors] change.
      *
      * @param executor The [Executor] on which to run [listener].
-     * @param listener The [Consumer] to run whenever the watch face's
-     * [Renderer.watchfaceColors] change.
+     * @param listener The [Consumer] to run whenever the watch face's [Renderer.watchfaceColors]
+     *   change.
      */
     @OptIn(WatchFaceExperimental::class)
     @WatchFaceClientExperimental
     public fun addOnWatchFaceColorsListener(
         executor: Executor,
         listener: Consumer<WatchFaceColors?>
-    ) {
-    }
+    ) {}
 
-    /**
-     * Stops listening for events registered by [addOnWatchFaceColorsListener].
-     */
+    /** Stops listening for events registered by [addOnWatchFaceColorsListener]. */
     @OptIn(WatchFaceExperimental::class)
     @WatchFaceClientExperimental
     public fun removeOnWatchFaceColorsListener(listener: Consumer<WatchFaceColors?>) {}
@@ -351,7 +333,8 @@
 
 /** Controls a stateful remote interactive watch face. */
 @OptIn(WatchFaceExperimental::class)
-internal class InteractiveWatchFaceClientImpl internal constructor(
+internal class InteractiveWatchFaceClientImpl
+internal constructor(
     private val iInteractiveWatchFace: IInteractiveWatchFace,
     private val previewImageUpdateRequestedExecutor: Executor?,
     private val previewImageUpdateRequestedListener: Consumer<String>?
@@ -362,53 +345,48 @@
         HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>()
     private val readyListeners =
         HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>()
-    private val watchFaceColorsChangeListeners =
-        HashMap<Consumer<WatchFaceColors?>, Executor>()
+    private val watchFaceColorsChangeListeners = HashMap<Consumer<WatchFaceColors?>, Executor>()
     private var watchfaceReadyListenerRegistered = false
     private var lastWatchFaceColors: WatchFaceColors? = null
     private var disconnectReason: Int? = null
     private var closed = false
 
-    private val iWatchFaceListener = object : IWatchfaceListener.Stub() {
-        override fun getApiVersion() = IWatchfaceListener.API_VERSION
+    private val iWatchFaceListener =
+        object : IWatchfaceListener.Stub() {
+            override fun getApiVersion() = IWatchfaceListener.API_VERSION
 
-        override fun onWatchfaceReady() {
-            this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
-        }
-
-        override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {
-            var listenerCopy: HashMap<Consumer<WatchFaceColors?>, Executor>
-
-            synchronized(lock) {
-                listenerCopy = HashMap(watchFaceColorsChangeListeners)
-                lastWatchFaceColors = watchFaceColors?.toApiFormat()
+            override fun onWatchfaceReady() {
+                this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
             }
 
-            for ((listener, executor) in listenerCopy) {
-                executor.execute {
-                    listener.accept(lastWatchFaceColors)
+            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {
+                var listenerCopy: HashMap<Consumer<WatchFaceColors?>, Executor>
+
+                synchronized(lock) {
+                    listenerCopy = HashMap(watchFaceColorsChangeListeners)
+                    lastWatchFaceColors = watchFaceColors?.toApiFormat()
+                }
+
+                for ((listener, executor) in listenerCopy) {
+                    executor.execute { listener.accept(lastWatchFaceColors) }
                 }
             }
-        }
 
-        override fun onPreviewImageUpdateRequested(watchFaceId: String) {
-            previewImageUpdateRequestedExecutor?.execute {
-                previewImageUpdateRequestedListener!!.accept(watchFaceId)
+            override fun onPreviewImageUpdateRequested(watchFaceId: String) {
+                previewImageUpdateRequestedExecutor?.execute {
+                    previewImageUpdateRequestedListener!!.accept(watchFaceId)
+                }
+            }
+
+            override fun onEngineDetached() {
+                sendDisconnectNotification(DisconnectReasons.ENGINE_DETACHED)
             }
         }
 
-        override fun onEngineDetached() {
-            sendDisconnectNotification(DisconnectReasons.ENGINE_DETACHED)
-        }
-    }
-
     init {
-        iInteractiveWatchFace.asBinder().linkToDeath(
-            {
-                sendDisconnectNotification(DisconnectReasons.ENGINE_DIED)
-            },
-            0
-        )
+        iInteractiveWatchFace
+            .asBinder()
+            .linkToDeath({ sendDisconnectNotification(DisconnectReasons.ENGINE_DIED) }, 0)
 
         if (iInteractiveWatchFace.apiVersion >= 6) {
             iInteractiveWatchFace.addWatchFaceListener(iWatchFaceListener)
@@ -416,30 +394,28 @@
     }
 
     internal fun sendDisconnectNotification(reason: Int) {
-        val listenersCopy = synchronized(lock) {
-            // Don't send more than one notification.
-            if (disconnectReason != null) {
-                return
+        val listenersCopy =
+            synchronized(lock) {
+                // Don't send more than one notification.
+                if (disconnectReason != null) {
+                    return
+                }
+                disconnectReason = reason
+                HashMap(disconnectListeners)
             }
-            disconnectReason = reason
-            HashMap(disconnectListeners)
-        }
         for ((listener, executor) in listenersCopy) {
-            executor.execute {
-                listener.onClientDisconnected(reason)
-            }
+            executor.execute { listener.onClientDisconnected(reason) }
         }
     }
 
-    override fun updateComplicationData(
-        slotIdToComplicationData: Map<Int, ComplicationData>
-    ) = TraceEvent("InteractiveWatchFaceClientImpl.updateComplicationData").use {
-        iInteractiveWatchFace.updateComplicationData(
-            slotIdToComplicationData.map {
-                IdAndComplicationDataWireFormat(it.key, it.value.asWireComplicationData())
-            }
-        )
-    }
+    override fun updateComplicationData(slotIdToComplicationData: Map<Int, ComplicationData>) =
+        TraceEvent("InteractiveWatchFaceClientImpl.updateComplicationData").use {
+            iInteractiveWatchFace.updateComplicationData(
+                slotIdToComplicationData.map {
+                    IdAndComplicationDataWireFormat(it.key, it.value.asWireComplicationData())
+                }
+            )
+        }
 
     @RequiresApi(27)
     override fun renderWatchFaceToBitmap(
@@ -447,23 +423,24 @@
         instant: Instant,
         userStyle: UserStyle?,
         idAndComplicationData: Map<Int, ComplicationData>?
-    ): Bitmap = TraceEvent("InteractiveWatchFaceClientImpl.renderWatchFaceToBitmap").use {
-        SharedMemoryImage.ashmemReadImageBundle(
-            iInteractiveWatchFace.renderWatchFaceToBitmap(
-                WatchFaceRenderParams(
-                    renderParameters.toWireFormat(),
-                    instant.toEpochMilli(),
-                    userStyle?.toWireFormat(),
-                    idAndComplicationData?.map {
-                        IdAndComplicationDataWireFormat(
-                            it.key,
-                            it.value.asWireComplicationData()
-                        )
-                    }
+    ): Bitmap =
+        TraceEvent("InteractiveWatchFaceClientImpl.renderWatchFaceToBitmap").use {
+            SharedMemoryImage.ashmemReadImageBundle(
+                iInteractiveWatchFace.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        renderParameters.toWireFormat(),
+                        instant.toEpochMilli(),
+                        userStyle?.toWireFormat(),
+                        idAndComplicationData?.map {
+                            IdAndComplicationDataWireFormat(
+                                it.key,
+                                it.value.asWireComplicationData()
+                            )
+                        }
+                    )
                 )
             )
-        )
-    }
+        }
 
     override val previewReferenceInstant: Instant
         get() = Instant.ofEpochMilli(iInteractiveWatchFace.previewReferenceTimeMillis)
@@ -478,23 +455,15 @@
             return OverlayStyle(null, null)
         }
 
-    override fun updateWatchFaceInstance(newInstanceId: String, userStyle: UserStyle) = TraceEvent(
-        "InteractiveWatchFaceClientImpl.updateInstance"
-    ).use {
-        iInteractiveWatchFace.updateWatchfaceInstance(newInstanceId, userStyle.toWireFormat())
-    }
+    override fun updateWatchFaceInstance(newInstanceId: String, userStyle: UserStyle) =
+        TraceEvent("InteractiveWatchFaceClientImpl.updateInstance").use {
+            iInteractiveWatchFace.updateWatchfaceInstance(newInstanceId, userStyle.toWireFormat())
+        }
 
-    override fun updateWatchFaceInstance(
-        newInstanceId: String,
-        userStyle: UserStyleData
-    ) = TraceEvent(
-        "InteractiveWatchFaceClientImpl.updateInstance"
-    ).use {
-        iInteractiveWatchFace.updateWatchfaceInstance(
-            newInstanceId,
-            userStyle.toWireFormat()
-        )
-    }
+    override fun updateWatchFaceInstance(newInstanceId: String, userStyle: UserStyleData) =
+        TraceEvent("InteractiveWatchFaceClientImpl.updateInstance").use {
+            iInteractiveWatchFace.updateWatchfaceInstance(newInstanceId, userStyle.toWireFormat())
+        }
 
     override val instanceId: String
         get() = iInteractiveWatchFace.instanceId
@@ -503,79 +472,64 @@
         get() = UserStyleSchema(iInteractiveWatchFace.userStyleSchema)
 
     override val complicationSlotsState: Map<Int, ComplicationSlotState>
-        get() = iInteractiveWatchFace.complicationDetails.associateBy(
-            { it.id },
-            { ComplicationSlotState(it.complicationState) }
-        )
+        get() =
+            iInteractiveWatchFace.complicationDetails.associateBy(
+                { it.id },
+                { ComplicationSlotState(it.complicationState) }
+            )
 
-    override fun close() = TraceEvent("InteractiveWatchFaceClientImpl.close").use {
-        if (iInteractiveWatchFace.apiVersion >= 6) {
-            iInteractiveWatchFace.removeWatchFaceListener(iWatchFaceListener)
+    override fun close() =
+        TraceEvent("InteractiveWatchFaceClientImpl.close").use {
+            if (iInteractiveWatchFace.apiVersion >= 6) {
+                iInteractiveWatchFace.removeWatchFaceListener(iWatchFaceListener)
+            }
+            iInteractiveWatchFace.release()
+            synchronized(lock) { closed = true }
         }
-        iInteractiveWatchFace.release()
-        synchronized(lock) {
-            closed = true
-        }
-    }
 
-    override fun sendTouchEvent(
-        xPosition: Int,
-        yPosition: Int,
-        @TapType tapType: Int
-    ) = TraceEvent("InteractiveWatchFaceClientImpl.sendTouchEvent").use {
-        iInteractiveWatchFace.sendTouchEvent(xPosition, yPosition, tapType)
-    }
+    override fun sendTouchEvent(xPosition: Int, yPosition: Int, @TapType tapType: Int) =
+        TraceEvent("InteractiveWatchFaceClientImpl.sendTouchEvent").use {
+            iInteractiveWatchFace.sendTouchEvent(xPosition, yPosition, tapType)
+        }
 
     override val contentDescriptionLabels: List<ContentDescriptionLabel>
-        get() = iInteractiveWatchFace.contentDescriptionLabels?.map {
-            ContentDescriptionLabel(
-                it.text.toApiComplicationText(),
-                it.bounds,
-                it.tapAction
-            )
-        } ?: emptyList()
+        get() =
+            iInteractiveWatchFace.contentDescriptionLabels?.map {
+                ContentDescriptionLabel(it.text.toApiComplicationText(), it.bounds, it.tapAction)
+            }
+                ?: emptyList()
 
-    override fun setWatchUiState(
-        watchUiState: androidx.wear.watchface.client.WatchUiState
-    ) = TraceEvent(
-        "InteractiveWatchFaceClientImpl.setSystemState"
-    ).use {
-        iInteractiveWatchFace.setWatchUiState(
-            WatchUiState(
-                watchUiState.inAmbientMode,
-                watchUiState.interruptionFilter
+    override fun setWatchUiState(watchUiState: androidx.wear.watchface.client.WatchUiState) =
+        TraceEvent("InteractiveWatchFaceClientImpl.setSystemState").use {
+            iInteractiveWatchFace.setWatchUiState(
+                WatchUiState(watchUiState.inAmbientMode, watchUiState.interruptionFilter)
             )
-        )
-    }
+        }
 
-    override fun performAmbientTick() = TraceEvent(
-        "InteractiveWatchFaceClientImpl.performAmbientTick"
-    ).use {
-        iInteractiveWatchFace.ambientTickUpdate()
-    }
+    override fun performAmbientTick() =
+        TraceEvent("InteractiveWatchFaceClientImpl.performAmbientTick").use {
+            iInteractiveWatchFace.ambientTickUpdate()
+        }
 
     override fun addClientDisconnectListener(
         listener: InteractiveWatchFaceClient.ClientDisconnectListener,
         executor: Executor
     ) {
-        val disconnectReasonCopy = synchronized(lock) {
-            require(!disconnectListeners.contains(listener)) {
-                "Don't call addClientDisconnectListener multiple times for the same listener"
+        val disconnectReasonCopy =
+            synchronized(lock) {
+                require(!disconnectListeners.contains(listener)) {
+                    "Don't call addClientDisconnectListener multiple times for the same listener"
+                }
+                disconnectListeners.put(listener, executor)
+                disconnectReason
             }
-            disconnectListeners.put(listener, executor)
-            disconnectReason
-        }
-        disconnectReasonCopy?.let {
-            listener.onClientDisconnected(it)
-        }
+        disconnectReasonCopy?.let { listener.onClientDisconnected(it) }
     }
 
     override fun removeClientDisconnectListener(
         listener: InteractiveWatchFaceClient.ClientDisconnectListener
     ) {
-        synchronized(lock) {
-            disconnectListeners.remove(listener)
-        }
+        synchronized(lock) { disconnectListeners.remove(listener) }
     }
 
     override fun isConnectionAlive() =
@@ -588,7 +542,6 @@
         when {
             // From version 6 we want to use IWatchFaceListener instead.
             iInteractiveWatchFace.apiVersion >= 6 -> return
-
             iInteractiveWatchFace.apiVersion >= 2 -> {
                 iInteractiveWatchFace.addWatchfaceReadyListener(
                     object : IWatchfaceReadyListener.Stub() {
@@ -600,7 +553,6 @@
                     }
                 )
             }
-
             else -> {
                 // We can emulate this on an earlier API by using a call to get userStyleSchema that
                 // will block until the watch face is ready. to Avoid blocking the current thread we
@@ -621,14 +573,10 @@
     internal fun onWatchFaceReady() {
         var listenerCopy: HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>
 
-        synchronized(lock) {
-            listenerCopy = HashMap(readyListeners)
-        }
+        synchronized(lock) { listenerCopy = HashMap(readyListeners) }
 
         for ((listener, executor) in listenerCopy) {
-            executor.execute {
-                listener.onWatchFaceReady()
-            }
+            executor.execute { listener.onWatchFaceReady() }
         }
     }
 
@@ -648,9 +596,7 @@
     override fun removeOnWatchFaceReadyListener(
         listener: InteractiveWatchFaceClient.OnWatchFaceReadyListener
     ) {
-        synchronized(lock) {
-            readyListeners.remove(listener)
-        }
+        synchronized(lock) { readyListeners.remove(listener) }
     }
 
     @WatchFaceClientExperimental
@@ -658,49 +604,50 @@
         executor: Executor,
         listener: Consumer<WatchFaceColors?>
     ) {
-        val colors = synchronized(lock) {
-            require(!watchFaceColorsChangeListeners.contains(listener)) {
-                "Don't call addOnWatchFaceColorsListener multiple times for the same listener"
-            }
-            maybeRegisterWatchfaceReadyListener()
-            watchFaceColorsChangeListeners.put(listener, executor)
+        val colors =
+            synchronized(lock) {
+                require(!watchFaceColorsChangeListeners.contains(listener)) {
+                    "Don't call addOnWatchFaceColorsListener multiple times for the same listener"
+                }
+                maybeRegisterWatchfaceReadyListener()
+                watchFaceColorsChangeListeners.put(listener, executor)
 
-            lastWatchFaceColors
-        }
+                lastWatchFaceColors
+            }
 
         listener.accept(colors)
     }
 
     @WatchFaceClientExperimental
-    override fun removeOnWatchFaceColorsListener(
-        listener: Consumer<WatchFaceColors?>
-    ) {
-        synchronized(lock) {
-            watchFaceColorsChangeListeners.remove(listener)
-        }
+    override fun removeOnWatchFaceColorsListener(listener: Consumer<WatchFaceColors?>) {
+        synchronized(lock) { watchFaceColorsChangeListeners.remove(listener) }
     }
 
-    override fun getComplicationIdAt(@Px x: Int, @Px y: Int): Int? = TraceEvent(
-        "getComplicationIdAt"
-    ).use {
-        if (iInteractiveWatchFace.apiVersion >= 7) {
-            val longId = iInteractiveWatchFace.getComplicationIdAt(x, y)
-            if (longId == Long.MIN_VALUE) {
-                null
-            } else {
-                longId.toInt()
-            }
-        } else {
-            complicationSlotsState.asSequence().firstOrNull {
-                it.value.isEnabled && when (it.value.boundsType) {
-                    ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
-                    ComplicationSlotBoundsType.BACKGROUND -> false
-                    ComplicationSlotBoundsType.EDGE -> false
-                    else -> false
+    override fun getComplicationIdAt(@Px x: Int, @Px y: Int): Int? =
+        TraceEvent("getComplicationIdAt").use {
+            if (iInteractiveWatchFace.apiVersion >= 7) {
+                val longId = iInteractiveWatchFace.getComplicationIdAt(x, y)
+                if (longId == Long.MIN_VALUE) {
+                    null
+                } else {
+                    longId.toInt()
                 }
-            }?.key
+            } else {
+                complicationSlotsState
+                    .asSequence()
+                    .firstOrNull {
+                        it.value.isEnabled &&
+                            when (it.value.boundsType) {
+                                ComplicationSlotBoundsType.ROUND_RECT ->
+                                    it.value.bounds.contains(x, y)
+                                ComplicationSlotBoundsType.BACKGROUND -> false
+                                ComplicationSlotBoundsType.EDGE -> false
+                                else -> false
+                            }
+                    }
+                    ?.key
+            }
         }
-    }
 
-    override fun isComplicationDisplayPolicySupported() = iInteractiveWatchFace.apiVersion >= 7
+    override fun isComplicationDisplayPolicySupported() = iInteractiveWatchFace.apiVersion >= 8
 }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/OverlayStyle.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/OverlayStyle.kt
index 0b1f55e..7091065 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/OverlayStyle.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/OverlayStyle.kt
@@ -31,9 +31,9 @@
     val backgroundColor: Color?,
 
     /**
-     * The background color of items rendered in the status indicator tray. If not `null` then
-     * this must be either [Color.BLACK] or [Color.WHITE]. If this is `null` then the system
-     * default will be used.
+     * The background color of items rendered in the status indicator tray. If not `null` then this
+     * must be either [Color.BLACK] or [Color.WHITE]. If this is `null` then the system default will
+     * be used.
      */
     val foregroundColor: Color?
 ) {
@@ -65,4 +65,4 @@
         return "OverlayStyle(backgroundColor=$backgroundColor, " +
             "foregroundColor=$foregroundColor)"
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceClientExperimental.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceClientExperimental.kt
index 66f5166..7693278 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceClientExperimental.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceClientExperimental.kt
@@ -16,8 +16,6 @@
 
 package androidx.wear.watchface.client
 
-@RequiresOptIn(
-    "This is an experimental API that may change or be removed without warning."
-)
+@RequiresOptIn("This is an experimental API that may change or be removed without warning.")
 @Retention(AnnotationRetention.BINARY)
 annotation class WatchFaceClientExperimental
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index 2bc3ba1..fad38e4 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -29,8 +29,6 @@
 import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.utility.AsyncTraceEvent
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.IWatchFaceControlService
@@ -43,12 +41,14 @@
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.style.data.UserStyleWireFormat
+import androidx.wear.watchface.utility.AsyncTraceEvent
+import androidx.wear.watchface.utility.TraceEvent
 import java.util.concurrent.Executor
 import java.util.function.Consumer
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
 import kotlin.coroutines.resumeWithException
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
  * Connects to a watch face's WatchFaceControlService which allows the user to control the watch
@@ -63,22 +63,23 @@
          *
          * @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.
+         *   a [ServiceStartFailureException] if the watch face dies during startup.
          */
         @JvmStatic
         @Throws(ServiceNotBoundException::class, ServiceStartFailureException::class)
         public suspend fun createWatchFaceControlClient(
             context: Context,
             watchFacePackageName: String
-        ): WatchFaceControlClient = createWatchFaceControlClientImpl(
-            context,
-            Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE).apply {
-                setPackage(watchFacePackageName)
-            }
-        )
+        ): WatchFaceControlClient =
+            createWatchFaceControlClientImpl(
+                context,
+                Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE).apply {
+                    setPackage(watchFacePackageName)
+                }
+            )
 
         /** @hide */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -88,34 +89,29 @@
         ): WatchFaceControlClient {
             val deferredService = CompletableDeferred<IWatchFaceControlService>()
             val traceEvent = AsyncTraceEvent("WatchFaceControlClientImpl.bindService")
-            val serviceConnection = object : ServiceConnection {
-                override fun onServiceConnected(name: ComponentName, binder: IBinder) {
-                    traceEvent.close()
-                    deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
-                }
+            val serviceConnection =
+                object : ServiceConnection {
+                    override fun onServiceConnected(name: ComponentName, binder: IBinder) {
+                        traceEvent.close()
+                        deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
+                    }
 
-                override fun onServiceDisconnected(name: ComponentName?) {
-                    // Note if onServiceConnected is called first completeExceptionally will do
-                    // nothing because the CompletableDeferred is already completed.
-                    traceEvent.close()
-                    deferredService.completeExceptionally(ServiceStartFailureException())
+                    override fun onServiceDisconnected(name: ComponentName?) {
+                        // Note if onServiceConnected is called first completeExceptionally will do
+                        // nothing because the CompletableDeferred is already completed.
+                        traceEvent.close()
+                        deferredService.completeExceptionally(ServiceStartFailureException())
+                    }
                 }
-            }
             if (!BindHelper.bindService(context, intent, serviceConnection)) {
                 traceEvent.close()
                 throw ServiceNotBoundException()
             }
-            return WatchFaceControlClientImpl(
-                context,
-                deferredService.await(),
-                serviceConnection
-            )
+            return WatchFaceControlClientImpl(context, deferredService.await(), serviceConnection)
         }
     }
 
-    /**
-     * Exception thrown by [createWatchFaceControlClient] if the remote service can't be bound.
-     */
+    /** Exception thrown by [createWatchFaceControlClient] if the remote service can't be bound. */
     public class ServiceNotBoundException : Exception()
 
     /** Exception thrown by [WatchFaceControlClient] methods if the service dies during start up. */
@@ -129,7 +125,7 @@
      *
      * @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.
+     *   [ServiceNotBoundException] if the WatchFaceControlService is not bound.
      */
     @Throws(RemoteException::class)
     public fun getInteractiveWatchFaceClientInstance(
@@ -144,8 +140,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]
@@ -174,10 +170,10 @@
      * When finished call [HeadlessWatchFaceClient.close] to release resources.
      *
      * @param id The ID for the requested [HeadlessWatchFaceClient], will be exposed to the watch
-     * face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
+     *   face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
      * @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]
@@ -196,21 +192,21 @@
         createHeadlessWatchFaceClient(watchFaceName, deviceConfig, surfaceWidth, surfaceHeight)
 
     /**
-     * Requests either an existing [InteractiveWatchFaceClient] with the specified [id] or
-     * schedules creation of an [InteractiveWatchFaceClient] for the next time the
-     * WallpaperService creates an engine.
+     * Requests either an existing [InteractiveWatchFaceClient] with the specified [id] or schedules
+     * creation of an [InteractiveWatchFaceClient] for the next time the WallpaperService creates an
+     * engine.
      *
      * NOTE that currently only one [InteractiveWatchFaceClient] per process can exist at a time.
      *
-     * @param id The ID for the requested [InteractiveWatchFaceClient], will be exposed to the
-     * watch face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
+     * @param id The ID for the requested [InteractiveWatchFaceClient], will be exposed to the watch
+     *   face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
      * @param deviceConfig The [DeviceConfig] for the wearable.
      * @param watchUiState The initial [WatchUiState] for the wearable.
      * @param userStyle Optional [UserStyleData] to apply to the instance (whether or not it's
-     * created). If `null` then the pre-existing user style is preserved (if the instance is created
-     * this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
+     *   created). If `null` then the pre-existing user style is preserved (if the instance is
+     *   created this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
      * @param slotIdToComplicationData The initial [androidx.wear.watchface.ComplicationSlot] data,
-     * or `null` if unavailable.
+     *   or `null` if unavailable.
      * @return The [InteractiveWatchFaceClient], this should be closed when finished.
      * @throws [ServiceStartFailureException] if the watchface dies during startup.
      */
@@ -233,33 +229,32 @@
 
     /**
      * Requests either an existing [InteractiveWatchFaceClient] with the specified [instanceId] or
-     * schedules creation of an [InteractiveWatchFaceClient] for the next time the
-     * WallpaperService creates an engine.
+     * schedules creation of an [InteractiveWatchFaceClient] for the next time the WallpaperService
+     * creates an engine.
      *
      * NOTE that currently only one [InteractiveWatchFaceClient] per process can exist at a time.
      *
      * @param instanceId The ID for the requested [InteractiveWatchFaceClient], will be exposed to
-     * the watch face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
+     *   the watch face via [androidx.wear.watchface.WatchState.watchFaceInstanceId].
      * @param deviceConfig The [DeviceConfig] for the wearable.
      * @param watchUiState The initial [WatchUiState] for the wearable.
      * @param userStyle Optional [UserStyleData] to apply to the instance (whether or not it's
-     * created). If `null` then the pre-existing user style is preserved (if the instance is created
-     * this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
+     *   created). If `null` then the pre-existing user style is preserved (if the instance is
+     *   created this will be the [androidx.wear.watchface.style.UserStyleSchema]'s default).
      * @param slotIdToComplicationData The initial [androidx.wear.watchface.ComplicationSlot] data,
-     * or `null` if unavailable.
+     *   or `null` if unavailable.
      * @param previewImageUpdateRequestedExecutor The [Executor] on which to run
-     * [previewImageUpdateRequestedListener] if the watch face calls
-     * [Renderer.sendPreviewImageNeedsUpdateRequest].
+     *   [previewImageUpdateRequestedListener] if the watch face calls
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest].
      * @param previewImageUpdateRequestedListener The [Consumer] fires when the watch face calls
-     * [Renderer.sendPreviewImageNeedsUpdateRequest], indicating that it now looks visually
-     * different. The string passed to the [Consumer] is the ID of the watch face (see [instanceId]
-     * passed into [getOrCreateInteractiveWatchFaceClient]) requesting the update. This will usually
-     * match the current watch face but it could also be from a previous watch face if
-     * [InteractiveWatchFaceClient.updateWatchFaceInstance] is called shortly after
-     * [Renderer.sendPreviewImageNeedsUpdateRequest].
-     * The [Consumer] should Schedule creation of a headless instance to render a new preview image
-     * for the instanceId. This is likely an expensive operation and should be rate limited.
-     *
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest], indicating that it now looks visually
+     *   different. The string passed to the [Consumer] is the ID of the watch face (see
+     *   [instanceId] passed into [getOrCreateInteractiveWatchFaceClient]) requesting the update.
+     *   This will usually match the current watch face but it could also be from a previous watch
+     *   face if [InteractiveWatchFaceClient.updateWatchFaceInstance] is called shortly after
+     *   [Renderer.sendPreviewImageNeedsUpdateRequest]. The [Consumer] should Schedule creation of a
+     *   headless instance to render a new preview image for the instanceId. This is likely an
+     *   expensive operation and should be rate limited.
      * @return The [InteractiveWatchFaceClient], this should be closed when finished.
      * @throws [ServiceStartFailureException] if the watchface dies during startup.
      */
@@ -273,16 +268,16 @@
         slotIdToComplicationData: Map<Int, ComplicationData>?,
         previewImageUpdateRequestedExecutor: Executor,
         previewImageUpdateRequestedListener: Consumer<String>
-    ): InteractiveWatchFaceClient = getOrCreateInteractiveWatchFaceClient(
-        instanceId,
-        deviceConfig,
-        watchUiState,
-        userStyle,
-        slotIdToComplicationData
-    )
+    ): InteractiveWatchFaceClient =
+        getOrCreateInteractiveWatchFaceClient(
+            instanceId,
+            deviceConfig,
+            watchUiState,
+            userStyle,
+            slotIdToComplicationData
+        )
 
-    @Throws(RemoteException::class)
-    public fun getEditorServiceClient(): EditorServiceClient
+    @Throws(RemoteException::class) public fun getEditorServiceClient(): EditorServiceClient
 
     /**
      * Returns a map of [androidx.wear.watchface.ComplicationSlot] id to the
@@ -292,8 +287,8 @@
      * watch face.
      *
      * @param watchFaceName The [ComponentName] of the watch face to obtain the map of
-     * [DefaultComplicationDataSourcePolicyAndType]s for. It must be in the same APK the
-     * WatchFaceControlClient is connected to. NB a single apk can contain multiple watch faces.
+     *   [DefaultComplicationDataSourcePolicyAndType]s for. It must be in the same APK the
+     *   WatchFaceControlClient is connected to. NB a single apk can contain multiple watch faces.
      */
     @Deprecated("Use the WatchFaceMetadataClient instead.")
     @Suppress("DEPRECATION") // DefaultComplicationDataSourcePolicyAndType
@@ -315,7 +310,7 @@
  * state of a [androidx.wear.watchface.ComplicationSlot].
  *
  * @param policy The [DefaultComplicationDataSourcePolicy] for the
- * [androidx.wear.watchface.ComplicationSlot].
+ *   [androidx.wear.watchface.ComplicationSlot].
  * @param type The default [ComplicationType] for the [androidx.wear.watchface.ComplicationSlot].
  */
 @Deprecated("Use the WatchFaceMetadataClient instead.")
@@ -343,7 +338,8 @@
     }
 }
 
-internal class WatchFaceControlClientImpl internal constructor(
+internal class WatchFaceControlClientImpl
+internal constructor(
     private val context: Context,
     private val service: IWatchFaceControlService,
     private val serviceConnection: ServiceConnection
@@ -354,15 +350,14 @@
         const val TAG = "WatchFaceControlClientImpl"
     }
 
-    override fun getInteractiveWatchFaceClientInstance(
-        instanceId: String
-    ) = service.getInteractiveWatchFaceInstance(instanceId)?.let {
-        InteractiveWatchFaceClientImpl(
-            it,
-            previewImageUpdateRequestedExecutor = null,
-            previewImageUpdateRequestedListener = null
-        )
-    }
+    override fun getInteractiveWatchFaceClientInstance(instanceId: String) =
+        service.getInteractiveWatchFaceInstance(instanceId)?.let {
+            InteractiveWatchFaceClientImpl(
+                it,
+                previewImageUpdateRequestedExecutor = null,
+                previewImageUpdateRequestedListener = null
+            )
+        }
 
     @Deprecated(
         "Creating a headless client without a watchface ID is deprecated",
@@ -375,22 +370,21 @@
         deviceConfig: DeviceConfig,
         surfaceWidth: Int,
         surfaceHeight: Int
-    ): HeadlessWatchFaceClient? = TraceEvent(
-        "WatchFaceControlClientImpl.createHeadlessWatchFaceClient"
-    ).use {
-        requireNotClosed()
-        return service.createHeadlessWatchFaceInstance(
-            HeadlessWatchFaceInstanceParams(
-                watchFaceName,
-                deviceConfig.asWireDeviceConfig(),
-                surfaceWidth,
-                surfaceHeight,
-                null
-            )
-        )?.let {
-            HeadlessWatchFaceClientImpl(it)
+    ): HeadlessWatchFaceClient? =
+        TraceEvent("WatchFaceControlClientImpl.createHeadlessWatchFaceClient").use {
+            requireNotClosed()
+            return service
+                .createHeadlessWatchFaceInstance(
+                    HeadlessWatchFaceInstanceParams(
+                        watchFaceName,
+                        deviceConfig.asWireDeviceConfig(),
+                        surfaceWidth,
+                        surfaceHeight,
+                        null
+                    )
+                )
+                ?.let { HeadlessWatchFaceClientImpl(it) }
         }
-    }
 
     override fun createHeadlessWatchFaceClient(
         id: String,
@@ -398,29 +392,30 @@
         deviceConfig: DeviceConfig,
         surfaceWidth: Int,
         surfaceHeight: Int
-    ): HeadlessWatchFaceClient? = TraceEvent(
-        "WatchFaceControlClientImpl.createHeadlessWatchFaceClient"
-    ).use {
-        requireNotClosed()
-        return service.createHeadlessWatchFaceInstance(
-            HeadlessWatchFaceInstanceParams(
-                watchFaceName,
-                deviceConfig.asWireDeviceConfig(),
-                surfaceWidth,
-                surfaceHeight,
-                id
-            )
-        )?.let {
-            HeadlessWatchFaceClientImpl(it)
+    ): HeadlessWatchFaceClient? =
+        TraceEvent("WatchFaceControlClientImpl.createHeadlessWatchFaceClient").use {
+            requireNotClosed()
+            return service
+                .createHeadlessWatchFaceInstance(
+                    HeadlessWatchFaceInstanceParams(
+                        watchFaceName,
+                        deviceConfig.asWireDeviceConfig(),
+                        surfaceWidth,
+                        surfaceHeight,
+                        id
+                    )
+                )
+                ?.let { HeadlessWatchFaceClientImpl(it) }
         }
-    }
 
     @Deprecated(
         "Use an overload that specifies Consumer<String>",
-        replaceWith = ReplaceWith(
-            "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState, " +
-                "UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
-                "Consumer<String>)")
+        replaceWith =
+            ReplaceWith(
+                "getOrCreateInteractiveWatchFaceClient(String, DeviceConfig, WatchUiState, " +
+                    "UserStyleData?, Map<Int, ComplicationData>?, Executor, " +
+                    "Consumer<String>)"
+            )
     )
     override suspend fun getOrCreateInteractiveWatchFaceClient(
         id: String,
@@ -428,15 +423,16 @@
         watchUiState: androidx.wear.watchface.client.WatchUiState,
         userStyle: UserStyleData?,
         slotIdToComplicationData: Map<Int, ComplicationData>?
-    ): InteractiveWatchFaceClient = getOrCreateInteractiveWatchFaceClientImpl(
-        id,
-        deviceConfig,
-        watchUiState,
-        userStyle,
-        slotIdToComplicationData,
-        previewImageUpdateRequestedExecutor = null,
-        previewImageUpdateRequestedListener = null
-    )
+    ): InteractiveWatchFaceClient =
+        getOrCreateInteractiveWatchFaceClientImpl(
+            id,
+            deviceConfig,
+            watchUiState,
+            userStyle,
+            slotIdToComplicationData,
+            previewImageUpdateRequestedExecutor = null,
+            previewImageUpdateRequestedListener = null
+        )
 
     override suspend fun getOrCreateInteractiveWatchFaceClient(
         instanceId: String,
@@ -446,15 +442,16 @@
         slotIdToComplicationData: Map<Int, ComplicationData>?,
         previewImageUpdateRequestedExecutor: Executor,
         previewImageUpdateRequestedListener: Consumer<String>
-    ): InteractiveWatchFaceClient = getOrCreateInteractiveWatchFaceClientImpl(
-        instanceId,
-        deviceConfig,
-        watchUiState,
-        userStyle,
-        slotIdToComplicationData,
-        previewImageUpdateRequestedExecutor,
-        previewImageUpdateRequestedListener
-    )
+    ): InteractiveWatchFaceClient =
+        getOrCreateInteractiveWatchFaceClientImpl(
+            instanceId,
+            deviceConfig,
+            watchUiState,
+            userStyle,
+            slotIdToComplicationData,
+            previewImageUpdateRequestedExecutor,
+            previewImageUpdateRequestedListener
+        )
 
     private suspend fun getOrCreateInteractiveWatchFaceClientImpl(
         id: String,
@@ -466,84 +463,85 @@
         previewImageUpdateRequestedListener: Consumer<String>?
     ): InteractiveWatchFaceClient {
         requireNotClosed()
-        val traceEvent = AsyncTraceEvent(
-            "WatchFaceControlClientImpl" +
-                ".getOrCreateWallpaperServiceBackedInteractiveWatchFaceClientAsync"
-        )
+        val traceEvent =
+            AsyncTraceEvent(
+                "WatchFaceControlClientImpl" +
+                    ".getOrCreateWallpaperServiceBackedInteractiveWatchFaceClientAsync"
+            )
         return suspendCancellableCoroutine { continuation ->
             // [IWatchFaceControlService.getOrCreateInteractiveWatchFaceWCS] has an asynchronous
             // callback and it's possible the watch face might crash during start up so we register
             // a death observer.
-            val deathObserver = IBinder.DeathRecipient {
-                continuation.resumeWithException(
-                    WatchFaceControlClient.ServiceStartFailureException()
-                )
-            }
+            val deathObserver =
+                IBinder.DeathRecipient {
+                    continuation.resumeWithException(
+                        WatchFaceControlClient.ServiceStartFailureException()
+                    )
+                }
             val serviceBinder = service.asBinder()
             serviceBinder.linkToDeath(deathObserver, 0)
 
-            service.getOrCreateInteractiveWatchFace(
-                WallpaperInteractiveWatchFaceInstanceParams(
-                    id,
-                    androidx.wear.watchface.data.DeviceConfig(
-                        deviceConfig.hasLowBitAmbient,
-                        deviceConfig.hasBurnInProtection,
-                        deviceConfig.analogPreviewReferenceTimeMillis,
-                        deviceConfig.digitalPreviewReferenceTimeMillis
-                    ),
-                    WatchUiState(
-                        watchUiState.inAmbientMode,
-                        watchUiState.interruptionFilter
-                    ),
-                    userStyle?.toWireFormat() ?: UserStyleWireFormat(emptyMap()),
-                    slotIdToComplicationData?.map {
-                        IdAndComplicationDataWireFormat(
-                            it.key,
-                            it.value.asWireComplicationData()
-                        )
-                    },
-                    null,
-                    null
-                ),
-                object : IPendingInteractiveWatchFace.Stub() {
-                    override fun getApiVersion() = API_VERSION
-
-                    override fun onInteractiveWatchFaceCreated(
-                        iInteractiveWatchFace: IInteractiveWatchFace
-                    ) {
-                        safeUnlinkToDeath(serviceBinder, deathObserver)
-                        traceEvent.close()
-                        continuation.resume(
-                            InteractiveWatchFaceClientImpl(
-                                iInteractiveWatchFace,
-                                previewImageUpdateRequestedExecutor,
-                                previewImageUpdateRequestedListener
+            service
+                .getOrCreateInteractiveWatchFace(
+                    WallpaperInteractiveWatchFaceInstanceParams(
+                        id,
+                        androidx.wear.watchface.data.DeviceConfig(
+                            deviceConfig.hasLowBitAmbient,
+                            deviceConfig.hasBurnInProtection,
+                            deviceConfig.analogPreviewReferenceTimeMillis,
+                            deviceConfig.digitalPreviewReferenceTimeMillis
+                        ),
+                        WatchUiState(watchUiState.inAmbientMode, watchUiState.interruptionFilter),
+                        userStyle?.toWireFormat() ?: UserStyleWireFormat(emptyMap()),
+                        slotIdToComplicationData?.map {
+                            IdAndComplicationDataWireFormat(
+                                it.key,
+                                it.value.asWireComplicationData()
                             )
-                        )
-                    }
+                        },
+                        null,
+                        null
+                    ),
+                    object : IPendingInteractiveWatchFace.Stub() {
+                        override fun getApiVersion() = API_VERSION
 
-                    override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
-                        safeUnlinkToDeath(serviceBinder, deathObserver)
-                        traceEvent.close()
-                        continuation.resumeWithException(
-                            WatchFaceControlClient.ServiceStartFailureException(
-                                "Watchface crashed during init: $exception"
+                        override fun onInteractiveWatchFaceCreated(
+                            iInteractiveWatchFace: IInteractiveWatchFace
+                        ) {
+                            safeUnlinkToDeath(serviceBinder, deathObserver)
+                            traceEvent.close()
+                            continuation.resume(
+                                InteractiveWatchFaceClientImpl(
+                                    iInteractiveWatchFace,
+                                    previewImageUpdateRequestedExecutor,
+                                    previewImageUpdateRequestedListener
+                                )
                             )
-                        )
+                        }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
+                            safeUnlinkToDeath(serviceBinder, deathObserver)
+                            traceEvent.close()
+                            continuation.resumeWithException(
+                                WatchFaceControlClient.ServiceStartFailureException(
+                                    "Watchface crashed during init: $exception"
+                                )
+                            )
+                        }
                     }
-                }
-            )?.let {
-                // There was an existing watchface.onInteractiveWatchFaceCreated
-                safeUnlinkToDeath(serviceBinder, deathObserver)
-                traceEvent.close()
-                continuation.resume(
-                    InteractiveWatchFaceClientImpl(
-                        it,
-                        previewImageUpdateRequestedExecutor,
-                        previewImageUpdateRequestedListener
-                    )
                 )
-            }
+                ?.let {
+                    // There was an existing watchface.onInteractiveWatchFaceCreated
+                    safeUnlinkToDeath(serviceBinder, deathObserver)
+                    traceEvent.close()
+                    continuation.resume(
+                        InteractiveWatchFaceClientImpl(
+                            it,
+                            previewImageUpdateRequestedExecutor,
+                            previewImageUpdateRequestedListener
+                        )
+                    )
+                }
         }
     }
 
@@ -556,75 +554,72 @@
         }
     }
 
-    override fun getEditorServiceClient(): EditorServiceClient = TraceEvent(
-        "WatchFaceControlClientImpl.getEditorServiceClient"
-    ).use {
-        requireNotClosed()
-        return EditorServiceClientImpl(service.editorService)
-    }
+    override fun getEditorServiceClient(): EditorServiceClient =
+        TraceEvent("WatchFaceControlClientImpl.getEditorServiceClient").use {
+            requireNotClosed()
+            return EditorServiceClientImpl(service.editorService)
+        }
 
     @Deprecated("Use the WatchFaceMetadataClient instead.")
     @Suppress("DEPRECATION") // DefaultComplicationDataSourcePolicyAndType
     override fun getDefaultComplicationDataSourcePoliciesAndType(
         watchFaceName: ComponentName
-    ): Map<Int, DefaultComplicationDataSourcePolicyAndType> = TraceEvent(
-        "WatchFaceControlClientImpl.getDefaultProviderPolicies"
-    ).use {
-        requireNotClosed()
-        if (service.apiVersion >= 2) {
-            // Fast path.
-            service.getDefaultProviderPolicies(DefaultProviderPoliciesParams(watchFaceName))
-                .associateBy(
-                    {
-                        it.id
-                    },
-                    {
-                        DefaultComplicationDataSourcePolicyAndType(
-                            DefaultComplicationDataSourcePolicy(
-                                it.defaultProvidersToTry ?: emptyList(),
-                                it.fallbackSystemProvider,
-                                ComplicationType.fromWireType(it.defaultProviderType),
-                                ComplicationType.fromWireType(it.defaultProviderType),
+    ): Map<Int, DefaultComplicationDataSourcePolicyAndType> =
+        TraceEvent("WatchFaceControlClientImpl.getDefaultProviderPolicies").use {
+            requireNotClosed()
+            if (service.apiVersion >= 2) {
+                // Fast path.
+                service
+                    .getDefaultProviderPolicies(DefaultProviderPoliciesParams(watchFaceName))
+                    .associateBy(
+                        { it.id },
+                        {
+                            DefaultComplicationDataSourcePolicyAndType(
+                                DefaultComplicationDataSourcePolicy(
+                                    it.defaultProvidersToTry ?: emptyList(),
+                                    it.fallbackSystemProvider,
+                                    ComplicationType.fromWireType(it.defaultProviderType),
+                                    ComplicationType.fromWireType(it.defaultProviderType),
+                                    ComplicationType.fromWireType(it.defaultProviderType)
+                                ),
                                 ComplicationType.fromWireType(it.defaultProviderType)
-                            ),
-                            ComplicationType.fromWireType(it.defaultProviderType)
+                            )
+                        }
+                    )
+            } else {
+                // Slow backwards compatible path.
+                val headlessClient =
+                    createHeadlessWatchFaceClient(
+                        "id",
+                        watchFaceName,
+                        DeviceConfig(false, false, 0, 0),
+                        1,
+                        1,
+                    )!!
+
+                // NB .use {} syntax doesn't compile here.
+                try {
+                    headlessClient.complicationSlotsState.mapValues {
+                        DefaultComplicationDataSourcePolicyAndType(
+                            it.value.defaultDataSourcePolicy,
+                            it.value.defaultDataSourceType
                         )
                     }
-                )
-        } else {
-            // Slow backwards compatible path.
-            val headlessClient = createHeadlessWatchFaceClient(
-                "id",
-                watchFaceName,
-                DeviceConfig(false, false, 0, 0),
-                1,
-                1,
-            )!!
-
-            // NB .use {} syntax doesn't compile here.
-            try {
-                headlessClient.complicationSlotsState.mapValues {
-                    DefaultComplicationDataSourcePolicyAndType(
-                        it.value.defaultDataSourcePolicy,
-                        it.value.defaultDataSourceType
-                    )
+                } finally {
+                    headlessClient.close()
                 }
-            } finally {
-                headlessClient.close()
             }
         }
-    }
 
     private fun requireNotClosed() {
-        require(!closed) {
-            "WatchFaceControlClient method called after close"
-        }
+        require(!closed) { "WatchFaceControlClient method called after close" }
     }
 
-    override fun close() = TraceEvent("WatchFaceControlClientImpl.close").use {
-        closed = true
-        context.unbindService(serviceConnection)
-    }
+    override fun close() =
+        TraceEvent("WatchFaceControlClientImpl.close").use {
+            closed = true
+            context.unbindService(serviceConnection)
+        }
 
     override fun hasComplicationDataCache(): Boolean {
         if (service.apiVersion < 4) {
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceException.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceException.kt
index 53d358a..0e1d605 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceException.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceException.kt
@@ -23,8 +23,6 @@
     try {
         task()
     } catch (e: RemoteException) {
-        if (Build.VERSION.SDK_INT >= 30)
-            throw Api30Helper.toRuntimeExpression(e)
-        else
-            throw RuntimeException(e)
+        if (Build.VERSION.SDK_INT >= 30) throw Api30Helper.toRuntimeExpression(e)
+        else throw RuntimeException(e)
     }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceMetadataClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceMetadataClient.kt
index 7d66a64..ad6a215 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceMetadataClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceMetadataClient.kt
@@ -29,26 +29,26 @@
 import android.util.Log
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.BoundingArc
-import androidx.wear.watchface.complications.ComplicationSlotBounds
-import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
-import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.utility.AsyncTraceEvent
-import androidx.wear.watchface.utility.TraceEvent
-import androidx.wear.watchface.client.WatchFaceControlClient.Companion.createWatchFaceControlClient
-import androidx.wear.watchface.control.IWatchFaceControlService
-import androidx.wear.watchface.control.WatchFaceControlService
-import androidx.wear.watchface.control.data.GetComplicationSlotMetadataParams
-import androidx.wear.watchface.control.data.GetUserStyleSchemaParams
-import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition
+import androidx.wear.watchface.client.WatchFaceControlClient.Companion.createWatchFaceControlClient
+import androidx.wear.watchface.complications.ComplicationSlotBounds
+import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.watchface.complications.data.ComplicationExperimental
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.control.IWatchFaceControlService
+import androidx.wear.watchface.control.WatchFaceControlService
+import androidx.wear.watchface.control.data.GetComplicationSlotMetadataParams
 import androidx.wear.watchface.control.data.GetUserStyleFlavorsParams
+import androidx.wear.watchface.control.data.GetUserStyleSchemaParams
+import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.style.UserStyleFlavors
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
+import androidx.wear.watchface.utility.AsyncTraceEvent
+import androidx.wear.watchface.utility.TraceEvent
 import kotlinx.coroutines.CompletableDeferred
 
 /**
@@ -69,10 +69,10 @@
          * @param watchFaceName The [ComponentName] of the watch face to fetch meta data from.
          * @return The [WatchFaceMetadataClient] if there is one.
          * @throws [ServiceNotBoundException] if the underlying watch face control service can not
-         * be bound or a [ServiceStartFailureException] if the watch face dies during startup. If
-         * the service's manifest contains an
-         * androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition meta data node then
-         * [PackageManager.NameNotFoundException] is thrown if [watchFaceName] is invalid.
+         *   be bound or a [ServiceStartFailureException] if the watch face dies during startup. If
+         *   the service's manifest contains an
+         *   androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition meta data node then
+         *   [PackageManager.NameNotFoundException] is thrown if [watchFaceName] is invalid.
          */
         @Throws(
             ServiceNotBoundException::class,
@@ -108,26 +108,32 @@
             controlServicePackage: String,
             controlServiceName: String = ANDROIDX_WATCHFACE_CONTROL_SERVICE
         ): Boolean {
-            val controlServiceComponentName = ComponentName(
-                controlServicePackage,
-                controlServiceName)
-            val version = try {
-                context.packageManager.getServiceInfo(
-                    controlServiceComponentName,
-                    PackageManager.GET_META_DATA or PackageManager.MATCH_DISABLED_COMPONENTS
-                ).metaData.getInt(ANDROIDX_WATCHFACE_XML_VERSION, 0)
-            } catch (exception: PackageManager.NameNotFoundException) {
-                // WatchFaceControlService may be missing in case WF is built with
-                // pre-androidx watchface library.
-                return false
-            }
+            val controlServiceComponentName =
+                ComponentName(controlServicePackage, controlServiceName)
+            val version =
+                try {
+                    context.packageManager
+                        .getServiceInfo(
+                            controlServiceComponentName,
+                            PackageManager.GET_META_DATA or PackageManager.MATCH_DISABLED_COMPONENTS
+                        )
+                        .metaData
+                        .getInt(ANDROIDX_WATCHFACE_XML_VERSION, 0)
+                } catch (exception: PackageManager.NameNotFoundException) {
+                    // WatchFaceControlService may be missing in case WF is built with
+                    // pre-androidx watchface library.
+                    return false
+                }
 
-            val ourVersion = resources.getInteger(
-                androidx.wear.watchface.R.integer.watch_face_xml_version)
+            val ourVersion =
+                resources.getInteger(androidx.wear.watchface.R.integer.watch_face_xml_version)
 
             if (version > ourVersion) {
-                Log.w(TAG, "WatchFaceControlService version ($version) " +
-                    "of $controlServiceComponentName is higher than $ourVersion")
+                Log.w(
+                    TAG,
+                    "WatchFaceControlService version ($version) " +
+                        "of $controlServiceComponentName is higher than $ourVersion"
+                )
                 return false
             }
 
@@ -143,13 +149,12 @@
                 if (!isXmlVersionCompatible(context, context.resources, watchFaceName.packageName))
                     return null
 
-                return context.packageManager.getServiceInfo(
-                    watchFaceName,
-                    PackageManager.GET_META_DATA
-                ).loadXmlMetaData(
-                    context.packageManager,
-                    WatchFaceService.XML_WATCH_FACE_METADATA
-                )
+                return context.packageManager
+                    .getServiceInfo(watchFaceName, PackageManager.GET_META_DATA)
+                    .loadXmlMetaData(
+                        context.packageManager,
+                        WatchFaceService.XML_WATCH_FACE_METADATA
+                    )
             }
         }
 
@@ -177,19 +182,20 @@
 
             val deferredService = CompletableDeferred<IWatchFaceControlService>()
             val traceEvent = AsyncTraceEvent("WatchFaceMetadataClientImpl.bindService")
-            val serviceConnection = object : ServiceConnection {
-                override fun onServiceConnected(name: ComponentName, binder: IBinder) {
-                    traceEvent.close()
-                    deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
-                }
+            val serviceConnection =
+                object : ServiceConnection {
+                    override fun onServiceConnected(name: ComponentName, binder: IBinder) {
+                        traceEvent.close()
+                        deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
+                    }
 
-                override fun onServiceDisconnected(name: ComponentName?) {
-                    // Note if onServiceConnected is called first completeExceptionally will do
-                    // nothing because the CompletableDeferred is already completed.
-                    traceEvent.close()
-                    deferredService.completeExceptionally(ServiceStartFailureException())
+                    override fun onServiceDisconnected(name: ComponentName?) {
+                        // Note if onServiceConnected is called first completeExceptionally will do
+                        // nothing because the CompletableDeferred is already completed.
+                        traceEvent.close()
+                        deferredService.completeExceptionally(ServiceStartFailureException())
+                    }
                 }
-            }
             if (!BindHelper.bindService(context, intent, serviceConnection)) {
                 traceEvent.close()
                 throw ServiceNotBoundException()
@@ -203,9 +209,7 @@
         }
     }
 
-    /**
-     * Exception thrown by [createWatchFaceControlClient] if the remote service can't be bound.
-     */
+    /** Exception thrown by [createWatchFaceControlClient] if the remote service can't be bound. */
     public class ServiceNotBoundException : Exception()
 
     /** Exception thrown by [WatchFaceControlClient] methods if the service dies during start up. */
@@ -215,7 +219,7 @@
      * Returns the watch face's [UserStyleSchema].
      *
      * @throws [RuntimeException] if the watch face threw an exception while trying to service the
-     * request or there was a communication problem with watch face process.
+     *   request or there was a communication problem with watch face process.
      */
     public fun getUserStyleSchema(): UserStyleSchema
 
@@ -231,7 +235,7 @@
      * for each slot in the watch face's [androidx.wear.watchface.ComplicationSlotsManager].
      *
      * @throws [RuntimeException] if the watch face threw an exception while trying to service the
-     * request or there was a communication problem with watch face process.
+     *   request or there was a communication problem with watch face process.
      */
     public fun getComplicationSlotMetadataMap(): Map<Int, ComplicationSlotMetadata>
 
@@ -239,7 +243,7 @@
      * Returns the watch face's [UserStyleFlavors].
      *
      * @throws [RuntimeException] if the watch face threw an exception while trying to service the
-     * request or there was a communication problem with watch face process.
+     *   request or there was a communication problem with watch face process.
      */
     public fun getUserStyleFlavors(): UserStyleFlavors
 }
@@ -248,63 +252,58 @@
  * Static metadata for a [androidx.wear.watchface.ComplicationSlot].
  *
  * @property bounds The complication slot's [ComplicationSlotBounds]. Only non `null` for watch
- * faces with a new enough [androidx.wear.watchface.control.WatchFaceControlService].
+ *   faces with a new enough [androidx.wear.watchface.control.WatchFaceControlService].
  * @property boundsType The [ComplicationSlotBoundsType] of the complication slot.
  * @property supportedTypes The list of [ComplicationType]s accepted by this complication slot. Used
- * during complication data source selection, this list should be non-empty.
+ *   during complication data source selection, this list should be non-empty.
  * @property defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] which controls the
- * initial complication data source when the watch face is first installed.
+ *   initial complication data source when the watch face is first installed.
  * @property isInitiallyEnabled At creation a complication slot is either enabled or disabled. This
- * can be overridden by a [ComplicationSlotsUserStyleSetting] (see
- * [ComplicationSlotOverlay.enabled]).
- * Editors need to know the initial state of a complication slot to predict the effects of making a
- * style change.
- * @property fixedComplicationDataSource  Whether or not the complication slot's complication data
- * source is fixed (i.e. can't be changed by the user). This is useful for watch faces built
- * around specific complication  complication data sources.
+ *   can be overridden by a [ComplicationSlotsUserStyleSetting] (see
+ *   [ComplicationSlotOverlay.enabled]). Editors need to know the initial state of a complication
+ *   slot to predict the effects of making a style change.
+ * @property fixedComplicationDataSource Whether or not the complication slot's complication data
+ *   source is fixed (i.e. can't be changed by the user). This is useful for watch faces built
+ *   around specific complication complication data sources.
  * @property complicationConfigExtras Extras to be merged into the Intent sent when invoking the
- * complication data source chooser activity.
+ *   complication data source chooser activity.
  */
 public class ComplicationSlotMetadata
-@ComplicationExperimental constructor(
+@ComplicationExperimental
+constructor(
     public val bounds: ComplicationSlotBounds?,
     @ComplicationSlotBoundsType public val boundsType: Int,
     public val supportedTypes: List<ComplicationType>,
     public val defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy,
-    @get:JvmName("isInitiallyEnabled")
-    public val isInitiallyEnabled: Boolean,
+    @get:JvmName("isInitiallyEnabled") public val isInitiallyEnabled: Boolean,
     public val fixedComplicationDataSource: Boolean,
     public val complicationConfigExtras: Bundle,
     private val boundingArc: BoundingArc?
 ) {
-    /**
-     * The optional [BoundingArc] for an edge complication if specified, or `null` otherwise.
-     */
+    /** The optional [BoundingArc] for an edge complication if specified, or `null` otherwise. */
     // TODO(b/230364881): Make this a normal primary constructor property when BoundingArc is no
     // longer experimental.
-    @ComplicationExperimental
-    public fun getBoundingArc(): BoundingArc? = boundingArc
+    @ComplicationExperimental public fun getBoundingArc(): BoundingArc? = boundingArc
 
     /**
      * Constructs a [ComplicationSlotMetadata].
      *
-     * @param bounds The complication slot's [ComplicationSlotBounds]. Only non `null` for watch faces
-     * with a new enough [androidx.wear.watchface.control.WatchFaceControlService].
+     * @param bounds The complication slot's [ComplicationSlotBounds]. Only non `null` for watch
+     *   faces with a new enough [androidx.wear.watchface.control.WatchFaceControlService].
      * @param boundsType The [ComplicationSlotBoundsType] of the complication slot.
-     * @param supportedTypes The list of [ComplicationType]s accepted by this complication slot. Used
-     * during complication data source selection, this list should be non-empty.
+     * @param supportedTypes The list of [ComplicationType]s accepted by this complication slot.
+     *   Used during complication data source selection, this list should be non-empty.
      * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] which controls the
-     * initial complication data source when the watch face is first installed.
+     *   initial complication data source when the watch face is first installed.
      * @param isInitiallyEnabled At creation a complication slot is either enabled or disabled. This
-     * can be overridden by a [ComplicationSlotsUserStyleSetting] (see
-     * [ComplicationSlotOverlay.enabled]).
-     * Editors need to know the initial state of a complication slot to predict the effects of making a
-     * style change.
-     * @param fixedComplicationDataSource  Whether or not the complication slot's complication data
-     * source is fixed (i.e. can't be changed by the user). This is useful for watch faces built
-     * around specific complication  complication data sources.
+     *   can be overridden by a [ComplicationSlotsUserStyleSetting] (see
+     *   [ComplicationSlotOverlay.enabled]). Editors need to know the initial state of a
+     *   complication slot to predict the effects of making a style change.
+     * @param fixedComplicationDataSource Whether or not the complication slot's complication data
+     *   source is fixed (i.e. can't be changed by the user). This is useful for watch faces built
+     *   around specific complication complication data sources.
      * @param complicationConfigExtras Extras to be merged into the Intent sent when invoking the
-     * complication data source chooser activity.
+     *   complication data source chooser activity.
      */
     // TODO(b/230364881): Deprecate when BoundingArc is no longer experimental.
     @OptIn(ComplicationExperimental::class)
@@ -328,7 +327,8 @@
     )
 }
 
-internal class WatchFaceMetadataClientImpl internal constructor(
+internal class WatchFaceMetadataClientImpl
+internal constructor(
     private val context: Context,
     private val service: IWatchFaceControlService,
     private val serviceConnection: ServiceConnection,
@@ -336,47 +336,42 @@
 ) : WatchFaceMetadataClient {
     private var closed = false
     private val headlessClientDelegate = lazy {
-        createHeadlessWatchFaceClient(
-            watchFaceName
-        ) ?: throw WatchFaceMetadataClient.ServiceStartFailureException(
-            "Could not open headless client for ${watchFaceName.flattenToString()}"
-        )
+        createHeadlessWatchFaceClient(watchFaceName)
+            ?: throw WatchFaceMetadataClient.ServiceStartFailureException(
+                "Could not open headless client for ${watchFaceName.flattenToString()}"
+            )
     }
     private val headlessClient by headlessClientDelegate
 
     private fun createHeadlessWatchFaceClient(
         watchFaceName: ComponentName
-    ): HeadlessWatchFaceClient? = TraceEvent(
-        "WatchFaceMetadataClientImpl.createHeadlessWatchFaceClient"
-    ).use {
-        requireNotClosed()
-        return service.createHeadlessWatchFaceInstance(
-            HeadlessWatchFaceInstanceParams(
-                watchFaceName,
-                androidx.wear.watchface.data.DeviceConfig(false, false, 0, 0),
-                1,
-                1,
-                null
-            )
-        )?.let {
-            HeadlessWatchFaceClientImpl(it)
+    ): HeadlessWatchFaceClient? =
+        TraceEvent("WatchFaceMetadataClientImpl.createHeadlessWatchFaceClient").use {
+            requireNotClosed()
+            return service
+                .createHeadlessWatchFaceInstance(
+                    HeadlessWatchFaceInstanceParams(
+                        watchFaceName,
+                        androidx.wear.watchface.data.DeviceConfig(false, false, 0, 0),
+                        1,
+                        1,
+                        null
+                    )
+                )
+                ?.let { HeadlessWatchFaceClientImpl(it) }
         }
-    }
 
     private fun requireNotClosed() {
-        require(!closed) {
-            "WatchFaceMetadataClient method called after close"
-        }
+        require(!closed) { "WatchFaceMetadataClient method called after close" }
     }
 
-    override fun getUserStyleSchema(): UserStyleSchema =
-        callRemote {
-            if (service.apiVersion >= 3) {
-                UserStyleSchema(service.getUserStyleSchema(GetUserStyleSchemaParams(watchFaceName)))
-            } else {
-                headlessClient.userStyleSchema
-            }
+    override fun getUserStyleSchema(): UserStyleSchema = callRemote {
+        if (service.apiVersion >= 3) {
+            UserStyleSchema(service.getUserStyleSchema(GetUserStyleSchemaParams(watchFaceName)))
+        } else {
+            headlessClient.userStyleSchema
         }
+    }
 
     override val isUserStyleSchemaStatic: Boolean
         get() = false
@@ -386,9 +381,10 @@
         requireNotClosed()
         return callRemote {
             if (service.apiVersion >= 3) {
-                val wireFormat = service.getComplicationSlotMetadata(
-                    GetComplicationSlotMetadataParams(watchFaceName)
-                )
+                val wireFormat =
+                    service.getComplicationSlotMetadata(
+                        GetComplicationSlotMetadataParams(watchFaceName)
+                    )
                 wireFormat.associateBy(
                     { it.id },
                     {
@@ -409,12 +405,8 @@
                             DefaultComplicationDataSourcePolicy(
                                 it.defaultDataSourcesToTry ?: emptyList(),
                                 it.fallbackSystemDataSource,
-                                ComplicationType.fromWireType(
-                                    it.primaryDataSourceDefaultType
-                                ),
-                                ComplicationType.fromWireType(
-                                    it.secondaryDataSourceDefaultType
-                                ),
+                                ComplicationType.fromWireType(it.primaryDataSourceDefaultType),
+                                ComplicationType.fromWireType(it.secondaryDataSourceDefaultType),
                                 ComplicationType.fromWireType(it.defaultDataSourceType)
                             ),
                             it.isInitiallyEnabled,
@@ -445,23 +437,20 @@
 
     override fun getUserStyleFlavors(): UserStyleFlavors = callRemote {
         if (service.apiVersion >= 5) {
-            UserStyleFlavors(
-                service.getUserStyleFlavors(
-                    GetUserStyleFlavorsParams(watchFaceName)
-                )
-            )
+            UserStyleFlavors(service.getUserStyleFlavors(GetUserStyleFlavorsParams(watchFaceName)))
         } else {
             UserStyleFlavors()
         }
     }
 
-    override fun close() = TraceEvent("WatchFaceMetadataClientImpl.close").use {
-        closed = true
-        if (headlessClientDelegate.isInitialized()) {
-            headlessClient.close()
+    override fun close() =
+        TraceEvent("WatchFaceMetadataClientImpl.close").use {
+            closed = true
+            if (headlessClientDelegate.isInitialized()) {
+                headlessClient.close()
+            }
+            context.unbindService(serviceConnection)
         }
-        context.unbindService(serviceConnection)
-    }
 }
 
 internal class XmlWatchFaceMetadataClientImpl(
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
index 3975627..0e35f45 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
@@ -21,16 +21,18 @@
 
 /**
  * The InterruptionFilter.
+ *
  * @hide
  */
 @IntDef(
-    value = [
-        NotificationManager.INTERRUPTION_FILTER_ALARMS,
-        NotificationManager.INTERRUPTION_FILTER_ALL,
-        NotificationManager.INTERRUPTION_FILTER_NONE,
-        NotificationManager.INTERRUPTION_FILTER_PRIORITY,
-        NotificationManager.INTERRUPTION_FILTER_UNKNOWN
-    ]
+    value =
+        [
+            NotificationManager.INTERRUPTION_FILTER_ALARMS,
+            NotificationManager.INTERRUPTION_FILTER_ALL,
+            NotificationManager.INTERRUPTION_FILTER_NONE,
+            NotificationManager.INTERRUPTION_FILTER_PRIORITY,
+            NotificationManager.INTERRUPTION_FILTER_UNKNOWN
+        ]
 )
 public annotation class InterruptionFilter
 
@@ -39,19 +41,15 @@
  *
  * @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")
-    public val inAmbientMode: Boolean,
-
-    @InterruptionFilter
-    public val interruptionFilter: Int
+    @get:JvmName("inAmbientMode") public val inAmbientMode: Boolean,
+    @InterruptionFilter public val interruptionFilter: Int
 ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -74,4 +72,4 @@
     override fun toString(): String {
         return "WatchUiState(inAmbientMode=$inAmbientMode, interruptionFilter=$interruptionFilter)"
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/InteractiveWatchFaceClientTest.kt b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/InteractiveWatchFaceClientTest.kt
index 931ae1f..e880a88 100644
--- a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/InteractiveWatchFaceClientTest.kt
+++ b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/InteractiveWatchFaceClientTest.kt
@@ -18,13 +18,13 @@
 
 import android.os.IBinder
 import androidx.wear.watchface.control.IInteractiveWatchFace
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.`when`
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.`when`
 
 @RunWith(ClientTestRunner::class)
 class InteractiveWatchFaceClientTest {
@@ -37,11 +37,12 @@
 
     @Test
     public fun sendDisconnectNotification() {
-        val client = InteractiveWatchFaceClientImpl(
-            iInteractiveWatchFace,
-            previewImageUpdateRequestedExecutor = null,
-            previewImageUpdateRequestedListener = null
-        )
+        val client =
+            InteractiveWatchFaceClientImpl(
+                iInteractiveWatchFace,
+                previewImageUpdateRequestedExecutor = null,
+                previewImageUpdateRequestedListener = null
+            )
 
         val listener = mock<InteractiveWatchFaceClient.ClientDisconnectListener>()
         client.addClientDisconnectListener(listener, { it.run() })
@@ -53,4 +54,4 @@
         // But only one should be sent to the listener.
         verify(listener, times(1)).onClientDisconnected(any())
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/JavaCompatTest.java b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/JavaCompatTest.java
index 1270b7b..b0688cf 100644
--- a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/JavaCompatTest.java
+++ b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/JavaCompatTest.java
@@ -18,8 +18,8 @@
 
 /** Tests that Java interfaces implementing kotlin interfaces with defaults compile. */
 public class JavaCompatTest {
-    class ClientDisconnectListenerImpl implements
-            InteractiveWatchFaceClient.ClientDisconnectListener {
+    class ClientDisconnectListenerImpl
+            implements InteractiveWatchFaceClient.ClientDisconnectListener {
         @Override
         @SuppressWarnings("deprecation")
         public void onClientDisconnected() {}
diff --git a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceIdTest.kt b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceIdTest.kt
index c6c137e..cd92cc3 100644
--- a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceIdTest.kt
+++ b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceIdTest.kt
@@ -18,18 +18,16 @@
 
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.internal.bytecode.InstrumentationConfiguration
 import org.junit.runner.RunWith
 import org.junit.runners.model.FrameworkMethod
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.internal.bytecode.InstrumentationConfiguration
 
 // Without this we get test failures with an error:
 // "failed to access class kotlin.jvm.internal.DefaultConstructorMarker".
 public class ClientTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration =
-        InstrumentationConfiguration.Builder(
-            super.createClassLoaderConfig(method)
-        )
+        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
             .doNotInstrumentPackage("androidx.wear.watchface.client")
             .build()
 }
@@ -57,4 +55,4 @@
         assertThat(a1.hashCode()).isEqualTo(a2.hashCode())
         assertThat(a1.hashCode()).isNotEqualTo(b1.hashCode())
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceMetadataClientTest.kt b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceMetadataClientTest.kt
index 43ff4bc..6ba9d7a 100644
--- a/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceMetadataClientTest.kt
+++ b/wear/watchface/watchface-client/src/test/java/androidx/wear/watchface/client/WatchFaceMetadataClientTest.kt
@@ -28,11 +28,11 @@
 import androidx.wear.watchface.control.IWatchFaceControlService
 import androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat
 import com.google.common.truth.Truth.assertThat
-import org.mockito.kotlin.any
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.kotlin.mock
 import org.mockito.Mockito.`when`
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
 
 @RunWith(ClientTestRunner::class)
 class WatchFaceMetadataClientTest {
@@ -49,47 +49,47 @@
         val longTextBounds = RectF(0.1f, 0.3f, 0.9f, 0.5f)
 
         // Return a ComplicationSlotMetadataWireFormat with partial complicationBounds
-        `when`(mockService.getComplicationSlotMetadata(any())).thenReturn(
-            arrayOf(
-                ComplicationSlotMetadataWireFormat(
-                    id,
-                    intArrayOf(
+        `when`(mockService.getComplicationSlotMetadata(any()))
+            .thenReturn(
+                arrayOf(
+                    ComplicationSlotMetadataWireFormat(
+                        id,
+                        intArrayOf(
+                            ComplicationType.SHORT_TEXT.toWireComplicationType(),
+                            ComplicationType.LONG_TEXT.toWireComplicationType()
+                        ),
+                        arrayOf(shortTextBounds, longTextBounds),
+                        ComplicationSlotBoundsType.ROUND_RECT,
+                        intArrayOf(ComplicationType.SHORT_TEXT.toWireComplicationType()),
+                        emptyList(),
+                        SystemDataSources.DATA_SOURCE_DATE,
                         ComplicationType.SHORT_TEXT.toWireComplicationType(),
-                        ComplicationType.LONG_TEXT.toWireComplicationType()
-                    ),
-                    arrayOf(shortTextBounds, longTextBounds),
-                    ComplicationSlotBoundsType.ROUND_RECT,
-                    intArrayOf(ComplicationType.SHORT_TEXT.toWireComplicationType()),
-                    emptyList(),
-                    SystemDataSources.DATA_SOURCE_DATE,
-                    ComplicationType.SHORT_TEXT.toWireComplicationType(),
-                    ComplicationType.SHORT_TEXT.toWireComplicationType(),
-                    ComplicationType.SHORT_TEXT.toWireComplicationType(),
-                    false,
-                    false,
-                    Bundle()
+                        ComplicationType.SHORT_TEXT.toWireComplicationType(),
+                        ComplicationType.SHORT_TEXT.toWireComplicationType(),
+                        false,
+                        false,
+                        Bundle()
+                    )
                 )
             )
-        )
 
-        val client = WatchFaceMetadataClientImpl(
-            ApplicationProvider.getApplicationContext<Context>(),
-            mockService,
-            mockServiceConnection,
-            watchFaceName
-        )
+        val client =
+            WatchFaceMetadataClientImpl(
+                ApplicationProvider.getApplicationContext<Context>(),
+                mockService,
+                mockServiceConnection,
+                watchFaceName
+            )
 
         // This should not crash.
         val map = client.getComplicationSlotMetadataMap()
 
         // SHORT_TEXT and LONG_TEXT should match the input
-        assertThat(
-            map[id]!!.bounds!!.perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
-        ).isEqualTo(shortTextBounds)
+        assertThat(map[id]!!.bounds!!.perComplicationTypeBounds[ComplicationType.SHORT_TEXT])
+            .isEqualTo(shortTextBounds)
 
-        assertThat(
-            map[id]!!.bounds!!.perComplicationTypeBounds[ComplicationType.LONG_TEXT]
-        ).isEqualTo(longTextBounds)
+        assertThat(map[id]!!.bounds!!.perComplicationTypeBounds[ComplicationType.LONG_TEXT])
+            .isEqualTo(longTextBounds)
 
         // All other types should have been backfilled with an empty rect.
         for (type in ComplicationType.values()) {
@@ -98,4 +98,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source-ktx/src/main/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceService.kt b/wear/watchface/watchface-complications-data-source-ktx/src/main/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceService.kt
index 653f26d..5395624 100644
--- a/wear/watchface/watchface-complications-data-source-ktx/src/main/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-ktx/src/main/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceService.kt
@@ -24,9 +24,7 @@
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
 
-/**
- * Kotlin coroutine wrapper for [ComplicationDataSourceService] producing [ComplicationData].
- */
+/** Kotlin coroutine wrapper for [ComplicationDataSourceService] producing [ComplicationData]. */
 public abstract class SuspendingComplicationDataSourceService : ComplicationDataSourceService() {
     private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
 
@@ -34,9 +32,7 @@
         request: ComplicationRequest,
         listener: ComplicationRequestListener
     ) {
-        scope.launch {
-            listener.onComplicationData(onComplicationRequest(request))
-        }
+        scope.launch { listener.onComplicationData(onComplicationRequest(request)) }
     }
 
     /**
@@ -44,8 +40,8 @@
      *
      * The [ComplicationData] returned from this method will be passed to the
      * [ComplicationDataSourceService.ComplicationRequestListener] provided to
-     * [onComplicationRequest].
-     * Return `null` to indicate that the previous complication data shouldn't be overwritten.
+     * [onComplicationRequest]. Return `null` to indicate that the previous complication data
+     * shouldn't be overwritten.
      *
      * @see ComplicationDataSourceService.onComplicationRequest
      * @see ComplicationDataSourceService.ComplicationRequestListener.onComplicationData
@@ -63,17 +59,15 @@
  * Kotlin coroutine wrapper for [ComplicationDataSourceService] producing
  * [ComplicationDataTimeline].
  */
-public abstract class
-SuspendingTimelineComplicationDataSourceService : ComplicationDataSourceService() {
+public abstract class SuspendingTimelineComplicationDataSourceService :
+    ComplicationDataSourceService() {
     private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
 
     final override fun onComplicationRequest(
         request: ComplicationRequest,
         listener: ComplicationRequestListener
     ) {
-        scope.launch {
-            listener.onComplicationDataTimeline(onComplicationRequest(request))
-        }
+        scope.launch { listener.onComplicationDataTimeline(onComplicationRequest(request)) }
     }
 
     /**
@@ -81,9 +75,8 @@
      *
      * The [ComplicationDataTimeline] returned from this method will be passed to the
      * [ComplicationDataSourceService.ComplicationRequestListener] provided to
-     * [onComplicationRequest].
-     * Return `null` to indicate that the previous complication data timeline shouldn't be
-     * overwritten.
+     * [onComplicationRequest]. Return `null` to indicate that the previous complication data
+     * timeline shouldn't be overwritten.
      *
      * @see ComplicationDataSourceService.onComplicationRequest
      * @see ComplicationDataSourceService.ComplicationRequestListener.onComplicationData
@@ -97,4 +90,4 @@
         super.onDestroy()
         scope.cancel()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source-ktx/src/test/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceServiceTest.kt b/wear/watchface/watchface-complications-data-source-ktx/src/test/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceServiceTest.kt
index d1f7af5..5b31578 100644
--- a/wear/watchface/watchface-complications-data-source-ktx/src/test/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceServiceTest.kt
+++ b/wear/watchface/watchface-complications-data-source-ktx/src/test/java/androidx/wear/watchface/complications/datasource/SuspendingComplicationDataSourceServiceTest.kt
@@ -24,35 +24,38 @@
 import androidx.wear.watchface.complications.data.PlainComplicationText
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import com.google.common.truth.Truth.assertThat
+import java.time.Instant
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.model.FrameworkMethod
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.internal.DoNotInstrument
 import org.robolectric.internal.bytecode.InstrumentationConfiguration
-import java.time.Instant
 
 class TestService : SuspendingComplicationDataSourceService() {
     override suspend fun onComplicationRequest(request: ComplicationRequest) =
         ShortTextComplicationData.Builder(
-            PlainComplicationText.Builder("Complication").build(),
-            ComplicationText.EMPTY
-        ).build()
+                PlainComplicationText.Builder("Complication").build(),
+                ComplicationText.EMPTY
+            )
+            .build()
 
     override fun getPreviewData(type: ComplicationType) =
         ShortTextComplicationData.Builder(
-            PlainComplicationText.Builder("Preview").build(),
-            ComplicationText.EMPTY
-        ).build()
+                PlainComplicationText.Builder("Preview").build(),
+                ComplicationText.EMPTY
+            )
+            .build()
 }
 
 class TestTimelineService : SuspendingTimelineComplicationDataSourceService() {
     override suspend fun onComplicationRequest(request: ComplicationRequest) =
         ComplicationDataTimeline(
             ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("Default").build(),
-                ComplicationText.EMPTY
-            ).build(),
+                    PlainComplicationText.Builder("Default").build(),
+                    ComplicationText.EMPTY
+                )
+                .build(),
             listOf(
                 TimelineEntry(
                     TimeInterval(
@@ -60,21 +63,23 @@
                         Instant.ofEpochSecond(100001000)
                     ),
                     ShortTextComplicationData.Builder(
-                        PlainComplicationText.Builder("Override").build(),
-                        ComplicationText.EMPTY
-                    ).build()
+                            PlainComplicationText.Builder("Override").build(),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
                 )
             )
         )
 
     override fun getPreviewData(type: ComplicationType) =
         ShortTextComplicationData.Builder(
-            PlainComplicationText.Builder("Preview").build(),
-            ComplicationText.EMPTY
-        ).build()
+                PlainComplicationText.Builder("Preview").build(),
+                ComplicationText.EMPTY
+            )
+            .build()
 }
 
-/** Needed to prevent Robolectric from instrumenting various classes.  */
+/** Needed to prevent Robolectric from instrumenting various classes. */
 class ComplicationsTestRunner(clazz: Class<*>?) : RobolectricTestRunner(clazz) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration {
         return InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
@@ -107,9 +112,8 @@
             }
         )
 
-        assertThat(
-            (result as ShortTextComplicationData).text.getTextAt(resources, Instant.EPOCH)
-        ).isEqualTo("Complication")
+        assertThat((result as ShortTextComplicationData).text.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("Complication")
     }
 
     @Test
@@ -120,7 +124,7 @@
         testService.onComplicationRequest(
             ComplicationRequest(123, ComplicationType.SMALL_IMAGE, false),
             object : ComplicationDataSourceService.ComplicationRequestListener {
-                override fun onComplicationData(complicationData: ComplicationData?) { }
+                override fun onComplicationData(complicationData: ComplicationData?) {}
 
                 override fun onComplicationDataTimeline(
                     complicationDataTimeline: ComplicationDataTimeline?
@@ -131,17 +135,21 @@
         )
 
         assertThat(
-            (result.defaultComplicationData as ShortTextComplicationData)
-                .text.getTextAt(resources, Instant.EPOCH)
-        ).isEqualTo("Default")
+                (result.defaultComplicationData as ShortTextComplicationData)
+                    .text
+                    .getTextAt(resources, Instant.EPOCH)
+            )
+            .isEqualTo("Default")
 
         val timelineEntry = result.timelineEntries.toTypedArray()[0]
         assertThat(timelineEntry.validity.start).isEqualTo(Instant.ofEpochSecond(100000000))
         assertThat(timelineEntry.validity.end).isEqualTo(Instant.ofEpochSecond(100001000))
         assertThat(
-            (timelineEntry.complicationData as ShortTextComplicationData)
-                .text.getTextAt(resources, Instant.EPOCH)
-        ).isEqualTo("Override")
+                (timelineEntry.complicationData as ShortTextComplicationData)
+                    .text
+                    .getTextAt(resources, Instant.EPOCH)
+            )
+            .isEqualTo("Override")
     }
 
     @Test
@@ -149,10 +157,14 @@
         val testService = TestService()
 
         assertThat(
-            testService.getPreviewData(ComplicationType.SMALL_IMAGE).text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                testService
+                    .getPreviewData(ComplicationType.SMALL_IMAGE)
+                    .text
+                    .getTextAt(
+                        ApplicationProvider.getApplicationContext<Context>().resources,
+                        Instant.EPOCH
+                    )
             )
-        ).isEqualTo("Preview")
+            .isEqualTo("Preview")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/AsynchronousDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/AsynchronousDataSourceService.kt
index d718dbb..dbd0230 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/AsynchronousDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/AsynchronousDataSourceService.kt
@@ -21,12 +21,12 @@
 import android.text.Spanned
 import android.text.style.ForegroundColorSpan
 import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
-import androidx.wear.watchface.complications.datasource.ComplicationRequest
 import androidx.wear.watchface.complications.data.ComplicationText
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.data.LongTextComplicationData
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
+import androidx.wear.watchface.complications.datasource.ComplicationRequest
 import java.util.concurrent.ExecutorService
 import java.util.concurrent.Executors
 
@@ -43,54 +43,52 @@
                 when (request.complicationType) {
                     ComplicationType.SHORT_TEXT ->
                         ShortTextComplicationData.Builder(
-                            plainText("# ${request.complicationInstanceId}"),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText("# ${request.complicationInstanceId}"),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     ComplicationType.LONG_TEXT ->
                         LongTextComplicationData.Builder(
-                            plainText(
-                                SpannableString("hello ${request.complicationInstanceId}").apply {
-                                    setSpan(
-                                        ForegroundColorSpan(Color.RED),
-                                        0,
-                                        5,
-                                        Spanned.SPAN_INCLUSIVE_INCLUSIVE
-                                    )
-                                }
-                            ),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText(
+                                    SpannableString("hello ${request.complicationInstanceId}")
+                                        .apply {
+                                            setSpan(
+                                                ForegroundColorSpan(Color.RED),
+                                                0,
+                                                5,
+                                                Spanned.SPAN_INCLUSIVE_INCLUSIVE
+                                            )
+                                        }
+                                ),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     else -> null
                 }
             )
         }
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(
-                plainText("# 123"),
-                ComplicationText.EMPTY
-            ).build()
-
-        ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(
-                plainText(
-                    SpannableString("hello 123").apply {
-                        setSpan(
-                            ForegroundColorSpan(Color.RED),
-                            0,
-                            5,
-                            Spanned.SPAN_INCLUSIVE_INCLUSIVE
-                        )
-                    }
-                ),
-                ComplicationText.EMPTY
-            ).build()
-
-        else
-        -> null
-    }
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.SHORT_TEXT ->
+                ShortTextComplicationData.Builder(plainText("# 123"), ComplicationText.EMPTY)
+                    .build()
+            ComplicationType.LONG_TEXT ->
+                LongTextComplicationData.Builder(
+                        plainText(
+                            SpannableString("hello 123").apply {
+                                setSpan(
+                                    ForegroundColorSpan(Color.RED),
+                                    0,
+                                    5,
+                                    Spanned.SPAN_INCLUSIVE_INCLUSIVE
+                                )
+                            }
+                        ),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+            else -> null
+        }
 }
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/BackgroundDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/BackgroundDataSourceService.kt
index 29d15de..fea793a 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/BackgroundDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/BackgroundDataSourceService.kt
@@ -20,13 +20,13 @@
 import android.os.Handler
 import android.os.Looper
 import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
-import androidx.wear.watchface.complications.datasource.ComplicationRequest
-import androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester
 import androidx.wear.watchface.complications.data.ComplicationText
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.data.LongTextComplicationData
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
+import androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester
+import androidx.wear.watchface.complications.datasource.ComplicationRequest
 
 const val UPDATE_CADEANCE_MS = 10000L
 
@@ -40,10 +40,11 @@
 
     override fun onCreate() {
         if (updateRequester == null) {
-            updateRequester = ComplicationDataSourceUpdateRequester.create(
-                this,
-                ComponentName(this, BackgroundDataSourceService::class.java)
-            )
+            updateRequester =
+                ComplicationDataSourceUpdateRequester.create(
+                    this,
+                    ComponentName(this, BackgroundDataSourceService::class.java)
+                )
         }
     }
 
@@ -66,34 +67,29 @@
             when (request.complicationType) {
                 ComplicationType.SHORT_TEXT ->
                     ShortTextComplicationData.Builder(
-                        plainText("# $counter"),
-                        ComplicationText.EMPTY
-                    ).build()
-
+                            plainText("# $counter"),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
                 ComplicationType.LONG_TEXT ->
                     LongTextComplicationData.Builder(
-                        plainText("Count $counter"),
-                        ComplicationText.EMPTY
-                    ).build()
-
+                            plainText("Count $counter"),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
                 else -> null
             }
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(
-                plainText("# 123"),
-                ComplicationText.EMPTY
-            ).build()
-
-        ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(
-                plainText("Count 123"),
-                ComplicationText.EMPTY
-            ).build()
-
-        else -> null
-    }
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.SHORT_TEXT ->
+                ShortTextComplicationData.Builder(plainText("# 123"), ComplicationText.EMPTY)
+                    .build()
+            ComplicationType.LONG_TEXT ->
+                LongTextComplicationData.Builder(plainText("Count 123"), ComplicationText.EMPTY)
+                    .build()
+            else -> null
+        }
 }
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ColorRampDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ColorRampDataSourceService.kt
index 40720bf..da0d5e0 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ColorRampDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ColorRampDataSourceService.kt
@@ -36,11 +36,12 @@
     ) {
         listener.onComplicationData(
             RangedValueComplicationData.Builder(
-                value = 75f,
-                min = 0.0f,
-                max = 100.0f,
-                plainText("Many colors")
-            ).setText(plainText("Colors"))
+                    value = 75f,
+                    min = 0.0f,
+                    max = 100.0f,
+                    plainText("Many colors")
+                )
+                .setText(plainText("Colors"))
                 .setValueType(RangedValueComplicationData.TYPE_RATING)
                 .setColorRamp(
                     ColorRamp(
@@ -59,30 +60,31 @@
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.RANGED_VALUE ->
-            RangedValueComplicationData.Builder(
-                value = 10f,
-                min = 0.0f,
-                max = 100.0f,
-                plainText("Many colors")
-            ).setText(plainText("Colors"))
-                .setValueType(RangedValueComplicationData.TYPE_RATING)
-                .setColorRamp(
-                    ColorRamp(
-                        intArrayOf(
-                            Color.GREEN,
-                            Color.YELLOW,
-                            Color.argb(255, 255, 255, 0),
-                            Color.RED,
-                            Color.argb(255, 255, 0, 255),
-                            Color.argb(255, 92, 64, 51)
-                        ),
-                        interpolated = true
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.RANGED_VALUE ->
+                RangedValueComplicationData.Builder(
+                        value = 10f,
+                        min = 0.0f,
+                        max = 100.0f,
+                        plainText("Many colors")
                     )
-                )
-                .build()
-
-        else -> null
-    }
+                    .setText(plainText("Colors"))
+                    .setValueType(RangedValueComplicationData.TYPE_RATING)
+                    .setColorRamp(
+                        ColorRamp(
+                            intArrayOf(
+                                Color.GREEN,
+                                Color.YELLOW,
+                                Color.argb(255, 255, 255, 0),
+                                Color.RED,
+                                Color.argb(255, 255, 0, 255),
+                                Color.argb(255, 92, 64, 51)
+                            ),
+                            interpolated = true
+                        )
+                    )
+                    .build()
+            else -> null
+        }
 }
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigActivity.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigActivity.kt
index 9d470e8..1768a39 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigActivity.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigActivity.kt
@@ -22,22 +22,22 @@
 import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
 import kotlin.random.Random
 
-/**
- * Config activity for data source which generates random in [0..100) range
- */
+/** Config activity for data source which generates random in [0..100) range */
 class ConfigActivity : Activity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
         setContentView(R.layout.config_activity_layout)
 
-        val complicationId = intent.getIntExtra(
-            ComplicationDataSourceService.EXTRA_CONFIG_COMPLICATION_ID, -1)
+        val complicationId =
+            intent.getIntExtra(ComplicationDataSourceService.EXTRA_CONFIG_COMPLICATION_ID, -1)
 
         findViewById<View>(R.id.config_gen_button).setOnClickListener {
             val num = Random.nextInt(100)
-            getSharedPreferences(SHARED_PREF_NAME, 0).edit()
-                .putInt(getKey(complicationId, SHARED_PREF_KEY), num).apply()
+            getSharedPreferences(SHARED_PREF_NAME, 0)
+                .edit()
+                .putInt(getKey(complicationId, SHARED_PREF_KEY), num)
+                .apply()
 
             setResult(RESULT_OK)
             finish()
@@ -54,4 +54,4 @@
             return "$complicationId/$prefKey"
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigurableDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigurableDataSourceService.kt
index 6ab1aca..a275f17 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigurableDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ConfigurableDataSourceService.kt
@@ -29,29 +29,35 @@
         request: ComplicationRequest,
         listener: ComplicationRequestListener
     ) {
-        val value = getSharedPreferences(ConfigActivity.SHARED_PREF_NAME, 0).getInt(
-            ConfigActivity.getKey(
-                request.complicationInstanceId,
-                ConfigActivity.SHARED_PREF_KEY),
-            DEFAULT_VALUE)
+        val value =
+            getSharedPreferences(ConfigActivity.SHARED_PREF_NAME, 0)
+                .getInt(
+                    ConfigActivity.getKey(
+                        request.complicationInstanceId,
+                        ConfigActivity.SHARED_PREF_KEY
+                    ),
+                    DEFAULT_VALUE
+                )
 
         listener.onComplicationData(makeComplicationData(value))
     }
 
-    override fun getPreviewData(type: ComplicationType) = when (type) {
-        ComplicationType.SHORT_TEXT -> makeComplicationData(DEFAULT_VALUE)
-        else -> null
-    }
+    override fun getPreviewData(type: ComplicationType) =
+        when (type) {
+            ComplicationType.SHORT_TEXT -> makeComplicationData(DEFAULT_VALUE)
+            else -> null
+        }
 
     private fun makeComplicationData(value: Int): ComplicationData {
         return ShortTextComplicationData.Builder(
-            plainText(value.toString()),
-            ComplicationText.EMPTY
-        ).build()
+                plainText(value.toString()),
+                ComplicationText.EMPTY
+            )
+            .build()
     }
 
     companion object {
         // used as default value while data source has not been configured
         const val DEFAULT_VALUE = 0
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/GoalProgressDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/GoalProgressDataSourceService.kt
index 3108039..a8ba82e 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/GoalProgressDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/GoalProgressDataSourceService.kt
@@ -34,25 +34,27 @@
     ) {
         listener.onComplicationData(
             GoalProgressComplicationData.Builder(
-                value = 12345.0f,
-                targetValue = 10000.0f,
-                plainText("12345 steps")
-            ).setText(plainText("12345"))
+                    value = 12345.0f,
+                    targetValue = 10000.0f,
+                    plainText("12345 steps")
+                )
+                .setText(plainText("12345"))
                 .setTitle(plainText("Steps"))
                 .build()
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.GOAL_PROGRESS ->
-            GoalProgressComplicationData.Builder(
-                value = 1024.0f,
-                targetValue = 10000.0f,
-                plainText("Steps complication")
-            ).setText(plainText("1024"))
-                .setTitle(plainText("Steps"))
-                .build()
-
-        else -> null
-    }
-}
\ No newline at end of file
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.GOAL_PROGRESS ->
+                GoalProgressComplicationData.Builder(
+                        value = 1024.0f,
+                        targetValue = 10000.0f,
+                        plainText("Steps complication")
+                    )
+                    .setText(plainText("1024"))
+                    .setTitle(plainText("Steps"))
+                    .build()
+            else -> null
+        }
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ImmediateDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ImmediateDataSourceService.kt
index 0481ad4..78ee6ed 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ImmediateDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/ImmediateDataSourceService.kt
@@ -17,12 +17,12 @@
 package androidx.wear.watchface.complications.datasource.samples
 
 import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
-import androidx.wear.watchface.complications.datasource.ComplicationRequest
 import androidx.wear.watchface.complications.data.ComplicationText
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.data.LongTextComplicationData
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.datasource.ComplicationDataSourceService
+import androidx.wear.watchface.complications.datasource.ComplicationRequest
 
 /** A minimal complication data source which reports the ID of the complication immediately. */
 class ImmediateDataSourceService : ComplicationDataSourceService() {
@@ -35,34 +35,29 @@
             when (request.complicationType) {
                 ComplicationType.SHORT_TEXT ->
                     ShortTextComplicationData.Builder(
-                        plainText("# ${request.complicationInstanceId}"),
-                        ComplicationText.EMPTY
-                    ).build()
-
+                            plainText("# ${request.complicationInstanceId}"),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
                 ComplicationType.LONG_TEXT ->
                     LongTextComplicationData.Builder(
-                        plainText("hello ${request.complicationInstanceId}"),
-                        ComplicationText.EMPTY
-                    ).build()
-
+                            plainText("hello ${request.complicationInstanceId}"),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
                 else -> null
             }
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(
-                plainText("# 123"),
-                ComplicationText.EMPTY
-            ).build()
-
-        ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(
-                plainText("hello 123"),
-                ComplicationText.EMPTY
-            ).build()
-
-        else -> null
-    }
-}
\ No newline at end of file
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.SHORT_TEXT ->
+                ShortTextComplicationData.Builder(plainText("# 123"), ComplicationText.EMPTY)
+                    .build()
+            ComplicationType.LONG_TEXT ->
+                LongTextComplicationData.Builder(plainText("hello 123"), ComplicationText.EMPTY)
+                    .build()
+            else -> null
+        }
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/NonInterpolatedColorRampDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/NonInterpolatedColorRampDataSourceService.kt
index 178fd13..c801654 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/NonInterpolatedColorRampDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/NonInterpolatedColorRampDataSourceService.kt
@@ -36,11 +36,12 @@
     ) {
         listener.onComplicationData(
             RangedValueComplicationData.Builder(
-                value = 75f,
-                min = 0.0f,
-                max = 100.0f,
-                plainText("Example")
-            ).setText(plainText("Example"))
+                    value = 75f,
+                    min = 0.0f,
+                    max = 100.0f,
+                    plainText("Example")
+                )
+                .setText(plainText("Example"))
                 .setValueType(RangedValueComplicationData.TYPE_RATING)
                 .setColorRamp(
                     ColorRamp(
@@ -52,23 +53,24 @@
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.RANGED_VALUE ->
-            RangedValueComplicationData.Builder(
-                value = 10f,
-                min = 0.0f,
-                max = 100.0f,
-                plainText("Example")
-            ).setText(plainText("Example"))
-                .setValueType(RangedValueComplicationData.TYPE_RATING)
-                .setColorRamp(
-                    ColorRamp(
-                        intArrayOf(Color.GREEN, Color.YELLOW, Color.RED),
-                        interpolated = false
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.RANGED_VALUE ->
+                RangedValueComplicationData.Builder(
+                        value = 10f,
+                        min = 0.0f,
+                        max = 100.0f,
+                        plainText("Example")
                     )
-                )
-                .build()
-
-        else -> null
-    }
+                    .setText(plainText("Example"))
+                    .setValueType(RangedValueComplicationData.TYPE_RATING)
+                    .setColorRamp(
+                        ColorRamp(
+                            intArrayOf(Color.GREEN, Color.YELLOW, Color.RED),
+                            interpolated = false
+                        )
+                    )
+                    .build()
+            else -> null
+        }
 }
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/PlainComplicationText.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/PlainComplicationText.kt
index 249a921..39aaa1e 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/PlainComplicationText.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/PlainComplicationText.kt
@@ -18,5 +18,4 @@
 
 import androidx.wear.watchface.complications.data.PlainComplicationText
 
-internal fun plainText(text: CharSequence) =
-    PlainComplicationText.Builder(text).build()
\ No newline at end of file
+internal fun plainText(text: CharSequence) = PlainComplicationText.Builder(text).build()
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/SynchronousDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/SynchronousDataSourceService.kt
index f4a625e..f75980a 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/SynchronousDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/SynchronousDataSourceService.kt
@@ -26,8 +26,8 @@
 import java.time.ZonedDateTime
 
 /**
- * A minimal immediate complication data source. Typically this would be used to surface sensor
- * data rather than the time.
+ * A minimal immediate complication data source. Typically this would be used to surface sensor data
+ * rather than the time.
  */
 class SynchronousDataSourceService : ComplicationDataSourceService() {
 
@@ -42,51 +42,45 @@
                 when (request.complicationType) {
                     ComplicationType.SHORT_TEXT ->
                         ShortTextComplicationData.Builder(
-                            plainText("S ${time.second}"),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText("S ${time.second}"),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     ComplicationType.LONG_TEXT ->
                         LongTextComplicationData.Builder(
-                            plainText("Secs ${time.second}"),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText("Secs ${time.second}"),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     else -> null
                 }
             } else {
                 when (request.complicationType) {
                     ComplicationType.SHORT_TEXT ->
                         ShortTextComplicationData.Builder(
-                            plainText("M ${time.minute}"),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText("M ${time.minute}"),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     ComplicationType.LONG_TEXT ->
                         LongTextComplicationData.Builder(
-                            plainText("Mins ${time.minute}"),
-                            ComplicationText.EMPTY
-                        ).build()
-
+                                plainText("Mins ${time.minute}"),
+                                ComplicationText.EMPTY
+                            )
+                            .build()
                     else -> null
                 }
             }
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(
-                plainText("S 10"),
-                ComplicationText.EMPTY
-            ).build()
-
-        ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(
-                plainText("Secs 10"),
-                ComplicationText.EMPTY
-            ).build()
-
-        else -> null
-    }
-}
\ No newline at end of file
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.SHORT_TEXT ->
+                ShortTextComplicationData.Builder(plainText("S 10"), ComplicationText.EMPTY).build()
+            ComplicationType.LONG_TEXT ->
+                LongTextComplicationData.Builder(plainText("Secs 10"), ComplicationText.EMPTY)
+                    .build()
+            else -> null
+        }
+}
diff --git a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/WeightedElementDataSourceService.kt b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/WeightedElementDataSourceService.kt
index 073af3f..c64f878 100644
--- a/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/WeightedElementDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source-samples/src/main/java/androidx/wear/watchface/complications/datasource/samples/WeightedElementDataSourceService.kt
@@ -35,30 +35,32 @@
     ) {
         listener.onComplicationData(
             WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(1.0f, Color.RED),
-                    WeightedElementsComplicationData.Element(1.0f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(2.0f, Color.BLUE),
-                    WeightedElementsComplicationData.Element(3.0f, Color.YELLOW)
-                ),
-                plainText("Example weighted elements")
-            ).setText(plainText("Calories"))
+                    listOf(
+                        WeightedElementsComplicationData.Element(1.0f, Color.RED),
+                        WeightedElementsComplicationData.Element(1.0f, Color.GREEN),
+                        WeightedElementsComplicationData.Element(2.0f, Color.BLUE),
+                        WeightedElementsComplicationData.Element(3.0f, Color.YELLOW)
+                    ),
+                    plainText("Example weighted elements")
+                )
+                .setText(plainText("Calories"))
                 .build()
         )
     }
 
-    override fun getPreviewData(type: ComplicationType): ComplicationData? = when (type) {
-        ComplicationType.WEIGHTED_ELEMENTS ->
-            WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(1.0f, Color.RED),
-                    WeightedElementsComplicationData.Element(2.0f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(3.0f, Color.BLUE),
-                ),
-                plainText("Example weighted elements")
-            ).setText(plainText("Calories"))
-                .build()
-
-        else -> null
-    }
-}
\ No newline at end of file
+    override fun getPreviewData(type: ComplicationType): ComplicationData? =
+        when (type) {
+            ComplicationType.WEIGHTED_ELEMENTS ->
+                WeightedElementsComplicationData.Builder(
+                        listOf(
+                            WeightedElementsComplicationData.Element(1.0f, Color.RED),
+                            WeightedElementsComplicationData.Element(2.0f, Color.GREEN),
+                            WeightedElementsComplicationData.Element(3.0f, Color.BLUE),
+                        ),
+                        plainText("Example weighted elements")
+                    )
+                    .setText(plainText("Calories"))
+                    .build()
+            else -> null
+        }
+}
diff --git a/wear/watchface/watchface-complications-data-source/build.gradle b/wear/watchface/watchface-complications-data-source/build.gradle
index e8b91c7..1726a58 100644
--- a/wear/watchface/watchface-complications-data-source/build.gradle
+++ b/wear/watchface/watchface-complications-data-source/build.gradle
@@ -34,8 +34,10 @@
     testImplementation(libs.testRules)
     testImplementation(libs.robolectric)
     testImplementation(libs.mockitoCore4)
+    testImplementation(libs.mockitoKotlin4)
     testImplementation(libs.truth)
     testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
 }
 
 android {
diff --git a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceService.kt b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceService.kt
index 442d906..2450fd86 100644
--- a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceService.kt
+++ b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceService.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.watchface.complications.datasource
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.app.Service
@@ -27,6 +26,7 @@
 import android.os.IBinder
 import android.os.Looper
 import android.os.RemoteException
+import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.support.wearable.complications.ComplicationProviderInfo
 import android.support.wearable.complications.IComplicationManager
 import android.support.wearable.complications.IComplicationProvider
@@ -34,6 +34,7 @@
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationDataExpressionEvaluator
+import androidx.wear.watchface.complications.data.ComplicationDataExpressionEvaluator.Companion.hasExpression
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.data.ComplicationType.Companion.fromWireType
 import androidx.wear.watchface.complications.data.NoDataComplicationData
@@ -50,14 +51,15 @@
 /**
  * Data associated with complication request in
  * [ComplicationDataSourceService.onComplicationRequest].
+ *
  * @param complicationInstanceId The system's id for the requested complication which is a unique
- * value for the tuple [Watch face ComponentName, complication slot ID].
+ *   value for the tuple [Watch face ComponentName, complication slot ID].
  * @param complicationType The type of complication data requested.
- * @param immediateResponseRequired If `true` then
- * [ComplicationRequestListener.onComplicationData] should be called as soon as possible (ideally
- * less than 100ms instead of the usual 20s deadline). This will only be `true` within a
- * [ComplicationDataSourceService.onStartImmediateComplicationRequests]
- * [ComplicationDataSourceService.onStopImmediateComplicationRequests] pair.
+ * @param immediateResponseRequired If `true` then [ComplicationRequestListener.onComplicationData]
+ *   should be called as soon as possible (ideally less than 100ms instead of the usual 20s
+ *   deadline). This will only be `true` within a
+ *   [ComplicationDataSourceService.onStartImmediateComplicationRequests]
+ *   [ComplicationDataSourceService.onStopImmediateComplicationRequests] pair.
  */
 public class ComplicationRequest(
     complicationInstanceId: Int,
@@ -65,8 +67,8 @@
     immediateResponseRequired: Boolean
 ) {
     /**
-     * The system's id for the requested complication which is a unique value for the tuple [Watch
-     * face ComponentName, complication slot ID].
+     * The system's id for the requested complication which is a unique value for the tuple
+     * [Watch face ComponentName, complication slot ID].
      */
     public val complicationInstanceId: Int = complicationInstanceId
 
@@ -98,33 +100,28 @@
  * 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.
- *
+ * - The manifest declaration of this service must include an intent filter for
+ *   android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST.
  * - A ComplicationDataSourceService 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 data source. 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`.
+ *   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 data source. 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.
+ * 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 complication data source 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 ComplicationDataSourceService 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 complication data source would like to elapse between
- * update requests.
+ *   android.support.wearable.complications.UPDATE_PERIOD_SECONDS its manifest entry. The value of
+ *   this tag is the number of seconds the complication data source would like to elapse between
+ *   update requests.
  *
  * Note that update requests are not guaranteed to be sent with this frequency.
  *
@@ -133,7 +130,6 @@
  *
  * For example, a complication data source 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"/>
@@ -151,10 +147,9 @@
  *      "androidx.wear.watchface.complications.data.source.IMMEDIATE_UPDATE_PERIOD_MILLISECONDS"
  *   android:value="1000"/>
  * ```
- *
  * - A ComplicationDataSourceService 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 complication data source is selected.
+ *   android.support.wearable.complications.PROVIDER_CONFIG_ACTION its manifest entry to cause a
+ *   configuration activity to be shown when the complication data source is selected.
  *
  * The configuration activity must reside in the same package as the complication data source, and
  * must register an intent filter for the action specified here, including
@@ -177,23 +172,21 @@
  * complication data source should be set on the given complication.
  *
  * It is possible to provide additional 'meta-data' tag
- * androidx.watchface.complications.datasource.DEFAULT_CONFIG_SUPPORTED in the service
- * set to "true" to let the system know that the data source is able to provide complication data
- * before it is configured.
- *
+ * androidx.watchface.complications.datasource.DEFAULT_CONFIG_SUPPORTED in the service set to "true"
+ * to let the system know that the data source is able to provide complication data before it is
+ * configured.
  * - 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 complication data source.
- * This icon will be shown in the complication data source chooser interface, and may also be
- * included in [ComplicationProviderInfo] given to watch faces for display in their configuration
- * activities.
- *
+ *   provided there should be a single-color white icon that represents the complication data
+ *   source. This icon will be shown in the complication data source 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.
+ *   `android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"` to
+ *   ensure that only the system can bind to it.
  *
- * Multiple complication data sources in the same APK are supported but in android R there's a
- * soft limit of 100 data sources per APK. Above that the companion watchface editor won't
- * support this complication data source app.
+ * Multiple complication data sources in the same APK are supported but in android R there's a soft
+ * limit of 100 data sources per APK. Above that the companion watchface editor won't support this
+ * complication data source app.
  *
  * There's no need to call setDataSource for any the ComplicationData Builders because the system
  * will append this value on your behalf.
@@ -237,12 +230,11 @@
      * This will be called on the main thread.
      *
      * @param complicationInstanceId The system's ID for the complication. Note this ID is distinct
-     * from the complication slot used by the watch face itself.
+     *   from the complication slot used by the watch face itself.
      * @param type The [ComplicationType] of the activated slot.
      */
     @MainThread
-    public open fun onComplicationActivated(complicationInstanceId: Int, type: ComplicationType) {
-    }
+    public open fun onComplicationActivated(complicationInstanceId: Int, type: ComplicationType) {}
 
     /**
      * Called when a complication data update is requested for the given complication id.
@@ -251,14 +243,14 @@
      * 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
+     * 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. However if [ComplicationRequest.immediateResponseRequired] is `true` then
      * provider should try to deliver the response in under 100 milliseconds, if `false` the
      * deadline is 20 seconds. [ComplicationRequest.immediateResponseRequired] will only ever be
-     * `true` if [METADATA_KEY_IMMEDIATE_UPDATE_PERIOD_MILLISECONDS] is present in the manifest,
-     * and the provider has the privileged permission
+     * `true` if [METADATA_KEY_IMMEDIATE_UPDATE_PERIOD_MILLISECONDS] is present in the manifest, and
+     * the provider has the privileged permission
      * com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE, and the
      * complication is visible and non-ambient.
      *
@@ -302,32 +294,30 @@
         /**
          * Sends the [ComplicationDataTimeline] 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. Note this is mutually exclusive with [onComplicationData].
-         * Note only [ComplicationDataTimeline.defaultComplicationData] is supported by older
-         * watch faces .
+         * called once. Note this is mutually exclusive with [onComplicationData]. Note only
+         * [ComplicationDataTimeline.defaultComplicationData] is supported by older watch faces .
          */
         // TODO(alexclarke): Plumb a capability bit so the developers can know if timelines are
         // supported by the watch face.
         @Throws(RemoteException::class)
-        public fun onComplicationDataTimeline(complicationDataTimeline: ComplicationDataTimeline?) {
-        }
+        public fun onComplicationDataTimeline(
+            complicationDataTimeline: ComplicationDataTimeline?
+        ) {}
     }
 
     /**
      * If a metadata key with [METADATA_KEY_IMMEDIATE_UPDATE_PERIOD_MILLISECONDS] is present in the
      * manifest, and the provider has privileged permission
      * `com.google.android.wearable.permission.USE_IMMEDIATE_COMPLICATION_UPDATE`, then
-     * [onStartImmediateComplicationRequests] will be called when the watch
-     * face is visible and non-ambient. A series of [onComplicationRequest]s will follow where
+     * [onStartImmediateComplicationRequests] will be called when the watch face is visible and
+     * non-ambient. A series of [onComplicationRequest]s will follow where
      * [ComplicationRequest.immediateResponseRequired] is `true`, ending with a call to
      * [onStopImmediateComplicationRequests].
      *
      * @param complicationInstanceId The system's ID for the complication. Note this ID is distinct
-     * from the complication slot used by the watch face itself.
+     *   from the complication slot used by the watch face itself.
      */
-    @MainThread
-    public open fun onStartImmediateComplicationRequests(complicationInstanceId: Int) {
-    }
+    @MainThread public open fun onStartImmediateComplicationRequests(complicationInstanceId: Int) {}
 
     /**
      * If a metadata key with [METADATA_KEY_IMMEDIATE_UPDATE_PERIOD_MILLISECONDS] is present in the
@@ -339,11 +329,9 @@
      * complication becomes visible and non-ambient again.
      *
      * @param complicationInstanceId The system's ID for the complication. Note this ID is distinct
-     * from the complication slot used by the watch face itself.
+     *   from the complication slot used by the watch face itself.
      */
-    @MainThread
-    public open fun onStopImmediateComplicationRequests(complicationInstanceId: Int) {
-    }
+    @MainThread public open fun onStopImmediateComplicationRequests(complicationInstanceId: Int) {}
 
     /**
      * Called when a complication is deactivated.
@@ -355,11 +343,9 @@
      * This will be called on the main thread.
      *
      * @param complicationInstanceId The system's ID for the complication. Note this ID is distinct
-     * from the complication slot used by the watch face itself.
+     *   from the complication slot used by the watch face itself.
      */
-    @MainThread
-    public open fun onComplicationDeactivated(complicationInstanceId: Int) {
-    }
+    @MainThread public open fun onComplicationDeactivated(complicationInstanceId: Int) {}
 
     private inner class IComplicationProviderWrapper : IComplicationProvider.Stub() {
         @SuppressLint("SyntheticAccessor")
@@ -385,8 +371,7 @@
                                     "TYPE_EMPTY. Use TYPE_NO_DATA instead."
                             }
                             require(
-                                dataType == ComplicationType.NO_DATA ||
-                                    dataType == expectedDataType
+                                dataType == ComplicationType.NO_DATA || dataType == expectedDataType
                             ) {
                                 "Complication data should match the requested type. " +
                                     "Expected $expectedDataType got $dataType."
@@ -418,14 +403,14 @@
                                     "TYPE_EMPTY. Use TYPE_NO_DATA instead."
                             }
                             require(
-                                dataType == ComplicationType.NO_DATA ||
-                                    dataType == expectedDataType
+                                dataType == ComplicationType.NO_DATA || dataType == expectedDataType
                             ) {
                                 "Complication data should match the requested type. " +
                                     "Expected $expectedDataType got $dataType."
                             }
-                            if (defaultComplicationData != null &&
-                                defaultComplicationData is NoDataComplicationData
+                            if (
+                                defaultComplicationData != null &&
+                                    defaultComplicationData is NoDataComplicationData
                             ) {
                                 defaultComplicationData.placeholder?.let {
                                     require(it.type == expectedDataType) {
@@ -446,9 +431,7 @@
                                             }
                                         }
                                     } else {
-                                        require(
-                                            timelineComplicationData.type == expectedDataType
-                                        ) {
+                                        require(timelineComplicationData.type == expectedDataType) {
                                             "Timeline entry types must match the requested type. " +
                                                 "Expected $expectedDataType got " +
                                                 "${timelineComplicationData.type}."
@@ -456,17 +439,18 @@
                                     }
                                 }
                             }
-                            complicationDataTimeline?.asWireComplicationData()
+                            complicationDataTimeline
+                                ?.asWireComplicationData()
                                 .evaluateAndUpdateManager()
                         }
 
                         private fun WireComplicationData?.evaluateAndUpdateManager() {
                             lastExpressionEvaluator?.close() // Cancelling any previous evaluation.
                             if (
-                            // Will be evaluated by the platform.
+                                // Will be evaluated by the platform.
                                 Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ||
-                                // When no update is needed, the data is going to be null.
-                                this == null
+                                    // When no update is needed, the data is going to be null.
+                                    this == null
                             ) {
                                 iComplicationManager.updateComplicationData(
                                     complicationInstanceId,
@@ -534,10 +518,7 @@
             val expectedDataType = fromWireType(type)
             val complicationData = getPreviewData(expectedDataType)
             val dataType = complicationData?.type ?: ComplicationType.NO_DATA
-            require(
-                dataType == ComplicationType.NO_DATA ||
-                    dataType == expectedDataType
-            ) {
+            require(dataType == ComplicationType.NO_DATA || dataType == expectedDataType) {
                 "Preview data should match the requested type. " +
                     "Expected $expectedDataType got $dataType."
             }
@@ -546,6 +527,9 @@
                 require(complicationData.validTimeRange == TimeRange.ALWAYS) {
                     "Preview data should have time range set to ALWAYS."
                 }
+                require(!hasExpression(complicationData.asWireComplicationData())) {
+                    "Preview data must not have expressions."
+                }
             }
             return complicationData?.asWireComplicationData()
         }
@@ -594,8 +578,7 @@
                                     "TYPE_EMPTY. Use TYPE_NO_DATA instead."
                             }
                             require(
-                                dataType == ComplicationType.NO_DATA ||
-                                    dataType == expectedDataType
+                                dataType == ComplicationType.NO_DATA || dataType == expectedDataType
                             ) {
                                 "Complication data should match the requested type. " +
                                     "Expected $expectedDataType got $dataType."
@@ -621,8 +604,7 @@
                                     "TYPE_EMPTY. Use TYPE_NO_DATA instead."
                             }
                             require(
-                                dataType == ComplicationType.NO_DATA ||
-                                    dataType == expectedDataType
+                                dataType == ComplicationType.NO_DATA || dataType == expectedDataType
                             ) {
                                 "Complication data should match the requested type. " +
                                     "Expected $expectedDataType got $dataType."
@@ -661,9 +643,9 @@
          * 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.
+         * 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 complication data source that supports the RANGED_VALUE, SHORT_TEXT, and
          * ICON type would include the following in its manifest entry:
@@ -721,8 +703,8 @@
         /**
          * Metadata key used to declare a list of watch faces that may receive data from a
          * complication data source before they are granted the RECEIVE_COMPLICATION_DATA
-         * permission. This allows the listed watch faces to set the complication data source as
-         * a default and have the complication populate when the watch face is first seen.
+         * permission. This allows the listed watch faces to set the complication data source as a
+         * default and have the complication populate when the watch face is first seen.
          *
          * Only trusted watch faces that will set this complication data source as a default should
          * be included in this list.
@@ -732,10 +714,9 @@
          *
          * 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 complication data
-         * source.
+         * 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 complication data source.
          */
         // TODO(b/192233205): Migrate value to androidx.
         public const val METADATA_KEY_SAFE_WATCH_FACES: String =
@@ -743,9 +724,9 @@
 
         /**
          * Metadata key used to declare that the complication data source should be hidden from the
-         * complication data source chooser interface. If set to "true", users will not be able
-         * to select this complication data source. The complication data source may still be
-         * specified as a default complication data source by watch faces.
+         * complication data source chooser interface. If set to "true", users will not be able to
+         * select this complication data source. The complication data source may still be specified
+         * as a default complication data source by watch faces.
          */
         // TODO(b/192233205): Migrate value to androidx.
         internal const val METADATA_KEY_HIDDEN: String =
@@ -784,8 +765,7 @@
         /**
          * Metadata key. Setting to "true" indicates to the system that this complication data
          * source with a PROVIDER_CONFIG_ACTION metadata tag is able to provide complication data
-         * before it is configured.
-         * See [METADATA_KEY_DATA_SOURCE_CONFIG_ACTION].
+         * before it is configured. See [METADATA_KEY_DATA_SOURCE_CONFIG_ACTION].
          */
         public const val METADATA_KEY_DATA_SOURCE_DEFAULT_CONFIG_SUPPORTED: String =
             "androidx.watchface.complications.datasource.DEFAULT_CONFIG_SUPPORTED"
diff --git a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceUpdateRequester.kt b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceUpdateRequester.kt
index 4bd9991..a5da4a2 100644
--- a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceUpdateRequester.kt
+++ b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceUpdateRequester.kt
@@ -47,14 +47,15 @@
      * as are complications configured to use a different complication data source.
      *
      * @param complicationInstanceIds The system's IDs for the complications to be updated as
-     * provided to [ComplicationDataSourceService.onComplicationActivated] and
-     * [ComplicationDataSourceService.onComplicationRequest].
+     *   provided to [ComplicationDataSourceService.onComplicationActivated] and
+     *   [ComplicationDataSourceService.onComplicationRequest].
      */
     public fun requestUpdate(vararg complicationInstanceIds: Int)
 
     public companion object {
         /**
          * The package of the service that accepts complication data source requests.
+         *
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -65,7 +66,7 @@
          *
          * @param context The [ComplicationDataSourceService]'s [Context]
          * @param complicationDataSourceComponent The [ComponentName] of the
-         * [ComplicationDataSourceService] to reload.
+         *   [ComplicationDataSourceService] to reload.
          * @return The constructed [ComplicationDataSourceUpdateRequester].
          */
         @JvmStatic
@@ -100,7 +101,7 @@
 /**
  * @param context The [ComplicationDataSourceService]'s [Context]
  * @param complicationDataSourceComponent The [ComponentName] of the ComplicationDataSourceService]
- * to reload.
+ *   to reload.
  */
 private class ComplicationDataSourceUpdateRequesterImpl(
     private val context: Context,
@@ -117,12 +118,7 @@
         // Add a placeholder PendingIntent to allow the UID to be checked.
         intent.putExtra(
             ComplicationDataSourceUpdateRequesterConstants.EXTRA_PENDING_INTENT,
-            PendingIntent.getActivity(
-                context,
-                0,
-                Intent(""),
-                PendingIntent.FLAG_IMMUTABLE
-            )
+            PendingIntent.getActivity(context, 0, Intent(""), PendingIntent.FLAG_IMMUTABLE)
         )
         context.sendBroadcast(intent)
     }
@@ -141,12 +137,7 @@
         // Add a placeholder PendingIntent to allow the UID to be checked.
         intent.putExtra(
             ComplicationDataSourceUpdateRequesterConstants.EXTRA_PENDING_INTENT,
-            PendingIntent.getActivity(
-                context,
-                0,
-                Intent(""),
-                PendingIntent.FLAG_IMMUTABLE
-            )
+            PendingIntent.getActivity(context, 0, Intent(""), PendingIntent.FLAG_IMMUTABLE)
         )
         context.sendBroadcast(intent)
     }
diff --git a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimeline.kt b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimeline.kt
index 68018b6..53d5646 100644
--- a/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimeline.kt
+++ b/wear/watchface/watchface-complications-data-source/src/main/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimeline.kt
@@ -27,10 +27,7 @@
  * @param start The [Instant] when this TimeInterval becomes valid
  * @param end The [Instant] when this TimeInterval becomes invalid, must be after [start]
  */
-public class TimeInterval(
-    public var start: Instant,
-    public var end: Instant
-) {
+public class TimeInterval(public var start: Instant, public var end: Instant) {
     init {
         require(start < end) { "start must be before end" }
     }
@@ -100,7 +97,7 @@
  *
  * In the case where the validity periods of TimelineEntry items overlap, the item with the
  * *shortest* validity period will be shown. If none are valid then the [defaultComplicationData]
- * will be shown.  This allows a complication datasource to show a "default", and override it at set
+ * will be shown. This allows a complication datasource to show a "default", and override it at set
  * points without having to explicitly insert the default [ComplicationData] between the each
  * "override".
  *
@@ -123,17 +120,16 @@
         for (entry in timelineEntries) {
             val complicationData = entry.complicationData
             if (complicationData is NoDataComplicationData) {
-                require(complicationData.placeholder == null ||
-                    complicationData.placeholder!!.type == defaultComplicationData.type
+                require(
+                    complicationData.placeholder == null ||
+                        complicationData.placeholder!!.type == defaultComplicationData.type
                 ) {
                     "TimelineEntry's placeholder types must match the defaultComplicationData. " +
                         "Found ${complicationData.placeholder!!.type} expected " +
                         "${defaultComplicationData.type}."
                 }
             } else {
-                require(
-                    complicationData.type == defaultComplicationData.type
-                ) {
+                require(complicationData.type == defaultComplicationData.type) {
                     "TimelineEntry's complicationData must have the same type as the " +
                         "defaultComplicationData or be NoDataComplicationData. Found " +
                         "${complicationData.type} expected ${defaultComplicationData.type}."
@@ -148,12 +144,13 @@
     }
 
     internal fun asWireComplicationData(): WireComplicationData {
-        val wireTimelineEntries = timelineEntries.map { timelineEntry ->
-            timelineEntry.complicationData.asWireComplicationData().apply {
-                timelineStartEpochSecond = timelineEntry.validity.start.epochSecond
-                timelineEndEpochSecond = timelineEntry.validity.end.epochSecond
+        val wireTimelineEntries =
+            timelineEntries.map { timelineEntry ->
+                timelineEntry.complicationData.asWireComplicationData().apply {
+                    timelineStartEpochSecond = timelineEntry.validity.start.epochSecond
+                    timelineEndEpochSecond = timelineEntry.validity.end.epochSecond
+                }
             }
-        }
         return defaultComplicationData.asWireComplicationData().apply {
             setTimelineEntryCollection(wireTimelineEntries)
         }
@@ -181,4 +178,4 @@
         return "ComplicationDataTimeline(defaultComplicationData=$defaultComplicationData, " +
             "timelineEntries=$timelineEntries)"
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.java b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.java
deleted file mode 100644
index 4742770..0000000
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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.datasource;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.content.Intent;
-import android.os.Build;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.RemoteException;
-import android.support.wearable.complications.IComplicationManager;
-import android.support.wearable.complications.IComplicationProvider;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.wear.protolayout.expression.DynamicBuilders;
-import androidx.wear.protolayout.expression.DynamicBuilders.DynamicString;
-import androidx.wear.watchface.complications.data.ComplicationData;
-import androidx.wear.watchface.complications.data.ComplicationText;
-import androidx.wear.watchface.complications.data.ComplicationType;
-import androidx.wear.watchface.complications.data.LongTextComplicationData;
-import androidx.wear.watchface.complications.data.PlainComplicationText;
-import androidx.wear.watchface.complications.data.ComplicationTextExpression;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.internal.DoNotInstrument;
-import org.robolectric.shadows.ShadowLog;
-
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-/** Tests for {@link ComplicationDataSourceService}. */
-@RunWith(ComplicationsTestRunner.class)
-@DoNotInstrument
-public class ComplicationDataSourceServiceTest {
-
-    private static final String TAG = "ComplicationDataSourceServiceTest";
-
-    HandlerThread mPretendMainThread = new HandlerThread("testThread");
-    Handler mPretendMainThreadHandler;
-
-    @Mock
-    private IComplicationManager mRemoteManager;
-
-    private final CountDownLatch mUpdateComplicationDataLatch = new CountDownLatch(1);
-    private final IComplicationManager.Stub mLocalManager = new IComplicationManager.Stub() {
-        @Override
-        public void updateComplicationData(int complicationSlotId,
-                android.support.wearable.complications.ComplicationData data)
-                throws RemoteException {
-            mRemoteManager.updateComplicationData(complicationSlotId, data);
-            mUpdateComplicationDataLatch.countDown();
-        }
-    };
-
-    private IComplicationProvider.Stub mProvider;
-
-    /**
-     * Mock implementation of ComplicationDataSourceService.
-     *
-     * <p>Can't use Mockito because it doesn't like partially implemented classes.
-     */
-    private class MockComplicationDataSourceService extends ComplicationDataSourceService {
-        boolean respondWithTimeline = false;
-
-        /**
-         * Will be used to invoke {@link ComplicationRequestListener#onComplicationData} on
-         * {@link #onComplicationRequest}.
-         */
-        @Nullable
-        ComplicationData responseData;
-
-        /**
-         * Will be used to invoke {@link ComplicationRequestListener#onComplicationDataTimeline} on
-         * {@link #onComplicationRequest}, if {@link #respondWithTimeline} is true.
-         */
-        @Nullable
-        ComplicationDataTimeline responseDataTimeline;
-
-        /** Last request provided to {@link #onComplicationRequest}. */
-        @Nullable
-        ComplicationRequest lastRequest;
-
-        /** Will be returned from {@link #getPreviewData}. */
-        @Nullable
-        ComplicationData previewData;
-
-        /** Last type provided to {@link #getPreviewData}. */
-        @Nullable
-        ComplicationType lastPreviewType;
-
-        @NonNull
-        @Override
-        public Handler createMainThreadHandler() {
-            return mPretendMainThreadHandler;
-        }
-
-        @Override
-        public void onComplicationRequest(@NonNull ComplicationRequest request,
-                @NonNull ComplicationRequestListener listener) {
-            lastRequest = request;
-            try {
-                if (respondWithTimeline) {
-                    listener.onComplicationDataTimeline(responseDataTimeline);
-                } else {
-                    listener.onComplicationData(responseData);
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "onComplicationRequest failed with error: ", e);
-            }
-        }
-
-        @Nullable
-        @Override
-        public ComplicationData getPreviewData(@NonNull ComplicationType type) {
-            lastPreviewType = type;
-            return previewData;
-        }
-    }
-
-    private final MockComplicationDataSourceService mService =
-            new MockComplicationDataSourceService();
-
-    @SuppressWarnings("deprecation") // b/251211092
-    @Before
-    public void setUp() {
-        ShadowLog.setLoggable("ComplicationData", Log.DEBUG);
-        MockitoAnnotations.initMocks(this);
-        mProvider =
-                (IComplicationProvider.Stub) mService.onBind(
-                        new Intent(
-                                ComplicationDataSourceService.ACTION_COMPLICATION_UPDATE_REQUEST));
-
-        mPretendMainThread.start();
-        mPretendMainThreadHandler = new Handler(mPretendMainThread.getLooper());
-    }
-
-    @After
-    public void tearDown() {
-        mPretendMainThread.quitSafely();
-    }
-
-    @Test
-    public void testOnComplicationRequest() throws Exception {
-        mService.responseData =
-                new LongTextComplicationData.Builder(
-                        new PlainComplicationText.Builder("hello").build(),
-                        ComplicationText.EMPTY
-                ).build();
-
-        int id = 123;
-        mProvider.onUpdate(
-                id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager);
-        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-
-        ArgumentCaptor<android.support.wearable.complications.ComplicationData> data =
-                ArgumentCaptor.forClass(
-                        android.support.wearable.complications.ComplicationData.class);
-        verify(mRemoteManager).updateComplicationData(eq(id), data.capture());
-        assertThat(data.getValue().getLongText().getTextAt(null, 0)).isEqualTo("hello");
-    }
-
-    @Test
-    @Config(sdk = Build.VERSION_CODES.TIRAMISU)
-    public void testOnComplicationRequestWithExpression_doesNotEvaluateExpression()
-            throws Exception {
-        mService.responseData =
-                new LongTextComplicationData.Builder(
-                        new ComplicationTextExpression(
-                                DynamicString.constant("hello").concat(
-                                        DynamicString.constant(" world"))),
-                        ComplicationText.EMPTY)
-                        .build();
-
-        mProvider.onUpdate(
-                /* complicationInstanceId = */ 123,
-                ComplicationType.LONG_TEXT.toWireComplicationType(),
-                mLocalManager);
-
-        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-        verify(mRemoteManager).updateComplicationData(
-                eq(123),
-                eq(new LongTextComplicationData.Builder(
-                        new ComplicationTextExpression(
-                                DynamicString.constant("hello").concat(
-                                        DynamicString.constant(" world"))),
-                        ComplicationText.EMPTY)
-                        .build()
-                        .asWireComplicationData()));
-    }
-
-    @Test
-    @Config(sdk = Build.VERSION_CODES.S)
-    public void testOnComplicationRequestWithExpressionPreT_evaluatesExpression()
-            throws Exception {
-        mService.responseData =
-                new LongTextComplicationData.Builder(
-                        new ComplicationTextExpression(
-                                DynamicString.constant("hello").concat(
-                                        DynamicString.constant(" world"))),
-                        ComplicationText.EMPTY)
-                        .build();
-
-        mProvider.onUpdate(
-                /* complicationInstanceId = */ 123,
-                ComplicationType.LONG_TEXT.toWireComplicationType(),
-                mLocalManager);
-
-        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-        verify(mRemoteManager).updateComplicationData(
-                eq(123),
-                eq(new LongTextComplicationData.Builder(
-                        // TODO(b/260065006): new PlainComplicationText.Builder("hello world")
-                        new ComplicationTextExpression(
-                                DynamicString.constant("hello").concat(
-                                        DynamicString.constant(" world"))),
-                        ComplicationText.EMPTY)
-                        .build()
-                        .asWireComplicationData()));
-    }
-
-    @Test
-    public void testOnComplicationRequestWrongType() throws Exception {
-        mService.responseData =
-                new LongTextComplicationData.Builder(
-                        new PlainComplicationText.Builder("hello").build(),
-                        ComplicationText.EMPTY
-                ).build();
-        int id = 123;
-        AtomicReference<Throwable> exception = new AtomicReference<>();
-        CountDownLatch exceptionLatch = new CountDownLatch(1);
-
-        mPretendMainThread.setUncaughtExceptionHandler((thread, throwable) -> {
-            exception.set(throwable);
-            exceptionLatch.countDown();
-        });
-
-        mProvider.onUpdate(
-                id, ComplicationType.SHORT_TEXT.toWireComplicationType(), mLocalManager);
-
-        assertThat(exceptionLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-        assertThat(exception.get()).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void testOnComplicationRequestNoUpdateRequired() throws Exception {
-        mService.responseData = null;
-
-        int id = 123;
-        mProvider.onUpdate(
-                id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager);
-        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-
-        ArgumentCaptor<android.support.wearable.complications.ComplicationData> data =
-                ArgumentCaptor.forClass(
-                        android.support.wearable.complications.ComplicationData.class);
-        verify(mRemoteManager).updateComplicationData(eq(id), data.capture());
-        assertThat(data.getValue()).isNull();
-    }
-
-    @Test
-    public void testGetComplicationPreviewData() throws Exception {
-        mService.previewData = new LongTextComplicationData.Builder(
-                new PlainComplicationText.Builder("hello preview").build(),
-                ComplicationText.EMPTY
-        ).build();
-
-        assertThat(mProvider.getComplicationPreviewData(
-                ComplicationType.LONG_TEXT.toWireComplicationType()
-        ).getLongText().getTextAt(null, 0)).isEqualTo("hello preview");
-    }
-
-    @Test
-    public void testTimelineTestService() throws Exception {
-        mService.respondWithTimeline = true;
-        ArrayList<TimelineEntry> timeline = new ArrayList<>();
-        timeline.add(new TimelineEntry(
-                        new TimeInterval(
-                                Instant.ofEpochSecond(1000),
-                                Instant.ofEpochSecond(4000)
-                        ),
-                        new LongTextComplicationData.Builder(
-                                new PlainComplicationText.Builder(
-                                        "A").build(),
-                                ComplicationText.EMPTY
-                        ).build()
-                )
-        );
-        timeline.add(new TimelineEntry(
-                        new TimeInterval(
-                                Instant.ofEpochSecond(6000),
-                                Instant.ofEpochSecond(8000)
-                        ),
-                        new LongTextComplicationData.Builder(
-                                new PlainComplicationText.Builder(
-                                        "B").build(),
-                                ComplicationText.EMPTY
-                        ).build()
-                )
-        );
-        mService.responseDataTimeline = new ComplicationDataTimeline(
-                new LongTextComplicationData.Builder(
-                        new PlainComplicationText.Builder(
-                                "default").build(),
-                        ComplicationText.EMPTY
-                ).build(),
-                timeline
-        );
-
-        int id = 123;
-        mProvider.onUpdate(
-                id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager);
-        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-
-        ArgumentCaptor<android.support.wearable.complications.ComplicationData> data =
-                ArgumentCaptor.forClass(
-                        android.support.wearable.complications.ComplicationData.class);
-        verify(mRemoteManager).updateComplicationData(eq(id), data.capture());
-        assertThat(data.getValue().getLongText().getTextAt(null, 0)).isEqualTo(
-                "default"
-        );
-        List<android.support.wearable.complications.ComplicationData> timeLineEntries =
-                data.getValue().getTimelineEntries();
-        assertThat(timeLineEntries).isNotNull();
-        assertThat(timeLineEntries.size()).isEqualTo(2);
-        assertThat(timeLineEntries.get(0).getTimelineStartEpochSecond()).isEqualTo(1000);
-        assertThat(timeLineEntries.get(0).getTimelineEndEpochSecond()).isEqualTo(4000);
-        assertThat(timeLineEntries.get(0).getLongText().getTextAt(null, 0)).isEqualTo(
-                "A"
-        );
-
-        assertThat(timeLineEntries.get(1).getTimelineStartEpochSecond()).isEqualTo(6000);
-        assertThat(timeLineEntries.get(1).getTimelineEndEpochSecond()).isEqualTo(8000);
-        assertThat(timeLineEntries.get(1).getLongText().getTextAt(null, 0)).isEqualTo(
-                "B"
-        );
-    }
-
-    @Test
-    public void testImmediateRequest() throws Exception {
-        int id = 123;
-        mService.responseData =
-                new LongTextComplicationData.Builder(
-                        new PlainComplicationText.Builder("hello").build(),
-                        ComplicationText.EMPTY
-                ).build();
-        HandlerThread thread = new HandlerThread("testThread");
-
-        try {
-            thread.start();
-            Handler threadHandler = new Handler(thread.getLooper());
-            AtomicReference<android.support.wearable.complications.ComplicationData> response =
-                    new AtomicReference<>();
-            CountDownLatch doneLatch = new CountDownLatch(1);
-
-            threadHandler.post(() -> {
-                        try {
-                            response.set(mProvider.onSynchronousComplicationRequest(
-                                    123,
-                                    ComplicationType.LONG_TEXT.toWireComplicationType()));
-                            doneLatch.countDown();
-                        } catch (RemoteException e) {
-                            // Should not happen
-                        }
-                    }
-            );
-
-            assertThat(doneLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue();
-            assertThat(response.get().getLongText().getTextAt(null, 0)).isEqualTo("hello");
-        } finally {
-            thread.quitSafely();
-        }
-    }
-}
-
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.kt b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.kt
new file mode 100644
index 0000000..a568b67
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataSourceServiceTest.kt
@@ -0,0 +1,468 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.datasource
+
+import android.content.Intent
+import android.content.res.Resources
+import android.os.Build
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.RemoteException
+import android.support.wearable.complications.ComplicationData as WireComplicationData
+import android.support.wearable.complications.IComplicationManager
+import android.support.wearable.complications.IComplicationProvider
+import android.util.Log
+import androidx.wear.protolayout.expression.DynamicBuilders
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicString
+import androidx.wear.watchface.complications.data.ComplicationData
+import androidx.wear.watchface.complications.data.ComplicationText
+import androidx.wear.watchface.complications.data.ComplicationTextExpression
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.data.LongTextComplicationData
+import androidx.wear.watchface.complications.data.PlainComplicationText
+import androidx.wear.watchface.complications.data.RangedValueComplicationData
+import androidx.wear.watchface.complications.data.ShortTextComplicationData
+import com.google.common.truth.Expect
+import com.google.common.truth.Truth.assertThat
+import java.time.Instant
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.atomic.AtomicReference
+import kotlin.test.assertFailsWith
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.argThat
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.verify
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.mock
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import org.robolectric.shadows.ShadowLog
+import org.robolectric.shadows.ShadowLooper.runUiThreadTasks
+
+/** Tests for [ComplicationDataSourceService]. */
+@RunWith(ComplicationsTestRunner::class)
+@DoNotInstrument
+class ComplicationDataSourceServiceTest {
+    @get:Rule val expect = Expect.create()
+
+    private var mPretendMainThread = HandlerThread("testThread")
+    private lateinit var mPretendMainThreadHandler: Handler
+
+    private val mRemoteManager = mock<IComplicationManager>()
+    private val mUpdateComplicationDataLatch = CountDownLatch(1)
+    private val mLocalManager: IComplicationManager.Stub =
+        object : IComplicationManager.Stub() {
+            override fun updateComplicationData(
+                complicationSlotId: Int,
+                data: WireComplicationData?
+            ) {
+                mRemoteManager.updateComplicationData(complicationSlotId, data)
+                mUpdateComplicationDataLatch.countDown()
+            }
+        }
+    private lateinit var mProvider: IComplicationProvider.Stub
+
+    /**
+     * Mock implementation of ComplicationDataSourceService.
+     *
+     * Can't use Mockito because it doesn't like partially implemented classes.
+     */
+    private inner class MockComplicationDataSourceService : ComplicationDataSourceService() {
+        var respondWithTimeline = false
+
+        /**
+         * Will be used to invoke [.ComplicationRequestListener.onComplicationData] on
+         * [onComplicationRequest].
+         */
+        var responseData: ComplicationData? = null
+
+        /**
+         * Will be used to invoke [.ComplicationRequestListener.onComplicationDataTimeline] on
+         * [onComplicationRequest], if [respondWithTimeline] is true.
+         */
+        var responseDataTimeline: ComplicationDataTimeline? = null
+
+        /** Last request provided to [onComplicationRequest]. */
+        var lastRequest: ComplicationRequest? = null
+
+        /** Will be returned from [previewData]. */
+        var previewData: ComplicationData? = null
+
+        /** Last type provided to [previewData]. */
+        var lastPreviewType: ComplicationType? = null
+
+        override fun createMainThreadHandler(): Handler = mPretendMainThreadHandler
+
+        override fun onComplicationRequest(
+            request: ComplicationRequest,
+            listener: ComplicationRequestListener
+        ) {
+            lastRequest = request
+            try {
+                if (respondWithTimeline) {
+                    listener.onComplicationDataTimeline(responseDataTimeline)
+                } else {
+                    listener.onComplicationData(responseData)
+                }
+            } catch (e: RemoteException) {
+                Log.e(TAG, "onComplicationRequest failed with error: ", e)
+            }
+        }
+
+        override fun getPreviewData(type: ComplicationType): ComplicationData? {
+            lastPreviewType = type
+            return previewData
+        }
+    }
+
+    private val mService = MockComplicationDataSourceService()
+
+    @Before
+    fun setUp() {
+        ShadowLog.setLoggable("ComplicationData", Log.DEBUG)
+        mProvider =
+            mService.onBind(
+                Intent(ComplicationDataSourceService.ACTION_COMPLICATION_UPDATE_REQUEST)
+            ) as IComplicationProvider.Stub
+
+        mPretendMainThread.start()
+        mPretendMainThreadHandler = Handler(mPretendMainThread.looper)
+    }
+
+    @After
+    fun tearDown() {
+        mPretendMainThread.quitSafely()
+    }
+
+    @Test
+    fun testOnComplicationRequest() {
+        mService.responseData =
+            LongTextComplicationData.Builder(
+                    PlainComplicationText.Builder("hello").build(),
+                    ComplicationText.EMPTY
+                )
+                .build()
+        val id = 123
+        mProvider.onUpdate(id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager)
+        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+
+        val data = argumentCaptor<WireComplicationData>()
+        verify(mRemoteManager).updateComplicationData(eq(id), data.capture())
+        assertThat(data.firstValue.longText!!.getTextAt(Resources.getSystem(), 0))
+            .isEqualTo("hello")
+    }
+
+    @Test
+    @Config(sdk = [Build.VERSION_CODES.TIRAMISU])
+    fun testOnComplicationRequestWithExpression_doesNotEvaluateExpression() {
+        mService.responseData =
+            LongTextComplicationData.Builder(
+                    ComplicationTextExpression(
+                        DynamicBuilders.DynamicString.constant("hello")
+                            .concat(DynamicBuilders.DynamicString.constant(" world"))
+                    ),
+                    ComplicationText.EMPTY
+                )
+                .build()
+        mProvider.onUpdate(
+            /* complicationInstanceId = */ 123,
+            ComplicationType.LONG_TEXT.toWireComplicationType(),
+            mLocalManager
+        )
+
+        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        verify(mRemoteManager)
+            .updateComplicationData(
+                eq(123),
+                eq(
+                    LongTextComplicationData.Builder(
+                            ComplicationTextExpression(
+                                DynamicBuilders.DynamicString.constant("hello")
+                                    .concat(DynamicBuilders.DynamicString.constant(" world"))
+                            ),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
+                        .asWireComplicationData()
+                )
+            )
+    }
+
+    @Test
+    @Config(sdk = [Build.VERSION_CODES.S])
+    fun testOnComplicationRequestWithExpressionPreT_evaluatesExpression() {
+        mService.responseData =
+            LongTextComplicationData.Builder(
+                    ComplicationTextExpression(
+                        DynamicBuilders.DynamicString.constant("hello")
+                            .concat(DynamicBuilders.DynamicString.constant(" world"))
+                    ),
+                    ComplicationText.EMPTY
+                )
+                .build()
+
+        mProvider.onUpdate(
+            /* complicationInstanceId = */ 123,
+            ComplicationType.LONG_TEXT.toWireComplicationType(),
+            mLocalManager
+        )
+
+        runUiThreadTasksWhileAwaitingDataLatch(1000)
+        verify(mRemoteManager)
+            .updateComplicationData(
+                eq(123),
+                argThat { data ->
+                    data.longText!!.getTextAt(Resources.getSystem(), 0) == "hello world"
+                }
+            )
+    }
+
+    @Test
+    fun testOnComplicationRequestWrongType() {
+        mService.responseData =
+            LongTextComplicationData.Builder(
+                    PlainComplicationText.Builder("hello").build(),
+                    ComplicationText.EMPTY
+                )
+                .build()
+        val id = 123
+        val exception = AtomicReference<Throwable>()
+        val exceptionLatch = CountDownLatch(1)
+
+        mPretendMainThread.uncaughtExceptionHandler =
+            Thread.UncaughtExceptionHandler { _, throwable ->
+                exception.set(throwable)
+                exceptionLatch.countDown()
+            }
+        mProvider.onUpdate(id, ComplicationType.SHORT_TEXT.toWireComplicationType(), mLocalManager)
+
+        assertThat(exceptionLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        assertThat(exception.get()).isInstanceOf(IllegalArgumentException::class.java)
+    }
+
+    @Test
+    fun testOnComplicationRequestNoUpdateRequired() {
+        mService.responseData = null
+
+        val id = 123
+        mProvider.onUpdate(id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager)
+        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+
+        val data = argumentCaptor<WireComplicationData>()
+        verify(mRemoteManager).updateComplicationData(eq(id), data.capture())
+        assertThat(data.allValues).containsExactly(null)
+    }
+
+    @Test
+    fun testGetComplicationPreviewData() {
+        mService.previewData =
+            LongTextComplicationData.Builder(
+                    PlainComplicationText.Builder("hello preview").build(),
+                    ComplicationText.EMPTY
+                )
+                .build()
+
+        assertThat(
+                mProvider
+                    .getComplicationPreviewData(ComplicationType.LONG_TEXT.toWireComplicationType())
+                    .longText!!
+                    .getTextAt(Resources.getSystem(), 0)
+            )
+            .isEqualTo("hello preview")
+    }
+
+    enum class DataWithExpressionScenario(val data: ComplicationData) {
+        RANGED_VALUE(
+            RangedValueComplicationData.Builder(
+                    valueExpression = DynamicFloat.constant(1f),
+                    min = 0f,
+                    max = 10f,
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .setText(ComplicationText.EMPTY)
+                .build()
+        ),
+        LONG_TEXT(
+            LongTextComplicationData.Builder(
+                    text = ComplicationTextExpression(DynamicString.constant("Long Text")),
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .build()
+        ),
+        LONG_TITLE(
+            LongTextComplicationData.Builder(
+                    text = ComplicationText.EMPTY,
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .setTitle(ComplicationTextExpression(DynamicString.constant("Long Title")))
+                .build()
+        ),
+        SHORT_TEXT(
+            ShortTextComplicationData.Builder(
+                    text = ComplicationTextExpression(DynamicString.constant("Short Text")),
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .build()
+        ),
+        SHORT_TITLE(
+            ShortTextComplicationData.Builder(
+                    text = ComplicationText.EMPTY,
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .setTitle(ComplicationTextExpression(DynamicString.constant("Short Title")))
+                .build()
+        ),
+        CONTENT_DESCRIPTION(
+            LongTextComplicationData.Builder(
+                    text = ComplicationText.EMPTY,
+                    contentDescription =
+                        ComplicationTextExpression(DynamicString.constant("Long Text")),
+                )
+                .build()
+        ),
+    }
+
+    @Test
+    fun testGetComplicationPreviewData_withExpression_fails() {
+        for (scenario in DataWithExpressionScenario.values()) {
+            mService.previewData = scenario.data
+
+            val exception =
+                assertFailsWith<IllegalArgumentException> {
+                    mProvider.getComplicationPreviewData(
+                        scenario.data.type.toWireComplicationType()
+                    )
+                }
+
+            expect
+                .withMessage(scenario.name)
+                .that(exception)
+                .hasMessageThat()
+                .isEqualTo("Preview data must not have expressions.")
+        }
+    }
+
+    @Test
+    fun testTimelineTestService() {
+        mService.respondWithTimeline = true
+        val timeline = ArrayList<TimelineEntry>()
+        timeline.add(
+            TimelineEntry(
+                TimeInterval(Instant.ofEpochSecond(1000), Instant.ofEpochSecond(4000)),
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("A").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+            )
+        )
+        timeline.add(
+            TimelineEntry(
+                TimeInterval(Instant.ofEpochSecond(6000), Instant.ofEpochSecond(8000)),
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("B").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+            )
+        )
+        mService.responseDataTimeline =
+            ComplicationDataTimeline(
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("default").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build(),
+                timeline
+            )
+
+        val id = 123
+        mProvider.onUpdate(id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager)
+        assertThat(mUpdateComplicationDataLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+        val data = argumentCaptor<WireComplicationData>()
+        verify(mRemoteManager).updateComplicationData(eq(id), data.capture())
+        assertThat(data.firstValue.longText!!.getTextAt(Resources.getSystem(), 0))
+            .isEqualTo("default")
+        val timeLineEntries: List<WireComplicationData?> = data.firstValue.timelineEntries!!
+        assertThat(timeLineEntries.size).isEqualTo(2)
+        assertThat(timeLineEntries[0]!!.timelineStartEpochSecond).isEqualTo(1000)
+        assertThat(timeLineEntries[0]!!.timelineEndEpochSecond).isEqualTo(4000)
+        assertThat(timeLineEntries[0]!!.longText!!.getTextAt(Resources.getSystem(), 0))
+            .isEqualTo("A")
+
+        assertThat(timeLineEntries[1]!!.timelineStartEpochSecond).isEqualTo(6000)
+        assertThat(timeLineEntries[1]!!.timelineEndEpochSecond).isEqualTo(8000)
+        assertThat(timeLineEntries[1]!!.longText!!.getTextAt(Resources.getSystem(), 0))
+            .isEqualTo("B")
+    }
+
+    @Test
+    fun testImmediateRequest() {
+        mService.responseData =
+            LongTextComplicationData.Builder(
+                    PlainComplicationText.Builder("hello").build(),
+                    ComplicationText.EMPTY
+                )
+                .build()
+        val thread = HandlerThread("testThread")
+
+        try {
+            thread.start()
+            val threadHandler = Handler(thread.looper)
+            val response = AtomicReference<WireComplicationData>()
+            val doneLatch = CountDownLatch(1)
+
+            threadHandler.post {
+                try {
+                    response.set(
+                        mProvider.onSynchronousComplicationRequest(
+                            123,
+                            ComplicationType.LONG_TEXT.toWireComplicationType()
+                        )
+                    )
+                    doneLatch.countDown()
+                } catch (e: RemoteException) {
+                    // Should not happen
+                }
+            }
+
+            assertThat(doneLatch.await(1000, TimeUnit.MILLISECONDS)).isTrue()
+            assertThat(response.get().longText!!.getTextAt(Resources.getSystem(), 0))
+                .isEqualTo("hello")
+        } finally {
+            thread.quitSafely()
+        }
+    }
+
+    private fun runUiThreadTasksWhileAwaitingDataLatch(timeout: Long) {
+        // Allowing UI thread to execute while we wait for the data latch.
+        var attempts: Long = 0
+        while (!mUpdateComplicationDataLatch.await(1, TimeUnit.MILLISECONDS)) {
+            runUiThreadTasks()
+            assertThat(attempts++).isLessThan(timeout) // In total waiting ~timeout.
+        }
+    }
+
+    companion object {
+        private const val TAG = "ComplicationDataSourceServiceTest"
+    }
+}
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimelineTest.java b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimelineTest.java
index 8ea484e..5463ef96 100644
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimelineTest.java
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/ComplicationDataTimelineTest.java
@@ -50,61 +50,69 @@
 public class ComplicationDataTimelineTest {
     private static final ComplicationDataTimeline TIMELINE_A =
             new ComplicationDataTimeline(
-                    new ShortTextComplicationData.Builder(new PlainComplicationText.Builder(
-                            "Hello").build(), ComplicationText.EMPTY).build(),
+                    new ShortTextComplicationData.Builder(
+                                    new PlainComplicationText.Builder("Hello").build(),
+                                    ComplicationText.EMPTY)
+                            .build(),
                     ImmutableList.of(
                             new TimelineEntry(
-                                    new TimeInterval(Instant.ofEpochMilli(100000000),
+                                    new TimeInterval(
+                                            Instant.ofEpochMilli(100000000),
                                             Instant.ofEpochMilli(200000000)),
                                     new ShortTextComplicationData.Builder(
-                                            new PlainComplicationText.Builder(
-                                                    "Updated").build(),
-                                            ComplicationText.EMPTY).build()
-                            )
-                    ));
+                                                    new PlainComplicationText.Builder("Updated")
+                                                            .build(),
+                                                    ComplicationText.EMPTY)
+                                            .build())));
     private static final ComplicationDataTimeline TIMELINE_A2 =
             new ComplicationDataTimeline(
-                    new ShortTextComplicationData.Builder(new PlainComplicationText.Builder(
-                            "Hello").build(), ComplicationText.EMPTY).build(),
+                    new ShortTextComplicationData.Builder(
+                                    new PlainComplicationText.Builder("Hello").build(),
+                                    ComplicationText.EMPTY)
+                            .build(),
                     ImmutableList.of(
                             new TimelineEntry(
-                                    new TimeInterval(Instant.ofEpochMilli(100000000),
+                                    new TimeInterval(
+                                            Instant.ofEpochMilli(100000000),
                                             Instant.ofEpochMilli(200000000)),
                                     new ShortTextComplicationData.Builder(
-                                            new PlainComplicationText.Builder(
-                                                    "Updated").build(),
-                                            ComplicationText.EMPTY).build()
-                            )
-                    ));
+                                                    new PlainComplicationText.Builder("Updated")
+                                                            .build(),
+                                                    ComplicationText.EMPTY)
+                                            .build())));
 
     private static final ComplicationDataTimeline TIMELINE_B =
             new ComplicationDataTimeline(
-                    new ShortTextComplicationData.Builder(new PlainComplicationText.Builder(
-                            "World").build(), ComplicationText.EMPTY).build(),
+                    new ShortTextComplicationData.Builder(
+                                    new PlainComplicationText.Builder("World").build(),
+                                    ComplicationText.EMPTY)
+                            .build(),
                     ImmutableList.of(
                             new TimelineEntry(
-                                    new TimeInterval(Instant.ofEpochMilli(120000000),
+                                    new TimeInterval(
+                                            Instant.ofEpochMilli(120000000),
                                             Instant.ofEpochMilli(220000000)),
                                     new ShortTextComplicationData.Builder(
-                                            new PlainComplicationText.Builder(
-                                                    "Updated").build(),
-                                            ComplicationText.EMPTY).build()
-                            )
-                    ));
+                                                    new PlainComplicationText.Builder("Updated")
+                                                            .build(),
+                                                    ComplicationText.EMPTY)
+                                            .build())));
     private static final ComplicationDataTimeline TIMELINE_B2 =
             new ComplicationDataTimeline(
-                    new ShortTextComplicationData.Builder(new PlainComplicationText.Builder(
-                            "World").build(), ComplicationText.EMPTY).build(),
+                    new ShortTextComplicationData.Builder(
+                                    new PlainComplicationText.Builder("World").build(),
+                                    ComplicationText.EMPTY)
+                            .build(),
                     ImmutableList.of(
                             new TimelineEntry(
-                                    new TimeInterval(Instant.ofEpochMilli(120000000),
+                                    new TimeInterval(
+                                            Instant.ofEpochMilli(120000000),
                                             Instant.ofEpochMilli(220000000)),
                                     new ShortTextComplicationData.Builder(
-                                            new PlainComplicationText.Builder(
-                                                    "Updated").build(),
-                                            ComplicationText.EMPTY).build()
-                            )
-                    ));
+                                                    new PlainComplicationText.Builder("Updated")
+                                                            .build(),
+                                                    ComplicationText.EMPTY)
+                                            .build())));
 
     @Before
     public void setup() {
@@ -129,50 +137,53 @@
 
     @Test
     public void timeEntryToString() {
-        assertThat(TIMELINE_A.toString()).isEqualTo(
-                "ComplicationDataTimeline(defaultComplicationData=ShortTextComplicationData("
-                        + "text=ComplicationText{mSurroundingText=Hello, mTimeDependentText=null, "
-                        + "mExpression=null}, title=null, monochromaticImage=null, "
-                        + "smallImage=null, contentDescription=ComplicationText{"
-                        + "mSurroundingText=, mTimeDependentText=null, mExpression=null}, "
-                        + "tapActionLostDueToSerialization=false, tapAction=null, "
-                        + "validTimeRange=TimeRange(startDateTimeMillis="
-                        + "-1000000000-01-01T00:00:00Z, endDateTimeMillis="
-                        + "+1000000000-12-31T23:59:59.999999999Z), dataSource=null, "
-                        + "persistencePolicy=0, displayPolicy=0), timelineEntries=["
-                        + "TimelineEntry(validity=TimeInterval(start=1970-01-02T03:46:40Z, "
-                        + "end=1970-01-03T07:33:20Z), complicationData=ShortTextComplicationData("
-                        + "text=ComplicationText{mSurroundingText=Updated, "
-                        + "mTimeDependentText=null, mExpression=null}, title=null, "
-                        + "monochromaticImage=null, smallImage=null, "
-                        + "contentDescription=ComplicationText{mSurroundingText=, "
-                        + "mTimeDependentText=null, mExpression=null}, "
-                        + "tapActionLostDueToSerialization=false, tapAction=null, "
-                        + "validTimeRange=TimeRange(startDateTimeMillis="
-                        + "-1000000000-01-01T00:00:00Z, endDateTimeMillis="
-                        + "+1000000000-12-31T23:59:59.999999999Z), dataSource=null, "
-                        + "persistencePolicy=0, displayPolicy=0))])"
-        );
+        assertThat(TIMELINE_A.toString())
+                .isEqualTo(
+                        "ComplicationDataTimeline("
+                                + "defaultComplicationData=ShortTextComplicationData("
+                                + "text=ComplicationText{mSurroundingText=Hello,"
+                                + " mTimeDependentText=null, mExpression=null}, title=null,"
+                                + " monochromaticImage=null, smallImage=null,"
+                                + " contentDescription=ComplicationText{mSurroundingText=,"
+                                + " mTimeDependentText=null, mExpression=null},"
+                                + " tapActionLostDueToSerialization=false, tapAction=null, "
+                                + "validTimeRange=TimeRange("
+                                + "startDateTimeMillis=-1000000000-01-01T00:00:00Z,"
+                                + " endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z),"
+                                + " dataSource=null, persistencePolicy=0, displayPolicy=0),"
+                                + " timelineEntries=["
+                                + "TimelineEntry(validity=TimeInterval(start=1970-01-02T03:46:40Z,"
+                                + " end=1970-01-03T07:33:20Z),"
+                                + " complicationData=ShortTextComplicationData("
+                                + "text=ComplicationText{mSurroundingText=Updated,"
+                                + " mTimeDependentText=null, mExpression=null}, title=null,"
+                                + " monochromaticImage=null, smallImage=null,"
+                                + " contentDescription=ComplicationText{mSurroundingText=,"
+                                + " mTimeDependentText=null, mExpression=null},"
+                                + " tapActionLostDueToSerialization=false, tapAction=null, "
+                                + "validTimeRange=TimeRange("
+                                + "startDateTimeMillis=-1000000000-01-01T00:00:00Z,"
+                                + " endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z),"
+                                + " dataSource=null, persistencePolicy=0, displayPolicy=0))])");
     }
 
     @Test
     public void noDataTimelineEntryRoundTrip() {
         ComplicationDataTimeline timeline =
                 new ComplicationDataTimeline(
-                        new ShortTextComplicationData.Builder(new PlainComplicationText.Builder(
-                                "World").build(), ComplicationText.EMPTY).build(),
+                        new ShortTextComplicationData.Builder(
+                                        new PlainComplicationText.Builder("World").build(),
+                                        ComplicationText.EMPTY)
+                                .build(),
                         ImmutableList.of(
                                 new TimelineEntry(
-                                        new TimeInterval(Instant.ofEpochMilli(120000000),
+                                        new TimeInterval(
+                                                Instant.ofEpochMilli(120000000),
                                                 Instant.ofEpochMilli(220000000)),
-                                        new NoDataComplicationData()
-                                )
-                        ));
+                                        new NoDataComplicationData())));
 
-        @SuppressWarnings("KotlinInternal")
-        ComplicationData complicationData = DataKt.toApiComplicationData(
-                timeline.asWireComplicationData$watchface_complications_data_source_debug()
-        );
+        ComplicationData complicationData =
+                DataKt.toApiComplicationData(asWireComplicationData(timeline));
 
         assertThat(complicationData.asWireComplicationData().getTimelineEntries().get(0).getType())
                 .isEqualTo(ComplicationType.NO_DATA.toWireComplicationType());
@@ -182,24 +193,23 @@
     public void cachedLongTextPlaceholder() throws IOException, ClassNotFoundException {
         ComplicationDataTimeline timeline =
                 new ComplicationDataTimeline(
-                        new LongTextComplicationData.Builder(new PlainComplicationText.Builder(
-                                "Hello").build(), ComplicationText.EMPTY).build(),
+                        new LongTextComplicationData.Builder(
+                                        new PlainComplicationText.Builder("Hello").build(),
+                                        ComplicationText.EMPTY)
+                                .build(),
                         ImmutableList.of(
                                 new TimelineEntry(
-                                        new TimeInterval(Instant.ofEpochMilli(100000000),
+                                        new TimeInterval(
+                                                Instant.ofEpochMilli(100000000),
                                                 Instant.ofEpochMilli(200000000)),
                                         new NoDataComplicationData(
                                                 new LongTextComplicationData.Builder(
-                                                        ComplicationText.PLACEHOLDER,
-                                                        ComplicationText.EMPTY).build()
-                                        )
-                                )
-                        ));
+                                                                ComplicationText.PLACEHOLDER,
+                                                                ComplicationText.EMPTY)
+                                                        .build()))));
 
-        @SuppressWarnings("KotlinInternal")
-        ComplicationData complicationData = DataKt.toApiComplicationData(
-                timeline.asWireComplicationData$watchface_complications_data_source_debug()
-        );
+        ComplicationData complicationData =
+                DataKt.toApiComplicationData(asWireComplicationData(timeline));
 
         // Simulate caching by a round trip conversion to byteArray.
         ByteArrayOutputStream stream = new ByteArrayOutputStream();
@@ -224,7 +234,8 @@
 
         ComplicationData timeLineEntry =
                 DataKt.toApiComplicationData(
-                        longText.asWireComplicationData().getTimelineEntries().stream().findFirst()
+                        longText.asWireComplicationData().getTimelineEntries().stream()
+                                .findFirst()
                                 .get());
 
         assertThat(timeLineEntry.getType()).isEqualTo(ComplicationType.NO_DATA);
@@ -236,4 +247,10 @@
         LongTextComplicationData longTextPlaceholder = (LongTextComplicationData) placeholder;
         assertThat(longTextPlaceholder.getText().isPlaceholder()).isTrue();
     }
+
+    @SuppressWarnings("KotlinInternal")
+    private android.support.wearable.complications.ComplicationData asWireComplicationData(
+            ComplicationDataTimeline timeline) {
+        return timeline.asWireComplicationData$watchface_complications_data_source_debug();
+    }
 }
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/JavaCompatTest.java b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/JavaCompatTest.java
index 156d273..dca99c7 100644
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/JavaCompatTest.java
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/JavaCompatTest.java
@@ -23,12 +23,11 @@
 
 /** Tests that Java interfaces implementing kotlin interfaces with defaults compile. */
 public class JavaCompatTest {
-    class ComplicationRequestListenerImpl implements
-            ComplicationDataSourceService.ComplicationRequestListener {
+    class ComplicationRequestListenerImpl
+            implements ComplicationDataSourceService.ComplicationRequestListener {
 
         @Override
-        public void onComplicationData(
-                @Nullable ComplicationData complicationData) throws RemoteException {
-        }
+        public void onComplicationData(@Nullable ComplicationData complicationData)
+                throws RemoteException {}
     }
 }
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimeIntervalTest.java b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimeIntervalTest.java
index 005141a..307d1406 100644
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimeIntervalTest.java
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimeIntervalTest.java
@@ -55,8 +55,7 @@
 
     @Test
     public void timeIntervalToString() {
-        assertThat(INTERVAL_A.toString()).isEqualTo(
-                "TimeInterval(start=1970-01-02T03:46:40Z, end=1970-01-03T07:33:20Z)"
-        );
+        assertThat(INTERVAL_A.toString())
+                .isEqualTo("TimeInterval(start=1970-01-02T03:46:40Z, end=1970-01-03T07:33:20Z)");
     }
 }
diff --git a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimelineEntryTest.java b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimelineEntryTest.java
index 94a6ed9..b53e9d2 100644
--- a/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimelineEntryTest.java
+++ b/wear/watchface/watchface-complications-data-source/src/test/java/androidx/wear/watchface/complications/datasource/TimelineEntryTest.java
@@ -36,28 +36,24 @@
 public class TimelineEntryTest {
     private static final TimelineEntry TIMELINE_ENTRY_A =
             new TimelineEntry(
-                    new TimeInterval(Instant.ofEpochMilli(100000000),
-                            Instant.ofEpochMilli(200000000)),
-                    new NoDataComplicationData()
-            );
+                    new TimeInterval(
+                            Instant.ofEpochMilli(100000000), Instant.ofEpochMilli(200000000)),
+                    new NoDataComplicationData());
     private static final TimelineEntry TIMELINE_ENTRY_A2 =
             new TimelineEntry(
-                    new TimeInterval(Instant.ofEpochMilli(100000000),
-                            Instant.ofEpochMilli(200000000)),
-                    new NoDataComplicationData()
-            );
+                    new TimeInterval(
+                            Instant.ofEpochMilli(100000000), Instant.ofEpochMilli(200000000)),
+                    new NoDataComplicationData());
     private static final TimelineEntry TIMELINE_ENTRY_B =
             new TimelineEntry(
-                    new TimeInterval(Instant.ofEpochMilli(110000000),
-                            Instant.ofEpochMilli(210000000)),
-                    new NoDataComplicationData()
-            );
+                    new TimeInterval(
+                            Instant.ofEpochMilli(110000000), Instant.ofEpochMilli(210000000)),
+                    new NoDataComplicationData());
     private static final TimelineEntry TIMELINE_ENTRY_B2 =
             new TimelineEntry(
-                    new TimeInterval(Instant.ofEpochMilli(110000000),
-                            Instant.ofEpochMilli(210000000)),
-                    new NoDataComplicationData()
-            );
+                    new TimeInterval(
+                            Instant.ofEpochMilli(110000000), Instant.ofEpochMilli(210000000)),
+                    new NoDataComplicationData());
 
     @Before
     public void setup() {
@@ -82,14 +78,15 @@
 
     @Test
     public void timeEntryToString() {
-        assertThat(TIMELINE_ENTRY_A.toString()).isEqualTo(
-                "TimelineEntry(validity=TimeInterval(start=1970-01-02T03:46:40Z, "
-                        + "end=1970-01-03T07:33:20Z), complicationData=NoDataComplicationData("
-                        + "placeholder=null, "
-                        + "tapActionLostDueToSerialization=false, tapAction=null, "
-                        + "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00"
-                        + ":00Z, endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), "
-                        + "persistencePolicy=0, displayPolicy=0))"
-        );
+        assertThat(TIMELINE_ENTRY_A.toString())
+                .isEqualTo(
+                        "TimelineEntry(validity=TimeInterval(start=1970-01-02T03:46:40Z,"
+                                + " end=1970-01-03T07:33:20Z),"
+                                + " complicationData=NoDataComplicationData(placeholder=null,"
+                                + " tapActionLostDueToSerialization=false, tapAction=null, "
+                                + "validTimeRange=TimeRange("
+                                + "startDateTimeMillis=-1000000000-01-01T00:00:00Z,"
+                                + " endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z),"
+                                + " persistencePolicy=0, displayPolicy=0))");
     }
 }
diff --git a/wear/watchface/watchface-complications-data/api/current.ignore b/wear/watchface/watchface-complications-data/api/current.ignore
new file mode 100644
index 0000000..123515f
--- /dev/null
+++ b/wear/watchface/watchface-complications-data/api/current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.complications.data.DataKt:
+    Removed class androidx.wear.watchface.complications.data.DataKt
+RemovedClass: androidx.wear.watchface.complications.data.ImageKt:
+    Removed class androidx.wear.watchface.complications.data.ImageKt
+RemovedClass: androidx.wear.watchface.complications.data.TextKt:
+    Removed class androidx.wear.watchface.complications.data.TextKt
+RemovedClass: androidx.wear.watchface.complications.data.TypeKt:
+    Removed class androidx.wear.watchface.complications.data.TypeKt
+
+
+RemovedPackage: androidx.wear.watchface.utility:
+    Removed package androidx.wear.watchface.utility
diff --git a/wear/watchface/watchface-complications-data/api/current.txt b/wear/watchface/watchface-complications-data/api/current.txt
index 40675d8..4a04d64 100644
--- a/wear/watchface/watchface-complications-data/api/current.txt
+++ b/wear/watchface/watchface-complications-data/api/current.txt
@@ -29,9 +29,6 @@
     property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
   }
 
-  public final class ComplicationDataExpressionEvaluatorKt {
-  }
-
   public final class ComplicationDisplayPolicies {
     field public static final int ALWAYS_DISPLAY = 0; // 0x0
     field public static final int DO_NOT_SHOW_WHEN_DEVICE_LOCKED = 1; // 0x1
@@ -86,9 +83,6 @@
     property public final java.time.Instant instant;
   }
 
-  public final class DataKt {
-  }
-
   public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -130,9 +124,6 @@
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
   }
 
-  public final class ImageKt {
-  }
-
   public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
@@ -375,9 +366,6 @@
     enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
   }
 
-  public final class TextKt {
-  }
-
   public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
     method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
     method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
@@ -447,9 +435,6 @@
     method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
   }
 
-  public final class TypeKt {
-  }
-
   @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WeightedElementsComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public int getElementBackgroundColor();
@@ -500,10 +485,3 @@
 
 }
 
-package androidx.wear.watchface.utility {
-
-  public final class TraceEventKt {
-  }
-
-}
-
diff --git a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
index d49c322..ec88ca3 100644
--- a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
@@ -29,9 +29,6 @@
     property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
   }
 
-  public final class ComplicationDataExpressionEvaluatorKt {
-  }
-
   public final class ComplicationDisplayPolicies {
     field public static final int ALWAYS_DISPLAY = 0; // 0x0
     field public static final int DO_NOT_SHOW_WHEN_DEVICE_LOCKED = 1; // 0x1
@@ -89,9 +86,6 @@
     property public final java.time.Instant instant;
   }
 
-  public final class DataKt {
-  }
-
   public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -133,9 +127,6 @@
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
   }
 
-  public final class ImageKt {
-  }
-
   public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
@@ -378,9 +369,6 @@
     enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
   }
 
-  public final class TextKt {
-  }
-
   public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
     method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
     method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
@@ -450,9 +438,6 @@
     method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
   }
 
-  public final class TypeKt {
-  }
-
   @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WeightedElementsComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public int getElementBackgroundColor();
@@ -503,10 +488,3 @@
 
 }
 
-package androidx.wear.watchface.utility {
-
-  public final class TraceEventKt {
-  }
-
-}
-
diff --git a/wear/watchface/watchface-complications-data/api/restricted_current.ignore b/wear/watchface/watchface-complications-data/api/restricted_current.ignore
index 6d9ba01..d3ed8b1 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.ignore
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.ignore
@@ -1,3 +1,15 @@
 // Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.complications.data.DataKt:
+    Removed class androidx.wear.watchface.complications.data.DataKt
 RemovedClass: androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat:
     Removed class androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat
+RemovedClass: androidx.wear.watchface.complications.data.ImageKt:
+    Removed class androidx.wear.watchface.complications.data.ImageKt
+RemovedClass: androidx.wear.watchface.complications.data.TextKt:
+    Removed class androidx.wear.watchface.complications.data.TextKt
+RemovedClass: androidx.wear.watchface.complications.data.TypeKt:
+    Removed class androidx.wear.watchface.complications.data.TypeKt
+
+
+RemovedPackage: androidx.wear.watchface.utility:
+    Removed package androidx.wear.watchface.utility
diff --git a/wear/watchface/watchface-complications-data/api/restricted_current.txt b/wear/watchface/watchface-complications-data/api/restricted_current.txt
index 58155a5..dccc614 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.txt
@@ -29,9 +29,6 @@
     property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
   }
 
-  public final class ComplicationDataExpressionEvaluatorKt {
-  }
-
   public final class ComplicationDisplayPolicies {
     field public static final int ALWAYS_DISPLAY = 0; // 0x0
     field public static final int DO_NOT_SHOW_WHEN_DEVICE_LOCKED = 1; // 0x1
@@ -86,9 +83,6 @@
     property public final java.time.Instant instant;
   }
 
-  public final class DataKt {
-  }
-
   public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
@@ -130,9 +124,6 @@
     method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
   }
 
-  public final class ImageKt {
-  }
-
   public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
@@ -376,9 +367,6 @@
     enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
   }
 
-  public final class TextKt {
-  }
-
   public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
     method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
     method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
@@ -450,9 +438,6 @@
     method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
   }
 
-  public final class TypeKt {
-  }
-
   @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public final class WeightedElementsComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public int getElementBackgroundColor();
@@ -503,10 +488,3 @@
 
 }
 
-package androidx.wear.watchface.utility {
-
-  public final class TraceEventKt {
-  }
-
-}
-
diff --git a/wear/watchface/watchface-complications-data/build.gradle b/wear/watchface/watchface-complications-data/build.gradle
index 3b9d23c..f4d254b 100644
--- a/wear/watchface/watchface-complications-data/build.gradle
+++ b/wear/watchface/watchface-complications-data/build.gradle
@@ -33,6 +33,7 @@
 
     // TODO(b/267170061): Use released protolayout-expression, remove protolayout-proto.
     api(project(":wear:protolayout:protolayout-expression"))
+    api(project(":wear:protolayout:protolayout-expression-pipeline"))
     implementation(project(":wear:protolayout:protolayout-proto"))
 
     implementation("androidx.core:core:1.1.0")
@@ -43,7 +44,7 @@
     testImplementation(libs.testRules)
     testImplementation(libs.robolectric)
     testImplementation(libs.mockitoCore4)
-    testImplementation(libs.mockitoKotlin)
+    testImplementation(libs.mockitoKotlin4)
     testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(libs.truth)
     testImplementation(libs.junit)
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/CharSequenceSerializableHelper.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/CharSequenceSerializableHelper.java
index d276c09..b2fe56e 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/CharSequenceSerializableHelper.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/CharSequenceSerializableHelper.java
@@ -30,17 +30,19 @@
     private CharSequenceSerializableHelper() {}
 
     @SuppressWarnings("ParameterNotNullable") // Error prone is wrong about charSequence.length()
-    public static void writeToStream(@Nullable CharSequence charSequence,
-            @NonNull ObjectOutputStream stream) throws IOException {
+    public static void writeToStream(
+            @Nullable CharSequence charSequence, @NonNull ObjectOutputStream stream)
+            throws IOException {
         Boolean isNull = charSequence == null;
         stream.writeBoolean(isNull);
         if (!isNull) {
             Boolean isSpannable = charSequence instanceof SpannableString;
             stream.writeBoolean(isSpannable);
             if (isSpannable) {
-                stream.writeUTF(HtmlCompat.toHtml(
-                        (SpannableString) charSequence,
-                        HtmlCompat.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE));
+                stream.writeUTF(
+                        HtmlCompat.toHtml(
+                                (SpannableString) charSequence,
+                                HtmlCompat.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE));
             } else {
                 // We don't rely on CharSequence having implemented toString().
                 StringBuilder builder = new StringBuilder(charSequence.length());
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.kt b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.kt
index 813758c..495d2a7 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.kt
@@ -48,11 +48,9 @@
 /**
  * Container for complication data of all types.
  *
- * A [androidx.wear.watchface.complications.ComplicationProviderService] should create
- * instances of
- * this class using [ComplicationData.Builder] and send them to the complication system in
- * response to
- * [androidx.wear.watchface.complications.ComplicationProviderService.onComplicationRequest].
+ * A [androidx.wear.watchface.complications.ComplicationProviderService] should create instances of
+ * this class using [ComplicationData.Builder] and send them to the complication system in response
+ * to [androidx.wear.watchface.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.
  *
@@ -95,8 +93,7 @@
     annotation class ImageStyle
 
     /** Returns the type of this complication data. */
-    @ComplicationType
-    val type: Int
+    @ComplicationType val type: Int
 
     private val fields: Bundle
 
@@ -113,18 +110,18 @@
 
     internal constructor(input: Parcel) {
         type = input.readInt()
-        fields = input.readBundle(javaClass.classLoader) ?: run {
-            Log.w(TAG, "ComplicationData parcel input has null bundle.")
-            Bundle()
-        }
+        fields =
+            input.readBundle(javaClass.classLoader)
+                ?: run {
+                    Log.w(TAG, "ComplicationData parcel input has null bundle.")
+                    Bundle()
+                }
     }
 
     @RequiresApi(api = Build.VERSION_CODES.P)
     private class SerializedForm
     @JvmOverloads
-    constructor(
-        private var complicationData: ComplicationData? = null
-    ) : Serializable {
+    constructor(private var complicationData: ComplicationData? = null) : Serializable {
 
         @Throws(IOException::class)
         private fun writeObject(oos: ObjectOutputStream) {
@@ -163,9 +160,7 @@
             }
             if (isFieldValidForType(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, type)) {
                 oos.writeObject(
-                    IconSerializableHelper.create(
-                        complicationData.burnInProtectionSmallImage
-                    )
+                    IconSerializableHelper.create(complicationData.burnInProtectionSmallImage)
                 )
             }
             if (isFieldValidForType(FIELD_IMAGE_STYLE, type)) {
@@ -286,7 +281,8 @@
             }
             if (isFieldValidForType(FIELD_CONTENT_DESCRIPTION, type)) {
                 putIfNotNull(
-                    fields, FIELD_CONTENT_DESCRIPTION,
+                    fields,
+                    FIELD_CONTENT_DESCRIPTION,
                     ois.readObject() as ComplicationText?
                 )
             }
@@ -295,7 +291,8 @@
             }
             if (isFieldValidForType(FIELD_ICON_BURN_IN_PROTECTION, type)) {
                 putIfNotNull(
-                    fields, FIELD_ICON_BURN_IN_PROTECTION,
+                    fields,
+                    FIELD_ICON_BURN_IN_PROTECTION,
                     IconSerializableHelper.read(ois)
                 )
             }
@@ -305,7 +302,8 @@
             if (isFieldValidForType(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, type)) {
                 putIfNotNull(
                     fields,
-                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, IconSerializableHelper.read(ois)
+                    FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    IconSerializableHelper.read(ois)
                 )
             }
             if (isFieldValidForType(FIELD_IMAGE_STYLE, type)) {
@@ -318,9 +316,8 @@
                 fields.putFloat(FIELD_VALUE, ois.readFloat())
             }
             if (isFieldValidForType(FIELD_VALUE_EXPRESSION, type)) {
-                ois.readNullable { ois.readByteArray() }?.let {
-                    fields.putByteArray(FIELD_VALUE_EXPRESSION, it)
-                }
+                ois.readNullable { ois.readByteArray() }
+                    ?.let { fields.putByteArray(FIELD_VALUE_EXPRESSION, it) }
             }
             if (isFieldValidForType(FIELD_VALUE_TYPE, type)) {
                 fields.putInt(FIELD_VALUE_TYPE, ois.readInt())
@@ -335,24 +332,20 @@
                 fields.putFloat(FIELD_TARGET_VALUE, ois.readFloat())
             }
             if (isFieldValidForType(FIELD_COLOR_RAMP, type)) {
-                ois.readNullable { ois.readIntArray() }?.let {
-                    fields.putIntArray(FIELD_COLOR_RAMP, it)
-                }
+                ois.readNullable { ois.readIntArray() }
+                    ?.let { fields.putIntArray(FIELD_COLOR_RAMP, it) }
             }
             if (isFieldValidForType(FIELD_COLOR_RAMP_INTERPOLATED, type)) {
-                ois.readNullable { ois.readBoolean() }?.let {
-                    fields.putBoolean(FIELD_COLOR_RAMP_INTERPOLATED, it)
-                }
+                ois.readNullable { ois.readBoolean() }
+                    ?.let { fields.putBoolean(FIELD_COLOR_RAMP_INTERPOLATED, it) }
             }
             if (isFieldValidForType(FIELD_ELEMENT_WEIGHTS, type)) {
-                ois.readNullable { ois.readFloatArray() }?.let {
-                    fields.putFloatArray(FIELD_ELEMENT_WEIGHTS, it)
-                }
+                ois.readNullable { ois.readFloatArray() }
+                    ?.let { fields.putFloatArray(FIELD_ELEMENT_WEIGHTS, it) }
             }
             if (isFieldValidForType(FIELD_ELEMENT_COLORS, type)) {
-                ois.readNullable { ois.readIntArray() }?.let {
-                    fields.putIntArray(FIELD_ELEMENT_COLORS, it)
-                }
+                ois.readNullable { ois.readIntArray() }
+                    ?.let { fields.putIntArray(FIELD_ELEMENT_COLORS, it) }
             }
             if (isFieldValidForType(FIELD_ELEMENT_BACKGROUND_COLOR, type)) {
                 fields.putInt(FIELD_ELEMENT_BACKGROUND_COLOR, ois.readInt())
@@ -400,7 +393,8 @@
                     fields.remove(FIELD_DATA_SOURCE)
                 } else {
                     fields.putParcelable(
-                        FIELD_DATA_SOURCE, ComponentName.unflattenFromString(componentName)
+                        FIELD_DATA_SOURCE,
+                        ComponentName.unflattenFromString(componentName)
                     )
                 }
             }
@@ -424,17 +418,16 @@
                 .takeIf { it.isNotEmpty() }
                 ?.let { fields.putParcelableArray(EXP_FIELD_LIST_ENTRIES, it.toTypedArray()) }
             if (isFieldValidForType(FIELD_PLACEHOLDER_FIELDS, type)) {
-                ois.readNullable { SerializedForm().apply { readObject(ois) } }?.let {
-                    fields.putInt(FIELD_PLACEHOLDER_TYPE, it.complicationData!!.type)
-                    fields.putBundle(FIELD_PLACEHOLDER_FIELDS, it.complicationData!!.fields)
-                }
+                ois.readNullable { SerializedForm().apply { readObject(ois) } }
+                    ?.let {
+                        fields.putInt(FIELD_PLACEHOLDER_TYPE, it.complicationData!!.type)
+                        fields.putBundle(FIELD_PLACEHOLDER_FIELDS, it.complicationData!!.fields)
+                    }
             }
             ois.readList { SerializedForm().apply { readObject(ois) } }
                 .map { it.complicationData!!.fields }
                 .takeIf { it.isNotEmpty() }
-                ?.let {
-                    fields.putParcelableArray(FIELD_TIMELINE_ENTRIES, it.toTypedArray())
-                }
+                ?.let { fields.putParcelableArray(FIELD_TIMELINE_ENTRIES, it.toTypedArray()) }
             complicationData = ComplicationData(type, fields)
         }
 
@@ -450,8 +443,7 @@
         }
     }
 
-    @RequiresApi(api = Build.VERSION_CODES.P)
-    fun writeReplace(): Any = SerializedForm(this)
+    @RequiresApi(api = Build.VERSION_CODES.P) fun writeReplace(): Any = SerializedForm(this)
 
     @Throws(InvalidObjectException::class)
     private fun readObject(@Suppress("UNUSED_PARAMETER") stream: ObjectInputStream) {
@@ -528,8 +520,8 @@
     /** The list of [ComplicationData] timeline entries. */
     val timelineEntries: List<ComplicationData>?
         @Suppress("DEPRECATION")
-        get() = fields.getParcelableArray(FIELD_TIMELINE_ENTRIES)
-            ?.map { parcelable ->
+        get() =
+            fields.getParcelableArray(FIELD_TIMELINE_ENTRIES)?.map { parcelable ->
                 val bundle = parcelable as Bundle
                 bundle.classLoader = javaClass.classLoader
                 // Use the serialized FIELD_TIMELINE_ENTRY_TYPE or the outer type if it's not there.
@@ -546,11 +538,13 @@
         } else {
             fields.putParcelableArray(
                 FIELD_TIMELINE_ENTRIES,
-                timelineEntries.map {
-                    // This supports timeline entry of NoDataComplicationData.
-                    it.fields.putInt(FIELD_TIMELINE_ENTRY_TYPE, it.type)
-                    it.fields
-                }.toTypedArray()
+                timelineEntries
+                    .map {
+                        // This supports timeline entry of NoDataComplicationData.
+                        it.fields.putInt(FIELD_TIMELINE_ENTRY_TYPE, it.type)
+                        it.fields
+                    }
+                    .toTypedArray()
             )
         }
     }
@@ -558,8 +552,8 @@
     /** The list of [ComplicationData] entries for a ListComplicationData. */
     val listEntries: List<ComplicationData>?
         @Suppress("deprecation")
-        get() = fields.getParcelableArray(EXP_FIELD_LIST_ENTRIES)
-            ?.map { parcelable ->
+        get() =
+            fields.getParcelableArray(EXP_FIELD_LIST_ENTRIES)?.map { parcelable ->
                 val bundle = parcelable as Bundle
                 bundle.classLoader = javaClass.classLoader
                 ComplicationData(bundle.getInt(EXP_FIELD_LIST_ENTRY_TYPE), bundle)
@@ -610,8 +604,9 @@
     val rangedValueExpression: DynamicFloat?
         get() {
             checkFieldValidForTypeWithoutThrowingException(FIELD_VALUE_EXPRESSION, type)
-            return fields.getByteArray(FIELD_VALUE_EXPRESSION)
-                ?.let { DynamicFloat.fromByteArray(it) }
+            return fields.getByteArray(FIELD_VALUE_EXPRESSION)?.let {
+                DynamicFloat.fromByteArray(it)
+            }
         }
 
     /**
@@ -705,8 +700,8 @@
 
     /**
      * Returns either a boolean where: true means the color ramp colors should be smoothly
-     * interpolated; false means the color ramp should be rendered in equal sized blocks of
-     * solid color; null means this value wasn't set, i.e. the complication is not of type
+     * interpolated; false means the color ramp should be rendered in equal sized blocks of solid
+     * color; null means this value wasn't set, i.e. the complication is not of type
      * [TYPE_RANGED_VALUE] or [TYPE_GOAL_PROGRESS].
      *
      * Valid only if the type of this complication data is [TYPE_RANGED_VALUE] or
@@ -723,24 +718,24 @@
         }
 
     /**
-     * Returns true if the ComplicationData contains a short title. I.e. if [shortTitle]
-     * can succeed.
+     * Returns true if the ComplicationData contains a short title. I.e. if [shortTitle] can
+     * succeed.
      */
     fun hasShortTitle(): Boolean =
         isFieldValidForType(FIELD_SHORT_TITLE, type) && hasParcelableField(FIELD_SHORT_TITLE)
 
     /**
-     * Returns the *short title* field for this complication, or `null` if no value was
-     * provided for the field.
+     * Returns the *short title* field for this complication, or `null` if no value was provided for
+     * the field.
      *
-     * The value is provided as a [ComplicationText] object, from which the text to display
-     * can be obtained for a given point in time.
+     * The value is provided as a [ComplicationText] object, from which the text to display can be
+     * obtained for a given point in time.
      *
-     * The length of the text, including any time-dependent values at any valid time, is expected
-     * to not exceed seven characters. When using this text, the watch face should be able to
-     * display any string of up to seven characters (reducing the text size appropriately if the
-     * string is very wide). Although not expected, it is possible that strings of more than seven
-     * characters might be seen, in which case they may be truncated.
+     * The length of the text, including any time-dependent values at any valid time, is expected to
+     * not exceed seven characters. When using this text, the watch face should be able to display
+     * any string of up to seven characters (reducing the text size appropriately if the string is
+     * very wide). Although not expected, it is possible that strings of more than seven characters
+     * might be seen, in which case they may be truncated.
      *
      * Valid only if the type of this complication data is [TYPE_SHORT_TEXT], [TYPE_RANGED_VALUE],
      * or [TYPE_NO_PERMISSION], otherwise returns null.
@@ -758,17 +753,17 @@
         isFieldValidForType(FIELD_SHORT_TEXT, type) && hasParcelableField(FIELD_SHORT_TEXT)
 
     /**
-     * Returns the *short text* field for this complication, or `null` if no value was
-     * provided for the field.
+     * Returns the *short text* field for this complication, or `null` if no value was provided for
+     * the field.
      *
-     * The value is provided as a [ComplicationText] object, from which the text to display
-     * can be obtained for a given point in time.
+     * The value is provided as a [ComplicationText] object, from which the text to display can be
+     * obtained for a given point in time.
      *
-     * The length of the text, including any time-dependent values at any valid time, is expected
-     * to not exceed seven characters. When using this text, the watch face should be able to
-     * display any string of up to seven characters (reducing the text size appropriately if the
-     * string is very wide). Although not expected, it is possible that strings of more than seven
-     * characters might be seen, in which case they may be truncated.
+     * The length of the text, including any time-dependent values at any valid time, is expected to
+     * not exceed seven characters. When using this text, the watch face should be able to display
+     * any string of up to seven characters (reducing the text size appropriately if the string is
+     * very wide). Although not expected, it is possible that strings of more than seven characters
+     * might be seen, in which case they may be truncated.
      *
      * Valid only if the type of this complication data is [TYPE_SHORT_TEXT], [TYPE_RANGED_VALUE],
      * or [TYPE_NO_PERMISSION], otherwise returns null.
@@ -780,18 +775,17 @@
         }
 
     /**
-     * Returns true if the ComplicationData contains a long title. I.e. if [longTitle]
-     * can succeed.
+     * Returns true if the ComplicationData contains a long title. I.e. if [longTitle] can succeed.
      */
     fun hasLongTitle(): Boolean =
         isFieldValidForType(FIELD_LONG_TITLE, type) && hasParcelableField(FIELD_LONG_TITLE)
 
     /**
-     * Returns the *long title* field for this complication, or `null` if no value was
-     * provided for the field.
+     * Returns the *long title* field for this complication, or `null` if no value was provided for
+     * the field.
      *
-     * The value is provided as a [ComplicationText] object, from which the text to display
-     * can be obtained for a given point in time.
+     * The value is provided as a [ComplicationText] object, from which the text to display can be
+     * obtained for a given point in time.
      *
      * Valid only if the type of this complication data is [TYPE_LONG_TEXT], otherwise returns null.
      */
@@ -801,18 +795,15 @@
             return getParcelableFieldOrWarn<ComplicationText>(FIELD_LONG_TITLE)
         }
 
-    /**
-     * Returns true if the ComplicationData contains long text. I.e. if [longText] can
-     * succeed.
-     */
+    /** Returns true if the ComplicationData contains long text. I.e. if [longText] can succeed. */
     fun hasLongText(): Boolean =
         isFieldValidForType(FIELD_LONG_TEXT, type) && hasParcelableField(FIELD_LONG_TEXT)
 
     /**
      * Returns the *long text* field for this complication.
      *
-     * The value is provided as a [ComplicationText] object, from which the text to display
-     * can be obtained for a given point in time.
+     * The value is provided as a [ComplicationText] object, from which the text to display can be
+     * obtained for a given point in time.
      *
      * Valid only if the type of this complication data is [TYPE_LONG_TEXT], otherwise returns null.
      */
@@ -823,14 +814,13 @@
         }
 
     /** Returns true if the ComplicationData contains an Icon. I.e. if [icon] can succeed. */
-    fun hasIcon(): Boolean =
-        isFieldValidForType(FIELD_ICON, type) && hasParcelableField(FIELD_ICON)
+    fun hasIcon(): Boolean = isFieldValidForType(FIELD_ICON, type) && hasParcelableField(FIELD_ICON)
 
     /**
-     * Returns the *icon* field for this complication, or `null` if no value was provided
-     * for the field. The image returned is expected to be single-color and so may be tinted to
-     * whatever color the watch face requires (but note that
-     * [android.graphics.drawable.Drawable.mutate] should be called before drawables are tinted).
+     * Returns the *icon* field for this complication, or `null` if no value was provided for the
+     * field. The image returned is expected to be single-color and so may be tinted to whatever
+     * color the watch face requires (but note that [android.graphics.drawable.Drawable.mutate]
+     * should be called before drawables are tinted).
      *
      * If the device is in ambient mode, and utilises burn-in protection, then the result of
      * [burnInProtectionIcon] must be used instead of this.
@@ -853,13 +843,12 @@
             hasParcelableField(FIELD_ICON_BURN_IN_PROTECTION)
 
     /**
-     * Returns the burn-in protection version of the *icon* field for this complication, or
-     * `null` if no such icon was provided. The image returned is expected to be an outline
-     * image suitable for use in ambient mode on screens with burn-in protection. The image is also
-     * expected to be single-color and so may be tinted to whatever color the watch face requires
-     * (but note that [android.graphics.drawable.Drawable.mutate] should be called before drawables
-     * are tinted, and that the color used should be suitable for ambient mode with burn-in
-     * protection).
+     * Returns the burn-in protection version of the *icon* field for this complication, or `null`
+     * if no such icon was provided. The image returned is expected to be an outline image suitable
+     * for use in ambient mode on screens with burn-in protection. The image is also expected to be
+     * single-color and so may be tinted to whatever color the watch face requires (but note that
+     * [android.graphics.drawable.Drawable.mutate] should be called before drawables are tinted, and
+     * that the color used should be suitable for ambient mode with burn-in protection).
      *
      * If the device is in ambient mode, and utilises burn-in protection, then the result of this
      * method must be used instead of the result of [icon].
@@ -874,27 +863,25 @@
         }
 
     /**
-     * Returns true if the ComplicationData contains a small image. I.e. if [smallImage]
-     * can succeed.
+     * Returns true if the ComplicationData contains a small image. I.e. if [smallImage] can
+     * succeed.
      */
     fun hasSmallImage(): Boolean =
         isFieldValidForType(FIELD_SMALL_IMAGE, type) && hasParcelableField(FIELD_SMALL_IMAGE)
 
     /**
-     * Returns the *small image* field for this complication, or `null` if no value was
-     * provided for the field.
+     * Returns the *small image* field for this complication, or `null` if no value was provided for
+     * the field.
      *
-     * This may be either a [IMAGE_STYLE_PHOTO] image, which is expected to
-     * fill the space available, or an [IMAGE_STYLE_ICON] image, which should be
-     * drawn entirely within the space available. Use [smallImageStyle] to determine which
-     * of these applies.
+     * This may be either a [IMAGE_STYLE_PHOTO] image, which is expected to fill the space
+     * available, or an [IMAGE_STYLE_ICON] image, which should be drawn entirely within the space
+     * available. Use [smallImageStyle] to determine which of these applies.
      *
      * As this may be any image, it is unlikely to be suitable for display in ambient mode when
      * burn-in protection is enabled, or in low-bit ambient mode, and should not be rendered under
      * these circumstances.
      *
-     * Valid for the types [TYPE_LONG_TEXT] and [TYPE_SMALL_IMAGE].
-     * Otherwise returns null.
+     * Valid for the types [TYPE_LONG_TEXT] and [TYPE_SMALL_IMAGE]. Otherwise returns null.
      */
     val smallImage: Icon?
         get() {
@@ -913,9 +900,9 @@
             hasParcelableField(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION)
 
     /**
-     * Returns the burn-in protection version of the *small image* field for this complication,
-     * or `null` if no such icon was provided. The image returned is expected to be an outline
-     * image suitable for use in ambient mode on screens with burn-in protection. The image is also
+     * Returns the burn-in protection version of the *small image* field for this complication, or
+     * `null` if no such icon was provided. The image returned is expected to be an outline image
+     * suitable for use in ambient mode on screens with burn-in protection. The image is also
      * expected to be single-color and so may be tinted to whatever color the watch face requires
      * (but note that [android.graphics.drawable.Drawable.mutate] should be called before drawables
      * are tinted, and that the color used should be suitable for ambient mode with burn-in
@@ -924,8 +911,7 @@
      * If the device is in ambient mode, and utilises burn-in protection, then the result of this
      * method must be used instead of the result of [smallImage].
      *
-     * Valid for the types [TYPE_LONG_TEXT] and [TYPE_SMALL_IMAGE].
-     * Otherwise returns null.
+     * Valid for the types [TYPE_LONG_TEXT] and [TYPE_SMALL_IMAGE]. Otherwise returns null.
      */
     val burnInProtectionSmallImage: Icon?
         get() {
@@ -956,8 +942,8 @@
         }
 
     /**
-     * Returns true if the ComplicationData contains a large image. I.e. if [largeImage]
-     * can succeed.
+     * Returns true if the ComplicationData contains a large image. I.e. if [largeImage] can
+     * succeed.
      */
     fun hasLargeImage(): Boolean =
         isFieldValidForType(FIELD_LARGE_IMAGE, type) && hasParcelableField(FIELD_LARGE_IMAGE)
@@ -970,8 +956,8 @@
      * burn-in protection is enabled, or in low-bit ambient mode, and should not be rendered under
      * these circumstances.
      *
-     * Valid only if the type of this complication data is [TYPE_LARGE_IMAGE].
-     * Otherwise returns null.
+     * Valid only if the type of this complication data is [TYPE_LARGE_IMAGE]. Otherwise returns
+     * null.
      */
     val largeImage: Icon?
         get() {
@@ -980,8 +966,7 @@
         }
 
     /**
-     * Returns true if the ComplicationData contains a tap action. I.e. if [tapAction]
-     * can succeed.
+     * Returns true if the ComplicationData contains a tap action. I.e. if [tapAction] can succeed.
      */
     fun hasTapAction(): Boolean =
         isFieldValidForType(FIELD_TAP_ACTION, type) && hasParcelableField(FIELD_TAP_ACTION)
@@ -1022,8 +1007,8 @@
     /**
      * Returns the element weights for this complication.
      *
-     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS].
-     * Otherwise returns null.
+     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS]. Otherwise
+     * returns null.
      */
     val elementWeights: FloatArray?
         get() {
@@ -1034,8 +1019,8 @@
     /**
      * Returns the element colors for this complication.
      *
-     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS].
-     * Otherwise returns null.
+     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS]. Otherwise
+     * returns null.
      */
     val elementColors: IntArray?
         get() {
@@ -1046,8 +1031,8 @@
     /**
      * Returns the background color to use between elements for this complication.
      *
-     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS].
-     * Otherwise returns 0.
+     * Valid only if the type of this complication data is [TYPE_WEIGHTED_ELEMENTS]. Otherwise
+     * returns 0.
      */
     @get:ColorInt
     val elementBackgroundColor: Int
@@ -1063,7 +1048,7 @@
             checkFieldValidForType(FIELD_PLACEHOLDER_TYPE, type)
             return if (
                 !fields.containsKey(FIELD_PLACEHOLDER_FIELDS) ||
-                !fields.containsKey(FIELD_PLACEHOLDER_TYPE)
+                    !fields.containsKey(FIELD_PLACEHOLDER_TYPE)
             ) {
                 null
             } else {
@@ -1081,8 +1066,7 @@
     /**
      * Returns the list style hint.
      *
-     * Valid only if the type of this complication data is [EXP_TYPE_LIST]. Otherwise
-     * returns zero.
+     * Valid only if the type of this complication data is [EXP_TYPE_LIST]. Otherwise returns zero.
      */
     val listStyleHint: Int
         get() {
@@ -1104,7 +1088,8 @@
         get() {
             checkFieldValidForTypeWithoutThrowingException(FIELD_PERSISTENCE_POLICY, type)
             return fields.getInt(
-                FIELD_PERSISTENCE_POLICY, ComplicationPersistencePolicies.CACHING_ALLOWED
+                FIELD_PERSISTENCE_POLICY,
+                ComplicationPersistencePolicies.CACHING_ALLOWED
             )
         }
 
@@ -1117,8 +1102,8 @@
         }
 
     /**
-     * Returns the start time for this complication data (i.e. the first time at which it should
-     * be considered active and displayed), this may be 0. See also [isActiveAt].
+     * Returns the start time for this complication data (i.e. the first time at which it should be
+     * considered active and displayed), this may be 0. See also [isActiveAt].
      */
     val startDateTimeMillis: Long
         get() = fields.getLong(FIELD_START_TIME, 0)
@@ -1135,10 +1120,11 @@
      * change based on the current time.
      */
     val isTimeDependent: Boolean
-        get() = isTimeDependentField(FIELD_SHORT_TEXT) ||
-            isTimeDependentField(FIELD_SHORT_TITLE) ||
-            isTimeDependentField(FIELD_LONG_TEXT) ||
-            isTimeDependentField(FIELD_LONG_TITLE)
+        get() =
+            isTimeDependentField(FIELD_SHORT_TEXT) ||
+                isTimeDependentField(FIELD_SHORT_TITLE) ||
+                isTimeDependentField(FIELD_LONG_TEXT) ||
+                isTimeDependentField(FIELD_LONG_TITLE)
 
     private fun isTimeDependentField(field: String): Boolean {
         val text = getParcelableFieldOrWarn<ComplicationText>(field)
@@ -1147,8 +1133,7 @@
 
     private fun <T : Parcelable?> getParcelableField(field: String): T? =
         try {
-            @Suppress("deprecation")
-            fields.getParcelable<T>(field)
+            @Suppress("deprecation") fields.getParcelable<T>(field)
         } catch (e: BadParcelableException) {
             null
         }
@@ -1157,8 +1142,7 @@
 
     private fun <T : Parcelable?> getParcelableFieldOrWarn(field: String): T? =
         try {
-            @Suppress("deprecation")
-            fields.getParcelable<T>(field)
+            @Suppress("deprecation") fields.getParcelable<T>(field)
         } catch (e: BadParcelableException) {
             Log.w(
                 TAG,
@@ -1176,8 +1160,7 @@
             toStringNoRedaction()
         }
 
-    /** @hide
-     */
+    /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     fun toStringNoRedaction() = "ComplicationData{mType=$type, mFields=$fields}"
 
@@ -1187,7 +1170,7 @@
             (!isFieldValidForType(FIELD_VALUE, type) || rangedValue == other.rangedValue) &&
             (!isFieldValidForType(FIELD_VALUE_EXPRESSION, type) ||
                 rangedValueExpression?.toDynamicFloatByteArray() contentEquals
-                other.rangedValueExpression?.toDynamicFloatByteArray()) &&
+                    other.rangedValueExpression?.toDynamicFloatByteArray()) &&
             (!isFieldValidForType(FIELD_SHORT_TITLE, type) || shortTitle == other.shortTitle) &&
             (!isFieldValidForType(FIELD_SHORT_TEXT, type) || shortText == other.shortText) &&
             (!isFieldValidForType(FIELD_LONG_TITLE, type) || longTitle == other.longTitle) &&
@@ -1232,8 +1215,8 @@
     }
 
     private fun equalsWithoutExpressions(other: ComplicationData): Boolean =
-        this === other || (
-            type == other.type &&
+        this === other ||
+            (type == other.type &&
                 (!isFieldValidForType(FIELD_TAP_ACTION_LOST, type) ||
                     tapActionLostDueToSerialization == other.tapActionLostDueToSerialization) &&
                 (!isFieldValidForType(FIELD_TIMELINE_START_TIME, type) ||
@@ -1244,8 +1227,7 @@
                     timelineEntries == other.timelineEntries) &&
                 (!isFieldValidForType(EXP_FIELD_LIST_ENTRIES, type) ||
                     listEntries == other.listEntries) &&
-                (!isFieldValidForType(FIELD_DATA_SOURCE, type) ||
-                    dataSource == other.dataSource) &&
+                (!isFieldValidForType(FIELD_DATA_SOURCE, type) || dataSource == other.dataSource) &&
                 (!isFieldValidForType(FIELD_VALUE_TYPE, type) ||
                     rangedValueType == other.rangedValueType) &&
                 (!isFieldValidForType(FIELD_MIN_VALUE, type) ||
@@ -1291,103 +1273,103 @@
                 (!isFieldValidForType(FIELD_START_TIME, type) ||
                     startDateTimeMillis == other.startDateTimeMillis) &&
                 (!isFieldValidForType(FIELD_END_TIME, type) ||
-                    endDateTimeMillis == other.endDateTimeMillis)
-            )
+                    endDateTimeMillis == other.endDateTimeMillis))
 
-    override fun hashCode(): Int = Objects.hash(
-        type,
-        if (isFieldValidForType(FIELD_TAP_ACTION_LOST, type)) {
-            tapActionLostDueToSerialization
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_TIMELINE_START_TIME, type)) {
-            timelineStartEpochSecond
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_TIMELINE_END_TIME, type)) timelineEndEpochSecond else null,
-        if (isFieldValidForType(FIELD_TIMELINE_ENTRIES, type)) timelineEntries else null,
-        if (isFieldValidForType(EXP_FIELD_LIST_ENTRIES, type)) listEntries else null,
-        if (isFieldValidForType(FIELD_DATA_SOURCE, type)) dataSource else null,
-        if (isFieldValidForType(FIELD_VALUE, type)) rangedValue else null,
-        if (isFieldValidForType(FIELD_VALUE_EXPRESSION, type)) {
-            Arrays.hashCode(rangedValueExpression?.toDynamicFloatByteArray())
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_VALUE_TYPE, type)) rangedValueType else null,
-        if (isFieldValidForType(FIELD_MIN_VALUE, type)) rangedMinValue else null,
-        if (isFieldValidForType(FIELD_MAX_VALUE, type)) rangedMaxValue else null,
-        if (isFieldValidForType(FIELD_TARGET_VALUE, type)) targetValue else null,
-        if (isFieldValidForType(FIELD_COLOR_RAMP, type)) colorRamp.contentHashCode() else null,
-        if (isFieldValidForType(FIELD_COLOR_RAMP_INTERPOLATED, type)) {
-            isColorRampInterpolated
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_SHORT_TITLE, type)) shortTitle else null,
-        if (isFieldValidForType(FIELD_SHORT_TEXT, type)) shortText else null,
-        if (isFieldValidForType(FIELD_LONG_TITLE, type)) longTitle else null,
-        if (isFieldValidForType(FIELD_LONG_TEXT, type)) longText else null,
-        if (isFieldValidForType(FIELD_ICON, type)) icon?.iconHashCode() else null,
-        if (isFieldValidForType(FIELD_ICON_BURN_IN_PROTECTION, type)) {
-            burnInProtectionIcon?.iconHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_SMALL_IMAGE, type)) smallImage?.iconHashCode() else null,
-        if (isFieldValidForType(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, type)) {
-            burnInProtectionSmallImage?.iconHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_IMAGE_STYLE, type)) smallImageStyle else null,
-        if (isFieldValidForType(FIELD_LARGE_IMAGE, type)) largeImage?.iconHashCode() else null,
-        if (isFieldValidForType(FIELD_TAP_ACTION, type)) tapAction else null,
-        if (isFieldValidForType(FIELD_CONTENT_DESCRIPTION, type)) contentDescription else null,
-        if (isFieldValidForType(FIELD_ELEMENT_WEIGHTS, type)) {
-            elementWeights.contentHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_ELEMENT_COLORS, type)) {
-            elementColors.contentHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_ELEMENT_BACKGROUND_COLOR, type)) {
-            elementBackgroundColor
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_PLACEHOLDER_TYPE, type)) placeholder else null,
-        if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_INTERACTIVE, type)) {
-            interactiveLayout.contentHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(EXP_FIELD_LIST_STYLE_HINT, type)) listStyleHint else null,
-        if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_AMBIENT, type)) {
-            ambientLayout.contentHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_RESOURCES, type)) {
-            layoutResources.contentHashCode()
-        } else {
-            null
-        },
-        if (isFieldValidForType(FIELD_PERSISTENCE_POLICY, type)) persistencePolicy else null,
-        if (isFieldValidForType(FIELD_DISPLAY_POLICY, type)) displayPolicy else null,
-        if (isFieldValidForType(FIELD_START_TIME, type)) startDateTimeMillis else null,
-        if (isFieldValidForType(FIELD_END_TIME, type)) endDateTimeMillis else null,
-    )
+    override fun hashCode(): Int =
+        Objects.hash(
+            type,
+            if (isFieldValidForType(FIELD_TAP_ACTION_LOST, type)) {
+                tapActionLostDueToSerialization
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_TIMELINE_START_TIME, type)) {
+                timelineStartEpochSecond
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_TIMELINE_END_TIME, type)) timelineEndEpochSecond
+            else null,
+            if (isFieldValidForType(FIELD_TIMELINE_ENTRIES, type)) timelineEntries else null,
+            if (isFieldValidForType(EXP_FIELD_LIST_ENTRIES, type)) listEntries else null,
+            if (isFieldValidForType(FIELD_DATA_SOURCE, type)) dataSource else null,
+            if (isFieldValidForType(FIELD_VALUE, type)) rangedValue else null,
+            if (isFieldValidForType(FIELD_VALUE_EXPRESSION, type)) {
+                Arrays.hashCode(rangedValueExpression?.toDynamicFloatByteArray())
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_VALUE_TYPE, type)) rangedValueType else null,
+            if (isFieldValidForType(FIELD_MIN_VALUE, type)) rangedMinValue else null,
+            if (isFieldValidForType(FIELD_MAX_VALUE, type)) rangedMaxValue else null,
+            if (isFieldValidForType(FIELD_TARGET_VALUE, type)) targetValue else null,
+            if (isFieldValidForType(FIELD_COLOR_RAMP, type)) colorRamp.contentHashCode() else null,
+            if (isFieldValidForType(FIELD_COLOR_RAMP_INTERPOLATED, type)) {
+                isColorRampInterpolated
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_SHORT_TITLE, type)) shortTitle else null,
+            if (isFieldValidForType(FIELD_SHORT_TEXT, type)) shortText else null,
+            if (isFieldValidForType(FIELD_LONG_TITLE, type)) longTitle else null,
+            if (isFieldValidForType(FIELD_LONG_TEXT, type)) longText else null,
+            if (isFieldValidForType(FIELD_ICON, type)) icon?.iconHashCode() else null,
+            if (isFieldValidForType(FIELD_ICON_BURN_IN_PROTECTION, type)) {
+                burnInProtectionIcon?.iconHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_SMALL_IMAGE, type)) smallImage?.iconHashCode() else null,
+            if (isFieldValidForType(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, type)) {
+                burnInProtectionSmallImage?.iconHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_IMAGE_STYLE, type)) smallImageStyle else null,
+            if (isFieldValidForType(FIELD_LARGE_IMAGE, type)) largeImage?.iconHashCode() else null,
+            if (isFieldValidForType(FIELD_TAP_ACTION, type)) tapAction else null,
+            if (isFieldValidForType(FIELD_CONTENT_DESCRIPTION, type)) contentDescription else null,
+            if (isFieldValidForType(FIELD_ELEMENT_WEIGHTS, type)) {
+                elementWeights.contentHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_ELEMENT_COLORS, type)) {
+                elementColors.contentHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_ELEMENT_BACKGROUND_COLOR, type)) {
+                elementBackgroundColor
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_PLACEHOLDER_TYPE, type)) placeholder else null,
+            if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_INTERACTIVE, type)) {
+                interactiveLayout.contentHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(EXP_FIELD_LIST_STYLE_HINT, type)) listStyleHint else null,
+            if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_AMBIENT, type)) {
+                ambientLayout.contentHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(EXP_FIELD_PROTO_LAYOUT_RESOURCES, type)) {
+                layoutResources.contentHashCode()
+            } else {
+                null
+            },
+            if (isFieldValidForType(FIELD_PERSISTENCE_POLICY, type)) persistencePolicy else null,
+            if (isFieldValidForType(FIELD_DISPLAY_POLICY, type)) displayPolicy else null,
+            if (isFieldValidForType(FIELD_START_TIME, type)) startDateTimeMillis else null,
+            if (isFieldValidForType(FIELD_END_TIME, type)) endDateTimeMillis else null,
+        )
 
     /** Builder class for [ComplicationData]. */
     class Builder {
-        @ComplicationType
-        internal val type: Int
+        @ComplicationType internal val type: Int
 
         internal val fields: Bundle
 
@@ -1406,25 +1388,27 @@
         }
 
         /** Sets the complication's [ComplicationPersistencePolicy]. */
-        fun setPersistencePolicy(@ComplicationPersistencePolicy cachePolicy: Int) =
-            apply { fields.putInt(FIELD_PERSISTENCE_POLICY, cachePolicy) }
+        fun setPersistencePolicy(@ComplicationPersistencePolicy cachePolicy: Int) = apply {
+            fields.putInt(FIELD_PERSISTENCE_POLICY, cachePolicy)
+        }
 
         /** Sets the complication's [ComplicationDisplayPolicy]. */
-        fun setDisplayPolicy(@ComplicationDisplayPolicy displayPolicy: Int) =
-            apply { fields.putInt(FIELD_DISPLAY_POLICY, displayPolicy) }
+        fun setDisplayPolicy(@ComplicationDisplayPolicy displayPolicy: Int) = apply {
+            fields.putInt(FIELD_DISPLAY_POLICY, displayPolicy)
+        }
 
         /**
          * Sets the start time for this complication data. This is optional for any type.
          *
-         * The complication data will be considered inactive (i.e. should not be displayed) if
-         * the current time is less than the start time. If not specified, the data is considered
-         * active for all time up to the end time (or always active if end time is also not
-         * specified).
+         * The complication data will be considered inactive (i.e. should not be displayed) if the
+         * current time is less than the start time. If not specified, the data is considered active
+         * for all time up to the end time (or always active if end time is also not specified).
          *
          * Returns this Builder to allow chaining.
          */
-        fun setStartDateTimeMillis(startDateTimeMillis: Long) =
-            apply { fields.putLong(FIELD_START_TIME, startDateTimeMillis) }
+        fun setStartDateTimeMillis(startDateTimeMillis: Long) = apply {
+            fields.putLong(FIELD_START_TIME, startDateTimeMillis)
+        }
 
         /**
          * Removes the start time for this complication data.
@@ -1436,15 +1420,16 @@
         /**
          * Sets the end time for this complication data. This is optional for any type.
          *
-         * The complication data will be considered inactive (i.e. should not be displayed) if
-         * the current time is greater than the end time. If not specified, the data is considered
+         * The complication data will be considered inactive (i.e. should not be displayed) if the
+         * current time is greater than the end time. If not specified, the data is considered
          * active for all time after the start time (or always active if start time is also not
          * specified).
          *
          * Returns this Builder to allow chaining.
          */
-        fun setEndDateTimeMillis(endDateTimeMillis: Long) =
-            apply { fields.putLong(FIELD_END_TIME, endDateTimeMillis) }
+        fun setEndDateTimeMillis(endDateTimeMillis: Long) = apply {
+            fields.putLong(FIELD_END_TIME, endDateTimeMillis)
+        }
 
         /**
          * Removes the end time for this complication data.
@@ -1454,14 +1439,14 @@
         fun clearEndDateTime() = apply { fields.remove(FIELD_END_TIME) }
 
         /**
-         * Sets the *value* field. This is required for the [TYPE_RANGED_VALUE] type,
-         * and the [TYPE_GOAL_PROGRESS] type. For [TYPE_RANGED_VALUE] value must
-         * be in the range [min .. max] for [TYPE_GOAL_PROGRESS] value must be >= and may
-         * be greater than target value.
+         * Sets the *value* field. This is required for the [TYPE_RANGED_VALUE] type, and the
+         * [TYPE_GOAL_PROGRESS] type. For [TYPE_RANGED_VALUE] value must be in the range
+         * [min .. max] for [TYPE_GOAL_PROGRESS] value must be >= and may be greater than target
+         * value.
          *
-         * Both the [TYPE_RANGED_VALUE] complication and the
-         * [TYPE_GOAL_PROGRESS] complication visually present a single value, which is
-         * usually a percentage. E.g. you have completed 70% of today's  target of 10000 steps.
+         * Both the [TYPE_RANGED_VALUE] complication and the [TYPE_GOAL_PROGRESS] complication
+         * visually present a single value, which is usually a percentage. E.g. you have completed
+         * 70% of today's target of 10000 steps.
          *
          * Returns this Builder to allow chaining.
          *
@@ -1477,20 +1462,21 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setRangedValueExpression(value: DynamicFloat?) =
-            apply { putOrRemoveField(FIELD_VALUE_EXPRESSION, value?.toDynamicFloatByteArray()) }
+        fun setRangedValueExpression(value: DynamicFloat?) = apply {
+            putOrRemoveField(FIELD_VALUE_EXPRESSION, value?.toDynamicFloatByteArray())
+        }
 
         /**
-         * Sets the *value type* field which provides meta data about the value. This is
-         * optional for the [TYPE_RANGED_VALUE] type.
+         * Sets the *value type* field which provides meta data about the value. This is optional
+         * for the [TYPE_RANGED_VALUE] type.
          */
         fun setRangedValueType(valueType: Int) = apply { putIntField(FIELD_VALUE_TYPE, valueType) }
 
         /**
-         * Sets the *min value* field. This is required for the [TYPE_RANGED_VALUE]
-         * type, and is not valid for any other type. A [TYPE_RANGED_VALUE] complication
-         * visually presents a single value, which is usually a percentage. E.g. you have
-         * completed 70% of today's target of 10000 steps.
+         * Sets the *min value* field. This is required for the [TYPE_RANGED_VALUE] type, and is not
+         * valid for any other type. A [TYPE_RANGED_VALUE] complication visually presents a single
+         * value, which is usually a percentage. E.g. you have completed 70% of today's target of
+         * 10000 steps.
          *
          * Returns this Builder to allow chaining.
          *
@@ -1499,10 +1485,10 @@
         fun setRangedMinValue(minValue: Float) = apply { putFloatField(FIELD_MIN_VALUE, minValue) }
 
         /**
-         * Sets the *max value* field. This is required for the [TYPE_RANGED_VALUE]
-         * type, and is not valid for any other type. A [TYPE_RANGED_VALUE] complication
-         * visually presents a single value, which is usually a percentage. E.g. you have
-         * completed 70% of today's target of 10000 steps.
+         * Sets the *max value* field. This is required for the [TYPE_RANGED_VALUE] type, and is not
+         * valid for any other type. A [TYPE_RANGED_VALUE] complication visually presents a single
+         * value, which is usually a percentage. E.g. you have completed 70% of today's target of
+         * 10000 steps.
          *
          * Returns this Builder to allow chaining.
          *
@@ -1511,52 +1497,55 @@
         fun setRangedMaxValue(maxValue: Float) = apply { putFloatField(FIELD_MAX_VALUE, maxValue) }
 
         /**
-         * Sets the *targetValue* field. This is required for the
-         * [TYPE_GOAL_PROGRESS] type, and is not valid for any other type. A
-         * [TYPE_GOAL_PROGRESS] complication visually presents a single value, which
-         * is usually a percentage. E.g. you have completed 70% of today's target of 10000 steps.
+         * Sets the *targetValue* field. This is required for the [TYPE_GOAL_PROGRESS] type, and is
+         * not valid for any other type. A [TYPE_GOAL_PROGRESS] complication visually presents a
+         * single value, which is usually a percentage. E.g. you have completed 70% of today's
+         * target of 10000 steps.
          *
          * Returns this Builder to allow chaining.
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setTargetValue(targetValue: Float) =
-            apply { putFloatField(FIELD_TARGET_VALUE, targetValue) }
+        fun setTargetValue(targetValue: Float) = apply {
+            putFloatField(FIELD_TARGET_VALUE, targetValue)
+        }
 
         /**
-         * Sets the *long title* field. This is optional for the [TYPE_LONG_TEXT] type,
-         * and is not valid for any other type.
+         * Sets the *long title* field. This is optional for the [TYPE_LONG_TEXT] type, and is not
+         * valid for any other type.
          *
-         * The value must be provided as a [ComplicationText] object, so that
-         * time-dependent values may be included.
+         * The value must be provided as a [ComplicationText] object, so that time-dependent values
+         * may be included.
          *
          * Returns this Builder to allow chaining.
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setLongTitle(longTitle: ComplicationText?) =
-            apply { putOrRemoveField(FIELD_LONG_TITLE, longTitle) }
+        fun setLongTitle(longTitle: ComplicationText?) = apply {
+            putOrRemoveField(FIELD_LONG_TITLE, longTitle)
+        }
 
         /**
-         * Sets the *long text* field. This is required for the [TYPE_LONG_TEXT] type,
-         * and is not valid for any other type.
+         * Sets the *long text* field. This is required for the [TYPE_LONG_TEXT] type, and is not
+         * valid for any other type.
          *
-         * The value must be provided as a [ComplicationText] object, so that
-         * time-dependent values may be included.
+         * The value must be provided as a [ComplicationText] object, so that time-dependent values
+         * may be included.
          *
          * Returns this Builder to allow chaining.
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setLongText(longText: ComplicationText?) =
-            apply { putOrRemoveField(FIELD_LONG_TEXT, longText) }
+        fun setLongText(longText: ComplicationText?) = apply {
+            putOrRemoveField(FIELD_LONG_TEXT, longText)
+        }
 
         /**
          * Sets the *short title* field. This is valid for the [TYPE_SHORT_TEXT],
          * [TYPE_RANGED_VALUE], and [TYPE_NO_PERMISSION] types, and is not valid for any other type.
          *
-         * The value must be provided as a [ComplicationText] object, so that
-         * time-dependent values may be included.
+         * The value must be provided as a [ComplicationText] object, so that time-dependent values
+         * may be included.
          *
          * The length of the text, including any time-dependent values, should not exceed seven
          * characters. If it does, the text may be truncated by the watch face or might not fit in
@@ -1566,16 +1555,17 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setShortTitle(shortTitle: ComplicationText?) =
-            apply { putOrRemoveField(FIELD_SHORT_TITLE, shortTitle) }
+        fun setShortTitle(shortTitle: ComplicationText?) = apply {
+            putOrRemoveField(FIELD_SHORT_TITLE, shortTitle)
+        }
 
         /**
-         * Sets the *short text* field. This is required for the [TYPE_SHORT_TEXT] type,
-         * is optional for the [TYPE_RANGED_VALUE] and [TYPE_NO_PERMISSION] types, and
-         * is not valid for any other type.
+         * Sets the *short text* field. This is required for the [TYPE_SHORT_TEXT] type, is optional
+         * for the [TYPE_RANGED_VALUE] and [TYPE_NO_PERMISSION] types, and is not valid for any
+         * other type.
          *
-         * The value must be provided as a [ComplicationText] object, so that
-         * time-dependent values may be included.
+         * The value must be provided as a [ComplicationText] object, so that time-dependent values
+         * may be included.
          *
          * The length of the text, including any time-dependent values, should not exceed seven
          * characters. If it does, the text may be truncated by the watch face or might not fit in
@@ -1585,13 +1575,13 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setShortText(shortText: ComplicationText?) =
-            apply { putOrRemoveField(FIELD_SHORT_TEXT, shortText) }
+        fun setShortText(shortText: ComplicationText?) = apply {
+            putOrRemoveField(FIELD_SHORT_TEXT, shortText)
+        }
 
         /**
-         * Sets the *icon* field. This is required for the [TYPE_ICON] type, and is
-         * optional for the [TYPE_SHORT_TEXT], [TYPE_LONG_TEXT], [TYPE_RANGED_VALUE], and
-         * [TYPE_NO_PERMISSION] types.
+         * Sets the *icon* field. This is required for the [TYPE_ICON] type, and is optional for the
+         * [TYPE_SHORT_TEXT], [TYPE_LONG_TEXT], [TYPE_RANGED_VALUE], and [TYPE_NO_PERMISSION] types.
          *
          * The provided image must be single-color, so that watch faces can tint it as required.
          *
@@ -1606,10 +1596,10 @@
         fun setIcon(icon: Icon?) = apply { putOrRemoveField(FIELD_ICON, icon) }
 
         /**
-         * Sets the burn-in protection version of the *icon* field. This should be provided if
-         * the *icon* field is provided, unless the main icon is already safe for use with
-         * burn-in protection.  This icon should have fewer lit pixels, and should use darker
-         * colors to prevent LCD burn in issues.
+         * Sets the burn-in protection version of the *icon* field. This should be provided if the
+         * *icon* field is provided, unless the main icon is already safe for use with burn-in
+         * protection. This icon should have fewer lit pixels, and should use darker colors to
+         * prevent LCD burn in issues.
          *
          * The provided image must be single-color, so that watch faces can tint it as required.
          *
@@ -1622,24 +1612,26 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setBurnInProtectionIcon(icon: Icon?) =
-            apply { putOrRemoveField(FIELD_ICON_BURN_IN_PROTECTION, icon) }
+        fun setBurnInProtectionIcon(icon: Icon?) = apply {
+            putOrRemoveField(FIELD_ICON_BURN_IN_PROTECTION, icon)
+        }
 
         /**
-         * Sets the *small image* field. This is required for the [TYPE_SMALL_IMAGE]
-         * type, and is optional for the [TYPE_LONG_TEXT] type.
+         * Sets the *small image* field. This is required for the [TYPE_SMALL_IMAGE] type, and is
+         * optional for the [TYPE_LONG_TEXT] type.
          *
          * Returns this Builder to allow chaining.
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setSmallImage(smallImage: Icon?) =
-            apply { putOrRemoveField(FIELD_SMALL_IMAGE, smallImage) }
+        fun setSmallImage(smallImage: Icon?) = apply {
+            putOrRemoveField(FIELD_SMALL_IMAGE, smallImage)
+        }
 
         /**
-         * Sets the burn-in protection version of the *small image* field. This should be
-         * provided if the *small image* field is provided, unless the main small image is
-         * already safe for use with burn-in protection.
+         * Sets the burn-in protection version of the *small image* field. This should be provided
+         * if the *small image* field is provided, unless the main small image is already safe for
+         * use with burn-in protection.
          *
          * The provided image must not contain solid blocks of pixels - it should instead be
          * composed of outlines or lines only.
@@ -1650,8 +1642,9 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setBurnInProtectionSmallImage(smallImage: Icon?) =
-            apply { putOrRemoveField(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, smallImage) }
+        fun setBurnInProtectionSmallImage(smallImage: Icon?) = apply {
+            putOrRemoveField(FIELD_SMALL_IMAGE_BURN_IN_PROTECTION, smallImage)
+        }
 
         /**
          * Sets the display style for this complication data. This is valid only for types that
@@ -1663,15 +1656,15 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          * @see .IMAGE_STYLE_PHOTO which can be cropped but not recolored.
-         *
          * @see .IMAGE_STYLE_ICON which can be recolored but not cropped.
          */
-        fun setSmallImageStyle(@ImageStyle imageStyle: Int) =
-            apply { putIntField(FIELD_IMAGE_STYLE, imageStyle) }
+        fun setSmallImageStyle(@ImageStyle imageStyle: Int) = apply {
+            putIntField(FIELD_IMAGE_STYLE, imageStyle)
+        }
 
         /**
-         * Sets the *large image* field. This is required for the [TYPE_LARGE_IMAGE]
-         * type, and is not valid for any other type.
+         * Sets the *large image* field. This is required for the [TYPE_LARGE_IMAGE] type, and is
+         * not valid for any other type.
          *
          * The provided image should be suitably sized to fill the screen of the watch.
          *
@@ -1679,38 +1672,40 @@
          *
          * @throws IllegalStateException if this field is not valid for the complication type
          */
-        fun setLargeImage(largeImage: Icon?) =
-            apply { putOrRemoveField(FIELD_LARGE_IMAGE, largeImage) }
+        fun setLargeImage(largeImage: Icon?) = apply {
+            putOrRemoveField(FIELD_LARGE_IMAGE, largeImage)
+        }
 
         /**
          * Sets the list style hint
          *
-         * Valid only if the type of this complication data is [EXP_TYPE_LIST]. Otherwise
-         * returns
+         * Valid only if the type of this complication data is [EXP_TYPE_LIST]. Otherwise returns
          * zero.
          */
-        fun setListStyleHint(listStyleHint: Int) =
-            apply { putIntField(EXP_FIELD_LIST_STYLE_HINT, listStyleHint) }
+        fun setListStyleHint(listStyleHint: Int) = apply {
+            putIntField(EXP_FIELD_LIST_STYLE_HINT, listStyleHint)
+        }
 
         /**
          * Sets the *tap action* field. This is optional for any non-empty type.
          *
-         * The provided [PendingIntent] may be fired if the complication is tapped on. Note
-         * that some complications might not be tappable, in which case this field will be ignored.
+         * The provided [PendingIntent] may be fired if the complication is tapped on. Note that
+         * some complications might not be tappable, in which case this field will be ignored.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setTapAction(pendingIntent: PendingIntent?) =
-            apply { putOrRemoveField(FIELD_TAP_ACTION, pendingIntent) }
+        fun setTapAction(pendingIntent: PendingIntent?) = apply {
+            putOrRemoveField(FIELD_TAP_ACTION, pendingIntent)
+        }
 
         /**
          * Sets the *content description* field for accessibility. This is optional for any
-         * non-empty type. It is recommended to provide a content description whenever the
-         * data includes an image.
+         * non-empty type. It is recommended to provide a content description whenever the data
+         * includes an image.
          *
-         * The provided text will be read aloud by a Text-to-speech converter for users who may
-         * be vision-impaired. It will be read aloud in addition to any long, short, or range text
-         * in the complication.
+         * The provided text will be read aloud by a Text-to-speech converter for users who may be
+         * vision-impaired. It will be read aloud in addition to any long, short, or range text in
+         * the complication.
          *
          * If using to describe an image/icon that is purely stylistic and doesn't convey any
          * information to the user, you may set the image content description to an empty string
@@ -1718,8 +1713,9 @@
          *
          * Returns this Builder to allow chaining.
          */
-        fun setContentDescription(description: ComplicationText?) =
-            apply { putOrRemoveField(FIELD_CONTENT_DESCRIPTION, description) }
+        fun setContentDescription(description: ComplicationText?) = apply {
+            putOrRemoveField(FIELD_CONTENT_DESCRIPTION, description)
+        }
 
         /**
          * Sets whether or not this ComplicationData has been serialized.
@@ -1755,40 +1751,45 @@
          *
          * Returns this Builder to allow chaining.
          */
-        fun setDataSource(provider: ComponentName?) =
-            apply { putOrRemoveField(FIELD_DATA_SOURCE, provider) }
+        fun setDataSource(provider: ComponentName?) = apply {
+            putOrRemoveField(FIELD_DATA_SOURCE, provider)
+        }
 
         /**
          * Sets the ambient proto layout associated with this complication.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setAmbientLayout(ambientProtoLayout: ByteArray) =
-            apply { putByteArrayField(EXP_FIELD_PROTO_LAYOUT_AMBIENT, ambientProtoLayout) }
+        fun setAmbientLayout(ambientProtoLayout: ByteArray) = apply {
+            putByteArrayField(EXP_FIELD_PROTO_LAYOUT_AMBIENT, ambientProtoLayout)
+        }
 
         /**
          * Sets the proto layout associated with this complication.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setInteractiveLayout(protoLayout: ByteArray) =
-            apply { putByteArrayField(EXP_FIELD_PROTO_LAYOUT_INTERACTIVE, protoLayout) }
+        fun setInteractiveLayout(protoLayout: ByteArray) = apply {
+            putByteArrayField(EXP_FIELD_PROTO_LAYOUT_INTERACTIVE, protoLayout)
+        }
 
         /**
          * Sets the proto layout resources associated with this complication.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setLayoutResources(resources: ByteArray) =
-            apply { putByteArrayField(EXP_FIELD_PROTO_LAYOUT_RESOURCES, resources) }
+        fun setLayoutResources(resources: ByteArray) = apply {
+            putByteArrayField(EXP_FIELD_PROTO_LAYOUT_RESOURCES, resources)
+        }
 
         /**
          * Optional. Sets the color the color ramp should be drawn with.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setColorRamp(colorRamp: IntArray?) =
-            apply { putOrRemoveField(FIELD_COLOR_RAMP, colorRamp) }
+        fun setColorRamp(colorRamp: IntArray?) = apply {
+            putOrRemoveField(FIELD_COLOR_RAMP, colorRamp)
+        }
 
         /**
          * Optional. Sets whether or not the color ramp should be smoothly shaded or drawn with
@@ -1796,26 +1797,27 @@
          *
          * Returns this Builder to allow chaining.
          */
-        fun setColorRampIsSmoothShaded(isSmoothShaded: Boolean?) =
-            apply { putOrRemoveField(FIELD_COLOR_RAMP_INTERPOLATED, isSmoothShaded) }
+        fun setColorRampIsSmoothShaded(isSmoothShaded: Boolean?) = apply {
+            putOrRemoveField(FIELD_COLOR_RAMP_INTERPOLATED, isSmoothShaded)
+        }
 
         /**
          * Sets the list of [ComplicationData] timeline entries.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setListEntryCollection(
-            timelineEntries: Collection<ComplicationData>?
-        ) = apply {
+        fun setListEntryCollection(timelineEntries: Collection<ComplicationData>?) = apply {
             if (timelineEntries == null) {
                 fields.remove(EXP_FIELD_LIST_ENTRIES)
             } else {
                 fields.putParcelableArray(
                     EXP_FIELD_LIST_ENTRIES,
-                    timelineEntries.map { data ->
-                        data.fields.putInt(EXP_FIELD_LIST_ENTRY_TYPE, data.type)
-                        data.fields
-                    }.toTypedArray()
+                    timelineEntries
+                        .map { data ->
+                            data.fields.putInt(EXP_FIELD_LIST_ENTRY_TYPE, data.type)
+                            data.fields
+                        }
+                        .toTypedArray()
                 )
             }
         }
@@ -1825,28 +1827,31 @@
          *
          * Returns this Builder to allow chaining.
          */
-        fun setElementWeights(elementWeights: FloatArray?) =
-            apply { putOrRemoveField(FIELD_ELEMENT_WEIGHTS, elementWeights) }
+        fun setElementWeights(elementWeights: FloatArray?) = apply {
+            putOrRemoveField(FIELD_ELEMENT_WEIGHTS, elementWeights)
+        }
 
         /**
          * Sets the element colors for this complication.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setElementColors(elementColors: IntArray?) =
-            apply { putOrRemoveField(FIELD_ELEMENT_COLORS, elementColors) }
+        fun setElementColors(elementColors: IntArray?) = apply {
+            putOrRemoveField(FIELD_ELEMENT_COLORS, elementColors)
+        }
 
         /**
          * Sets the background color to use between elements for this complication.
          *
          * Returns this Builder to allow chaining.
          */
-        fun setElementBackgroundColor(@ColorInt elementBackgroundColor: Int) =
-            apply { putOrRemoveField(FIELD_ELEMENT_BACKGROUND_COLOR, elementBackgroundColor) }
+        fun setElementBackgroundColor(@ColorInt elementBackgroundColor: Int) = apply {
+            putOrRemoveField(FIELD_ELEMENT_BACKGROUND_COLOR, elementBackgroundColor)
+        }
 
         /**
-         * Constructs and returns [ComplicationData] with the provided fields. All required
-         * fields must be populated before this method is called.
+         * Constructs and returns [ComplicationData] with the provided fields. All required fields
+         * must be populated before this method is called.
          *
          * @throws IllegalStateException if the required fields have not been populated
          */
@@ -1952,12 +1957,11 @@
          * accompanied by an icon or a short title (or both, but if both are provided then a watch
          * face may choose to display only one).
          *
-         * The *short text* field is required for this type, and is expected to always be
-         * displayed.
+         * The *short text* field is required for this type, and is expected to always be displayed.
          *
-         * The *icon* (and *burnInProtectionIcon*) and *short title* fields are
-         * optional for this type. If only one of these is provided, it is expected that it will be
-         * displayed. If both are provided, it is expected that one of these will be displayed.
+         * The *icon* (and *burnInProtectionIcon*) and *short title* fields are optional for this
+         * type. If only one of these is provided, it is expected that it will be displayed. If both
+         * are provided, it is expected that one of these will be displayed.
          */
         const val TYPE_SHORT_TEXT = 3
 
@@ -1965,14 +1969,13 @@
          * Type used for complications where the primary piece of data is a piece of text. The text
          * may be accompanied by an icon and/or a title.
          *
-         * The *long text* field is required for this type, and is expected to always be
-         * displayed.
+         * The *long text* field is required for this type, and is expected to always be displayed.
          *
-         * The *long title* field is optional for this type. If provided, it is expected that
-         * this field will be displayed.
+         * The *long title* field is optional for this type. If provided, it is expected that this
+         * field will be displayed.
          *
-         * The *icon* (and *burnInProtectionIcon*) and *small image* fields are also
-         * optional for this type. If provided, at least one of these should be displayed.
+         * The *icon* (and *burnInProtectionIcon*) and *small image* fields are also optional for
+         * this type. If provided, at least one of these should be displayed.
          */
         const val TYPE_LONG_TEXT = 4
 
@@ -1980,12 +1983,12 @@
          * Type used for complications including a numerical value within a range, such as a
          * percentage. The value may be accompanied by an icon and/or short text and title.
          *
-         * The *value*, *min value*, and *max value* fields are required for this
-         * type, and the value within the range is expected to always be displayed.
+         * The *value*, *min value*, and *max value* fields are required for this type, and the
+         * value within the range is expected to always be displayed.
          *
-         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short
-         * text* fields are optional for this type, but at least one must be defined. The watch face
-         * may choose which of these fields to display, if any.
+         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short text* fields are
+         * optional for this type, but at least one must be defined. The watch face may choose which
+         * of these fields to display, if any.
          */
         const val TYPE_RANGED_VALUE = 5
 
@@ -2051,13 +2054,13 @@
          * Type used for complications which indicate progress towards a goal. The value may be
          * accompanied by an icon and/or short text and title.
          *
-         * The *value*, and *target value* fields are required for this type, and the
-         * value is expected to always be displayed. The value must be >= 0 and may be > target
-         * value. E.g. 15000 out of a target of 10000 steps.
+         * The *value*, and *target value* fields are required for this type, and the value is
+         * expected to always be displayed. The value must be >= 0 and may be > target value. E.g.
+         * 15000 out of a target of 10000 steps.
          *
-         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short
-         * text* fields are optional for this type, but at least one must be defined. The watch face
-         * may choose which of these fields to display, if any.
+         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short text* fields are
+         * optional for this type, but at least one must be defined. The watch face may choose which
+         * of these fields to display, if any.
          */
         const val TYPE_GOAL_PROGRESS = 13
 
@@ -2065,12 +2068,12 @@
          * Type used for complications to display a series of weighted values e.g. in a pie chart.
          * The weighted values may be accompanied by an icon and/or short text and title.
          *
-         * The *element weights* and *element colors* fields are required for this type,
-         * and the value within the range is expected to always be displayed.
+         * The *element weights* and *element colors* fields are required for this type, and the
+         * value within the range is expected to always be displayed.
          *
-         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short
-         * text* fields are optional for this type, but at least one must be defined. The watch face
-         * may choose which of these fields to display, if any.
+         * The *icon* (and *burnInProtectionIcon*), *short title*, and *short text* fields are
+         * optional for this type, but at least one must be defined. The watch face may choose which
+         * of these fields to display, if any.
          */
         const val TYPE_WEIGHTED_ELEMENTS = 14
 
@@ -2144,212 +2147,232 @@
         private const val FIELD_CONTENT_DESCRIPTION = "IMAGE_CONTENT_DESCRIPTION"
 
         // The set of valid types.
-        private val VALID_TYPES: Set<Int> = setOf(
-            TYPE_NOT_CONFIGURED,
-            TYPE_EMPTY,
-            TYPE_SHORT_TEXT,
-            TYPE_LONG_TEXT,
-            TYPE_RANGED_VALUE,
-            TYPE_ICON,
-            TYPE_SMALL_IMAGE,
-            TYPE_LARGE_IMAGE,
-            TYPE_NO_PERMISSION,
-            TYPE_NO_DATA,
-            EXP_TYPE_PROTO_LAYOUT,
-            EXP_TYPE_LIST,
-            TYPE_GOAL_PROGRESS,
-            TYPE_WEIGHTED_ELEMENTS,
-        )
+        private val VALID_TYPES: Set<Int> =
+            setOf(
+                TYPE_NOT_CONFIGURED,
+                TYPE_EMPTY,
+                TYPE_SHORT_TEXT,
+                TYPE_LONG_TEXT,
+                TYPE_RANGED_VALUE,
+                TYPE_ICON,
+                TYPE_SMALL_IMAGE,
+                TYPE_LARGE_IMAGE,
+                TYPE_NO_PERMISSION,
+                TYPE_NO_DATA,
+                EXP_TYPE_PROTO_LAYOUT,
+                EXP_TYPE_LIST,
+                TYPE_GOAL_PROGRESS,
+                TYPE_WEIGHTED_ELEMENTS,
+            )
 
         // Used for validation. REQUIRED_FIELDS[i] is a list containing all the fields which must be
         // populated for @ComplicationType i.
-        private val REQUIRED_FIELDS: Map<Int, Set<String>> = mapOf(
-            TYPE_NOT_CONFIGURED to setOf(),
-            TYPE_EMPTY to setOf(),
-            TYPE_SHORT_TEXT to setOf(FIELD_SHORT_TEXT),
-            TYPE_LONG_TEXT to setOf(FIELD_LONG_TEXT),
-            TYPE_RANGED_VALUE to setOf(FIELD_MIN_VALUE, FIELD_MAX_VALUE),
-            TYPE_ICON to setOf(FIELD_ICON),
-            TYPE_SMALL_IMAGE to setOf(FIELD_SMALL_IMAGE, FIELD_IMAGE_STYLE),
-            TYPE_LARGE_IMAGE to setOf(FIELD_LARGE_IMAGE),
-            TYPE_NO_PERMISSION to setOf(),
-            TYPE_NO_DATA to setOf(),
-            EXP_TYPE_PROTO_LAYOUT to setOf(
-                EXP_FIELD_PROTO_LAYOUT_AMBIENT,
-                EXP_FIELD_PROTO_LAYOUT_INTERACTIVE,
-                EXP_FIELD_PROTO_LAYOUT_RESOURCES,
-            ),
-            EXP_TYPE_LIST to setOf(EXP_FIELD_LIST_ENTRIES),
-            TYPE_GOAL_PROGRESS to setOf(FIELD_TARGET_VALUE),
-            TYPE_WEIGHTED_ELEMENTS to setOf(
-                FIELD_ELEMENT_WEIGHTS,
-                FIELD_ELEMENT_COLORS,
-                FIELD_ELEMENT_BACKGROUND_COLOR,
-            ),
-        )
+        private val REQUIRED_FIELDS: Map<Int, Set<String>> =
+            mapOf(
+                TYPE_NOT_CONFIGURED to setOf(),
+                TYPE_EMPTY to setOf(),
+                TYPE_SHORT_TEXT to setOf(FIELD_SHORT_TEXT),
+                TYPE_LONG_TEXT to setOf(FIELD_LONG_TEXT),
+                TYPE_RANGED_VALUE to setOf(FIELD_MIN_VALUE, FIELD_MAX_VALUE),
+                TYPE_ICON to setOf(FIELD_ICON),
+                TYPE_SMALL_IMAGE to setOf(FIELD_SMALL_IMAGE, FIELD_IMAGE_STYLE),
+                TYPE_LARGE_IMAGE to setOf(FIELD_LARGE_IMAGE),
+                TYPE_NO_PERMISSION to setOf(),
+                TYPE_NO_DATA to setOf(),
+                EXP_TYPE_PROTO_LAYOUT to
+                    setOf(
+                        EXP_FIELD_PROTO_LAYOUT_AMBIENT,
+                        EXP_FIELD_PROTO_LAYOUT_INTERACTIVE,
+                        EXP_FIELD_PROTO_LAYOUT_RESOURCES,
+                    ),
+                EXP_TYPE_LIST to setOf(EXP_FIELD_LIST_ENTRIES),
+                TYPE_GOAL_PROGRESS to setOf(FIELD_TARGET_VALUE),
+                TYPE_WEIGHTED_ELEMENTS to
+                    setOf(
+                        FIELD_ELEMENT_WEIGHTS,
+                        FIELD_ELEMENT_COLORS,
+                        FIELD_ELEMENT_BACKGROUND_COLOR,
+                    ),
+            )
 
         // Used for validation. REQUIRED_ONE_OF_FIELDS[i] is a list of field groups of which at
         // least one field must be populated for @ComplicationType i.
         // If a field is also in REQUIRED_FIELDS[i], it is not required if another field in the one
         // of group is populated.
-        private val REQUIRED_ONE_OF_FIELDS: Map<Int, Set<Set<String>>> = mapOf(
-            TYPE_NOT_CONFIGURED to setOf(),
-            TYPE_EMPTY to setOf(),
-            TYPE_SHORT_TEXT to setOf(),
-            TYPE_LONG_TEXT to setOf(),
-            TYPE_RANGED_VALUE to setOf(setOf(FIELD_VALUE, FIELD_VALUE_EXPRESSION)),
-            TYPE_ICON to setOf(),
-            TYPE_SMALL_IMAGE to setOf(),
-            TYPE_LARGE_IMAGE to setOf(),
-            TYPE_NO_PERMISSION to setOf(),
-            TYPE_NO_DATA to setOf(),
-            EXP_TYPE_PROTO_LAYOUT to setOf(),
-            EXP_TYPE_LIST to setOf(),
-            TYPE_GOAL_PROGRESS to setOf(setOf(FIELD_VALUE, FIELD_VALUE_EXPRESSION)),
-            TYPE_WEIGHTED_ELEMENTS to setOf(),
-        )
+        private val REQUIRED_ONE_OF_FIELDS: Map<Int, Set<Set<String>>> =
+            mapOf(
+                TYPE_NOT_CONFIGURED to setOf(),
+                TYPE_EMPTY to setOf(),
+                TYPE_SHORT_TEXT to setOf(),
+                TYPE_LONG_TEXT to setOf(),
+                TYPE_RANGED_VALUE to setOf(setOf(FIELD_VALUE, FIELD_VALUE_EXPRESSION)),
+                TYPE_ICON to setOf(),
+                TYPE_SMALL_IMAGE to setOf(),
+                TYPE_LARGE_IMAGE to setOf(),
+                TYPE_NO_PERMISSION to setOf(),
+                TYPE_NO_DATA to setOf(),
+                EXP_TYPE_PROTO_LAYOUT to setOf(),
+                EXP_TYPE_LIST to setOf(),
+                TYPE_GOAL_PROGRESS to setOf(setOf(FIELD_VALUE, FIELD_VALUE_EXPRESSION)),
+                TYPE_WEIGHTED_ELEMENTS to setOf(),
+            )
 
-        private val COMMON_OPTIONAL_FIELDS: Array<String> = arrayOf(
-            FIELD_TAP_ACTION,
-            FIELD_CONTENT_DESCRIPTION,
-            FIELD_DATA_SOURCE,
-            FIELD_PERSISTENCE_POLICY,
-            FIELD_DISPLAY_POLICY,
-            FIELD_TIMELINE_START_TIME,
-            FIELD_TIMELINE_END_TIME,
-            FIELD_START_TIME,
-            FIELD_END_TIME,
-            FIELD_TIMELINE_ENTRIES,
-            FIELD_TIMELINE_ENTRY_TYPE,
-        )
+        private val COMMON_OPTIONAL_FIELDS: Array<String> =
+            arrayOf(
+                FIELD_TAP_ACTION,
+                FIELD_CONTENT_DESCRIPTION,
+                FIELD_DATA_SOURCE,
+                FIELD_PERSISTENCE_POLICY,
+                FIELD_DISPLAY_POLICY,
+                FIELD_TIMELINE_START_TIME,
+                FIELD_TIMELINE_END_TIME,
+                FIELD_START_TIME,
+                FIELD_END_TIME,
+                FIELD_TIMELINE_ENTRIES,
+                FIELD_TIMELINE_ENTRY_TYPE,
+            )
 
         // Used for validation. OPTIONAL_FIELDS[i] is a list containing all the fields which are
         // valid but not required for type i.
-        private val OPTIONAL_FIELDS: Map<Int, Set<String>> = mapOf(
-            TYPE_NOT_CONFIGURED to setOf(),
-            TYPE_EMPTY to setOf(),
-            TYPE_SHORT_TEXT to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SHORT_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-            ),
-            TYPE_LONG_TEXT to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_LONG_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-            ),
-            TYPE_RANGED_VALUE to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SHORT_TEXT,
-                FIELD_SHORT_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-                FIELD_COLOR_RAMP,
-                FIELD_COLOR_RAMP_INTERPOLATED,
-                FIELD_VALUE_TYPE,
-            ),
-            TYPE_ICON to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_ICON_BURN_IN_PROTECTION,
-            ),
-            TYPE_SMALL_IMAGE to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-            ),
-            TYPE_LARGE_IMAGE to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-            ),
-            TYPE_NO_PERMISSION to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SHORT_TEXT,
-                FIELD_SHORT_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-            ),
-            TYPE_NO_DATA to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_COLOR_RAMP,
-                FIELD_COLOR_RAMP_INTERPOLATED,
-                FIELD_ELEMENT_BACKGROUND_COLOR,
-                FIELD_ELEMENT_COLORS,
-                FIELD_ELEMENT_WEIGHTS,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-                FIELD_LARGE_IMAGE,
-                FIELD_LONG_TITLE,
-                FIELD_LONG_TEXT,
-                FIELD_MAX_VALUE,
-                FIELD_MIN_VALUE,
-                FIELD_PLACEHOLDER_FIELDS,
-                FIELD_PLACEHOLDER_TYPE,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_SHORT_TITLE,
-                FIELD_SHORT_TEXT,
-                FIELD_TAP_ACTION_LOST,
-                FIELD_TARGET_VALUE,
-                FIELD_VALUE,
-                FIELD_VALUE_EXPRESSION,
-                FIELD_VALUE_TYPE,
-                EXP_FIELD_LIST_ENTRIES,
-                EXP_FIELD_LIST_ENTRY_TYPE,
-                EXP_FIELD_LIST_STYLE_HINT,
-                EXP_FIELD_PROTO_LAYOUT_AMBIENT,
-                EXP_FIELD_PROTO_LAYOUT_INTERACTIVE,
-                EXP_FIELD_PROTO_LAYOUT_RESOURCES,
-            ),
-            EXP_TYPE_PROTO_LAYOUT to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-            ),
-            EXP_TYPE_LIST to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                EXP_FIELD_LIST_STYLE_HINT,
-            ),
-            TYPE_GOAL_PROGRESS to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SHORT_TEXT,
-                FIELD_SHORT_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-                FIELD_COLOR_RAMP,
-                FIELD_COLOR_RAMP_INTERPOLATED,
-            ),
-            TYPE_WEIGHTED_ELEMENTS to setOf(
-                *COMMON_OPTIONAL_FIELDS,
-                FIELD_SHORT_TEXT,
-                FIELD_SHORT_TITLE,
-                FIELD_ICON,
-                FIELD_ICON_BURN_IN_PROTECTION,
-                FIELD_SMALL_IMAGE,
-                FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
-                FIELD_IMAGE_STYLE,
-            ),
-        )
+        private val OPTIONAL_FIELDS: Map<Int, Set<String>> =
+            mapOf(
+                TYPE_NOT_CONFIGURED to setOf(),
+                TYPE_EMPTY to setOf(),
+                TYPE_SHORT_TEXT to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SHORT_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                    ),
+                TYPE_LONG_TEXT to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_LONG_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                    ),
+                TYPE_RANGED_VALUE to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SHORT_TEXT,
+                        FIELD_SHORT_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                        FIELD_COLOR_RAMP,
+                        FIELD_COLOR_RAMP_INTERPOLATED,
+                        FIELD_VALUE_TYPE,
+                    ),
+                TYPE_ICON to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                    ),
+                TYPE_SMALL_IMAGE to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                    ),
+                TYPE_LARGE_IMAGE to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                    ),
+                TYPE_NO_PERMISSION to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SHORT_TEXT,
+                        FIELD_SHORT_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                    ),
+                TYPE_NO_DATA to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_COLOR_RAMP,
+                        FIELD_COLOR_RAMP_INTERPOLATED,
+                        FIELD_ELEMENT_BACKGROUND_COLOR,
+                        FIELD_ELEMENT_COLORS,
+                        FIELD_ELEMENT_WEIGHTS,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                        FIELD_LARGE_IMAGE,
+                        FIELD_LONG_TITLE,
+                        FIELD_LONG_TEXT,
+                        FIELD_MAX_VALUE,
+                        FIELD_MIN_VALUE,
+                        FIELD_PLACEHOLDER_FIELDS,
+                        FIELD_PLACEHOLDER_TYPE,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_SHORT_TITLE,
+                        FIELD_SHORT_TEXT,
+                        FIELD_TAP_ACTION_LOST,
+                        FIELD_TARGET_VALUE,
+                        FIELD_VALUE,
+                        FIELD_VALUE_EXPRESSION,
+                        FIELD_VALUE_TYPE,
+                        EXP_FIELD_LIST_ENTRIES,
+                        EXP_FIELD_LIST_ENTRY_TYPE,
+                        EXP_FIELD_LIST_STYLE_HINT,
+                        EXP_FIELD_PROTO_LAYOUT_AMBIENT,
+                        EXP_FIELD_PROTO_LAYOUT_INTERACTIVE,
+                        EXP_FIELD_PROTO_LAYOUT_RESOURCES,
+                    ),
+                EXP_TYPE_PROTO_LAYOUT to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                    ),
+                EXP_TYPE_LIST to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        EXP_FIELD_LIST_STYLE_HINT,
+                    ),
+                TYPE_GOAL_PROGRESS to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SHORT_TEXT,
+                        FIELD_SHORT_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                        FIELD_COLOR_RAMP,
+                        FIELD_COLOR_RAMP_INTERPOLATED,
+                    ),
+                TYPE_WEIGHTED_ELEMENTS to
+                    setOf(
+                        *COMMON_OPTIONAL_FIELDS,
+                        FIELD_SHORT_TEXT,
+                        FIELD_SHORT_TITLE,
+                        FIELD_ICON,
+                        FIELD_ICON_BURN_IN_PROTECTION,
+                        FIELD_SMALL_IMAGE,
+                        FIELD_SMALL_IMAGE_BURN_IN_PROTECTION,
+                        FIELD_IMAGE_STYLE,
+                    ),
+            )
 
         @JvmField
-        val CREATOR = object : Parcelable.Creator<ComplicationData> {
-            override fun createFromParcel(source: Parcel) = ComplicationData(source)
+        val CREATOR =
+            object : Parcelable.Creator<ComplicationData> {
+                override fun createFromParcel(source: Parcel) = ComplicationData(source)
 
-            override fun newArray(size: Int): Array<ComplicationData?> = Array(size) { null }
-        }
+                override fun newArray(size: Int): Array<ComplicationData?> = Array(size) { null }
+            }
 
         fun isFieldValidForType(field: String, @ComplicationType type: Int): Boolean {
             return REQUIRED_FIELDS[type]!!.contains(field) ||
@@ -2360,9 +2383,8 @@
         private fun isTypeSupported(type: Int) = type in VALID_TYPES
 
         /**
-         * The unparceling logic needs to remain backward compatible.
-         * Validates that a value of the given field type can be assigned
-         * to the given complication type.
+         * The unparceling logic needs to remain backward compatible. Validates that a value of the
+         * given field type can be assigned to the given complication type.
          */
         internal fun checkFieldValidForTypeWithoutThrowingException(
             fieldType: String,
@@ -2385,18 +2407,15 @@
         }
 
         /** Returns whether or not we should redact complication data in toString(). */
-        @JvmStatic
-        fun shouldRedact() = !Log.isLoggable(TAG, Log.DEBUG)
+        @JvmStatic fun shouldRedact() = !Log.isLoggable(TAG, Log.DEBUG)
 
         @JvmStatic
         fun maybeRedact(unredacted: CharSequence?): String =
-            if (unredacted == null) "(null)"
-            else maybeRedact(unredacted.toString())
+            if (unredacted == null) "(null)" else maybeRedact(unredacted.toString())
 
         @JvmSynthetic
         private fun maybeRedact(unredacted: String): String =
-            if (!shouldRedact() || unredacted == PLACEHOLDER_STRING) unredacted
-            else "REDACTED"
+            if (!shouldRedact() || unredacted == PLACEHOLDER_STRING) unredacted else "REDACTED"
     }
 }
 
@@ -2416,9 +2435,8 @@
 }
 
 /** Reads an [IntArray] written with [writeIntArray]. */
-internal fun ObjectInputStream.readIntArray() = IntArray(readInt()).also {
-    for (i in it.indices) it[i] = readInt()
-}
+internal fun ObjectInputStream.readIntArray() =
+    IntArray(readInt()).also { for (i in it.indices) it[i] = readInt() }
 
 /** Writes a [FloatArray] by writing the size, then the bytes. To be used with [readFloatArray]. */
 internal fun ObjectOutputStream.writeFloatArray(value: FloatArray) {
@@ -2427,9 +2445,8 @@
 }
 
 /** Reads a [FloatArray] written with [writeFloatArray]. */
-internal fun ObjectInputStream.readFloatArray() = FloatArray(readInt()).also {
-    for (i in it.indices) it[i] = readFloat()
-}
+internal fun ObjectInputStream.readFloatArray() =
+    FloatArray(readInt()).also { for (i in it.indices) it[i] = readFloat() }
 
 /** Writes a generic [List] by writing the size, then the objects. To be used with [readList]. */
 internal fun <T> ObjectOutputStream.writeList(value: List<T>, writer: (T) -> Unit) {
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
index 6c7eea8..03ed7f6 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
@@ -29,9 +29,9 @@
 
 /**
  * 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.watchface.complications.ComplicationDataSourceInfoRetriever} can be used to
- * obtain instances of this class for each of a watch face's complications.
+ * current provider in settings). A {@link
+ * androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever} can be used to obtain
+ * instances of this class for each of a watch face's complications.
  *
  * @hide
  */
@@ -78,7 +78,9 @@
      * @param providerComponentName The component name of the complication provider
      */
     public ComplicationProviderInfo(
-            @NonNull String appName, @NonNull String providerName, @NonNull Icon providerIcon,
+            @NonNull String appName,
+            @NonNull String providerName,
+            @NonNull Icon providerIcon,
             @ComplicationData.ComplicationType int complicationType,
             @Nullable ComponentName providerComponentName) {
         this.mAppName = appName;
@@ -88,9 +90,7 @@
         this.mProviderComponentName = providerComponentName;
     }
 
-    /**
-     * Constructs a {@link ComplicationProviderInfo} from details stored in a {@link Parcel}.
-     */
+    /** Constructs a {@link ComplicationProviderInfo} from details stored in a {@link Parcel}. */
     @SuppressWarnings({"ParcelConstructor", "deprecation"})
     public ComplicationProviderInfo(@NonNull Parcel in) {
         Bundle bundle = in.readBundle(getClass().getClassLoader());
@@ -135,7 +135,7 @@
         return mProviderName;
     }
 
-    /** Sets the  name of the complication provider */
+    /** Sets the name of the complication provider */
     public void setProviderName(@NonNull String providerName) {
         mProviderName = providerName;
     }
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
index cefbd65..7020a81 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
@@ -59,7 +59,7 @@
  * <p>Instances of this class should be obtained either by calling {@link #plainText}, or by using
  * one of the provided builders: {@link TimeDifferenceBuilder} or {@link TimeFormatBuilder}.
  *
- * <p>Note this class is not thread safe.</p>
+ * <p>Note this class is not thread safe.
  *
  * @hide
  */
@@ -83,10 +83,9 @@
         } else {
             if (that.mExpression == null) {
                 return false;
-            } else if (
-                    !Arrays.equals(mExpression.toDynamicStringByteArray(),
-                            that.mExpression.toDynamicStringByteArray())
-            ) {
+            } else if (!Arrays.equals(
+                    mExpression.toDynamicStringByteArray(),
+                    that.mExpression.toDynamicStringByteArray())) {
                 return false;
             }
         }
@@ -112,31 +111,35 @@
         return Objects.hash(
                 mSurroundingText,
                 mTimeDependentText,
-                mExpression == null ?
-                        null : Arrays.hashCode(mExpression.toDynamicStringByteArray()));
+                mExpression == null
+                        ? null
+                        : Arrays.hashCode(mExpression.toDynamicStringByteArray()));
     }
 
     @NonNull
     @Override
     public String toString() {
         return "ComplicationText{"
-                + "mSurroundingText=" + ComplicationData.maybeRedact(mSurroundingText)
-                + ", mTimeDependentText=" + mTimeDependentText
-                + ", mExpression=" + mExpression + "}";
+                + "mSurroundingText="
+                + ComplicationData.maybeRedact(mSurroundingText)
+                + ", mTimeDependentText="
+                + mTimeDependentText
+                + ", mExpression="
+                + mExpression
+                + "}";
     }
 
     /** @hide */
     @IntDef({
-            DIFFERENCE_STYLE_STOPWATCH,
-            DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
+        DIFFERENCE_STYLE_STOPWATCH,
+        DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+        DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+        DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+        DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
     })
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @Retention(RetentionPolicy.SOURCE)
-    public @interface TimeDifferenceStyle {
-    }
+    public @interface TimeDifferenceStyle {}
 
     /**
      * Style for time differences shown in a numeric fashion like a timer.
@@ -235,8 +238,7 @@
     @IntDef({FORMAT_STYLE_DEFAULT, FORMAT_STYLE_UPPER_CASE, FORMAT_STYLE_LOWER_CASE})
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @Retention(RetentionPolicy.SOURCE)
-    public @interface TimeFormatStyle {
-    }
+    public @interface TimeFormatStyle {}
 
     /** Style where the formatted date/time should be shown unchanged. */
     public static final int FORMAT_STYLE_DEFAULT = 1;
@@ -282,24 +284,21 @@
      * #mTimeDependentText} is not null, getText will return this text with {@code ^1} replaced by
      * the time-dependent string.
      */
-    @Nullable
-    private final CharSequence mSurroundingText;
+    @Nullable private final CharSequence mSurroundingText;
 
     /**
      * The time-dependent part of the complication text. If {@link #mSurroundingText} is null, this
      * must be not null and {@link #getTextAt} will return just the time-dependent value relative to
      * the given time.
      */
-    @Nullable
-    private final TimeDependentText mTimeDependentText;
+    @Nullable private final TimeDependentText mTimeDependentText;
 
     /** A {@link DynamicString} which will be evaluated by the system on the WatchFace's behalf. */
-    @Nullable
-    private final DynamicString mExpression;
+    @Nullable private final DynamicString mExpression;
 
     /** Used to replace occurrences of ^1 with time dependent text and ignore ^[2-9]. */
     private final CharSequence[] mTemplateValues =
-            new CharSequence[]{"", "^2", "^3", "^4", "^5", "^6", "^7", "^8", "^9"};
+            new CharSequence[] {"", "^2", "^3", "^4", "^5", "^6", "^7", "^8", "^9"};
 
     /** The timestamp of the stored TimeDependentText in the cache. */
     private long mDependentTextCacheTime;
@@ -317,21 +316,21 @@
     }
 
     public ComplicationText(@NonNull CharSequence surroundingText) {
-        this(surroundingText, /* timeDependentText = */ null, /* expression = */ null);
+        this(surroundingText, /* timeDependentText= */ null, /* expression= */ null);
     }
 
     public ComplicationText(
             @NonNull CharSequence surroundingText, @NonNull TimeDependentText timeDependentText) {
-        this(surroundingText, timeDependentText, /* expression = */ null);
+        this(surroundingText, timeDependentText, /* expression= */ null);
     }
 
     public ComplicationText(
             @NonNull CharSequence surroundingText, @NonNull DynamicString expression) {
-        this(surroundingText, /* timeDependentText = */ null, expression);
+        this(surroundingText, /* timeDependentText= */ null, expression);
     }
 
     public ComplicationText(@NonNull DynamicString expression) {
-        this(/* surroundingText = */ null, /* timeDependentText = */ null, expression);
+        this(/* surroundingText= */ null, /* timeDependentText= */ null, expression);
     }
 
     private ComplicationText(@NonNull Parcel in) {
@@ -376,7 +375,8 @@
         TimeDependentText mTimeDependentText;
         DynamicString mExpression;
 
-        SerializedForm(@Nullable CharSequence surroundingText,
+        SerializedForm(
+                @Nullable CharSequence surroundingText,
                 @Nullable TimeDependentText timeDependentText,
                 @Nullable DynamicString expression) {
             mSurroundingText = surroundingText;
@@ -449,7 +449,7 @@
     /**
      * Writes this {@link ComplicationProviderInfo} to a {@link Parcel}.
      *
-     * @param out   The {@link Parcel} to write to
+     * @param out The {@link Parcel} to write to
      * @param flags Flags for writing the {@link Parcel}
      */
     @Override
@@ -469,8 +469,8 @@
                 bundle.putInt(KEY_DIFFERENCE_STYLE, timeDiffText.getStyle());
                 bundle.putBoolean(KEY_DIFFERENCE_SHOW_NOW_TEXT, timeDiffText.shouldShowNowText());
                 if (timeDiffText.getMinimumUnit() != null) {
-                    bundle.putString(KEY_DIFFERENCE_MINIMUM_UNIT,
-                            timeDiffText.getMinimumUnit().name());
+                    bundle.putString(
+                            KEY_DIFFERENCE_MINIMUM_UNIT, timeDiffText.getMinimumUnit().name());
                 }
             } else if (mTimeDependentText instanceof TimeFormatText) {
                 TimeFormatText timeFormatText = (TimeFormatText) mTimeDependentText;
@@ -495,8 +495,8 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public TimeDependentText getTimeDependentText() {
         if (mExpression != null) {
-            throw new UnsupportedOperationException("getTimeDependentText not supported for "
-                    + "StringExpressions");
+            throw new UnsupportedOperationException(
+                    "getTimeDependentText not supported for " + "StringExpressions");
         }
         assert mTimeDependentText != null;
         return mTimeDependentText;
@@ -505,13 +505,13 @@
     /**
      * 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
-     * {@code referencePeriodStart} then the text returned will represent the time difference
-     * between {@code referencePeriodStart} and {@code dateTimeMillis}. If the time is after
-     * {@code referencePeriodEnd} then the text returned will represent the time difference
-     * between {@code referencePeriodStart} and {@code dateTimeMillis}.
+     * returned will be "now" (localised to the default locale). If the time is before {@code
+     * referencePeriodStart} then the text returned will represent the time difference between
+     * {@code referencePeriodStart} and {@code dateTimeMillis}. If the time is after {@code
+     * referencePeriodEnd} then the text returned will represent the time difference between {@code
+     * referencePeriodStart} and {@code dateTimeMillis}.
      *
-     * @param resources      {@link Resources} from the current {@link Context}
+     * @param resources {@link Resources} from the current {@link Context}
      * @param dateTimeMillis milliseconds since epoch, e.g. from {@link System#currentTimeMillis}
      * @return Text appropriate for the given date time.
      */
@@ -519,8 +519,8 @@
     @Override
     public CharSequence getTextAt(@NonNull Resources resources, long dateTimeMillis) {
         if (mExpression != null && mTimeDependentText == null && mSurroundingText == null) {
-            throw new UnsupportedOperationException("getTextAt not supported for "
-                    + "StringExpressions");
+            throw new UnsupportedOperationException(
+                    "getTextAt not supported for " + "StringExpressions");
         }
 
         if (mTimeDependentText == null) {
@@ -609,9 +609,9 @@
      * Returns a ComplicationText object that will display the given {@code text} for any input
      * time.
      *
-     * <p>If the text contains spans, some of them may not be rendered by
-     * {@link androidx.wear.watchface.complications.rendering.ComplicationDrawable}. Supported spans
-     * are {@link ForegroundColorSpan}, {@link LocaleSpan}, {@link SubscriptSpan}, {@link
+     * <p>If the text contains spans, some of them may not be rendered by {@link
+     * androidx.wear.watchface.complications.rendering.ComplicationDrawable}. Supported spans are
+     * {@link ForegroundColorSpan}, {@link LocaleSpan}, {@link SubscriptSpan}, {@link
      * SuperscriptSpan}, {@link StyleSpan}, {@link StrikethroughSpan}, {@link TypefaceSpan} and
      * {@link UnderlineSpan}.
      *
@@ -649,27 +649,21 @@
 
         private long mReferencePeriodStartMillis = NO_PERIOD_START;
         private long mReferencePeriodEndMillis = NO_PERIOD_END;
-        @TimeDifferenceStyle
-        private int mStyle = ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT;
+        @TimeDifferenceStyle private int mStyle = ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT;
         private CharSequence mSurroundingText;
         private Boolean mShowNowText;
         private TimeUnit mMinimumUnit;
 
-        public TimeDifferenceBuilder() {
-        }
+        public TimeDifferenceBuilder() {}
 
         /**
          * @param referencePeriodStartMillis The start of the reference period (in milliseconds
-         *                                   since the epoch) from which the time difference will
-         *                                   be calculated.
-         * @param referencePeriodEndMillis   The end of the reference period (in milliseconds since
-         *                                   the epoch) from which the time difference will be
-         *                                   calculated.
+         *     since the epoch) from which the time difference will be calculated.
+         * @param referencePeriodEndMillis The end of the reference period (in milliseconds since
+         *     the epoch) from which the time difference will be calculated.
          */
         public TimeDifferenceBuilder(
-                long referencePeriodStartMillis,
-                long referencePeriodEndMillis
-        ) {
+                long referencePeriodStartMillis, long referencePeriodEndMillis) {
             mReferencePeriodStartMillis = referencePeriodStartMillis;
             mReferencePeriodEndMillis = referencePeriodEndMillis;
         }
@@ -679,7 +673,7 @@
          * Defaults to 0, effectively making the period unbounded at the start.
          *
          * @param refPeriodStartMillis the end of the reference period, given as UTC milliseconds
-         *                             since the epoch.
+         *     since the epoch.
          * @return this builder for chaining.
          */
         @NonNull
@@ -696,7 +690,7 @@
          * Defaults to {@code Long.MAX_VALUE}, effectively making the period unbounded at the end.
          *
          * @param refPeriodEndMillis the end of the reference period, given as UTC milliseconds
-         *                           since the epoch.
+         *     since the epoch.
          * @return this builder for chaining.
          */
         @NonNull
@@ -740,7 +734,7 @@
          * {@link UnderlineSpan}.
          *
          * @param surroundingText text within which the time difference value will be displayed,
-         *                        with {@code ^1} in place of the time difference.
+         *     with {@code ^1} in place of the time difference.
          * @return this builder for chaining.
          */
         @NonNull
@@ -815,8 +809,7 @@
      */
     public static final class TimeFormatBuilder {
         private String mFormat;
-        @TimeFormatStyle
-        private int mStyle = ComplicationText.FORMAT_STYLE_DEFAULT;
+        @TimeFormatStyle private int mStyle = ComplicationText.FORMAT_STYLE_DEFAULT;
         private CharSequence mSurroundingText;
         private TimeZone mTimeZone;
 
@@ -848,20 +841,20 @@
         /**
          * Sets the string within which the time difference will be displayed. This is optional.
          *
-         * <p>Within the text, {@code ^1} will be replaced with the time format, so for example
-         * to show a result like {@code "10:00: meeting"} the surrounding text would be {@code "^1:
+         * <p>Within the text, {@code ^1} will be replaced with the time format, so for example to
+         * show a result like {@code "10:00: meeting"} the surrounding text would be {@code "^1:
          * meeting"}.
          *
          * <p>To use the {@code ^} character within the text, escape it as {@code ^^}.
          *
-         * <p>If the text contains spans, some of them may not be rendered by
-         * {@link androidx.wear.watchface.complications.rendering.ComplicationDrawable}. Supported
-         * spans are {@link ForegroundColorSpan}, {@link LocaleSpan}, {@link SubscriptSpan}, {@link
+         * <p>If the text contains spans, some of them may not be rendered by {@link
+         * androidx.wear.watchface.complications.rendering.ComplicationDrawable}. Supported spans
+         * are {@link ForegroundColorSpan}, {@link LocaleSpan}, {@link SubscriptSpan}, {@link
          * SuperscriptSpan}, {@link StyleSpan}, {@link StrikethroughSpan}, {@link TypefaceSpan} and
          * {@link UnderlineSpan}.
          *
          * @param surroundingText string within which the time difference value will be displayed,
-         *                        with {@code ^1} in place of the time difference.
+         *     with {@code ^1} in place of the time difference.
          * @return this builder for chaining.
          */
         @NonNull
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationTextTemplate.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationTextTemplate.java
index 27a3827..f4376a6 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationTextTemplate.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationTextTemplate.java
@@ -81,8 +81,7 @@
     private final ComplicationText[] mComplicationTexts;
 
     ComplicationTextTemplate(
-            @Nullable CharSequence surroundingText,
-            @NonNull ComplicationText[] complicationTexts) {
+            @Nullable CharSequence surroundingText, @NonNull ComplicationText[] complicationTexts) {
         mSurroundingText = surroundingText;
         mComplicationTexts = complicationTexts;
         checkFields();
@@ -225,10 +224,10 @@
          *
          * <p>If not specified, the texts will be concatenated together, separated by spaces.
          *
-         * <p>If the text contains spans, some of them may not be rendered by
-         * {@link ComplicationDrawable}. Supported spans are {@link ForegroundColorSpan},
-         * {@link LocaleSpan}, {@link SubscriptSpan}, {@link SuperscriptSpan}, {@link StyleSpan},
-         * {@link StrikethroughSpan}, {@link TypefaceSpan} and {@link UnderlineSpan}.
+         * <p>If the text contains spans, some of them may not be rendered by {@link
+         * ComplicationDrawable}. Supported spans are {@link ForegroundColorSpan}, {@link
+         * LocaleSpan}, {@link SubscriptSpan}, {@link SuperscriptSpan}, {@link StyleSpan}, {@link
+         * StrikethroughSpan}, {@link TypefaceSpan} and {@link UnderlineSpan}.
          *
          * @param surroundingText string template
          * @return this builder for chaining
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/IconSerializableHelper.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/IconSerializableHelper.java
index 4dea811..acb56d7 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/IconSerializableHelper.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/IconSerializableHelper.java
@@ -105,8 +105,8 @@
 
             case Icon.TYPE_BITMAP:
             case Icon.TYPE_ADAPTIVE_BITMAP:
-                return Icon.createWithBitmap(BitmapFactory.decodeByteArray(mBitmap, 0,
-                        mBitmap.length));
+                return Icon.createWithBitmap(
+                        BitmapFactory.decodeByteArray(mBitmap, 0, mBitmap.length));
 
             default:
                 return null;
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
index 5284261..37d751b 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
@@ -51,13 +51,11 @@
     private final long mReferencePeriodStart;
     private final long mReferencePeriodEnd;
 
-    @ComplicationText.TimeDifferenceStyle
-    private final int mStyle;
+    @ComplicationText.TimeDifferenceStyle private final int mStyle;
 
     private final boolean mShowNowText;
 
-    @Nullable
-    private final TimeUnit mMinimumUnit;
+    @Nullable private final TimeUnit mMinimumUnit;
 
     public TimeDifferenceText(
             long referencePeriodStart,
@@ -78,14 +76,16 @@
         if (o == null || getClass() != o.getClass()) return false;
         TimeDifferenceText that = (TimeDifferenceText) o;
         return mReferencePeriodStart == that.mReferencePeriodStart
-                && mReferencePeriodEnd == that.mReferencePeriodEnd && mStyle == that.mStyle
-                && mShowNowText == that.mShowNowText && mMinimumUnit == that.mMinimumUnit;
+                && mReferencePeriodEnd == that.mReferencePeriodEnd
+                && mStyle == that.mStyle
+                && mShowNowText == that.mShowNowText
+                && mMinimumUnit == that.mMinimumUnit;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mReferencePeriodStart, mReferencePeriodEnd, mStyle, mShowNowText,
-                mMinimumUnit);
+        return Objects.hash(
+                mReferencePeriodStart, mReferencePeriodEnd, mStyle, mShowNowText, mMinimumUnit);
     }
 
     @NonNull
@@ -94,23 +94,28 @@
         if (ComplicationData.shouldRedact()) {
             return "TimeDifferenceText{Redacted}";
         }
-        return "TimeDifferenceText{mReferencePeriodStart=" + mReferencePeriodStart
-                + ", mReferencePeriodEnd=" + mReferencePeriodEnd
-                + ", mStyle=" + mStyle  + ", mShowNowText=" + mShowNowText
-                + ", mMinimumUnit=" + mMinimumUnit + '}';
+        return "TimeDifferenceText{mReferencePeriodStart="
+                + mReferencePeriodStart
+                + ", mReferencePeriodEnd="
+                + mReferencePeriodEnd
+                + ", mStyle="
+                + mStyle
+                + ", mShowNowText="
+                + mShowNowText
+                + ", mMinimumUnit="
+                + mMinimumUnit
+                + '}';
     }
 
     private static class SerializedForm implements Serializable {
         long mReferencePeriodStart;
         long mReferencePeriodEnd;
 
-        @ComplicationText.TimeDifferenceStyle
-        int mStyle;
+        @ComplicationText.TimeDifferenceStyle int mStyle;
 
         boolean mShowNowText;
 
-        @Nullable
-        TimeUnit mMinimumUnit;
+        @Nullable TimeUnit mMinimumUnit;
 
         SerializedForm(
                 long referencePeriodStart,
@@ -126,14 +131,14 @@
         }
 
         Object readResolve() {
-            return new TimeDifferenceText(mReferencePeriodStart, mReferencePeriodEnd, mStyle,
-                    mShowNowText, mMinimumUnit);
+            return new TimeDifferenceText(
+                    mReferencePeriodStart, mReferencePeriodEnd, mStyle, mShowNowText, mMinimumUnit);
         }
     }
 
     Object writeReplace() {
-        return new SerializedForm(mReferencePeriodStart, mReferencePeriodEnd, mStyle,
-                mShowNowText, mMinimumUnit);
+        return new SerializedForm(
+                mReferencePeriodStart, mReferencePeriodEnd, mStyle, mShowNowText, mMinimumUnit);
     }
 
     private void readObject(ObjectInputStream stream) throws InvalidObjectException {
@@ -179,9 +184,7 @@
         return divRoundingUp(fromTime, precision) * precision + 1;
     }
 
-    /**
-     * Returns the time precision in milliseconds.
-     */
+    /** Returns the time precision in milliseconds. */
     public long getPrecision() {
         long defaultPrecision;
         switch (mStyle) {
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeFormatText.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeFormatText.java
index 20d958f..c448b66 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeFormatText.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeFormatText.java
@@ -46,9 +46,10 @@
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         TimeFormatText that = (TimeFormatText) o;
-        return mStyle == that.mStyle && mTimePrecision == that.mTimePrecision
-                && Objects.equals(mDateFormat, that.mDateFormat) && Objects.equals(
-                mTimeZone, that.mTimeZone)
+        return mStyle == that.mStyle
+                && mTimePrecision == that.mTimePrecision
+                && Objects.equals(mDateFormat, that.mDateFormat)
+                && Objects.equals(mTimeZone, that.mTimeZone)
                 && Objects.equals(mDate.toString(), that.mDate.toString());
     }
 
@@ -63,9 +64,17 @@
         if (ComplicationData.shouldRedact()) {
             return "TimeFormatText{Redacted}";
         }
-        return "TimeFormatText{mDateFormat=" + mDateFormat
-                + ", mStyle=" + mStyle + ", mTimeZone=" + mTimeZone + ", mDate=" + mDate
-                + ", mTimePrecision=" + mTimePrecision + '}';
+        return "TimeFormatText{mDateFormat="
+                + mDateFormat
+                + ", mStyle="
+                + mStyle
+                + ", mTimeZone="
+                + mTimeZone
+                + ", mDate="
+                + mDate
+                + ", mTimePrecision="
+                + mTimePrecision
+                + '}';
     }
 
     private static class DateTimeFormat {
@@ -79,23 +88,23 @@
     }
 
     private static final DateTimeFormat[] DATE_TIME_FORMATS = {
-            new DateTimeFormat(new String[]{"S", "s"}, TimeUnit.SECONDS.toMillis(1)),
-            new DateTimeFormat(new String[]{"m"}, TimeUnit.MINUTES.toMillis(1)),
-            new DateTimeFormat(new String[]{"H", "K", "h", "k", "j", "J", "C"},
-                    TimeUnit.HOURS.toMillis(1)),
-            new DateTimeFormat(new String[]{"a", "b", "B"}, TimeUnit.HOURS.toMillis(12)),
+        new DateTimeFormat(new String[] {"S", "s"}, TimeUnit.SECONDS.toMillis(1)),
+        new DateTimeFormat(new String[] {"m"}, TimeUnit.MINUTES.toMillis(1)),
+        new DateTimeFormat(
+                new String[] {"H", "K", "h", "k", "j", "J", "C"}, TimeUnit.HOURS.toMillis(1)),
+        new DateTimeFormat(new String[] {"a", "b", "B"}, TimeUnit.HOURS.toMillis(12)),
     };
 
     private final SimpleDateFormat mDateFormat;
 
-    @ComplicationText.TimeFormatStyle
-    private final int mStyle;
+    @ComplicationText.TimeFormatStyle private final int mStyle;
     private final TimeZone mTimeZone;
     private final Date mDate;
     private long mTimePrecision;
 
     public TimeFormatText(
-            @NonNull String format, @ComplicationText.TimeFormatStyle int style,
+            @NonNull String format,
+            @ComplicationText.TimeFormatStyle int style,
             @Nullable TimeZone timeZone) {
         if (format == null) {
             throw new IllegalArgumentException("Format must be specified.");
@@ -112,7 +121,8 @@
         mDate = new Date();
     }
 
-    TimeFormatText(SimpleDateFormat dateFormat,
+    TimeFormatText(
+            SimpleDateFormat dateFormat,
             @ComplicationText.TimeFormatStyle int style,
             TimeZone timeZone,
             long timePrecision) {
@@ -125,13 +135,14 @@
 
     private static class SerializedForm implements Serializable {
         SimpleDateFormat mDateFormat;
-        @ComplicationText.TimeFormatStyle
-        int mStyle;
+        @ComplicationText.TimeFormatStyle int mStyle;
         TimeZone mTimeZone;
         long mTimePrecision;
 
-        SerializedForm(@NonNull SimpleDateFormat dateFormat,
-                @ComplicationText.TimeFormatStyle int style, @Nullable TimeZone timeZone,
+        SerializedForm(
+                @NonNull SimpleDateFormat dateFormat,
+                @ComplicationText.TimeFormatStyle int style,
+                @Nullable TimeZone timeZone,
                 long timePrecision) {
             mDateFormat = dateFormat;
             mStyle = style;
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/package-info.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/package-info.java
index 7aa7905..7ccf319 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/package-info.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/package-info.java
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(LIBRARY_GROUP)
 package android.support.wearable.complications;
 
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluator.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluator.kt
index afa5db9..44aa387 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluator.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluator.kt
@@ -16,22 +16,32 @@
 
 package androidx.wear.watchface.complications.data
 
+import android.icu.util.ULocale
 import android.support.wearable.complications.ComplicationData as WireComplicationData
-import androidx.annotation.GuardedBy
+import android.support.wearable.complications.ComplicationText as WireComplicationText
 import androidx.annotation.RestrictTo
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat
+import androidx.wear.protolayout.expression.pipeline.BoundDynamicType
+import androidx.wear.protolayout.expression.pipeline.DynamicTypeEvaluator
+import androidx.wear.protolayout.expression.pipeline.DynamicTypeValueReceiver
+import androidx.wear.protolayout.expression.pipeline.ObservableStateStore
+import androidx.wear.protolayout.expression.pipeline.sensor.SensorGateway
 import java.util.concurrent.Executor
 import java.util.function.Consumer
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.asCoroutineDispatcher
-import kotlinx.coroutines.cancel
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.update
 
 /**
- * Evaluates a [WireComplicationData] with [androidx.wear.remote.expr.DynamicBuilders.DynamicType]
- * within its fields.
+ * Evaluates a [WireComplicationData] with
+ * [androidx.wear.protolayout.expression.DynamicBuilders.DynamicType] within its fields.
  *
  * Due to [WireComplicationData]'s shallow copy strategy the input is modified in-place.
  *
@@ -40,7 +50,35 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 class ComplicationDataExpressionEvaluator(
     val unevaluatedData: WireComplicationData,
+    private val sensorGateway: SensorGateway? = null,
+    private val stateStore: ObservableStateStore = ObservableStateStore(emptyMap()),
 ) : AutoCloseable {
+    /**
+     * Java compatibility class for [ComplicationDataExpressionEvaluator].
+     *
+     * Unlike [data], [listener] is not invoked until there is a value (until [data] is non-null).
+     */
+    class Compat(
+        val unevaluatedData: WireComplicationData,
+        private val executor: Executor,
+        private val listener: Consumer<WireComplicationData>,
+    ) : AutoCloseable {
+        private val evaluator = ComplicationDataExpressionEvaluator(unevaluatedData)
+
+        /** @see ComplicationDataExpressionEvaluator.init */
+        fun init() {
+            evaluator.init()
+            evaluator.data
+                .filterNotNull()
+                .onEach(listener::accept)
+                .launchIn(CoroutineScope(executor.asCoroutineDispatcher()))
+        }
+
+        /** @see ComplicationDataExpressionEvaluator.close */
+        override fun close() {
+            evaluator.close()
+        }
+    }
 
     private val _data = MutableStateFlow<WireComplicationData?>(null)
 
@@ -50,46 +88,169 @@
      */
     val data: StateFlow<WireComplicationData?> = _data.asStateFlow()
 
-    @GuardedBy("listeners")
-    private val listeners = mutableMapOf<Listener, CoroutineScope>()
-
-    /** Parses the expression and starts async evaluation. */
-    fun init() {
-        // TODO(b/260065006): Use real implementation.
-        _data.value = unevaluatedData
-    }
+    @Volatile // In case init() and close() are called on different threads.
+    private lateinit var evaluator: DynamicTypeEvaluator
+    private val state = MutableStateFlow(State(unevaluatedData))
 
     /**
-     * Java equivalent for `data.collect { ... }`, except it is not invoked for the initial value.
+     * Parses the expression and starts blocking evaluation.
+     *
+     * This needs to be called exactly once.
      */
-    fun addListener(executor: Executor, listener: Listener) {
-        synchronized(listeners) {
-            listeners[listener] = CoroutineScope(executor.asCoroutineDispatcher()).apply {
-                launch {
-                    data.collect {
-                        if (it != null) listener.accept(it)
-                    }
-                }
-            }
-        }
-    }
-
-    fun removeListener(listener: Listener) {
-        synchronized(listeners) {
-            listeners.remove(listener)?.cancel()
-        }
+    fun init() {
+        // Add all the receivers before we start binding them because binding can synchronously
+        // trigger the receiver, which would update the data before all the fields are evaluated.
+        initStateReceivers()
+        initEvaluator()
+        monitorState()
     }
 
     /**
      * Stops evaluation.
      *
-     * [data] will not change after this is called, and listeners will not be invoked (also
-     * equivalent to calling [removeListener] on all listeners).
+     * [data] will not change after this is called.
      */
     override fun close() {
-        // TODO(b/260065006): Use real implementation.
-        listeners.keys.forEach(this::removeListener)
+        for (receiver in state.value.all) receiver.close()
+        if (this::evaluator.isInitialized) evaluator.close()
+    }
+
+    /** Adds [ComplicationEvaluationResultReceiver]s to [state]. */
+    private fun initStateReceivers() {
+        val receivers = mutableSetOf<ComplicationEvaluationResultReceiver<out Any>>()
+
+        if (unevaluatedData.hasRangedValueExpression()) {
+            unevaluatedData.rangedValueExpression
+                ?.buildReceiver { setRangedValue(it) }
+                ?.let { receivers += it }
+        }
+        if (unevaluatedData.hasLongText()) {
+            unevaluatedData.longText?.buildReceiver { setLongText(it) }?.let { receivers += it }
+        }
+        if (unevaluatedData.hasLongTitle()) {
+            unevaluatedData.longTitle?.buildReceiver { setLongTitle(it) }?.let { receivers += it }
+        }
+        if (unevaluatedData.hasShortText()) {
+            unevaluatedData.shortText?.buildReceiver { setShortText(it) }?.let { receivers += it }
+        }
+        if (unevaluatedData.hasShortTitle()) {
+            unevaluatedData.shortTitle?.buildReceiver { setShortTitle(it) }?.let { receivers += it }
+        }
+        if (unevaluatedData.hasContentDescription()) {
+            unevaluatedData.contentDescription
+                ?.buildReceiver { setContentDescription(it) }
+                ?.let { receivers += it }
+        }
+
+        state.value = State(unevaluatedData, receivers)
+    }
+
+    private fun DynamicFloat.buildReceiver(
+        setter: WireComplicationData.Builder.(Float) -> WireComplicationData.Builder
+    ) =
+        ComplicationEvaluationResultReceiver(
+            setter,
+            binder = { receiver -> evaluator.bind(this@buildReceiver, receiver) },
+        )
+
+    private fun WireComplicationText.buildReceiver(
+        setter: WireComplicationData.Builder.(WireComplicationText) -> WireComplicationData.Builder
+    ) =
+        stringExpression?.let { stringExpression ->
+            ComplicationEvaluationResultReceiver<String>(
+                setter = { setter(WireComplicationText(it, stringExpression)) },
+                binder = { receiver ->
+                    evaluator.bind(stringExpression, ULocale.getDefault(), receiver)
+                },
+            )
+        }
+
+    /** Initializes the internal [DynamicTypeEvaluator] if there are pending receivers. */
+    private fun initEvaluator() {
+        if (state.value.pending.isEmpty()) return
+        evaluator =
+            DynamicTypeEvaluator(
+                /* platformDataSourcesInitiallyEnabled = */ true,
+                sensorGateway,
+                stateStore,
+            )
+        for (receiver in state.value.pending) receiver.bind()
+        evaluator.enablePlatformDataSources()
+    }
+
+    /** Monitors [state] changes and updates [data]. */
+    private fun monitorState() {
+        state
+            .onEach {
+                if (it.invalid.isNotEmpty()) _data.value = INVALID_DATA
+                else if (it.pending.isEmpty()) _data.value = it.data
+            }
+            .launchIn(CoroutineScope(Dispatchers.Main))
+    }
+
+    /**
+     * Holds the state of the continuously evaluated [WireComplicationData] and the various
+     * [ComplicationEvaluationResultReceiver] that are evaluating it.
+     */
+    private class State(
+        val data: WireComplicationData,
+        val pending: Set<ComplicationEvaluationResultReceiver<out Any>> = setOf(),
+        val invalid: Set<ComplicationEvaluationResultReceiver<out Any>> = setOf(),
+        val complete: Set<ComplicationEvaluationResultReceiver<out Any>> = setOf(),
+    ) {
+        val all = pending + invalid + complete
+
+        fun withInvalid(receiver: ComplicationEvaluationResultReceiver<out Any>) =
+            State(data, pending - receiver, invalid + receiver, complete - receiver)
+
+        fun withComplete(
+            data: WireComplicationData,
+            receiver: ComplicationEvaluationResultReceiver<out Any>,
+        ) = State(data, pending - receiver, invalid - receiver, complete + receiver)
+    }
+
+    private inner class ComplicationEvaluationResultReceiver<T : Any>(
+        private val setter: WireComplicationData.Builder.(T) -> WireComplicationData.Builder,
+        private val binder: (ComplicationEvaluationResultReceiver<T>) -> BoundDynamicType,
+    ) : DynamicTypeValueReceiver<T>, AutoCloseable {
+        @Volatile // In case bind() and close() are called on different threads.
+        private lateinit var boundDynamicType: BoundDynamicType
+
+        fun bind() {
+            boundDynamicType = binder(this)
+        }
+
+        override fun close() {
+            boundDynamicType.close()
+        }
+
+        override fun onPreUpdate() {}
+
+        override fun onData(newData: T) {
+            state.update {
+                it.withComplete(
+                    setter(WireComplicationData.Builder(it.data), newData).build(),
+                    this
+                )
+            }
+        }
+
+        override fun onInvalidated() {
+            state.update { it.withInvalid(this) }
+        }
+    }
+
+    companion object {
+        val INVALID_DATA: WireComplicationData = NoDataComplicationData().asWireComplicationData()
+
+        fun hasExpression(data: WireComplicationData): Boolean =
+            data.run {
+                (hasRangedValueExpression() && rangedValueExpression != null) ||
+                    (hasLongText() && longText?.stringExpression != null) ||
+                    (hasLongTitle() && longTitle?.stringExpression != null) ||
+                    (hasShortText() && shortText?.stringExpression != null) ||
+                    (hasShortTitle() && shortTitle?.stringExpression != null) ||
+                    (hasContentDescription() && contentDescription?.stringExpression != null)
+            }
     }
 }
-
-private typealias Listener = Consumer<WireComplicationData>
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationExperimental.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationExperimental.kt
index 81942d7..ed792d6 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationExperimental.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/ComplicationExperimental.kt
@@ -16,8 +16,6 @@
 
 package androidx.wear.watchface.complications.data
 
-@RequiresOptIn(
-    "This is an experimental API that may change or be removed without warning."
-)
+@RequiresOptIn("This is an experimental API that may change or be removed without warning.")
 @Retention(AnnotationRetention.BINARY)
 annotation class ComplicationExperimental
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
index 444a7d1..f9c57aa 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
@@ -18,13 +18,13 @@
 
 package androidx.wear.watchface.complications.data
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
-import android.support.wearable.complications.ComplicationData.Builder as WireComplicationDataBuilder
 import android.app.PendingIntent
 import android.content.ComponentName
 import android.graphics.Color
 import android.graphics.drawable.Icon
 import android.os.Build
+import android.support.wearable.complications.ComplicationData as WireComplicationData
+import android.support.wearable.complications.ComplicationData.Builder as WireComplicationDataBuilder
 import android.util.Log
 import androidx.annotation.ColorInt
 import androidx.annotation.FloatRange
@@ -42,9 +42,7 @@
 
 internal const val TAG = "Data.kt"
 
-/**
- * The policies that control complication persistence.
- */
+/** The policies that control complication persistence. */
 public object ComplicationPersistencePolicies {
     /** The default policy is that persistence/caching is allowed. */
     public const val CACHING_ALLOWED: Int = 0
@@ -59,16 +57,15 @@
 /** @hide */
 @IntDef(
     flag = true, // This is a flag to allow for future expansion.
-    value = [
-        ComplicationPersistencePolicies.CACHING_ALLOWED,
-        ComplicationPersistencePolicies.DO_NOT_PERSIST
-    ]
+    value =
+        [
+            ComplicationPersistencePolicies.CACHING_ALLOWED,
+            ComplicationPersistencePolicies.DO_NOT_PERSIST
+        ]
 )
 public annotation class ComplicationPersistencePolicy
 
-/**
- * The policies that control when complications should be displayed.
- */
+/** The policies that control when complications should be displayed. */
 public object ComplicationDisplayPolicies {
     /** The default policy is that the complication should always be shown. */
     public const val ALWAYS_DISPLAY: Int = 0
@@ -80,10 +77,11 @@
 /** @hide */
 @IntDef(
     flag = true, // This is a flag to allow for future expansion.
-    value = [
-        ComplicationDisplayPolicies.ALWAYS_DISPLAY,
-        ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED
-    ]
+    value =
+        [
+            ComplicationDisplayPolicies.ALWAYS_DISPLAY,
+            ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED
+        ]
 )
 public annotation class ComplicationDisplayPolicy
 
@@ -93,23 +91,24 @@
  * Please note to aid unit testing of ComplicationDataSourceServices, [equals], [hashCode] and
  * [toString] have been overridden for all the types of ComplicationData, however due to the
  * embedded [Icon] class we have to fall back to reference equality and hashing below API 28 and
- * also for the [Icon]s that don't use either a resource or a uri (these should be rare but they
- * can exist).
+ * also for the [Icon]s that don't use either a resource or a uri (these should be rare but they can
+ * exist).
  *
  * @property type The [ComplicationType] of this complication data.
  * @property tapAction The [PendingIntent] to send when the complication is tapped on.
  * @property validTimeRange The [TimeRange] within which the complication should be displayed.
- * Whether the complication is active and should be displayed at the given time should be
- * checked with [TimeRange.contains].
+ *   Whether the complication is active and should be displayed at the given time should be checked
+ *   with [TimeRange.contains].
  * @property dataSource The [ComponentName] of the
- * [androidx.wear.watchface.complications.datasource.ComplicationDataSourceService] that provided
- * the ComplicationData. This may be `null` when run on old systems.
+ *   [androidx.wear.watchface.complications.datasource.ComplicationDataSourceService] that provided
+ *   the ComplicationData. This may be `null` when run on old systems.
  * @property persistencePolicy The [ComplicationPersistencePolicy] for this complication. This
- * requires the watchface to be built with a compatible library to work.
+ *   requires the watchface to be built with a compatible library to work.
  * @property displayPolicy The [ComplicationDisplayPolicy] for this complication. This requires the
- * watchface to be built with a compatible library to work.
+ *   watchface to be built with a compatible library to work.
  */
-public sealed class ComplicationData constructor(
+public sealed class ComplicationData
+constructor(
     public val type: ComplicationType,
     public val tapAction: PendingIntent?,
     internal var cachedWireComplicationData: WireComplicationData?,
@@ -138,7 +137,9 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun asWireComplicationData(): WireComplicationData {
-        cachedWireComplicationData?.let { return it }
+        cachedWireComplicationData?.let {
+            return it
+        }
         return createWireComplicationDataBuilder()
             .apply { fillWireComplicationDataBuilder(this) }
             .build()
@@ -146,9 +147,8 @@
     }
 
     internal fun createWireComplicationDataBuilder(): WireComplicationDataBuilder =
-        cachedWireComplicationData?.let {
-            WireComplicationDataBuilder(it)
-        } ?: WireComplicationDataBuilder(type.toWireComplicationType())
+        cachedWireComplicationData?.let { WireComplicationDataBuilder(it) }
+            ?: WireComplicationDataBuilder(type.toWireComplicationType())
 
     internal open fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {
         builder.setDataSource(dataSource)
@@ -175,11 +175,11 @@
     public open fun getNextChangeInstant(afterInstant: Instant): Instant = Instant.MAX
 
     override fun equals(other: Any?): Boolean =
-        other is ComplicationData &&
-            asWireComplicationData() == other.asWireComplicationData()
+        other is ComplicationData && asWireComplicationData() == other.asWireComplicationData()
 
     /**
      * Similar to [equals], but avoids comparing evaluated fields (if expressions exist).
+     *
      * @hide
      */
     infix fun equalsUnevaluated(other: ComplicationData): Boolean =
@@ -189,6 +189,7 @@
 
     /**
      * Builder for properties in common for most Complication Types.
+     *
      * @hide
      */
     public abstract class BaseBuilder<T : BaseBuilder<T, ReturnT>, ReturnT> {
@@ -226,9 +227,7 @@
             return this as T
         }
 
-        /**
-         * Sets the complication's [ComplicationPersistencePolicy].
-         */
+        /** Sets the complication's [ComplicationPersistencePolicy]. */
         @Suppress("UNCHECKED_CAST", "SetterReturnsThis")
         @RequiresApi(Build.VERSION_CODES.TIRAMISU)
         public fun setPersistencePolicy(@ComplicationPersistencePolicy persistencePolicy: Int): T {
@@ -236,9 +235,7 @@
             return this as T
         }
 
-        /**
-         * Sets the complication's [ComplicationDisplayPolicy].
-         */
+        /** Sets the complication's [ComplicationDisplayPolicy]. */
         @Suppress("UNCHECKED_CAST", "SetterReturnsThis")
         @RequiresApi(Build.VERSION_CODES.TIRAMISU)
         public fun setDisplayPolicy(@ComplicationDisplayPolicy displayPolicy: Int): T {
@@ -260,27 +257,29 @@
  * watch face renders the placeholder elements (text, title, smallImage, etc...) using solid grey
  * blocks. Any non-placeholder elements included in [placeholder] must be rendered normally.
  *
- * Some watchfaces may not support placeholders and in that case the NoDataComplicationData will
- * be treated as being empty.
+ * Some watchfaces may not support placeholders and in that case the NoDataComplicationData will be
+ * treated as being empty.
  *
  * @property placeholder An optional [ComplicationData] which may contain placeholder fields (see
- * [hasPlaceholderFields]). The type of the placeholder must match the type of the ComplicationData
- * that would have otherwise been sent. The placeholder is expected to be rendered if the watch
- * face has been built with a compatible library, older libraries which don't support placeholders
- * will ignore this field.
+ *   [hasPlaceholderFields]). The type of the placeholder must match the type of the
+ *   ComplicationData that would have otherwise been sent. The placeholder is expected to be
+ *   rendered if the watch face has been built with a compatible library, older libraries which
+ *   don't support placeholders will ignore this field.
  */
-public class NoDataComplicationData internal constructor(
+public class NoDataComplicationData
+internal constructor(
     public val placeholder: ComplicationData?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(
-    TYPE,
-    placeholder?.tapAction,
-    cachedWireComplicationData,
-    dataSource = null,
-    persistencePolicy =
-    placeholder?.persistencePolicy ?: ComplicationPersistencePolicies.CACHING_ALLOWED,
-    displayPolicy = placeholder?.displayPolicy ?: ComplicationDisplayPolicies.ALWAYS_DISPLAY
-) {
+) :
+    ComplicationData(
+        TYPE,
+        placeholder?.tapAction,
+        cachedWireComplicationData,
+        dataSource = null,
+        persistencePolicy = placeholder?.persistencePolicy
+                ?: ComplicationPersistencePolicies.CACHING_ALLOWED,
+        displayPolicy = placeholder?.displayPolicy ?: ComplicationDisplayPolicies.ALWAYS_DISPLAY
+    ) {
 
     /** Constructs a NoDataComplicationData without a [placeholder]. */
     constructor() : this(null, null)
@@ -290,10 +289,7 @@
      * to contain placeholder fields (see [hasPlaceholderFields]) which must be drawn to look like
      * placeholders. E.g. with grey boxes / arcs.
      */
-    constructor(placeholder: ComplicationData) : this(
-        placeholder,
-        null
-    )
+    constructor(placeholder: ComplicationData) : this(placeholder, null)
 
     val contentDescription: ComplicationText? =
         when (placeholder) {
@@ -330,8 +326,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.NO_DATA
+        @JvmField public val TYPE: ComplicationType = ComplicationType.NO_DATA
     }
 }
 
@@ -340,14 +335,15 @@
  * data source, i.e. when the user has chosen "Empty" in the complication data source chooser.
  * Complication data sources cannot send data of this type.
  */
-public class EmptyComplicationData : ComplicationData(
-    TYPE,
-    tapAction = null,
-    cachedWireComplicationData = null,
-    dataSource = null,
-    persistencePolicy = ComplicationPersistencePolicies.CACHING_ALLOWED,
-    displayPolicy = ComplicationDisplayPolicies.ALWAYS_DISPLAY
-) {
+public class EmptyComplicationData :
+    ComplicationData(
+        TYPE,
+        tapAction = null,
+        cachedWireComplicationData = null,
+        dataSource = null,
+        persistencePolicy = ComplicationPersistencePolicies.CACHING_ALLOWED,
+        displayPolicy = ComplicationDisplayPolicies.ALWAYS_DISPLAY
+    ) {
     // Always empty.
     override fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {}
 
@@ -358,8 +354,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.EMPTY
+        @JvmField public val TYPE: ComplicationType = ComplicationType.EMPTY
     }
 }
 
@@ -369,14 +364,15 @@
  * source for an active complication, and the watch face has not set a default complication data
  * source. Complication data sources cannot send data of this type.
  */
-public class NotConfiguredComplicationData : ComplicationData(
-    TYPE,
-    tapAction = null,
-    cachedWireComplicationData = null,
-    dataSource = null,
-    persistencePolicy = ComplicationPersistencePolicies.CACHING_ALLOWED,
-    displayPolicy = ComplicationDisplayPolicies.ALWAYS_DISPLAY
-) {
+public class NotConfiguredComplicationData :
+    ComplicationData(
+        TYPE,
+        tapAction = null,
+        cachedWireComplicationData = null,
+        dataSource = null,
+        persistencePolicy = ComplicationPersistencePolicies.CACHING_ALLOWED,
+        displayPolicy = ComplicationDisplayPolicies.ALWAYS_DISPLAY
+    ) {
     // Always empty.
     override fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {}
 
@@ -387,18 +383,17 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.NOT_CONFIGURED
+        @JvmField public val TYPE: ComplicationType = ComplicationType.NOT_CONFIGURED
     }
 }
 
 /**
- * Type used for complications where the primary piece of data is a short piece of text
- * (expected to be no more than seven characters in length). The text may be accompanied
- * by an icon or a title or both.
+ * Type used for complications where the primary piece of data is a short piece of text (expected to
+ * be no more than seven characters in length). The text may be accompanied by an icon or a title or
+ * both.
  *
- * If only one of icon and title is provided, it is expected that it will be displayed. If both
- * are provided, it is expected that at least one of these will be displayed.
+ * If only one of icon and title is provided, it is expected that it will be displayed. If both are
+ * provided, it is expected that at least one of these will be displayed.
  *
  * If a [monochromaticImage] and a [smallImage] are both specified then only one should be
  * displayed. If the complication is drawn with a single color it's recommended to choose
@@ -407,33 +402,34 @@
  * specify both a [monochromaticImage] and a [smallImage].
  *
  * @property text The body [ComplicationText] of the complication. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
- * as a placeholder rather than rendering normally, its suggested it should be rendered as a light
- * grey box.
- * @property title The optional title [ComplicationText]. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
- * as a placeholder rather than rendering normally, its suggested it should be rendered as a light
- * grey box.
+ *   any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ *   using this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ *   a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
+ * @property title The optional title [ComplicationText]. The length of the text, including any
+ *   time-dependent values at any valid time, is expected to not exceed seven characters. When using
+ *   this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
+ *   as a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
- * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
- * a light grey box.
+ *   face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ *   treat it as a placeholder rather than rendering normally, its suggested it should be rendered
+ *   as a light grey box.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
  * @property contentDescription The content description field for accessibility. Please do not
- * include the word 'complication' in the description.
+ *   include the word 'complication' in the description.
  */
-public class ShortTextComplicationData internal constructor(
+public class ShortTextComplicationData
+internal constructor(
     public val text: ComplicationText,
     public val title: ComplicationText?,
     public val monochromaticImage: MonochromaticImage?,
@@ -445,15 +441,16 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Builder for [ShortTextComplicationData].
      *
@@ -461,7 +458,7 @@
      *
      * @param text The main localized [ComplicationText]. This must be less than 7 characters long
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     public class Builder(
         private val text: ComplicationText,
@@ -485,9 +482,7 @@
         }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional icon associated with the complication data. */
         public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
@@ -542,8 +537,11 @@
             "persistencePolicy=$persistencePolicy, displayPolicy=$displayPolicy)"
     }
 
-    override fun hasPlaceholderFields() = text.isPlaceholder() || title?.isPlaceholder() == true ||
-        monochromaticImage?.isPlaceholder() == true || smallImage?.isPlaceholder() == true
+    override fun hasPlaceholderFields() =
+        text.isPlaceholder() ||
+            title?.isPlaceholder() == true ||
+            monochromaticImage?.isPlaceholder() == true ||
+            smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         if (title != null) {
@@ -562,18 +560,16 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.SHORT_TEXT
+        @JvmField public val TYPE: ComplicationType = ComplicationType.SHORT_TEXT
 
         /** The maximum length of [ShortTextComplicationData.text] in characters. */
-        @JvmField
-        public val MAX_TEXT_LENGTH = 7
+        @JvmField public val MAX_TEXT_LENGTH = 7
     }
 }
 
 /**
- * Type used for complications where the primary piece of data is a piece of text. The text may
- * be accompanied by an icon and/or a title.
+ * Type used for complications where the primary piece of data is a piece of text. The text may be
+ * accompanied by an icon and/or a title.
  *
  * The text is expected to always be displayed.
  *
@@ -586,23 +582,24 @@
  * specify both a [monochromaticImage] and a [smallImage].
  *
  * @property text The body [ComplicationText] of the complication. If the text is equal to
- * [ComplicationText.PLACEHOLDER] the renderer must treat it as a placeholder rather than rendering
- * normally, its suggested it should be rendered as a light grey box.
+ *   [ComplicationText.PLACEHOLDER] the renderer must treat it as a placeholder rather than
+ *   rendering normally, its suggested it should be rendered as a light grey box.
  * @property title The optional title [ComplicationText]. If the title is equal to
- * [ComplicationText.PLACEHOLDER] the renderer must treat it as a placeholder rather than rendering
- * normally, its suggested it should be rendered as a light grey box.
+ *   [ComplicationText.PLACEHOLDER] the renderer must treat it as a placeholder rather than
+ *   rendering normally, its suggested it should be rendered as a light grey box.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
- * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
- * a light grey box.
+ *   face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ *   treat it as a placeholder rather than rendering normally, its suggested it should be rendered
+ *   as a light grey box.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
  * @property contentDescription The content description field for accessibility. Please do not
- * include the word 'complication' in the description.
+ *   include the word 'complication' in the description.
  */
-public class LongTextComplicationData internal constructor(
+public class LongTextComplicationData
+internal constructor(
     public val text: ComplicationText,
     public val title: ComplicationText?,
     public val monochromaticImage: MonochromaticImage?,
@@ -614,25 +611,25 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Builder for [LongTextComplicationData].
      *
      * You must at a minimum set the [text] and [contentDescription] fields.
      *
-     * @param text Localized main [ComplicationText] to display within the complication. There
-     * isn't an explicit character limit but text may be truncated if too long
+     * @param text Localized main [ComplicationText] to display within the complication. There isn't
+     *   an explicit character limit but text may be truncated if too long
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     public class Builder(
         private val text: ComplicationText,
@@ -656,9 +653,7 @@
         }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional image associated with the complication data. */
         public fun setMonochromaticImage(icon: MonochromaticImage?): Builder = apply {
@@ -713,8 +708,11 @@
             "persistencePolicy=$persistencePolicy, displayPolicy=$displayPolicy)"
     }
 
-    override fun hasPlaceholderFields() = text.isPlaceholder() || title?.isPlaceholder() == true ||
-        monochromaticImage?.isPlaceholder() == true || smallImage?.isPlaceholder() == true
+    override fun hasPlaceholderFields() =
+        text.isPlaceholder() ||
+            title?.isPlaceholder() == true ||
+            monochromaticImage?.isPlaceholder() == true ||
+            smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         if (title != null) {
@@ -733,8 +731,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.LONG_TEXT
+        @JvmField public val TYPE: ComplicationType = ComplicationType.LONG_TEXT
     }
 }
 
@@ -748,24 +745,21 @@
  * coordinates for the ramp are not known to the complication data source.
  *
  * @property colors The colors to render the progress bar with. For [RangedValueComplicationData]
- * the first color corresponds to [RangedValueComplicationData.min] and the last color to
- * [RangedValueComplicationData.max]. For [GoalProgressComplicationData] the first color corresponds
- * to zero and the last color to [GoalProgressComplicationData.targetValue]. A maximum of 7 colors
- * may be specified. When rendered the colors must be evenly spread along the progress bar. The
- * colors must be meaningful to the user, e.g. blue = cold, red/yellow = warm.
+ *   the first color corresponds to [RangedValueComplicationData.min] and the last color to
+ *   [RangedValueComplicationData.max]. For [GoalProgressComplicationData] the first color
+ *   corresponds to zero and the last color to [GoalProgressComplicationData.targetValue]. A maximum
+ *   of 7 colors may be specified. When rendered the colors must be evenly spread along the progress
+ *   bar. The colors must be meaningful to the user, e.g. blue = cold, red/yellow = warm.
  * @property interpolated If `true` then the colors should be smoothly interpolated when rendering
- * the progress bar. If `false` the colors should be rendered as equal sized regions of solid color,
- * resulting in a noticeable step between each color.
+ *   the progress bar. If `false` the colors should be rendered as equal sized regions of solid
+ *   color, resulting in a noticeable step between each color.
  */
 public class ColorRamp(
     @ColorInt val colors: IntArray,
-    @get:JvmName("isInterpolated")
-    val interpolated: Boolean
+    @get:JvmName("isInterpolated") val interpolated: Boolean
 ) {
     init {
-        require(colors.size <= 7) {
-            "colors can have no more than seven entries"
-        }
+        require(colors.size <= 7) { "colors can have no more than seven entries" }
     }
 
     override fun toString(): String {
@@ -792,14 +786,14 @@
 }
 
 /**
- * Type used for complications including a numerical value within a range, such as a percentage.
- * The value may be accompanied by an icon and/or short text and title.
+ * Type used for complications including a numerical value within a range, such as a percentage. The
+ * value may be accompanied by an icon and/or short text and title.
  *
  * The [min] and [max] fields are required for this type, as well as one of [value] or
  * [valueExpression]. The value within the range is expected to always be displayed.
  *
- * The icon, title, and text fields are optional and the watch face may choose which of these
- * fields to display, if any.
+ * The icon, title, and text fields are optional and the watch face may choose which of these fields
+ * to display, if any.
  *
  * If a [monochromaticImage] and a [smallImage] are both specified then only one should be
  * displayed. If the complication is drawn with a single color it's recommended to choose
@@ -808,47 +802,47 @@
  * specify both a [monochromaticImage] and a [smallImage].
  *
  * @property value The [Float] value of this complication which is >= [min] and <= [max] or equal to
- * [PLACEHOLDER]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder rather
- * than rendering normally, its suggested to be drawn as a grey arc with a percentage value selected
- * by the renderer. The semantic meaning of value is described by [valueType].
+ *   [PLACEHOLDER]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder
+ *   rather than rendering normally, its suggested to be drawn as a grey arc with a percentage value
+ *   selected by the renderer. The semantic meaning of value is described by [valueType].
  * @property min The minimum [Float] value for this complication.
  * @property max The maximum [Float] value for this complication.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
- * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
- * a light grey box.
+ *   face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ *   treat it as a placeholder rather than rendering normally, its suggested it should be rendered
+ *   as a light grey box.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
- * @property title The optional title [ComplicationText]. The length of the title, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
- * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including any
+ *   time-dependent values at any valid time, is expected to not exceed seven characters. When using
+ *   this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
+ *   as a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property text The body [ComplicationText] of the complication. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
- * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ *   using this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ *   a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property contentDescription The content description field for accessibility. Please do not
- * include the word 'complication' in the description.
+ *   include the word 'complication' in the description.
  * @property colorRamp Optional hint to render the value with the specified [ColorRamp]. When
- * present the renderer may choose to use the ColorRamp when rendering the progress bar.
+ *   present the renderer may choose to use the ColorRamp when rendering the progress bar.
  * @property valueType The semantic meaning of [value]. The complication renderer may choose to
- * visually differentiate between the different types, for example rendering a dot on a line/arc to
- * indicate the value for a [TYPE_RATING].
+ *   visually differentiate between the different types, for example rendering a dot on a line/arc
+ *   to indicate the value for a [TYPE_RATING].
  */
-public class RangedValueComplicationData internal constructor(
+public class RangedValueComplicationData
+internal constructor(
     public val value: Float,
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    valueExpression: DynamicFloat?,
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET") valueExpression: DynamicFloat?,
     public val min: Float,
     public val max: Float,
     public val monochromaticImage: MonochromaticImage?,
@@ -864,19 +858,20 @@
     @RangedValueType public val valueType: Int,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
-     * The [DynamicFloat] optionally set by the data source. If present the system will
-     * dynamically evaluate this and store the result in [value]. Watch faces can typically ignore
-     * this field.
+     * The [DynamicFloat] optionally set by the data source. If present the system will dynamically
+     * evaluate this and store the result in [value]. Watch faces can typically ignore this field.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -906,12 +901,12 @@
          * Creates a [Builder] for a [RangedValueComplicationData] with a [Float] value.
          *
          * @param value The value of the ranged complication which should be in the range [[min]] ..
-         * [[max]]. The semantic meaning of value can be specified via [setValueType].
+         *   [[max]]. The semantic meaning of value can be specified via [setValueType].
          * @param min The minimum value. For [TYPE_PERCENTAGE] this must be 0f.
          * @param max The maximum value. This must be less than [Float.MAX_VALUE]. For
-         * [TYPE_PERCENTAGE] this must be 0f.
+         *   [TYPE_PERCENTAGE] this must be 0f.
          * @param contentDescription Localized description for use by screen readers. Please do not
-         * include the word 'complication' in the description.
+         *   include the word 'complication' in the description.
          */
         public constructor(
             value: Float,
@@ -924,13 +919,13 @@
          * Creates a [Builder] for a [RangedValueComplicationData] with a [DynamicFloat] value.
          *
          * @param valueExpression The [DynamicFloat] of the ranged complication which will be
-         * evaluated into a value dynamically, and should be in the range [[min]] .. [[max]]. The
-         * semantic meaning of value can be specified via [setValueType].
+         *   evaluated into a value dynamically, and should be in the range [[min]] .. [[max]]. The
+         *   semantic meaning of value can be specified via [setValueType].
          * @param min The minimum value. For [TYPE_PERCENTAGE] this must be 0f.
          * @param max The maximum value. This must be less than [Float.MAX_VALUE]. For
-         * [TYPE_PERCENTAGE] this must be 0f.
+         *   [TYPE_PERCENTAGE] this must be 0f.
          * @param contentDescription Localized description for use by screen readers. Please do not
-         * include the word 'complication' in the description.
+         *   include the word 'complication' in the description.
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -949,8 +944,7 @@
         private var text: ComplicationText? = null
         private var colorRamp: ColorRamp? = null
 
-        @RangedValueType
-        private var valueType: Int = TYPE_UNDEFINED
+        @RangedValueType private var valueType: Int = TYPE_UNDEFINED
 
         init {
             require(min <= max) { "min must be lower than or equal to max" }
@@ -984,14 +978,10 @@
         }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional text associated with the complication data. */
-        public fun setText(text: ComplicationText?): Builder = apply {
-            this.text = text
-        }
+        public fun setText(text: ComplicationText?): Builder = apply { this.text = text }
 
         /**
          * Sets an optional hint that the renderer should draw the progress bar using the
@@ -1070,16 +1060,18 @@
     }
 
     override fun toString(): String {
-        val valueString = if (WireComplicationData.shouldRedact()) {
-            "REDACTED"
-        } else {
-            value.toString()
-        }
-        val valueExpressionString = if (WireComplicationData.shouldRedact()) {
-            "REDACTED"
-        } else {
-            valueExpression.toString()
-        }
+        val valueString =
+            if (WireComplicationData.shouldRedact()) {
+                "REDACTED"
+            } else {
+                value.toString()
+            }
+        val valueExpressionString =
+            if (WireComplicationData.shouldRedact()) {
+                "REDACTED"
+            } else {
+                valueExpression.toString()
+            }
         return "RangedValueComplicationData(value=$valueString, " +
             "valueExpression=$valueExpressionString, valueType=$valueType, min=$min, " +
             "max=$max, monochromaticImage=$monochromaticImage, smallImage=$smallImage, " +
@@ -1090,9 +1082,12 @@
             "displayPolicy=$displayPolicy)"
     }
 
-    override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
-        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true ||
-        smallImage?.isPlaceholder() == true
+    override fun hasPlaceholderFields() =
+        value == PLACEHOLDER ||
+            text?.isPlaceholder() == true ||
+            title?.isPlaceholder() == true ||
+            monochromaticImage?.isPlaceholder() == true ||
+            smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
@@ -1107,8 +1102,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.RANGED_VALUE
+        @JvmField public val TYPE: ComplicationType = ComplicationType.RANGED_VALUE
 
         /**
          * Used to signal the range should be rendered as a placeholder. It's suggested that a
@@ -1118,8 +1112,7 @@
          * Note a placeholder may only be used in the context of
          * [NoDataComplicationData.placeholder].
          */
-        @JvmField
-        public val PLACEHOLDER = Float.MAX_VALUE
+        @JvmField public val PLACEHOLDER = Float.MAX_VALUE
 
         /**
          * The ranged value's semantic hasn't been explicitly defined, most commonly it's a
@@ -1128,14 +1121,12 @@
         const val TYPE_UNDEFINED = 0
 
         /**
-         * The ranged value represents a rating or score for something unrelated to the user,
-         * e.g. the air quality index or the UV index.
+         * The ranged value represents a rating or score for something unrelated to the user, e.g.
+         * the air quality index or the UV index.
          */
         const val TYPE_RATING = 1
 
-        /**
-         * The ranged value represents a percentage in the range [0..100]. E.g. Battery charge.
-         */
+        /** The ranged value represents a percentage in the range [0..100]. E.g. Battery charge. */
         const val TYPE_PERCENTAGE = 2
     }
 }
@@ -1151,8 +1142,8 @@
  * The [targetValue] field is required for this type, as well as one of [value] or
  * [valueExpression]. The progress is expected to always be displayed.
  *
- * The icon, title, and text fields are optional and the watch face may choose which of these
- * fields to display, if any.
+ * The icon, title, and text fields are optional and the watch face may choose which of these fields
+ * to display, if any.
  *
  * If a [monochromaticImage] and a [smallImage] are both specified then only one should be
  * displayed. If the complication is drawn with a single color it's recommended to choose
@@ -1166,45 +1157,44 @@
  * [RangedValueComplicationData.Builder.setValueType].
  *
  * @property value The [Float] value of this complication which is >= 0f, this value may be larger
- * than [targetValue]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder
- * rather than rendering normally, its suggested to be drawn as a grey arc with a percentage value
- * selected by the renderer.
+ *   than [targetValue]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder
+ *   rather than rendering normally, its suggested to be drawn as a grey arc with a percentage value
+ *   selected by the renderer.
  * @property targetValue The target [Float] value for this complication.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
- * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
- * a light grey box.
+ *   face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ *   treat it as a placeholder rather than rendering normally, its suggested it should be rendered
+ *   as a light grey box.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
- * @property title The optional title [ComplicationText]. The length of the title, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
- * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including any
+ *   time-dependent values at any valid time, is expected to not exceed seven characters. When using
+ *   this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
+ *   as a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property text The body [ComplicationText] of the complication. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
- * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ *   using this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ *   a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property contentDescription The content description field for accessibility. Please do not
- * include the word 'complication' in the description.
+ *   include the word 'complication' in the description.
  * @property colorRamp Optional hint to render the progress bar representing [value] with the
- * specified [ColorRamp].
+ *   specified [ColorRamp].
  */
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
 public class GoalProgressComplicationData
 internal constructor(
     public val value: Float,
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    valueExpression: DynamicFloat?,
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET") valueExpression: DynamicFloat?,
     public val targetValue: Float,
     public val monochromaticImage: MonochromaticImage?,
     public val smallImage: SmallImage?,
@@ -1218,19 +1208,20 @@
     public val colorRamp: ColorRamp?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
-     * The [DynamicFloat] optionally set by the data source. If present the system will
-     * dynamically evaluate this and store the result in [value]. Watch faces can typically ignore
-     * this field.
+     * The [DynamicFloat] optionally set by the data source. If present the system will dynamically
+     * evaluate this and store the result in [value]. Watch faces can typically ignore this field.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -1258,7 +1249,7 @@
          * @param value The value of the goal complication which should be >= 0.
          * @param targetValue The target value. This must be less than [Float.MAX_VALUE].
          * @param contentDescription Localized description for use by screen readers. Please do not
-         * include the word 'complication' in the description.
+         *   include the word 'complication' in the description.
          */
         public constructor(
             value: Float,
@@ -1270,10 +1261,10 @@
          * Creates a [Builder] for a [GoalProgressComplicationData] with a [DynamicFloat] value.
          *
          * @param valueExpression The [DynamicFloat] of the goal complication which will be
-         * evaluated into a value dynamically, and should be >= 0.
+         *   evaluated into a value dynamically, and should be >= 0.
          * @param targetValue The target value. This must be less than [Float.MAX_VALUE].
          * @param contentDescription Localized description for use by screen readers. Please do not
-         * include the word 'complication' in the description.
+         *   include the word 'complication' in the description.
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -1324,14 +1315,10 @@
         }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional text associated with the complication data. */
-        public fun setText(text: ComplicationText?): Builder = apply {
-            this.text = text
-        }
+        public fun setText(text: ComplicationText?): Builder = apply { this.text = text }
 
         /**
          * Sets an optional hint which suggests the renderer draws the complication using a
@@ -1393,16 +1380,18 @@
     }
 
     override fun toString(): String {
-        val valueString = if (WireComplicationData.shouldRedact()) {
-            "REDACTED"
-        } else {
-            value.toString()
-        }
-        val valueExpressionString = if (WireComplicationData.shouldRedact()) {
-            "REDACTED"
-        } else {
-            valueExpression.toString()
-        }
+        val valueString =
+            if (WireComplicationData.shouldRedact()) {
+                "REDACTED"
+            } else {
+                value.toString()
+            }
+        val valueExpressionString =
+            if (WireComplicationData.shouldRedact()) {
+                "REDACTED"
+            } else {
+                valueExpression.toString()
+            }
         return "GoalProgressComplicationData(value=$valueString, " +
             "valueExpression=$valueExpressionString, targetValue=$targetValue, " +
             "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
@@ -1413,9 +1402,12 @@
             "displayPolicy=$displayPolicy)"
     }
 
-    override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
-        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true ||
-        smallImage?.isPlaceholder() == true
+    override fun hasPlaceholderFields() =
+        value == PLACEHOLDER ||
+            text?.isPlaceholder() == true ||
+            title?.isPlaceholder() == true ||
+            monochromaticImage?.isPlaceholder() == true ||
+            smallImage?.isPlaceholder() == true
 
     override fun getNextChangeInstant(afterInstant: Instant): Instant {
         val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
@@ -1430,8 +1422,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.GOAL_PROGRESS
+        @JvmField public val TYPE: ComplicationType = ComplicationType.GOAL_PROGRESS
 
         /**
          * Used to signal the range should be rendered as a placeholder. It's suggested that a
@@ -1441,8 +1432,7 @@
          * Note a placeholder may only be used in the context of
          * [NoDataComplicationData.placeholder].
          */
-        @JvmField
-        public val PLACEHOLDER = Float.MAX_VALUE
+        @JvmField public val PLACEHOLDER = Float.MAX_VALUE
     }
 }
 
@@ -1463,40 +1453,40 @@
  * specify both a [monochromaticImage] and a [smallImage].
  *
  * @property elements The breakdown of the subject into various [Element]s (e.g. the proportion of
- * calories consumed which were carbohydrates, fats, etc.). The colors need to be meaningful to the
- * user (e.g. blue is cold, yellow/red is worm), and should be consistent with the experience
- * launched by tapping on the complication. If this is equal to [PLACEHOLDER] then the renderer must
- * display this in a visually distinct way to suggest to the user that it's placeholder data.  E.g.
- * each element is rendered in light grey. The maximum valid size of this list is provided by
- * [getMaxElements] and it will be truncated if its larger.
+ *   calories consumed which were carbohydrates, fats, etc.). The colors need to be meaningful to
+ *   the user (e.g. blue is cold, yellow/red is worm), and should be consistent with the experience
+ *   launched by tapping on the complication. If this is equal to [PLACEHOLDER] then the renderer
+ *   must display this in a visually distinct way to suggest to the user that it's placeholder data.
+ *   E.g. each element is rendered in light grey. The maximum valid size of this list is provided by
+ *   [getMaxElements] and it will be truncated if its larger.
  * @property elementBackgroundColor If elements are draw as segments then this is the background
- * color to use in between them.
+ *   color to use in between them.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
- * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
- * a light grey box.
+ *   face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ *   treat it as a placeholder rather than rendering normally, its suggested it should be rendered
+ *   as a light grey box.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
- * @property title The optional title [ComplicationText]. The length of the title, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
- * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including any
+ *   time-dependent values at any valid time, is expected to not exceed seven characters. When using
+ *   this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it
+ *   as a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property text The body [ComplicationText] of the complication. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
- * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
- * box.
+ *   any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ *   using this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ *   a placeholder rather than rendering normally, its suggested it should be rendered as a light
+ *   grey box.
  * @property contentDescription The content description field for accessibility. Please do not
- * include the word 'complication' in the description.
+ *   include the word 'complication' in the description.
  */
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
 public class WeightedElementsComplicationData
@@ -1514,26 +1504,27 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Describes a single value within a [WeightedElementsComplicationData].
      *
      * @property weight The weight of the Element which must be > zero. The size of the element when
-     * rendered should be proportional to its weight. Weights are not required to sum to any
-     * particular value.
+     *   rendered should be proportional to its weight. Weights are not required to sum to any
+     *   particular value.
      * @property color The color of the Element, which must be used instead of the watch face's
-     * colors. This color needs to be meaningful to the user in conjunction with the other fields
-     * (e.g. blue is cold, red/yellow is warm). Tapping on the complication should launch an
-     * experience where the data is presented in more detail. Care must be taken to ensure the
-     * colors used are consistent with the launched experience.
+     *   colors. This color needs to be meaningful to the user in conjunction with the other fields
+     *   (e.g. blue is cold, red/yellow is warm). Tapping on the complication should launch an
+     *   experience where the data is presented in more detail. Care must be taken to ensure the
+     *   colors used are consistent with the launched experience.
      */
     class Element(
         @FloatRange(from = 0.0, fromInclusive = false) val weight: Float,
@@ -1573,19 +1564,18 @@
      * [smallImage], [text] or [title].
      *
      * @param elements The breakdown of the subject into various [Element]s. E.g. the proportion of
-     * calories consumed which were carbohydrates, fats etc... The [tapAction] must take the user to
-     * an experience where the color key becomes obvious. The maximum valid size of this list is
-     * provided by [getMaxElements].
+     *   calories consumed which were carbohydrates, fats etc... The [tapAction] must take the user
+     *   to an experience where the color key becomes obvious. The maximum valid size of this list
+     *   is provided by [getMaxElements].
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     @RequiresApi(Build.VERSION_CODES.TIRAMISU)
     public class Builder(
         elements: List<Element>,
         private var contentDescription: ComplicationText
     ) : BaseBuilder<Builder, WeightedElementsComplicationData>() {
-        @ColorInt
-        private var elementBackgroundColor: Int = Color.TRANSPARENT
+        @ColorInt private var elementBackgroundColor: Int = Color.TRANSPARENT
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
@@ -1603,21 +1593,21 @@
             }
         }
 
-        private val elements: List<Element> = if (elements.size > getMaxElements()) {
-            elements.subList(0, getMaxElements()) // NB the second parameter is exclusive!
-        } else {
-            elements
-        }
+        private val elements: List<Element> =
+            if (elements.size > getMaxElements()) {
+                elements.subList(0, getMaxElements()) // NB the second parameter is exclusive!
+            } else {
+                elements
+            }
 
         /**
          * Sets the background color to use between the [elements] if they are drawn segmented.
          * Defaults to [Color.TRANSPARENT] if not set.
          */
-        public fun setElementBackgroundColor(
-            @ColorInt elementBackgroundColor: Int
-        ): Builder = apply {
-            this.elementBackgroundColor = elementBackgroundColor
-        }
+        public fun setElementBackgroundColor(@ColorInt elementBackgroundColor: Int): Builder =
+            apply {
+                this.elementBackgroundColor = elementBackgroundColor
+            }
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
         public fun setTapAction(tapAction: PendingIntent?): Builder = apply {
@@ -1641,14 +1631,10 @@
         }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional text associated with the complication data. */
-        public fun setText(text: ComplicationText?): Builder = apply {
-            this.text = text
-        }
+        public fun setText(text: ComplicationText?): Builder = apply { this.text = text }
 
         /** Builds the [GoalProgressComplicationData]. */
         public override fun build(): WeightedElementsComplicationData {
@@ -1706,11 +1692,12 @@
     }
 
     override fun toString(): String {
-        val elementsString = if (WireComplicationData.shouldRedact()) {
-            "REDACTED"
-        } else {
-            elements.joinToString()
-        }
+        val elementsString =
+            if (WireComplicationData.shouldRedact()) {
+                "REDACTED"
+            } else {
+                elements.joinToString()
+            }
         return "WeightedElementsComplicationData(elements=$elementsString, " +
             "elementBackgroundColor=$elementBackgroundColor, " +
             "monochromaticImage=$monochromaticImage, smallImage=$smallImage, title=$title, " +
@@ -1720,14 +1707,16 @@
             "persistencePolicy=$persistencePolicy, displayPolicy=$displayPolicy)"
     }
 
-    override fun hasPlaceholderFields() = elements == PLACEHOLDER ||
-        text?.isPlaceholder() == true || title?.isPlaceholder() == true ||
-        monochromaticImage?.isPlaceholder() == true || smallImage?.isPlaceholder() == true
+    override fun hasPlaceholderFields() =
+        elements == PLACEHOLDER ||
+            text?.isPlaceholder() == true ||
+            title?.isPlaceholder() == true ||
+            monochromaticImage?.isPlaceholder() == true ||
+            smallImage?.isPlaceholder() == true
 
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.WEIGHTED_ELEMENTS
+        @JvmField public val TYPE: ComplicationType = ComplicationType.WEIGHTED_ELEMENTS
 
         /**
          * Used to signal the range should be rendered as a placeholder. It's suggested that a
@@ -1737,15 +1726,14 @@
          * Note a placeholder may only be used in the context of
          * [NoDataComplicationData.placeholder].
          */
-        @JvmField
-        public val PLACEHOLDER = emptyList<Element>()
+        @JvmField public val PLACEHOLDER = emptyList<Element>()
 
         /**
          * Returns the maximum size for [elements]. Complications are small and if we have a very
-         * large  number of elements we likely won't be able to render them properly because the
-         * individual elements will be too small on screen. */
-        @JvmStatic
-        public fun getMaxElements() = 7
+         * large number of elements we likely won't be able to render them properly because the
+         * individual elements will be too small on screen.
+         */
+        @JvmStatic public fun getMaxElements() = 7
     }
 }
 
@@ -1755,16 +1743,17 @@
  * The image is expected to always be displayed.
  *
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face (typically with SRC_IN). If the monochromaticImage is equal to
- * [MonochromaticImage.PLACEHOLDER] the renderer must treat it as a placeholder rather than
- * rendering normally, it's suggested it should be rendered as a light grey box.
+ *   face (typically with SRC_IN). If the monochromaticImage is equal to
+ *   [MonochromaticImage.PLACEHOLDER] the renderer must treat it as a placeholder rather than
+ *   rendering normally, it's suggested it should be rendered as a light grey box.
  * @property contentDescription The content description field for accessibility and is used to
- * describe what data the icon represents. If the icon is purely stylistic, and does not convey any
- * information to the user, then provide an empty content description. If no content description is
- * provided, a generic content description will be used instead. Please do not include the word
- * 'complication' in the description.
+ *   describe what data the icon represents. If the icon is purely stylistic, and does not convey
+ *   any information to the user, then provide an empty content description. If no content
+ *   description is provided, a generic content description will be used instead. Please do not
+ *   include the word 'complication' in the description.
  */
-public class MonochromaticImageComplicationData internal constructor(
+public class MonochromaticImageComplicationData
+internal constructor(
     public val monochromaticImage: MonochromaticImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
@@ -1773,15 +1762,16 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Builder for [MonochromaticImageComplicationData].
      *
@@ -1789,7 +1779,7 @@
      *
      * @param monochromaticImage The [MonochromaticImage] to be displayed
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     public class Builder(
         private val monochromaticImage: MonochromaticImage,
@@ -1850,8 +1840,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.MONOCHROMATIC_IMAGE
+        @JvmField public val TYPE: ComplicationType = ComplicationType.MONOCHROMATIC_IMAGE
     }
 }
 
@@ -1861,16 +1850,17 @@
  * The image is expected to always be displayed.
  *
  * @property smallImage The [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
+ *   occupied by a single complication. If the smallImage is equal to [SmallImage.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
  * @property contentDescription The content description field for accessibility and is used to
- * describe what data the image represents. If the image is purely stylistic, and does not convey
- * any information to the user, then provide an empty content description. If no content description
- * is provided, a generic content description will be used instead. Please do not include the word
- * 'complication' in the description.
+ *   describe what data the image represents. If the image is purely stylistic, and does not convey
+ *   any information to the user, then provide an empty content description. If no content
+ *   description is provided, a generic content description will be used instead. Please do not
+ *   include the word 'complication' in the description.
  */
-public class SmallImageComplicationData internal constructor(
+public class SmallImageComplicationData
+internal constructor(
     public val smallImage: SmallImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
@@ -1879,15 +1869,16 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Builder for [SmallImageComplicationData].
      *
@@ -1895,7 +1886,7 @@
      *
      * @param smallImage The [SmallImage] to be displayed
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     public class Builder(
         private val smallImage: SmallImage,
@@ -1956,8 +1947,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.SMALL_IMAGE
+        @JvmField public val TYPE: ComplicationType = ComplicationType.SMALL_IMAGE
     }
 }
 
@@ -1966,22 +1956,23 @@
  * of the watch face, large enough to be shown as either a background or as part of a high
  * resolution complication.
  *
- * The image is expected to always be displayed. The image may be shown as the background, any
- * other part of the watch face or within a complication. The image is large enough to be cover
- * the entire screen. The image may be cropped to fit the watch face or complication.
+ * The image is expected to always be displayed. The image may be shown as the background, any other
+ * part of the watch face or within a complication. The image is large enough to be cover the entire
+ * screen. The image may be cropped to fit the watch face or complication.
  *
  * @property photoImage The [Icon] that is expected to fill a large part of the watch face, large
- * enough to be shown as either a background or as part of a high resolution complication. This must
- * not be tinted. If the photoImage is equal to [PhotoImageComplicationData.PLACEHOLDER] the
- * renderer must treat it as a placeholder rather than rendering normally, its suggested it should
- * be rendered as a light grey box.
+ *   enough to be shown as either a background or as part of a high resolution complication. This
+ *   must not be tinted. If the photoImage is equal to [PhotoImageComplicationData.PLACEHOLDER] the
+ *   renderer must treat it as a placeholder rather than rendering normally, its suggested it should
+ *   be rendered as a light grey box.
  * @property contentDescription The content description field for accessibility and is used to
- * describe what data the image represents. If the image is purely stylistic, and does not convey
- * any information to the user, then provide an empty content description. If no content description
- * is provided, a generic content description will be used instead. Please do not include the word
- * 'complication' in the description.
+ *   describe what data the image represents. If the image is purely stylistic, and does not convey
+ *   any information to the user, then provide an empty content description. If no content
+ *   description is provided, a generic content description will be used instead. Please do not
+ *   include the word 'complication' in the description.
  */
-public class PhotoImageComplicationData internal constructor(
+public class PhotoImageComplicationData
+internal constructor(
     public val photoImage: Icon,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
@@ -1990,15 +1981,16 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = tapAction,
-    cachedWireComplicationData = cachedWireComplicationData,
-    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = tapAction,
+        cachedWireComplicationData = cachedWireComplicationData,
+        validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
     /**
      * Builder for [PhotoImageComplicationData].
      *
@@ -2006,7 +1998,7 @@
      *
      * @param photoImage The [Icon] to be displayed
      * @param contentDescription Localized description for use by screen readers. Please do not
-     * include the word 'complication' in the description.
+     *   include the word 'complication' in the description.
      */
     public class Builder(
         private val photoImage: Icon,
@@ -2068,8 +2060,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.PHOTO_IMAGE
+        @JvmField public val TYPE: ComplicationType = ComplicationType.PHOTO_IMAGE
 
         /**
          * Used to signal the photo image should be rendered as a placeholder. It's suggested that a
@@ -2079,8 +2070,7 @@
          * Note a placeholder may only be used in the context of
          * [NoDataComplicationData.placeholder].
          */
-        @JvmField
-        public val PLACEHOLDER: Icon = createPlaceholderIcon()
+        @JvmField public val PLACEHOLDER: Icon = createPlaceholderIcon()
     }
 }
 
@@ -2090,28 +2080,29 @@
  *
  * The text, title, and icon may be displayed by watch faces, but this is not required.
  *
- * It is recommended that, where possible, tapping on the complication when in this state
- * should trigger a permission request. Note this is done by
+ * It is recommended that, where possible, tapping on the complication when in this state should
+ * trigger a permission request. Note this is done by
  * [androidx.wear.watchface.ComplicationSlotsManager] for androidx watch faces.
  *
  * @property text The body [ComplicationText] of the complication. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated.
- * @property title The optional title [ComplicationText]. The length of the text, including
- * any time-dependent values at any valid time, is expected to not exceed seven characters. When
- * using this text, the watch face should be able to display any string of up to seven characters
- * (reducing the text size appropriately if the string is very wide). Although not expected, it is
- * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated.
+ *   any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ *   using this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated.
+ * @property title The optional title [ComplicationText]. The length of the text, including any
+ *   time-dependent values at any valid time, is expected to not exceed seven characters. When using
+ *   this text, the watch face should be able to display any string of up to seven characters
+ *   (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ *   possible that strings of more than seven characters might be seen, in which case they may be
+ *   truncated.
  * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
- * face.
+ *   face.
  * @property smallImage A [SmallImage] that is expected to cover a small fraction of a watch face
- * occupied by a single complication
+ *   occupied by a single complication
  */
-public class NoPermissionComplicationData internal constructor(
+public class NoPermissionComplicationData
+internal constructor(
     public val text: ComplicationText?,
     public val title: ComplicationText?,
     public val monochromaticImage: MonochromaticImage?,
@@ -2120,17 +2111,16 @@
     dataSource: ComponentName?,
     @ComplicationPersistencePolicy persistencePolicy: Int,
     @ComplicationDisplayPolicy displayPolicy: Int
-) : ComplicationData(
-    TYPE,
-    tapAction = null,
-    cachedWireComplicationData = cachedWireComplicationData,
-    dataSource = dataSource,
-    persistencePolicy = persistencePolicy,
-    displayPolicy = displayPolicy
-) {
-    /**
-     * Builder for [NoPermissionComplicationData].
-     */
+) :
+    ComplicationData(
+        TYPE,
+        tapAction = null,
+        cachedWireComplicationData = cachedWireComplicationData,
+        dataSource = dataSource,
+        persistencePolicy = persistencePolicy,
+        displayPolicy = displayPolicy
+    ) {
+    /** Builder for [NoPermissionComplicationData]. */
     public class Builder : BaseBuilder<Builder, NoPermissionComplicationData>() {
         private var text: ComplicationText? = null
         private var title: ComplicationText? = null
@@ -2138,14 +2128,10 @@
         private var smallImage: SmallImage? = null
 
         /** Sets optional text associated with the complication data. */
-        public fun setText(text: ComplicationText?): Builder = apply {
-            this.text = text
-        }
+        public fun setText(text: ComplicationText?): Builder = apply { this.text = text }
 
         /** Sets optional title associated with the complication data. */
-        public fun setTitle(title: ComplicationText?): Builder = apply {
-            this.title = title
-        }
+        public fun setTitle(title: ComplicationText?): Builder = apply { this.title = title }
 
         /** Sets optional icon associated with the complication data. */
         public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
@@ -2200,8 +2186,7 @@
     /** @hide */
     public companion object {
         /** The [ComplicationType] corresponding to objects of this type. */
-        @JvmField
-        public val TYPE: ComplicationType = ComplicationType.NO_PERMISSION
+        @JvmField public val TYPE: ComplicationType = ComplicationType.NO_PERMISSION
     }
 }
 
@@ -2214,62 +2199,62 @@
         val displayPolicyCopy = displayPolicy
         return when (type) {
             NoDataComplicationData.TYPE.toWireComplicationType() -> null
-
             ShortTextComplicationData.TYPE.toWireComplicationType() -> {
                 ShortTextComplicationData.Builder(
-                    shortText!!.toApiComplicationTextPlaceholderAware(),
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIconPlaceholderAware())
-                    setSmallImage(parseSmallImagePlaceholderAware())
-                    setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
-                    setDataSource(dataSourceCopy)
-                    setPersistencePolicy(persistencePolicyCopy)
-                    setDisplayPolicy(displayPolicyCopy)
-                }.build()
+                        shortText!!.toApiComplicationTextPlaceholderAware(),
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIconPlaceholderAware())
+                        setSmallImage(parseSmallImagePlaceholderAware())
+                        setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+                        setDataSource(dataSourceCopy)
+                        setPersistencePolicy(persistencePolicyCopy)
+                        setDisplayPolicy(displayPolicyCopy)
+                    }
+                    .build()
             }
-
             LongTextComplicationData.TYPE.toWireComplicationType() -> {
                 LongTextComplicationData.Builder(
-                    longText!!.toApiComplicationTextPlaceholderAware(),
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIconPlaceholderAware())
-                    setSmallImage(parseSmallImagePlaceholderAware())
-                    setTitle(longTitle?.toApiComplicationTextPlaceholderAware())
-                    setDataSource(dataSourceCopy)
-                    setPersistencePolicy(persistencePolicyCopy)
-                    setDisplayPolicy(displayPolicyCopy)
-                }.build()
+                        longText!!.toApiComplicationTextPlaceholderAware(),
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIconPlaceholderAware())
+                        setSmallImage(parseSmallImagePlaceholderAware())
+                        setTitle(longTitle?.toApiComplicationTextPlaceholderAware())
+                        setDataSource(dataSourceCopy)
+                        setPersistencePolicy(persistencePolicyCopy)
+                        setDisplayPolicy(displayPolicyCopy)
+                    }
+                    .build()
             }
-
             RangedValueComplicationData.TYPE.toWireComplicationType() ->
                 RangedValueComplicationData.Builder(
-                    value = rangedValue,
-                    valueExpression = rangedValueExpression,
-                    min = rangedMinValue,
-                    max = rangedMaxValue,
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIconPlaceholderAware())
-                    setSmallImage(parseSmallImagePlaceholderAware())
-                    setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
-                    setText(shortText?.toApiComplicationTextPlaceholderAware())
-                    setDataSource(dataSourceCopy)
-                    colorRamp?.let {
-                        setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+                        value = rangedValue,
+                        valueExpression = rangedValueExpression,
+                        min = rangedMinValue,
+                        max = rangedMaxValue,
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIconPlaceholderAware())
+                        setSmallImage(parseSmallImagePlaceholderAware())
+                        setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+                        setText(shortText?.toApiComplicationTextPlaceholderAware())
+                        setDataSource(dataSourceCopy)
+                        colorRamp?.let { setColorRamp(ColorRamp(it, isColorRampInterpolated!!)) }
+                        setPersistencePolicy(persistencePolicyCopy)
+                        setDisplayPolicy(displayPolicyCopy)
+                        setValueType(rangedValueType)
                     }
-                    setPersistencePolicy(persistencePolicyCopy)
-                    setDisplayPolicy(displayPolicyCopy)
-                    setValueType(rangedValueType)
-                }.build()
-
+                    .build()
             MonochromaticImageComplicationData.TYPE.toWireComplicationType() ->
                 MonochromaticImageComplicationData(
                     parseIconPlaceholderAware()!!,
@@ -2281,7 +2266,6 @@
                     persistencePolicyCopy,
                     displayPolicyCopy
                 )
-
             SmallImageComplicationData.TYPE.toWireComplicationType() ->
                 SmallImageComplicationData(
                     parseSmallImagePlaceholderAware()!!,
@@ -2293,7 +2277,6 @@
                     persistencePolicyCopy,
                     displayPolicyCopy
                 )
-
             PhotoImageComplicationData.TYPE.toWireComplicationType() ->
                 PhotoImageComplicationData(
                     parseLargeImagePlaceholderAware()!!,
@@ -2305,56 +2288,61 @@
                     persistencePolicyCopy,
                     displayPolicyCopy
                 )
-
             GoalProgressComplicationData.TYPE.toWireComplicationType() ->
                 GoalProgressComplicationData.Builder(
-                    value = rangedValue,
-                    valueExpression = rangedValueExpression,
-                    targetValue = targetValue,
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIconPlaceholderAware())
-                    setSmallImage(parseSmallImagePlaceholderAware())
-                    setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
-                    setText(shortText?.toApiComplicationTextPlaceholderAware())
-                    setDataSource(dataSourceCopy)
-                    colorRamp?.let {
-                        setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+                        value = rangedValue,
+                        valueExpression = rangedValueExpression,
+                        targetValue = targetValue,
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIconPlaceholderAware())
+                        setSmallImage(parseSmallImagePlaceholderAware())
+                        setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+                        setText(shortText?.toApiComplicationTextPlaceholderAware())
+                        setDataSource(dataSourceCopy)
+                        colorRamp?.let { setColorRamp(ColorRamp(it, isColorRampInterpolated!!)) }
+                        setPersistencePolicy(persistencePolicyCopy)
+                        setDisplayPolicy(displayPolicyCopy)
                     }
-                    setPersistencePolicy(persistencePolicyCopy)
-                    setDisplayPolicy(displayPolicyCopy)
-                }.build()
-
+                    .build()
             WeightedElementsComplicationData.TYPE.toWireComplicationType() ->
                 WeightedElementsComplicationData.Builder(
-                    elements = if (elementWeights!!.isEmpty()) {
-                        WeightedElementsComplicationData.PLACEHOLDER
-                    } else {
-                        val elementWeights = this.elementWeights!!
-                        val elementColors = this.elementColors!!
-                        require(elementWeights.size == elementColors.size) {
-                            "elementWeights and elementColors must have the same size"
-                        }
-                        elementWeights.mapIndexed { index, weight ->
-                            WeightedElementsComplicationData.Element(weight, elementColors[index])
-                        }.toList()
-                    },
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setElementBackgroundColor(elementBackgroundColor)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIconPlaceholderAware())
-                    setSmallImage(parseSmallImagePlaceholderAware())
-                    setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
-                    setText(shortText?.toApiComplicationTextPlaceholderAware())
-                    setDataSource(dataSourceCopy)
-                    setPersistencePolicy(persistencePolicyCopy)
-                    setDisplayPolicy(displayPolicyCopy)
-                }.build()
-
+                        elements =
+                            if (elementWeights!!.isEmpty()) {
+                                WeightedElementsComplicationData.PLACEHOLDER
+                            } else {
+                                val elementWeights = this.elementWeights!!
+                                val elementColors = this.elementColors!!
+                                require(elementWeights.size == elementColors.size) {
+                                    "elementWeights and elementColors must have the same size"
+                                }
+                                elementWeights
+                                    .mapIndexed { index, weight ->
+                                        WeightedElementsComplicationData.Element(
+                                            weight,
+                                            elementColors[index]
+                                        )
+                                    }
+                                    .toList()
+                            },
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setElementBackgroundColor(elementBackgroundColor)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIconPlaceholderAware())
+                        setSmallImage(parseSmallImagePlaceholderAware())
+                        setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+                        setText(shortText?.toApiComplicationTextPlaceholderAware())
+                        setDataSource(dataSourceCopy)
+                        setPersistencePolicy(persistencePolicyCopy)
+                        setDisplayPolicy(displayPolicyCopy)
+                    }
+                    .build()
             else -> null
         }
     } catch (e: Exception) {
@@ -2368,9 +2356,7 @@
     }
 }
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @Suppress("NewApi")
 public fun WireComplicationData.toApiComplicationData(): ComplicationData {
@@ -2379,121 +2365,123 @@
             NoDataComplicationData.TYPE.toWireComplicationType() -> {
                 placeholder?.toPlaceholderComplicationData()?.let {
                     NoDataComplicationData(it, this@toApiComplicationData)
-                } ?: NoDataComplicationData(null, this@toApiComplicationData)
+                }
+                    ?: NoDataComplicationData(null, this@toApiComplicationData)
             }
-
             EmptyComplicationData.TYPE.toWireComplicationType() -> EmptyComplicationData()
-
             NotConfiguredComplicationData.TYPE.toWireComplicationType() ->
                 NotConfiguredComplicationData()
-
             ShortTextComplicationData.TYPE.toWireComplicationType() ->
                 ShortTextComplicationData.Builder(
-                    shortText!!.toApiComplicationText(),
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setTitle(shortTitle?.toApiComplicationText())
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                }.build()
-
+                        shortText!!.toApiComplicationText(),
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setTitle(shortTitle?.toApiComplicationText())
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                    }
+                    .build()
             LongTextComplicationData.TYPE.toWireComplicationType() ->
                 LongTextComplicationData.Builder(
-                    longText!!.toApiComplicationText(),
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setTitle(longTitle?.toApiComplicationText())
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                }.build()
-
+                        longText!!.toApiComplicationText(),
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setTitle(longTitle?.toApiComplicationText())
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                    }
+                    .build()
             RangedValueComplicationData.TYPE.toWireComplicationType() ->
                 RangedValueComplicationData.Builder(
-                    value = rangedValue,
-                    valueExpression = rangedValueExpression,
-                    min = rangedMinValue,
-                    max = rangedMaxValue,
-                    contentDescription = contentDescription?.toApiComplicationText()
-                        ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                    setTitle(shortTitle?.toApiComplicationText())
-                    setText(shortText?.toApiComplicationText())
-                    colorRamp?.let {
-                        setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+                        value = rangedValue,
+                        valueExpression = rangedValueExpression,
+                        min = rangedMinValue,
+                        max = rangedMaxValue,
+                        contentDescription = contentDescription?.toApiComplicationText()
+                                ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                        setTitle(shortTitle?.toApiComplicationText())
+                        setText(shortText?.toApiComplicationText())
+                        colorRamp?.let { setColorRamp(ColorRamp(it, isColorRampInterpolated!!)) }
+                        setValueType(rangedValueType)
                     }
-                    setValueType(rangedValueType)
-                }.build()
-
+                    .build()
             MonochromaticImageComplicationData.TYPE.toWireComplicationType() ->
                 MonochromaticImageComplicationData.Builder(
-                    parseIcon()!!,
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                }.build()
-
+                        parseIcon()!!,
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                    }
+                    .build()
             SmallImageComplicationData.TYPE.toWireComplicationType() ->
                 SmallImageComplicationData.Builder(
-                    parseSmallImage()!!,
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                }.build()
-
+                        parseSmallImage()!!,
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                    }
+                    .build()
             PhotoImageComplicationData.TYPE.toWireComplicationType() ->
                 PhotoImageComplicationData.Builder(
-                    largeImage!!,
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                }.build()
-
+                        largeImage!!,
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                    }
+                    .build()
             NoPermissionComplicationData.TYPE.toWireComplicationType() ->
-                NoPermissionComplicationData.Builder().apply {
-                    setCommon(this@toApiComplicationData)
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                    setTitle(shortTitle?.toApiComplicationText())
-                    setText(shortText?.toApiComplicationText())
-                }.build()
-
+                NoPermissionComplicationData.Builder()
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                        setTitle(shortTitle?.toApiComplicationText())
+                        setText(shortText?.toApiComplicationText())
+                    }
+                    .build()
             GoalProgressComplicationData.TYPE.toWireComplicationType() ->
                 GoalProgressComplicationData.Builder(
-                    value = rangedValue,
-                    valueExpression = rangedValueExpression,
-                    targetValue = targetValue,
-                    contentDescription = contentDescription?.toApiComplicationText()
-                        ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                    setTitle(shortTitle?.toApiComplicationText())
-                    setText(shortText?.toApiComplicationText())
-                    colorRamp?.let {
-                        setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+                        value = rangedValue,
+                        valueExpression = rangedValueExpression,
+                        targetValue = targetValue,
+                        contentDescription = contentDescription?.toApiComplicationText()
+                                ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                        setTitle(shortTitle?.toApiComplicationText())
+                        setText(shortText?.toApiComplicationText())
+                        colorRamp?.let { setColorRamp(ColorRamp(it, isColorRampInterpolated!!)) }
                     }
-                }.build()
-
+                    .build()
             WeightedElementsComplicationData.TYPE.toWireComplicationType() -> {
                 val elementWeights = this.elementWeights!!
                 val elementColors = this.elementColors!!
@@ -2501,22 +2489,29 @@
                     "elementWeights and elementColors must have the same size"
                 }
                 WeightedElementsComplicationData.Builder(
-                    elements = elementWeights.mapIndexed { index, weight ->
-                        WeightedElementsComplicationData.Element(weight, elementColors[index])
-                    }.toList(),
-                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
-                ).apply {
-                    setCommon(this@toApiComplicationData)
-                    setElementBackgroundColor(elementBackgroundColor)
-                    setTapAction(tapAction)
-                    setValidTimeRange(parseTimeRange())
-                    setMonochromaticImage(parseIcon())
-                    setSmallImage(parseSmallImage())
-                    setTitle(shortTitle?.toApiComplicationText())
-                    setText(shortText?.toApiComplicationText())
-                }.build()
+                        elements =
+                            elementWeights
+                                .mapIndexed { index, weight ->
+                                    WeightedElementsComplicationData.Element(
+                                        weight,
+                                        elementColors[index]
+                                    )
+                                }
+                                .toList(),
+                        contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+                    )
+                    .apply {
+                        setCommon(this@toApiComplicationData)
+                        setElementBackgroundColor(elementBackgroundColor)
+                        setTapAction(tapAction)
+                        setValidTimeRange(parseTimeRange())
+                        setMonochromaticImage(parseIcon())
+                        setSmallImage(parseSmallImage())
+                        setTitle(shortTitle?.toApiComplicationText())
+                        setText(shortText?.toApiComplicationText())
+                    }
+                    .build()
             }
-
             else -> NoDataComplicationData()
         }
     } catch (e: Exception) {
@@ -2541,9 +2536,7 @@
 
 private fun WireComplicationData.parseIcon() =
     icon?.let {
-        MonochromaticImage.Builder(it).apply {
-            setAmbientImage(burnInProtectionIcon)
-        }.build()
+        MonochromaticImage.Builder(it).apply { setAmbientImage(burnInProtectionIcon) }.build()
     }
 
 private fun WireComplicationData.parseIconPlaceholderAware() =
@@ -2551,22 +2544,21 @@
         if (it.isPlaceholder()) {
             MonochromaticImage.PLACEHOLDER
         } else {
-            MonochromaticImage.Builder(it).apply {
-                setAmbientImage(burnInProtectionIcon)
-            }.build()
+            MonochromaticImage.Builder(it).apply { setAmbientImage(burnInProtectionIcon) }.build()
         }
     }
 
 private fun WireComplicationData.parseSmallImage() =
     smallImage?.let {
-        val imageStyle = when (smallImageStyle) {
-            WireComplicationData.IMAGE_STYLE_ICON -> SmallImageType.ICON
-            WireComplicationData.IMAGE_STYLE_PHOTO -> SmallImageType.PHOTO
-            else -> SmallImageType.PHOTO
-        }
-        SmallImage.Builder(it, imageStyle).apply {
-            setAmbientImage(burnInProtectionSmallImage)
-        }.build()
+        val imageStyle =
+            when (smallImageStyle) {
+                WireComplicationData.IMAGE_STYLE_ICON -> SmallImageType.ICON
+                WireComplicationData.IMAGE_STYLE_PHOTO -> SmallImageType.PHOTO
+                else -> SmallImageType.PHOTO
+            }
+        SmallImage.Builder(it, imageStyle)
+            .apply { setAmbientImage(burnInProtectionSmallImage) }
+            .build()
     }
 
 private fun WireComplicationData.parseSmallImagePlaceholderAware() =
@@ -2574,14 +2566,15 @@
         if (it.isPlaceholder()) {
             SmallImage.PLACEHOLDER
         } else {
-            val imageStyle = when (smallImageStyle) {
-                WireComplicationData.IMAGE_STYLE_ICON -> SmallImageType.ICON
-                WireComplicationData.IMAGE_STYLE_PHOTO -> SmallImageType.PHOTO
-                else -> SmallImageType.PHOTO
-            }
-            SmallImage.Builder(it, imageStyle).apply {
-                setAmbientImage(burnInProtectionSmallImage)
-            }.build()
+            val imageStyle =
+                when (smallImageStyle) {
+                    WireComplicationData.IMAGE_STYLE_ICON -> SmallImageType.ICON
+                    WireComplicationData.IMAGE_STYLE_PHOTO -> SmallImageType.PHOTO
+                    else -> SmallImageType.PHOTO
+                }
+            SmallImage.Builder(it, imageStyle)
+                .apply { setAmbientImage(burnInProtectionSmallImage) }
+                .build()
         }
     }
 
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/DefaultComplicationDataSourcePolicyWireFormat.java b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/DefaultComplicationDataSourcePolicyWireFormat.java
index 7f78b06..9f5dbb2 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/DefaultComplicationDataSourcePolicyWireFormat.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/DefaultComplicationDataSourcePolicyWireFormat.java
@@ -57,8 +57,7 @@
     @ComplicationData.ComplicationType
     public int mSecondaryDataSourceDefaultType;
 
-    DefaultComplicationDataSourcePolicyWireFormat() {
-    }
+    DefaultComplicationDataSourcePolicyWireFormat() {}
 
     public DefaultComplicationDataSourcePolicyWireFormat(
             @NonNull List<ComponentName> defaultDataSourcesToTry,
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Image.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Image.kt
index 35bda85..15cb0c5 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Image.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Image.kt
@@ -16,9 +16,9 @@
 
 package androidx.wear.watchface.complications.data
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.graphics.drawable.Icon
 import android.os.Build
+import android.support.wearable.complications.ComplicationData as WireComplicationData
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.utility.iconEquals
@@ -37,17 +37,15 @@
  * with the provider / brand with the expectation that the watch face may recolor it (typically
  * using a SRC_IN filter).
  *
- * An ambient alternative is provided that may be shown instead of the regular image while the
- * watch is not active.
+ * An ambient alternative is provided that may be shown instead of the regular image while the watch
+ * is not active.
  *
  * @property [image] The image itself
  * @property [ambientImage] The image to be shown when the device is in ambient mode to save power
- * or avoid burn in
+ *   or avoid burn in
  */
-public class MonochromaticImage internal constructor(
-    public val image: Icon,
-    public val ambientImage: Icon?
-) {
+public class MonochromaticImage
+internal constructor(public val image: Icon, public val ambientImage: Icon?) {
     /**
      * Builder for [MonochromaticImage].
      *
@@ -57,9 +55,9 @@
         private var ambientImage: Icon? = null
 
         /**
-         * Sets a different image for when the device is ambient mode to save power and prevent
-         * burn in. If no ambient variant is provided, the watch face may not show anything while
-         * in ambient mode.
+         * Sets a different image for when the device is ambient mode to save power and prevent burn
+         * in. If no ambient variant is provided, the watch face may not show anything while in
+         * ambient mode.
          */
         public fun setAmbientImage(ambientImage: Icon?): Builder = apply {
             this.ambientImage = ambientImage
@@ -70,10 +68,11 @@
     }
 
     /** Adds a [MonochromaticImage] to a builder for [WireComplicationData]. */
-    internal fun addToWireComplicationData(builder: WireComplicationData.Builder) = builder.apply {
-        setIcon(image)
-        setBurnInProtectionIcon(ambientImage)
-    }
+    internal fun addToWireComplicationData(builder: WireComplicationData.Builder) =
+        builder.apply {
+            setIcon(image)
+            setBurnInProtectionIcon(ambientImage)
+        }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -94,8 +93,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    fun isPlaceholder() = image.isPlaceholder()
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) fun isPlaceholder() = image.isPlaceholder()
 
     /** @hide */
     public companion object {
@@ -120,16 +118,16 @@
  */
 public enum class SmallImageType {
     /**
-     * Type for images that have a transparent background and are expected to be drawn
-     * entirely within the space available, such as a launcher image. Watch faces may add padding
-     * when drawing these images, but should never crop these images. Icons must not be recolored.
+     * Type for images that have a transparent background and are expected to be drawn entirely
+     * within the space available, such as a launcher image. Watch faces may add padding when
+     * drawing these images, but should never crop these images. Icons must not be recolored.
      */
     ICON,
 
     /**
-     * Type for images which are photos that are expected to fill the space available. Images
-     * of this style may be cropped to fit the shape of the complication - in particular, the image
-     * may be cropped to a circle. Photos must not be recolored.
+     * Type for images which are photos that are expected to fill the space available. Images of
+     * this style may be cropped to fit the shape of the complication - in particular, the image may
+     * be cropped to a circle. Photos must not be recolored.
      */
     PHOTO
 }
@@ -138,15 +136,16 @@
  * An image that is expected to cover a small fraction of a watch face occupied by a single
  * complication. A SmallImage must not be tinted.
  *
- * An ambient alternative is provided that may be shown instead of the regular image while the
- * watch is not active.
+ * An ambient alternative is provided that may be shown instead of the regular image while the watch
+ * is not active.
  *
  * @property [image] The image itself
  * @property [type] The style of the image provided, to guide how it should be displayed
  * @property [ambientImage] The image to be shown when the device is in ambient mode to save power
- * or avoid burn in
+ *   or avoid burn in
  */
-public class SmallImage internal constructor(
+public class SmallImage
+internal constructor(
     public val image: Icon,
     public val type: SmallImageType,
     public val ambientImage: Icon?
@@ -161,9 +160,9 @@
         private var ambientImage: Icon? = null
 
         /**
-         * Sets a different image for when the device is ambient mode to save power and prevent
-         * burn in. If no ambient variant is provided, the watch face may not show anything while
-         * in ambient mode.
+         * Sets a different image for when the device is ambient mode to save power and prevent burn
+         * in. If no ambient variant is provided, the watch face may not show anything while in
+         * ambient mode.
          */
         public fun setAmbientImage(ambientImage: Icon?): Builder = apply {
             this.ambientImage = ambientImage
@@ -174,16 +173,17 @@
     }
 
     /** Adds a [SmallImage] to a builder for [WireComplicationData]. */
-    internal fun addToWireComplicationData(builder: WireComplicationData.Builder) = builder.apply {
-        setSmallImage(image)
-        setSmallImageStyle(
-            when (this@SmallImage.type) {
-                SmallImageType.ICON -> WireComplicationData.IMAGE_STYLE_ICON
-                SmallImageType.PHOTO -> WireComplicationData.IMAGE_STYLE_PHOTO
-            }
-        )
-        setBurnInProtectionSmallImage(ambientImage)
-    }
+    internal fun addToWireComplicationData(builder: WireComplicationData.Builder) =
+        builder.apply {
+            setSmallImage(image)
+            setSmallImageStyle(
+                when (this@SmallImage.type) {
+                    SmallImageType.ICON -> WireComplicationData.IMAGE_STYLE_ICON
+                    SmallImageType.PHOTO -> WireComplicationData.IMAGE_STYLE_PHOTO
+                }
+            )
+            setBurnInProtectionSmallImage(ambientImage)
+        }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -208,8 +208,8 @@
     /** @hide */
     public companion object {
         /**
-         * For use when the real data isn't available yet, this [SmallImage] should be rendered
-         * as a placeholder. It is suggested that it should be rendered with a light grey box.
+         * For use when the real data isn't available yet, this [SmallImage] should be rendered as a
+         * placeholder. It is suggested that it should be rendered with a light grey box.
          *
          * Note a placeholder may only be used in the context of
          * [NoDataComplicationData.placeholder].
@@ -220,17 +220,17 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    fun isPlaceholder() = image.isPlaceholder()
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) fun isPlaceholder() = image.isPlaceholder()
 }
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun Icon.isPlaceholder() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-    IconP.isPlaceholder(this)
-} else {
-    false
-}
+fun Icon.isPlaceholder() =
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+        IconP.isPlaceholder(this)
+    } else {
+        false
+    }
 
 @RequiresApi(Build.VERSION_CODES.P)
 private object IconP {
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
index 22f7fc7..0f77bd0 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
@@ -16,13 +16,13 @@
 
 package androidx.wear.watchface.complications.data
 
+import android.content.res.Resources
+import android.icu.util.TimeZone
 import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder as WireComplicationTextTimeDifferenceBuilder
 import android.support.wearable.complications.ComplicationText.TimeFormatBuilder as WireComplicationTextTimeFormatBuilder
 import android.support.wearable.complications.TimeDependentText as WireTimeDependentText
-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
@@ -38,14 +38,14 @@
 import java.time.Instant
 import java.util.concurrent.TimeUnit
 
-@JvmDefaultWithCompatibility
 /**
  * The text within a complication.
  *
  * This text may change over time and this interface provides both a way to determine the current
- * text to show with [getTextAt] but also a way to know whether the text needs to be
- * re-rendered, by means of [returnsSameText], [getNextChangeTime], and [isAlwaysEmpty].
+ * text to show with [getTextAt] but also a way to know whether the text needs to be re-rendered, by
+ * means of [returnsSameText], [getNextChangeTime], and [isAlwaysEmpty].
  */
+@JvmDefaultWithCompatibility
 public interface ComplicationText {
     /**
      * Returns the text that should be displayed for the given timestamp.
@@ -53,10 +53,7 @@
      * @param resources [Resources] from the current context
      * @param instant The [Instant] at which to sample the text
      */
-    public fun getTextAt(
-        resources: Resources,
-        instant: Instant
-    ): CharSequence
+    public fun getTextAt(resources: Resources, instant: Instant): CharSequence
 
     /**
      * Returns true if the result of [getTextAt] will be the same for both [firstInstant] and
@@ -64,22 +61,16 @@
      */
     public fun returnsSameText(firstInstant: Instant, secondInstant: Instant): Boolean
 
-    /** Returns the next time after [afterInstant] at which the text may change.  */
+    /** Returns the next time after [afterInstant] at which the text may change. */
     public fun getNextChangeTime(afterInstant: Instant): Instant
 
     public fun isAlwaysEmpty(): Boolean
 
-    /**
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun isPlaceholder(): Boolean = false
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public fun isPlaceholder(): Boolean = false
 
-    /**
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.SUBCLASSES)
-    public fun getTimeDependentText(): TimeDependentText
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.SUBCLASSES) public fun getTimeDependentText(): TimeDependentText
 
     /**
      * Converts this value to [WireComplicationText] object used for serialization.
@@ -90,8 +81,7 @@
     public fun toWireComplicationText(): WireComplicationText
 
     public companion object {
-        @JvmField
-        public val EMPTY: ComplicationText = PlainComplicationText.Builder("").build()
+        @JvmField public val EMPTY: ComplicationText = PlainComplicationText.Builder("").build()
 
         /**
          * For use when the real data isn't available yet, this [ComplicationText] should be
@@ -108,9 +98,8 @@
 }
 
 /** A [ComplicationText] that contains plain text. */
-public class PlainComplicationText internal constructor(
-    delegate: WireComplicationText
-) : ComplicationText {
+public class PlainComplicationText internal constructor(delegate: WireComplicationText) :
+    ComplicationText {
     private val delegate = DelegatingComplicationText(delegate)
 
     override fun getTextAt(resources: Resources, instant: Instant) =
@@ -175,11 +164,11 @@
      * If `t < 1 hour`, the value will be shown as minutes and seconds, such as `02:35` for 2
      * minutes and 35 seconds.
      *
-     * If `1 hour <= t < 1 day`, the value will be shown as hours and minutes, such as
-     * `4:02` for 4 hours and 2 minutes, or as `12:02` for 12 hours and 2 minutes.
+     * If `1 hour <= t < 1 day`, the value will be shown as hours and minutes, such as `4:02` for 4
+     * hours and 2 minutes, or as `12:02` for 12 hours and 2 minutes.
      *
-     * If `1 day <= t < 10 days`, the value will be shown as days and hours, such as `3d 4h` for
-     * 3 days 4 hours.
+     * If `1 day <= t < 10 days`, the value will be shown as days and hours, such as `3d 4h` for 3
+     * days 4 hours.
      *
      * If `10 days <= t`, the value will be shown as just days, such as `13d` for 13 days.
      *
@@ -193,8 +182,8 @@
      *
      * For time difference `t`:
      *
-     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `2m` for 2 minutes
-     * . Seconds are not displayed.
+     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `2m` for 2 minutes .
+     * Seconds are not displayed.
      *
      * If `1 hour <= t < 1 day`, the value will be shown as a number of hours, such as `4h` for 4
      * hours.
@@ -211,20 +200,19 @@
      *
      * For time difference `t`:
      *
-     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `2m`
-     * for 2 minutes. Seconds are not displayed.
+     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `2m` for 2 minutes.
+     * Seconds are not displayed.
      *
-     * If `1 hour <= t < 1 day`, the value will be shown as hours and minutes, such as
-     * `4h 2m` for 4 hours and 2 minutes.
+     * If `1 hour <= t < 1 day`, the value will be shown as hours and minutes, such as `4h 2m` for 4
+     * hours and 2 minutes.
      *
-     * If `1 day <= t < 10 days`, the value will be shown as days and hours, such as `3d 4h` for
-     * 3 days 4 hours.
+     * If `1 day <= t < 10 days`, the value will be shown as days and hours, such as `3d 4h` for 3
+     * days 4 hours.
      *
-     * If `10 days <= t`, the value will be shown as a number of days, such as `13d`
-     * for 13 days.
+     * If `10 days <= t`, the value will be shown as a number of days, such as `13d` for 13 days.
      *
-     * The characters used will be localised to match the default locale. If the representation
-     * of the time difference with two units would be too long in the default locale, just a single
+     * The characters used will be localised to match the default locale. If the representation of
+     * the time difference with two units would be too long in the default locale, just a single
      * unit may be shown instead.
      */
     SHORT_DUAL_UNIT(WireComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT),
@@ -235,14 +223,14 @@
      *
      * For time difference `t`:
      *
-     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `1 min` for 1
-     * minute or `2 mins` for 2 minutes. Seconds are not displayed.
+     * If `t < 1 hour`, the value will be shown as a number of minutes, such as `1 min` for 1 minute
+     * or `2 mins` for 2 minutes. Seconds are not displayed.
      *
-     * If `1 hour <= t < 1 day`, the value will be shown as a number of hours, such as
-     * `1 hour` for 1 hour or `4 hours` for 4 hours.
+     * If `1 hour <= t < 1 day`, the value will be shown as a number of hours, such as `1 hour` for
+     * 1 hour or `4 hours` for 4 hours.
      *
-     * If `1 days <= t`, the value will be shown as a number of days, such as `1 day`
-     * for 1 day or `13 days` for 13 days.
+     * If `1 days <= t`, the value will be shown as a number of days, such as `1 day` for 1 day or
+     * `13 days` for 13 days.
      *
      * The words used will be localised to match the default locale.
      */
@@ -252,17 +240,16 @@
      * Style for time differences shown using (possibly abbreviated) words, with only the most
      * significant unit included, that should fit within the character limit for a short text field.
      *
-     * The output will be the same as for [WORDS_SINGLE_UNIT], except that if the text does not
-     * fit into the seven character limit then a shorter form will be used instead, e.g. `1356d`
-     * instead of `1356 days`.
+     * The output will be the same as for [WORDS_SINGLE_UNIT], except that if the text does not fit
+     * into the seven character limit then a shorter form will be used instead, e.g. `1356d` instead
+     * of `1356 days`.
      */
-    SHORT_WORDS_SINGLE_UNIT(WireComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT);
+    SHORT_WORDS_SINGLE_UNIT(WireComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT)
 }
 
 /** A [ComplicationText] that represents a time difference. */
-public class TimeDifferenceComplicationText internal constructor(
-    delegate: WireComplicationText
-) : ComplicationText by DelegatingComplicationText(delegate) {
+public class TimeDifferenceComplicationText internal constructor(delegate: WireComplicationText) :
+    ComplicationText by DelegatingComplicationText(delegate) {
     private val delegate = DelegatingComplicationText(delegate)
 
     /**
@@ -315,7 +302,8 @@
      *
      * Requires setting a [TimeDifferenceStyle].
      */
-    public class Builder private constructor(
+    public class Builder
+    private constructor(
         private val style: TimeDifferenceStyle,
         private val startInstant: Instant?,
         private val endInstant: Instant?
@@ -351,12 +339,14 @@
         /**
          * Sets the text within which the time difference will be displayed.
          *
-         * Within the text, `^1` will be replaced with the time difference, so for example
-         * to show a result like `"2 mins: meeting"` the text would be `"^1: meeting"`
+         * Within the text, `^1` will be replaced with the time difference, so for example to show a
+         * result like `"2 mins: meeting"` the text would be `"^1: meeting"`
          *
          * To use the `^` character within the text, escape it as `^^`.
          *
-         * The text may contain spans, but the watch face is not required to respect them.
+         * The text may contain spans, but the watch face is not required to respect them. The watch
+         * face is allowed to treat [ForegroundColorSpan] as a hint that it should render the
+         * affected text with an alternative color of its choosing.
          *
          * The allowed spans are [ForegroundColorSpan], [LocaleSpan], [SubscriptSpan],
          * [SuperscriptSpan], [StyleSpan], [StrikethroughSpan], [TypefaceSpan] and [UnderlineSpan].
@@ -364,48 +354,49 @@
         public fun setText(text: CharSequence?): Builder = apply { this.text = text }
 
         /**
-         * Sets whether time difference should be displayed as "now" (appropriately localized)
-         * when the given time is within the reference period. If false, then text representing zero
+         * Sets whether time difference should be displayed as "now" (appropriately localized) when
+         * the given time is within the reference period. If false, then text representing zero
          * (e.g. `0 mins` or `00:00`) will be shown instead.
          *
          * The default is true for all styles except for [TimeDifferenceStyle.STOPWATCH].
          */
-        public fun setDisplayAsNow(displayAsNow: Boolean): Builder =
-            apply { this.displayAsNow = displayAsNow }
+        public fun setDisplayAsNow(displayAsNow: Boolean): Builder = apply {
+            this.displayAsNow = displayAsNow
+        }
 
         /**
          * Sets the smallest unit that may be shown in the time difference text. If specified, units
          * smaller than this minimum will not be included.
          *
          * For example, if this is set to [TimeUnit.HOURS], and the style is
-         * [TimeDifferenceStyle.SHORT_SINGLE_UNIT] then `12d` or `5h` would be shown as normal,
-         * but `35m` would be shown as `1h`.
+         * [TimeDifferenceStyle.SHORT_SINGLE_UNIT] then `12d` or `5h` would be shown as normal, but
+         * `35m` would be shown as `1h`.
          *
          * If not specified the style will determine the smallest unit that will be shown.
          *
-         * If the specified minimum is smaller than the smallest unit supported by the style,
-         * then the minimum will be ignored. For example, if the style is
+         * If the specified minimum is smaller than the smallest unit supported by the style, then
+         * the minimum will be ignored. For example, if the style is
          * [TimeDifferenceStyle.SHORT_SINGLE_UNIT], then a minimum unit of [TimeUnit.SECONDS] will
          * have no effect.
          */
-        public fun setMinimumTimeUnit(minimumUnit: TimeUnit?): Builder =
-            apply { this.minimumUnit = minimumUnit }
+        public fun setMinimumTimeUnit(minimumUnit: TimeUnit?): Builder = apply {
+            this.minimumUnit = minimumUnit
+        }
 
         /** Builds a [TimeDifferenceComplicationText]. */
-        public fun build(): TimeDifferenceComplicationText = TimeDifferenceComplicationText(
-            WireComplicationTextTimeDifferenceBuilder().apply {
-                setStyle(style.wireStyle)
-                setSurroundingText(text)
-                startInstant?.let {
-                    setReferencePeriodStartMillis(it.toEpochMilli())
-                }
-                endInstant?.let {
-                    setReferencePeriodEndMillis(it.toEpochMilli())
-                }
-                displayAsNow?.let { setShowNowText(it) }
-                setMinimumUnit(minimumUnit)
-            }.build()
-        )
+        public fun build(): TimeDifferenceComplicationText =
+            TimeDifferenceComplicationText(
+                WireComplicationTextTimeDifferenceBuilder()
+                    .apply {
+                        setStyle(style.wireStyle)
+                        setSurroundingText(text)
+                        startInstant?.let { setReferencePeriodStartMillis(it.toEpochMilli()) }
+                        endInstant?.let { setReferencePeriodEndMillis(it.toEpochMilli()) }
+                        displayAsNow?.let { setShowNowText(it) }
+                        setMinimumUnit(minimumUnit)
+                    }
+                    .build()
+            )
     }
 }
 
@@ -413,13 +404,12 @@
 public enum class TimeFormatStyle(internal val wireStyle: Int) {
     DEFAULT(WireComplicationText.FORMAT_STYLE_DEFAULT),
     UPPER_CASE(WireComplicationText.FORMAT_STYLE_UPPER_CASE),
-    LOWER_CASE(WireComplicationText.FORMAT_STYLE_LOWER_CASE);
+    LOWER_CASE(WireComplicationText.FORMAT_STYLE_LOWER_CASE)
 }
 
 /** A [ComplicationText] that shows a formatted time. */
-public class TimeFormatComplicationText internal constructor(
-    delegate: WireComplicationText
-) : ComplicationText by DelegatingComplicationText(delegate) {
+public class TimeFormatComplicationText internal constructor(delegate: WireComplicationText) :
+    ComplicationText by DelegatingComplicationText(delegate) {
     private val delegate = DelegatingComplicationText(delegate)
 
     override fun getTextAt(resources: Resources, instant: Instant) =
@@ -461,8 +451,8 @@
     /**
      * A builder for [TimeFormatComplicationText].
      *
-     * @param[format] the format in which the time should be displayed. This should be a pattern
-     * as used by [java.text.SimpleDateFormat].
+     * @param[format] the format in which the time should be displayed. This should be a pattern as
+     *   used by [java.text.SimpleDateFormat].
      */
     public class Builder(private var format: String) {
         private var style: TimeFormatStyle? = null
@@ -480,8 +470,8 @@
         /**
          * Sets the text within which the time difference will be displayed.
          *
-         * Within the text, `^1` will be replaced with the time difference, so for example
-         * to show a result like `"2 mins: meeting"` the text would be `"^1: meeting"`
+         * Within the text, `^1` will be replaced with the time difference, so for example to show a
+         * result like `"2 mins: meeting"` the text would be `"^1: meeting"`
          *
          * To use the `^` character within the text, escape it as `^^`.
          *
@@ -499,21 +489,23 @@
         public fun setTimeZone(timeZone: TimeZone): Builder = apply { this.timeZone = timeZone }
 
         /** Builds a [TimeFormatComplicationText]. */
-        public fun build(): TimeFormatComplicationText = TimeFormatComplicationText(
-            WireComplicationTextTimeFormatBuilder().apply {
-                setFormat(format)
-                setStyle(style?.wireStyle ?: WireComplicationText.FORMAT_STYLE_DEFAULT)
-                setSurroundingText(text)
-                setTimeZone(timeZone?.asJavaTimeZone())
-            }.build()
-        )
+        public fun build(): TimeFormatComplicationText =
+            TimeFormatComplicationText(
+                WireComplicationTextTimeFormatBuilder()
+                    .apply {
+                        setFormat(format)
+                        setStyle(style?.wireStyle ?: WireComplicationText.FORMAT_STYLE_DEFAULT)
+                        setSurroundingText(text)
+                        setTimeZone(timeZone?.asJavaTimeZone())
+                    }
+                    .build()
+            )
     }
 }
 
 /** [ComplicationText] implementation that delegates to a [WireComplicationText] instance. */
-private class DelegatingComplicationText(
-    private val delegate: WireComplicationText
-) : ComplicationText {
+private class DelegatingComplicationText(private val delegate: WireComplicationText) :
+    ComplicationText {
     override fun getTextAt(resources: Resources, instant: Instant) =
         delegate.getTextAt(resources, instant.toEpochMilli())
 
@@ -523,7 +515,7 @@
     override fun getNextChangeTime(afterInstant: Instant): Instant {
         val nextChangeTime = delegate.getNextChangeTime(afterInstant.toEpochMilli())
         return if (nextChangeTime == Long.MAX_VALUE) {
-             Instant.MAX
+            Instant.MAX
         } else {
             Instant.ofEpochMilli(nextChangeTime)
         }
@@ -537,8 +529,7 @@
     override fun getTimeDependentText(): TimeDependentText = delegate.timeDependentText
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    override fun toWireComplicationText() = delegate
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) override fun toWireComplicationText() = delegate
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -570,16 +561,18 @@
 
 /** Converts a [WireComplicationText] into an equivalent [ComplicationText] instead. */
 internal fun WireComplicationText.toApiComplicationTextPlaceholderAware(): ComplicationText =
-    if (isPlaceholder) { ComplicationText.PLACEHOLDER } else { DelegatingComplicationText(this) }
+    if (isPlaceholder) {
+        ComplicationText.PLACEHOLDER
+    } else {
+        DelegatingComplicationText(this)
+    }
 
 /** Converts a [TimeZone] into an equivalent [java.util.TimeZone]. */
-internal fun TimeZone.asJavaTimeZone(): java.util.TimeZone =
-    java.util.TimeZone.getTimeZone(this.id)
+internal fun TimeZone.asJavaTimeZone(): java.util.TimeZone = java.util.TimeZone.getTimeZone(this.id)
 
 /** [ComplicationText] implementation that delegates to a [WireTimeDependentText] instance. */
-private class DelegatingTimeDependentText(
-    private val delegate: WireTimeDependentText
-) : ComplicationText {
+private class DelegatingTimeDependentText(private val delegate: WireTimeDependentText) :
+    ComplicationText {
     override fun getTextAt(resources: Resources, instant: Instant) =
         delegate.getTextAt(resources, instant.toEpochMilli())
 
@@ -629,16 +622,14 @@
     DelegatingTimeDependentText(this)
 
 /**
- * A [ComplicationText] where the system evaluates a [DynamicString] on behalf of the watch face.
- * By the time this reaches the watch face's Renderer, it'll have been converted to a plain
+ * A [ComplicationText] where the system evaluates a [DynamicString] on behalf of the watch face. By
+ * the time this reaches the watch face's Renderer, it'll have been converted to a plain
  * ComplicationText.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class ComplicationTextExpression(
-    public val expression: DynamicString
-) : ComplicationText {
+public class ComplicationTextExpression(public val expression: DynamicString) : ComplicationText {
     private val delegate = DelegatingComplicationText(WireComplicationText(expression))
 
     override fun getTextAt(resources: Resources, instant: Instant) =
@@ -678,4 +669,4 @@
     override fun hashCode() = delegate.hashCode()
 
     override fun toString() = delegate.toString()
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Time.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Time.kt
index c402f16..5167948 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Time.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Time.kt
@@ -20,7 +20,8 @@
 import java.time.Instant
 
 /** A range of time, that may be unbounded on either side. */
-public class TimeRange internal constructor(
+public class TimeRange
+internal constructor(
     public val startDateTimeMillis: Instant,
     public val endDateTimeMillis: Instant
 ) {
@@ -56,20 +57,18 @@
 
     public companion object {
         /** The [TimeRange] that includes every point in time. */
-        @JvmField
-        public val ALWAYS: TimeRange = TimeRange(Instant.MIN, Instant.MAX)
+        @JvmField public val ALWAYS: TimeRange = TimeRange(Instant.MIN, Instant.MAX)
 
         /** Constructs a time range after a given point in time. */
         @JvmStatic
-        public fun after(startInstant: Instant): TimeRange =
-            TimeRange(startInstant, Instant.MAX)
+        public fun after(startInstant: Instant): TimeRange = TimeRange(startInstant, Instant.MAX)
 
         /** Constructs a time range until a given point in time. */
         @JvmStatic
         public fun before(endInstant: Instant): TimeRange = TimeRange(Instant.MIN, endInstant)
 
-        /** Constructs a time range between two points in time, inclusive of the points
-         * themselves.
+        /**
+         * Constructs a time range between two points in time, inclusive of the points themselves.
          */
         @JvmStatic
         public fun between(startInstant: Instant, endInstant: Instant): TimeRange =
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
index f4dfa77..ab013b5 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
@@ -16,8 +16,8 @@
 
 package androidx.wear.watchface.complications.data
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.os.Build
+import android.support.wearable.complications.ComplicationData as WireComplicationData
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 
@@ -25,8 +25,8 @@
  * The possible complication data types.
  *
  * See also wear/watchface/watchface-complications-data/src/main/res/values/attrs.xml for the XML
- * definition. And supportedTypes in wear/watchface/watchface/src/main/res/values/attrs.xml.
- * And wear/watchface/watchface/src/main/res/values/attrs.xml which defines a subset.
+ * definition. And supportedTypes in wear/watchface/watchface/src/main/res/values/attrs.xml. And
+ * wear/watchface/watchface/src/main/res/values/attrs.xml which defines a subset.
  */
 public enum class ComplicationType(private val wireType: Int) {
     NO_DATA(WireComplicationData.TYPE_NO_DATA),
@@ -51,8 +51,7 @@
      *
      * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public fun toWireComplicationType(): Int = wireType
+    @RestrictTo(RestrictTo.Scope.LIBRARY) public fun toWireComplicationType(): Int = wireType
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -115,8 +114,8 @@
             types.toApiComplicationTypes()
 
         /**
-         * Converts an array of integer values used for serialization into the corresponding list
-         * of [ComplicationType].
+         * Converts an array of integer values used for serialization into the corresponding list of
+         * [ComplicationType].
          *
          * @hide
          */
@@ -128,8 +127,8 @@
 }
 
 /**
- * Converts an array of [ComplicationType] to an array of integers with the corresponding
- * wire types.
+ * Converts an array of [ComplicationType] to an array of integers with the corresponding wire
+ * types.
  *
  * This is only needed internally to convert to the underlying communication protocol.
  *
@@ -140,8 +139,8 @@
     this.map { it.toWireComplicationType() }.toIntArray()
 
 /**
- * Converts an array of integer values uses for serialization into the corresponding array
- * of [ComplicationType] to .
+ * Converts an array of integer values uses for serialization into the corresponding array of
+ * [ComplicationType] to .
  *
  * This is only needed internally to convert to the underlying communication protocol.
  *
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/IconKt.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/IconKt.kt
index 3c16333..2eb80e8 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/IconKt.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/IconKt.kt
@@ -58,7 +58,6 @@
                 when (icon.type) {
                     Icon.TYPE_RESOURCE ->
                         icon.resId == other.resId && icon.resPackage == other.resPackage
-
                     Icon.TYPE_URI -> icon.uri == other.uri
                     else -> icon == other
                 })
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/TraceEvent.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/TraceEvent.kt
index 8730f90..89ce5a9 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/TraceEvent.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/utility/TraceEvent.kt
@@ -21,10 +21,10 @@
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import java.io.Closeable
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
-import java.io.Closeable
 
 /**
  * Wrapper around [Trace.beginSection] and [Trace.endSection] which helps reduce boilerplate by
@@ -48,7 +48,7 @@
  * RAII like [Trace.endAsyncSection] in a try block, and by dealing with API version support.
  *
  * @hide
- **/
+ */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class AsyncTraceEvent(private val traceName: String) : Closeable {
     internal companion object {
@@ -90,14 +90,11 @@
 
 /**
  * Wrapper around [CoroutineScope.launch] with an async trace event.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public fun CoroutineScope.launchWithTracing(
     traceEventName: String,
     block: suspend CoroutineScope.() -> Unit
-): Job = launch {
-    TraceEvent(traceEventName).use {
-        block.invoke(this)
-    }
-}
+): Job = launch { TraceEvent(traceEventName).use { block.invoke(this) } }
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataEqualityTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataEqualityTest.kt
index 9dd28c8..29611f1 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataEqualityTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataEqualityTest.kt
@@ -40,8 +40,7 @@
 
 @RunWith(SharedRobolectricTestRunner::class)
 class ComplicationDataEqualityTest {
-    @get:Rule
-    val expect = Expect.create()
+    @get:Rule val expect = Expect.create()
 
     @Before
     fun setup() {
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
index 617d51a..3f25f2a 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
@@ -1074,4 +1074,4 @@
         const val TEST_LONG_TITLE = "what a long title such a long title"
         const val TEST_LONG_TEXT = "such long text so much text omg"
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
index 1ceb670..4b5be1e 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
@@ -22,11 +22,11 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
 import com.google.common.truth.Truth
+import java.util.GregorianCalendar
+import java.util.concurrent.TimeUnit
 import org.junit.Assert
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.GregorianCalendar
-import java.util.concurrent.TimeUnit
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class ComplicationTextTemplateTest {
@@ -37,11 +37,12 @@
         val hello = ComplicationText.plainText(TEST_TEXT1)
         val there = ComplicationText.plainText(TEST_TEXT2)
         val friend = ComplicationText.plainText(TEST_TEXT3)
-        val complicationTextTemplate = ComplicationTextTemplate.Builder()
-            .addComplicationText(hello)
-            .addComplicationText(there)
-            .addComplicationText(friend)
-            .build()
+        val complicationTextTemplate =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(hello)
+                .addComplicationText(there)
+                .addComplicationText(friend)
+                .build()
         Assert.assertEquals(
             "$TEST_TEXT1 $TEST_TEXT2 $TEST_TEXT3",
             complicationTextTemplate.getTextAt(mResources, 132456789).toString()
@@ -53,12 +54,13 @@
         val hello = ComplicationText.plainText(TEST_TEXT1)
         val there = ComplicationText.plainText(TEST_TEXT2)
         val friend = ComplicationText.plainText(TEST_TEXT3)
-        val complicationTextTemplate = ComplicationTextTemplate.Builder()
-            .addComplicationText(hello)
-            .addComplicationText(there)
-            .addComplicationText(friend)
-            .setSurroundingText("^1, ^2 my ^3.")
-            .build()
+        val complicationTextTemplate =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(hello)
+                .addComplicationText(there)
+                .addComplicationText(friend)
+                .setSurroundingText("^1, ^2 my ^3.")
+                .build()
         Assert.assertEquals(
             "$TEST_TEXT1, $TEST_TEXT2 my $TEST_TEXT3.",
             complicationTextTemplate.getTextAt(mResources, 132456789).toString()
@@ -69,11 +71,12 @@
     public fun testTemplateEscapeCharacter() {
         val hello = ComplicationText.plainText(TEST_TEXT1)
         val there = ComplicationText.plainText(TEST_TEXT2)
-        val complicationTextTemplate = ComplicationTextTemplate.Builder()
-            .addComplicationText(hello)
-            .addComplicationText(there)
-            .setSurroundingText("^1 ^^2 ^2")
-            .build()
+        val complicationTextTemplate =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(hello)
+                .addComplicationText(there)
+                .setSurroundingText("^1 ^^2 ^2")
+                .build()
         Assert.assertEquals(
             "$TEST_TEXT1 ^2 $TEST_TEXT2",
             complicationTextTemplate.getTextAt(mResources, 132456789).toString()
@@ -95,43 +98,28 @@
                 .setReferencePeriodEndMillis(refTime)
                 .setStyle(ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT)
                 .build()
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(complicationText)
-            .addComplicationText(complicationText2)
-            .setSurroundingText("^1 : ^2")
-            .build()
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(complicationText)
+                .addComplicationText(complicationText2)
+                .setSurroundingText("^1 : ^2")
+                .build()
 
         // "2h 35m" should be rounded to "3h".
-        var testTime =
-            refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
-        Assert.assertEquals(
-            "3h : 2h 35m",
-            template.getTextAt(mResources, testTime).toString()
-        )
+        var testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
+        Assert.assertEquals("3h : 2h 35m", template.getTextAt(mResources, testTime).toString())
 
         // "23h 59m" should be rounded to "1d".
-        testTime =
-            refTime + TimeUnit.MINUTES.toMillis(59) + TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "1d : 23h 59m",
-            template.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(59) + TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d : 23h 59m", template.getTextAt(mResources, testTime).toString())
 
         // "10m 10s" should be rounded to "11m".
-        testTime =
-            refTime + TimeUnit.SECONDS.toMillis(10) + TimeUnit.MINUTES.toMillis(10)
-        Assert.assertEquals(
-            "11m : 11m",
-            template.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.SECONDS.toMillis(10) + TimeUnit.MINUTES.toMillis(10)
+        Assert.assertEquals("11m : 11m", template.getTextAt(mResources, testTime).toString())
 
         // "23h 15m" should be rounded to "1d".
-        testTime =
-            refTime + TimeUnit.MINUTES.toMillis(15) + TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "1d : 23h 15m",
-            template.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(15) + TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d : 23h 15m", template.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -142,30 +130,26 @@
                 .setStyle(ComplicationText.FORMAT_STYLE_UPPER_CASE)
                 .build()
         val longText = ComplicationText.plainText(TEST_TEXT_LONG)
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(complicationText)
-            .addComplicationText(longText)
-            .setSurroundingText("^1 *** ^2")
-            .build()
-        val result = template.getTextAt(
-            mResources,
-            GregorianCalendar(2016, 2, 4).timeInMillis
-        )
-        Assert.assertEquals(
-            "FRI THE 4 MAR *** $TEST_TEXT_LONG",
-            result.toString()
-        )
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(complicationText)
+                .addComplicationText(longText)
+                .setSurroundingText("^1 *** ^2")
+                .build()
+        val result = template.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        Assert.assertEquals("FRI THE 4 MAR *** $TEST_TEXT_LONG", result.toString())
     }
 
     @Test
     public fun testParcelPlainText() {
         val text1 = ComplicationText.plainText(TEST_TEXT1)
         val longText = ComplicationText.plainText(TEST_TEXT_LONG)
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(text1)
-            .addComplicationText(longText)
-            .setSurroundingText("^1 : ^2")
-            .build()
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(text1)
+                .addComplicationText(longText)
+                .setSurroundingText("^1 : ^2")
+                .build()
         val newText = template.roundTripParcelable()!!
 
         Assert.assertEquals(
@@ -186,14 +170,14 @@
                 .setShowNowText(false)
                 .build()
         val longText = ComplicationText.plainText(TEST_TEXT_LONG)
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(originalText)
-            .addComplicationText(longText)
-            .setSurroundingText("^1 : ^2")
-            .build()
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(originalText)
+                .addComplicationText(longText)
+                .setSurroundingText("^1 : ^2")
+                .build()
         val newText = template.roundTripParcelable()!!
-        val testTime =
-            refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
+        val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals(
             "hello 3h time : $TEST_TEXT_LONG",
             newText.getTextAt(mResources, testTime).toString()
@@ -217,15 +201,15 @@
                 .setFormat("EEE 'the' d LLL HH")
                 .setStyle(ComplicationText.FORMAT_STYLE_LOWER_CASE)
                 .build()
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(diffText)
-            .addComplicationText(formatText)
-            .setSurroundingText("^1 : ^2")
-            .build()
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(diffText)
+                .addComplicationText(formatText)
+                .setSurroundingText("^1 : ^2")
+                .build()
 
         // Next change comes from the time difference, so is next minute boundary + 1ms.
-        Truth.assertThat(template.getNextChangeTime(60000000123L))
-            .isEqualTo(60000060001L)
+        Truth.assertThat(template.getNextChangeTime(60000000123L)).isEqualTo(60000060001L)
     }
 
     @Test
@@ -236,15 +220,14 @@
                 .setReferencePeriodEndMillis(0)
                 .setStyle(ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT)
                 .build()
-        val plainText =
-            ComplicationText.plainText("hello")
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(diffText)
-            .addComplicationText(plainText)
-            .setSurroundingText("^1 : ^2")
-            .build()
-        Truth.assertThat(template.getNextChangeTime(60000000123L))
-            .isEqualTo(60000060001L)
+        val plainText = ComplicationText.plainText("hello")
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(diffText)
+                .addComplicationText(plainText)
+                .setSurroundingText("^1 : ^2")
+                .build()
+        Truth.assertThat(template.getNextChangeTime(60000000123L)).isEqualTo(60000060001L)
     }
 
     @Test
@@ -254,15 +237,14 @@
                 .setFormat("EEE 'the' d LLL HH:mm")
                 .setStyle(ComplicationText.FORMAT_STYLE_LOWER_CASE)
                 .build()
-        val plainText =
-            ComplicationText.plainText("hello")
-        val template = ComplicationTextTemplate.Builder()
-            .addComplicationText(plainText)
-            .addComplicationText(formatText)
-            .setSurroundingText("^1 : ^2")
-            .build()
-        Truth.assertThat(template.getNextChangeTime(60000000123L))
-            .isEqualTo(60000060000L)
+        val plainText = ComplicationText.plainText("hello")
+        val template =
+            ComplicationTextTemplate.Builder()
+                .addComplicationText(plainText)
+                .addComplicationText(formatText)
+                .setSurroundingText("^1 : ^2")
+                .build()
+        Truth.assertThat(template.getNextChangeTime(60000000123L)).isEqualTo(60000060000L)
     }
 
     private companion object {
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
index 331b996..4a4d1dc 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
@@ -26,12 +26,12 @@
 import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
 import com.google.common.testing.EqualsTester
 import com.google.common.truth.Truth
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.util.GregorianCalendar
 import java.util.TimeZone
 import java.util.concurrent.TimeUnit
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class ComplicationTextTest {
@@ -67,15 +67,11 @@
     @Test
     public fun testPlainText() {
         // GIVEN ComplicationText of the plain string type
-        val complicationText =
-            ComplicationText.plainText("hello")
+        val complicationText = ComplicationText.plainText("hello")
 
         // WHEN getText is called
         // THEN the plain string is returned.
-        Assert.assertEquals(
-            "hello",
-            complicationText.getTextAt(mResources, 132456789).toString()
-        )
+        Assert.assertEquals("hello", complicationText.getTextAt(mResources, 132456789).toString())
     }
 
     @Test
@@ -91,109 +87,61 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "2h 35m" should be rounded to "3h".
-        var testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.HOURS.toMillis(2)
-        Assert.assertEquals(
-            "3h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        var testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
+        Assert.assertEquals("3h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 59m 10s" should be rounded to "1d".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "1d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(59) +
+                TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d", complicationText.getTextAt(mResources, testTime).toString())
 
         // THEN the time difference text is returned, and "10m 10s" should be rounded to "11m".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(10)
-        Assert.assertEquals(
-            "11m",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.SECONDS.toMillis(10) + TimeUnit.MINUTES.toMillis(10)
+        Assert.assertEquals("11m", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 15m" should be rounded to "1d".
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(15) +
-            TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "1d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(15) + TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 0m" should be round to "23h".
         testTime = refTime + TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "23h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        Assert.assertEquals("23h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 10m" should be round to "1d".
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(10) +
-            TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "1d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "22h 10m" should be round to "23h".
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(10) +
-            TimeUnit.HOURS.toMillis(22)
-        Assert.assertEquals(
-            "23h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.HOURS.toMillis(22)
+        Assert.assertEquals("23h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "1d 10h" should be round to "2d".
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(10) +
-            TimeUnit.DAYS.toMillis(1)
-        Assert.assertEquals(
-            "2d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.HOURS.toMillis(10) + TimeUnit.DAYS.toMillis(1)
+        Assert.assertEquals("2d", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "22h 10m" should be round to "23h".
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(10) +
-            TimeUnit.HOURS.toMillis(22)
-        Assert.assertEquals(
-            "23h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.HOURS.toMillis(22)
+        Assert.assertEquals("23h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "59m 30s" should be round to "1h".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(30) +
-            TimeUnit.MINUTES.toMillis(59)
-        Assert.assertEquals(
-            "1h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.SECONDS.toMillis(30) + TimeUnit.MINUTES.toMillis(59)
+        Assert.assertEquals("1h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "59m 00s" should be displayed as "59m".
         testTime = refTime + TimeUnit.MINUTES.toMillis(59)
-        Assert.assertEquals(
-            "59m",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        Assert.assertEquals("59m", complicationText.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -209,64 +157,45 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "2h 35m 10s" should be rounded to "2h 36m".
-        var testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.HOURS.toMillis(
-                2
-            )
-        Assert.assertEquals(
-            "2h 36m",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        var testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(35) +
+                TimeUnit.HOURS.toMillis(2)
+        Assert.assertEquals("2h 36m", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "2h 35m" should be rounded to "2h 35m".
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.HOURS.toMillis(2)
-        Assert.assertEquals(
-            "2h 35m",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
+        Assert.assertEquals("2h 35m", complicationText.getTextAt(mResources, testTime).toString())
 
         // THEN the time difference text is returned
         // and "9d 23h 58m 10s" should be rounded to "10d".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(58) +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.DAYS.toMillis(9)
-        Assert.assertEquals(
-            "10d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(58) +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.DAYS.toMillis(9)
+        Assert.assertEquals("10d", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 59m 10s" should be rounded to "1d".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.HOURS.toMillis(
-                23
-            )
-        Assert.assertEquals(
-            "1d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(59) +
+                TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d", complicationText.getTextAt(mResources, testTime).toString())
 
         // THEN the time difference text is returned
         // and "23h 58m 10s" should be rounded to "23h 59m".
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(58) +
-            TimeUnit.HOURS.toMillis(
-                23
-            )
-        Assert.assertEquals(
-            "23h 59m",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(58) +
+                TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("23h 59m", complicationText.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -282,36 +211,22 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 59m 10s" should be rounded to "1d".
-        var testTime = refTime +
-            TimeUnit.SECONDS.toMillis(10) +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.HOURS.toMillis(
-                23
-            )
-        Assert.assertEquals(
-            "1d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        var testTime =
+            refTime +
+                TimeUnit.SECONDS.toMillis(10) +
+                TimeUnit.MINUTES.toMillis(59) +
+                TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("1d", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned in stopwatch style with no rounding.
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.HOURS.toMillis(23)
-        Assert.assertEquals(
-            "23:59",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.MINUTES.toMillis(59) + TimeUnit.HOURS.toMillis(23)
+        Assert.assertEquals("23:59", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for another time after the ref period
         // THEN the time difference text is returned in stopwatch style with no rounding.
-        testTime = refTime +
-            TimeUnit.SECONDS.toMillis(59) +
-            TimeUnit.MINUTES.toMillis(1)
-        Assert.assertEquals(
-            "01:59",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.SECONDS.toMillis(59) + TimeUnit.MINUTES.toMillis(1)
+        Assert.assertEquals("01:59", complicationText.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -328,12 +243,11 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 59m 10s" should be rounded to one day.
-        var testTime = refTime +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.SECONDS.toMillis(
-                10
-            )
+        var testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(59) +
+                TimeUnit.SECONDS.toMillis(10)
         Assert.assertEquals(
             "just 1 day left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -342,9 +256,7 @@
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned in words, showing the bigger unit only, and
         // rounding up.
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(12) +
-            TimeUnit.MINUTES.toMillis(35)
+        testTime = refTime + TimeUnit.HOURS.toMillis(12) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals(
             "just 13 hours left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -353,9 +265,7 @@
         // WHEN getText is called for another time after the ref period
         // THEN the time difference text is returned in words, showing the bigger unit only, and
         // rounding up.
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.SECONDS.toMillis(59)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.SECONDS.toMillis(59)
         Assert.assertEquals(
             "just 36 mins left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -396,10 +306,11 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned with the time rounded up to the next day.
-        var testTime = refTime +
-            TimeUnit.DAYS.toMillis(7) +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(59)
+        var testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(7) +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(59)
         Assert.assertEquals(
             "just 8 days left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -408,9 +319,7 @@
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned in words with the time rounded up to the next
         // day.
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(12) +
-            TimeUnit.MINUTES.toMillis(35)
+        testTime = refTime + TimeUnit.HOURS.toMillis(12) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals(
             "just 1 day left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -419,9 +328,7 @@
         // WHEN getText is called for another time after the ref period
         // THEN the time difference text is returned in words with the time rounded up to the next
         // day.
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.SECONDS.toMillis(59)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.SECONDS.toMillis(59)
         Assert.assertEquals(
             "just 1 day left",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -441,44 +348,29 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and "23h 59m 10s" should be rounded to one day.
-        var testTime = refTime +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(59) +
-            TimeUnit.SECONDS.toMillis(10)
-        Assert.assertEquals(
-            "1 day",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        var testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(59) +
+                TimeUnit.SECONDS.toMillis(10)
+        Assert.assertEquals("1 day", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned in words, showing the bigger unit only, and
         // rounding up.
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(1) +
-            TimeUnit.MINUTES.toMillis(35)
-        Assert.assertEquals(
-            "2 hours",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.HOURS.toMillis(1) + TimeUnit.MINUTES.toMillis(35)
+        Assert.assertEquals("2 hours", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for a double-digit number of hours after the ref period
         // THEN the time difference text is returned using the short style.
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(12) +
-            TimeUnit.MINUTES.toMillis(35)
-        Assert.assertEquals(
-            "13h",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        testTime = refTime + TimeUnit.HOURS.toMillis(12) + TimeUnit.MINUTES.toMillis(35)
+        Assert.assertEquals("13h", complicationText.getTextAt(mResources, testTime).toString())
 
         // WHEN getText is called for another time many days the ref period, such that more than 7
         // characters would be used if the unit was shown as a word
         // THEN the time difference text is returned using the short style.
         testTime = refTime + TimeUnit.DAYS.toMillis(120)
-        Assert.assertEquals(
-            "120d",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        Assert.assertEquals("120d", complicationText.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -495,19 +387,13 @@
 
         // WHEN getText is called for a time within the ref period
         // THEN the time difference text is returned and "Now" is shown.
-        Assert.assertEquals(
-            "Now",
-            complicationText.getTextAt(mResources, refTime - 100).toString()
-        )
+        Assert.assertEquals("Now", complicationText.getTextAt(mResources, refTime - 100).toString())
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned and the time difference is shown in stopwatch
         // style.
         val testTime = refTime + TimeUnit.SECONDS.toMillis(35)
-        Assert.assertEquals(
-            "00:35",
-            complicationText.getTextAt(mResources, testTime).toString()
-        )
+        Assert.assertEquals("00:35", complicationText.getTextAt(mResources, testTime).toString())
     }
 
     @Test
@@ -524,10 +410,7 @@
 
         // WHEN getText is called for a time within the ref period
         // THEN the time difference text is returned and "0m" is shown.
-        Assert.assertEquals(
-            "0m",
-            complicationText.getTextAt(mResources, refTime).toString()
-        )
+        Assert.assertEquals("0m", complicationText.getTextAt(mResources, refTime).toString())
     }
 
     @Test
@@ -544,9 +427,7 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned within the format string
-        val testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.HOURS.toMillis(2)
+        val testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
         Assert.assertEquals(
             "hello 3h time",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -567,9 +448,7 @@
 
         // WHEN getText is called for a time after the ref period
         // THEN the time difference text is returned within the format string
-        val testTime = refTime +
-            TimeUnit.MINUTES.toMillis(35) +
-            TimeUnit.HOURS.toMillis(2)
+        val testTime = refTime + TimeUnit.MINUTES.toMillis(35) + TimeUnit.HOURS.toMillis(2)
         Assert.assertEquals(
             "sometext2h 35msomemoretext",
             complicationText.getTextAt(mResources, testTime).toString()
@@ -583,9 +462,8 @@
                 .setFormat("EEE 'the' d LLL")
                 .setStyle(ComplicationText.FORMAT_STYLE_UPPER_CASE)
                 .build()
-        val result = complicationText.getTextAt(
-            mResources, GregorianCalendar(2016, 2, 4).timeInMillis
-        )
+        val result =
+            complicationText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("FRI THE 4 MAR", result.toString())
     }
 
@@ -596,19 +474,16 @@
                 .setFormat("EEE 'the' d LLL")
                 .setStyle(ComplicationText.FORMAT_STYLE_LOWER_CASE)
                 .build()
-        val result = complicationText.getTextAt(
-            mResources, GregorianCalendar(2016, 2, 4).timeInMillis
-        )
+        val result =
+            complicationText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("fri the 4 mar", result.toString())
     }
 
     @Test
     public fun testTimeFormatNoStyle() {
-        val complicationText =
-            TimeFormatBuilder().setFormat("EEE 'the' d LLL").build()
-        val result = complicationText.getTextAt(
-            mResources, GregorianCalendar(2016, 2, 4).timeInMillis
-        )
+        val complicationText = TimeFormatBuilder().setFormat("EEE 'the' d LLL").build()
+        val result =
+            complicationText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("Fri the 4 Mar", result.toString())
     }
 
@@ -620,9 +495,8 @@
                 .setStyle(ComplicationText.FORMAT_STYLE_UPPER_CASE)
                 .setSurroundingText("sometext^1somemoretext")
                 .build()
-        val result = complicationText.getTextAt(
-            mResources, GregorianCalendar(2016, 2, 4).timeInMillis
-        )
+        val result =
+            complicationText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("sometextFRI THE 4 MARsomemoretext", result.toString())
     }
 
@@ -633,28 +507,22 @@
                 .setFormat("HH:mm")
                 .setTimeZone(TimeZone.getTimeZone("Asia/Seoul"))
                 .build()
-        val calendar =
-            GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
+        val calendar = GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
         calendar[2016, 2, 4, 18, 52] = 58
-        val result =
-            complicationText.getTextAt(mResources, calendar.timeInMillis)
+        val result = complicationText.getTextAt(mResources, calendar.timeInMillis)
         Assert.assertEquals("03:52", result.toString())
     }
 
     @Test
     public fun testParcelPlainText() {
         // GIVEN ComplicationText containing plain text
-        val originalText =
-            ComplicationText.plainText("hello how are you")
+        val originalText = ComplicationText.plainText("hello how are you")
 
         // WHEN the object is parcelled and unparcelled
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        Assert.assertEquals(
-            "hello how are you",
-            newText.getTextAt(mResources, 100000).toString()
-        )
+        Assert.assertEquals("hello how are you", newText.getTextAt(mResources, 100000).toString())
     }
 
     @Test
@@ -674,17 +542,9 @@
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val testTime = refTime +
-            TimeUnit.HOURS.toMillis(2) +
-            TimeUnit.MINUTES.toMillis(35)
-        Assert.assertEquals(
-            "hello 3h time",
-            newText.getTextAt(mResources, testTime).toString()
-        )
-        Assert.assertEquals(
-            "hello 0m time",
-            newText.getTextAt(mResources, refTime).toString()
-        )
+        val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
+        Assert.assertEquals("hello 3h time", newText.getTextAt(mResources, testTime).toString())
+        Assert.assertEquals("hello 0m time", newText.getTextAt(mResources, refTime).toString())
     }
 
     @Test
@@ -703,9 +563,7 @@
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val testTime = refTime +
-            TimeUnit.HOURS.toMillis(2) +
-            TimeUnit.MINUTES.toMillis(35)
+        val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals("3h", newText.getTextAt(mResources, testTime).toString())
     }
 
@@ -730,15 +588,10 @@
         parcelWithBadMinUnit.setDataPosition(0)
 
         // WHEN the object is unparcelled
-        val newText =
-            ComplicationText.CREATOR.createFromParcel(
-                parcelWithBadMinUnit
-            )
+        val newText = ComplicationText.CREATOR.createFromParcel(parcelWithBadMinUnit)
 
         // THEN the object is unparcelled successfully, and behaves as if no min unit was specified.
-        val testTime = refTime +
-            TimeUnit.HOURS.toMillis(2) +
-            TimeUnit.MINUTES.toMillis(35)
+        val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals("2h 35m", newText.getTextAt(mResources, testTime).toString())
     }
 
@@ -755,8 +608,7 @@
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val result =
-            newText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        val result = newText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("fri the 4 mar", result.toString())
     }
 
@@ -774,8 +626,7 @@
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val calendar =
-            GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
+        val calendar = GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
         calendar[2016, 2, 4, 18, 52] = 58
         val result = newText.getTextAt(mResources, calendar.timeInMillis)
         Assert.assertEquals("fri the 4 mar 23:52", result.toString())
@@ -799,35 +650,33 @@
 
     @Test
     public fun nextChangeTimeNotTimeDependent() {
-        val text =
-            ComplicationText.plainText("hello")
-        Truth.assertThat(text.getNextChangeTime(1000000))
-            .isEqualTo(Long.MAX_VALUE)
+        val text = ComplicationText.plainText("hello")
+        Truth.assertThat(text.getNextChangeTime(1000000)).isEqualTo(Long.MAX_VALUE)
     }
 
     @Test
     public fun nextChangeTimeTimeDifference() {
-        val text = TimeDifferenceBuilder()
-            .setReferencePeriodStartMillis(0)
-            .setReferencePeriodEndMillis(0)
-            .setStyle(ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT)
-            .build()
+        val text =
+            TimeDifferenceBuilder()
+                .setReferencePeriodStartMillis(0)
+                .setReferencePeriodEndMillis(0)
+                .setStyle(ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT)
+                .build()
 
         // Time difference rounds up, so the next change is 1ms after the next minute boundary.
-        Truth.assertThat(text.getNextChangeTime(600000123))
-            .isEqualTo(600060001)
+        Truth.assertThat(text.getNextChangeTime(600000123)).isEqualTo(600060001)
     }
 
     @Test
     public fun nextChangeTimeTimeFormat() {
-        val text = TimeFormatBuilder()
-            .setFormat("EEE 'the' d LLL HH:mm")
-            .setStyle(ComplicationText.FORMAT_STYLE_LOWER_CASE)
-            .build()
+        val text =
+            TimeFormatBuilder()
+                .setFormat("EEE 'the' d LLL HH:mm")
+                .setStyle(ComplicationText.FORMAT_STYLE_LOWER_CASE)
+                .build()
 
         // Time format rounds down, so the next change is at the next minute boundary.
-        Truth.assertThat(text.getNextChangeTime(600000123))
-            .isEqualTo(600060000)
+        Truth.assertThat(text.getNextChangeTime(600000123)).isEqualTo(600060000)
     }
 
     @Test
@@ -839,19 +688,15 @@
 
     @Test
     public fun getTextAt_ignoresStringExpressionIfSurroundingStringPresent() {
-        val text = ComplicationText(
-            "hello" as CharSequence,
-            DynamicString.constant("world")
-        )
+        val text = ComplicationText("hello" as CharSequence, DynamicString.constant("world"))
 
-        Truth.assertThat(text.getTextAt(mResources, 132456789).toString())
-            .isEqualTo("hello")
+        Truth.assertThat(text.getTextAt(mResources, 132456789).toString()).isEqualTo("hello")
     }
 }
 
 fun ComplicationText.toParcelRoundTrip(): ComplicationText {
     val parcel = Parcel.obtain()
-    writeToParcel(parcel, /* flags = */ 0)
+    writeToParcel(parcel, /* flags= */ 0)
     parcel.setDataPosition(0)
     return ComplicationText.CREATOR.createFromParcel(parcel)
 }
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/Parcelables.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/Parcelables.kt
index 58287e2..e793321 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/Parcelables.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/Parcelables.kt
@@ -19,7 +19,7 @@
 import android.os.Parcel
 import android.os.Parcelable
 
-/** Writes a [Parcelable] to a [Parcel] and reads it back, returning the result.  */
+/** Writes a [Parcelable] to a [Parcel] and reads it back, returning the result. */
 @Suppress("UNCHECKED_CAST")
 internal fun <T : Parcelable> T.roundTripParcelable(): T? {
     val parcel = Parcel.obtain()
@@ -29,5 +29,6 @@
         parcel.readValue(this.javaClass.classLoader)
     } finally {
         parcel.recycle()
-    } as T
+    }
+        as T
 }
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
index ef1d1a0..2b3d0c6 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
@@ -20,10 +20,10 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
 import com.google.common.truth.Truth
+import java.util.concurrent.TimeUnit
 import org.junit.Assert
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.TimeUnit
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class TimeDifferenceTextTest {
@@ -33,13 +33,14 @@
     public fun testShortSingleUnitAfterRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -61,13 +62,14 @@
     public fun testShortDualUnitAfterRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -89,13 +91,8 @@
     public fun testStopwatchAfterRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(0, refTime, ComplicationText.DIFFERENCE_STYLE_STOPWATCH, true, null)
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -117,13 +114,14 @@
     public fun testWordsSingleUnitAfterRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -149,50 +147,52 @@
     public fun testShortWordsSingleUnitAfterRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 min", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(1) + TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(1) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("2 mins", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("13 mins", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(1) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(1) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("2 hours", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(9) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(9) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("10h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(
-                35
-            )
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 day", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(1) +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(1) +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("2 days", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(11) +
-            TimeUnit.HOURS.toMillis(23) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(11) +
+                TimeUnit.HOURS.toMillis(23) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("12 days", tdt.getTextAt(mResources, testTime))
         testTime = refTime + TimeUnit.DAYS.toMillis(125)
         Assert.assertEquals("125d", tdt.getTextAt(mResources, testTime))
@@ -202,13 +202,14 @@
     public fun testShortSingleUnitBeforeRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            123456789,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                123456789,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times before the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -230,13 +231,14 @@
     public fun testShortDualUnitBeforeRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 1000,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 1000,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times before the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -258,13 +260,14 @@
     public fun testStopwatchBeforeRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 1569456,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 1569456,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                null
+            )
 
         // WHEN getText is called for times before the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -286,13 +289,14 @@
     public fun testWordsSingleUnitBeforeRefPeriod() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 654654,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 654654,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for times before the end of the ref period...
         // THEN the result is formatted according to the style.
@@ -318,13 +322,14 @@
     public fun testDuringRefPeriodShowingNowText() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN "Now" is returned.
@@ -335,13 +340,14 @@
     public fun testDuringRefPeriodNotShowingNowTextShortSingle() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            false,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                false,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN a zero value is returned.
@@ -352,13 +358,14 @@
     public fun testDuringRefPeriodNotShowingNowTextShortDual() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            false,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                false,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN a zero value is returned.
@@ -369,13 +376,14 @@
     public fun testDuringRefPeriodNotShowingNowTextWord() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            false,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                false,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN a zero value is returned.
@@ -386,13 +394,14 @@
     public fun testDuringRefPeriodNotShowingNowTextStopwatch() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            false,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                false,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN a zero value is returned.
@@ -403,13 +412,14 @@
     public fun testDuringRefPeriodShowingNowTextStopwatch() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                null
+            )
 
         // WHEN getText is called for a time within the ref period
         // THEN "Now" is returned.
@@ -420,13 +430,14 @@
     public fun testAtRefPeriodStartTime() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime,
-            refTime + 100000,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime,
+                refTime + 100000,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for the ref period start time
         // THEN "Now" is returned.
@@ -437,13 +448,14 @@
     public fun testAtRefPeriodEndTime() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for the ref period end time
         // THEN "Now" is returned.
@@ -454,13 +466,14 @@
     public fun testReturnsSameTextWithStopwatchStyle() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                null
+            )
 
         // WHEN we consider two times for which the text would differ.
         // THEN returnsSameText returns false.
@@ -479,13 +492,14 @@
     public fun testReturnsSameTextWithShortSingleStyle() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN we consider two times for which the text would differ.
         // THEN returnsSameText returns false.
@@ -495,10 +509,8 @@
 
         // WHEN we consider two times for which the text would be the same.
         // THEN returnsSameText returns true.
-        testTime1 = refTime +
-            TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(10)
-        testTime2 = refTime +
-            TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(15)
+        testTime1 = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(10)
+        testTime2 = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(15)
         Assert.assertTrue(tdt.returnsSameText(testTime1, testTime2))
     }
 
@@ -506,13 +518,14 @@
     public fun testReturnsSameTextShortDualStyle() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                null
+            )
 
         // WHEN we consider two times for which the text would differ.
         // THEN returnsSameText returns false.
@@ -522,10 +535,8 @@
 
         // WHEN we consider two times for which the text would be the same.
         // THEN returnsSameText returns true.
-        testTime1 = refTime +
-            TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(10)
-        testTime2 = refTime +
-            TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(15)
+        testTime1 = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(10)
+        testTime2 = refTime + TimeUnit.MINUTES.toMillis(10) + TimeUnit.SECONDS.toMillis(15)
         Assert.assertTrue(tdt.returnsSameText(testTime1, testTime2))
     }
 
@@ -533,13 +544,14 @@
     public fun testReturnsSameTextWordsSingleStyle() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN we consider two times for which the text would differ.
         // THEN returnsSameText returns false.
@@ -558,13 +570,14 @@
     public fun testReturnsSameTextWithStopwatchStyleMinuteMinimumUnit() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            TimeUnit.MINUTES
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                TimeUnit.MINUTES
+            )
 
         // WHEN we consider two times for which the text would differ without the minimum unit,
         // but now will not differ
@@ -584,13 +597,14 @@
     public fun testReturnsSameTextWithShortSingleStyleHourMinimumUnit() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN we consider two times for which the text would differ without the minimum unit,
         // but now will not differ
@@ -610,13 +624,14 @@
     public fun testReturnsSameTextWithShortDualStyleHourMinimumUnit() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN we consider two times for which the text would differ without the minimum unit,
         // but now will not differ
@@ -636,13 +651,14 @@
     public fun testReturnsSameTextWithShortSingleStyleDayMinimumUnit() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN we consider two times for which the text differs by a number of minutes
         // THEN returnsSameText returns true.
@@ -667,13 +683,14 @@
     public fun testReturnsSameTextWithWordStyleDayMinimumUnit() {
         // GIVEN TimeDifferenceText
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            refTime - 100000,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                refTime - 100000,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN we consider two times for which the text differs by a number of minutes
         // THEN returnsSameText returns true.
@@ -698,35 +715,33 @@
     public fun testShortSingleUnitRoundingFromSmallUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for a time a few seconds more than a whole number of hours after
         // the
         // ref time
-        var testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) + TimeUnit.SECONDS.toMillis(35)
+        var testTime = refTime + TimeUnit.HOURS.toMillis(4) + TimeUnit.SECONDS.toMillis(35)
         // THEN the time is rounded up to the next hour
         Assert.assertEquals("5h", tdt.getTextAt(mResources, testTime))
 
         // WHEN getText is called for a time a few seconds more than a whole number of days after
         // the
         // ref time
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.DAYS.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         // THEN the text is rounded up to the next day
         Assert.assertEquals("13d", tdt.getTextAt(mResources, testTime))
 
         // WHEN getText is called for a time a few minutes more than a whole number of days after
         // the
         // ref time
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(12) + TimeUnit.MINUTES.toMillis(35)
+        testTime = refTime + TimeUnit.DAYS.toMillis(12) + TimeUnit.MINUTES.toMillis(35)
         // THEN the text is rounded up to the next day
         Assert.assertEquals("13d", tdt.getTextAt(mResources, testTime))
     }
@@ -735,13 +750,14 @@
     public fun testShortSingleUnitExactNumberOfUnits() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for a time a whole number of minutes after the ref time
         var testTime = refTime + TimeUnit.MINUTES.toMillis(35)
@@ -785,13 +801,14 @@
     public fun testShortDualUnitDoesntShowZeroInSmallerUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            null
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                null
+            )
 
         // WHEN getText is called for a time a whole number of hours after the ref time
         var testTime = refTime + TimeUnit.HOURS.toMillis(4)
@@ -808,42 +825,45 @@
     public fun testShortSingleUnitWithHourMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -851,42 +871,45 @@
     public fun testShortSingleUnitWithDayMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -894,42 +917,45 @@
     public fun testShortSingleUnitWithMinuteMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_SINGLE_UNIT
         val refTime: Long = 1000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            true,
-            TimeUnit.MINUTES
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                true,
+                TimeUnit.MINUTES
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, with no change due to the minimum
         // unit.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -937,42 +963,45 @@
     public fun testShortDualUnitWithHourMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -980,42 +1009,45 @@
     public fun testShortDualUnitWithDayMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // a day
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1023,42 +1055,45 @@
     public fun testShortDualUnitWithMinuteMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.MINUTES
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.MINUTES
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, with no change due to the minimum
         // unit.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("4h 13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("14h 13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1066,42 +1101,45 @@
     public fun testShortDualUnitWithSecondMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_SHORT_DUAL_UNIT
         val refTime: Long = 10000000
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.SECONDS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.SECONDS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, with no change due to the minimum
         // unit.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("4h 13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("14h 13m", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1109,42 +1147,45 @@
     public fun testStopwatchWithMinuteMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            TimeUnit.MINUTES
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                TimeUnit.MINUTES
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // a minute.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("0:01", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("0:13", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("4:13", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("14:13", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1152,42 +1193,45 @@
     public fun testStopwatchWithHourMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour (which means that the stopwatch-style format hh:mm cannot be used).
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1195,42 +1239,45 @@
     public fun testStopwatchWithDayMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // a day..
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4d", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1238,42 +1285,45 @@
     public fun testStopwatchWithSecondMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_STOPWATCH
         val refTime = 70000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            TimeUnit.SECONDS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                true,
+                TimeUnit.SECONDS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, with no change due to the minimum
         // unit.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("00:35", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("12:35", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("4:13", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("14:13", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("3d 15h", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14d", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1281,42 +1331,45 @@
     public fun testWordsSingleUnitWithHourMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 hour", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 hour", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5 hours", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15 hours", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4 days", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14 days", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1324,42 +1377,45 @@
     public fun testWordsSingleUnitWithDayMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            TimeUnit.DAYS
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                TimeUnit.DAYS
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, not including any units smaller than
         // an hour
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 day", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 day", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 day", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 day", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4 days", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14 days", tdt.getTextAt(mResources, testTime))
     }
 
@@ -1367,172 +1423,142 @@
     public fun testWordsSingleUnitWithMinuteMinimumUnit() {
         // GIVEN TimeDifferenceText of STYLE_WORDS_SINGLE_UNIT
         val refTime = 990000000000L
-        val tdt = TimeDifferenceText(
-            0,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            true,
-            TimeUnit.MINUTES
-        )
+        val tdt =
+            TimeDifferenceText(
+                0,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                true,
+                TimeUnit.MINUTES
+            )
 
         // WHEN getText is called for times after the end of the ref period...
         // THEN the result is formatted according to the style, with no change due to the minimum
         // unit.
         var testTime = refTime + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("1 min", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime = refTime + TimeUnit.MINUTES.toMillis(12) + TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("13 mins", tdt.getTextAt(mResources, testTime))
-        testTime = refTime +
-            TimeUnit.HOURS.toMillis(4) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(4) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("5 hours", tdt.getTextAt(mResources, testTime))
-        testTime = refTime + TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12) +
-            TimeUnit.SECONDS.toMillis(35)
+        testTime =
+            refTime +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12) +
+                TimeUnit.SECONDS.toMillis(35)
         Assert.assertEquals("15 hours", tdt.getTextAt(mResources, testTime))
-        testTime = refTime + TimeUnit.DAYS.toMillis(3) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(3) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("4 days", tdt.getTextAt(mResources, testTime))
-        testTime = refTime + TimeUnit.DAYS.toMillis(13) +
-            TimeUnit.HOURS.toMillis(14) +
-            TimeUnit.MINUTES.toMillis(12)
+        testTime =
+            refTime +
+                TimeUnit.DAYS.toMillis(13) +
+                TimeUnit.HOURS.toMillis(14) +
+                TimeUnit.MINUTES.toMillis(12)
         Assert.assertEquals("14 days", tdt.getTextAt(mResources, testTime))
     }
 
     @Test
     public fun testTimeDifferenceGetNextChangeStopWatchNoMinimum() {
-        val text = TimeDifferenceText(
-            0,
-            1,
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            true,
-            null
-        )
-        Assert.assertEquals(
-            TimeUnit.SECONDS.toMillis(1),
-            text.precision
-        )
+        val text = TimeDifferenceText(0, 1, ComplicationText.DIFFERENCE_STYLE_STOPWATCH, true, null)
+        Assert.assertEquals(TimeUnit.SECONDS.toMillis(1), text.precision)
 
         // Time difference is rounded up, so the next change is 1ms after the next second boundary.
-        Truth.assertThat(text.getNextChangeTime(1000000000L))
-            .isEqualTo(1000000001L)
-        Truth.assertThat(text.getNextChangeTime(1000000001L))
-            .isEqualTo(1000001001L)
-        Truth.assertThat(text.getNextChangeTime(1000001234L))
-            .isEqualTo(1000002001L)
+        Truth.assertThat(text.getNextChangeTime(1000000000L)).isEqualTo(1000000001L)
+        Truth.assertThat(text.getNextChangeTime(1000000001L)).isEqualTo(1000001001L)
+        Truth.assertThat(text.getNextChangeTime(1000001234L)).isEqualTo(1000002001L)
     }
 
     @Test
     public fun testTimeDifferenceGetNextChangeNoMinimum() {
-        val styles = intArrayOf(
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
-        )
+        val styles =
+            intArrayOf(
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
+            )
         for (style in styles) {
             val text = TimeDifferenceText(0, 1, style, true, null)
-            Assert.assertEquals(
-                TimeUnit.MINUTES.toMillis(1),
-                text.precision
-            )
+            Assert.assertEquals(TimeUnit.MINUTES.toMillis(1), text.precision)
 
             // Time difference is rounded up, and precision for all of these is 1 minute, so the
             // next
             // change is 1ms after the next minute boundary.
-            Truth.assertThat(text.getNextChangeTime(60000000000L))
-                .isEqualTo(60000000001L)
-            Truth.assertThat(text.getNextChangeTime(60000000001L))
-                .isEqualTo(60000060001L)
-            Truth.assertThat(text.getNextChangeTime(60000060000L))
-                .isEqualTo(60000060001L)
+            Truth.assertThat(text.getNextChangeTime(60000000000L)).isEqualTo(60000000001L)
+            Truth.assertThat(text.getNextChangeTime(60000000001L)).isEqualTo(60000060001L)
+            Truth.assertThat(text.getNextChangeTime(60000060000L)).isEqualTo(60000060001L)
         }
     }
 
     @Test
     public fun testTimeDifferenceGetNextChangeMinuteMinimum() {
-        val styles = intArrayOf(
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
-        )
-        for (style in styles) {
-            val text =
-                TimeDifferenceText(0, 1, style, true, TimeUnit.MINUTES)
-            Assert.assertEquals(
-                TimeUnit.MINUTES.toMillis(1),
-                text.precision
+        val styles =
+            intArrayOf(
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
             )
+        for (style in styles) {
+            val text = TimeDifferenceText(0, 1, style, true, TimeUnit.MINUTES)
+            Assert.assertEquals(TimeUnit.MINUTES.toMillis(1), text.precision)
 
             // Next change is 1ms after the next minute boundary.
-            Truth.assertThat(text.getNextChangeTime(60000000000L))
-                .isEqualTo(60000000001L)
-            Truth.assertThat(text.getNextChangeTime(60000000001L))
-                .isEqualTo(60000060001L)
-            Truth.assertThat(text.getNextChangeTime(60000060000L))
-                .isEqualTo(60000060001L)
+            Truth.assertThat(text.getNextChangeTime(60000000000L)).isEqualTo(60000000001L)
+            Truth.assertThat(text.getNextChangeTime(60000000001L)).isEqualTo(60000060001L)
+            Truth.assertThat(text.getNextChangeTime(60000060000L)).isEqualTo(60000060001L)
         }
     }
 
     @Test
     public fun testTimeDifferenceGetNextChangeHourMinimum() {
-        val styles = intArrayOf(
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
-        )
-        for (style in styles) {
-            val text =
-                TimeDifferenceText(0, 1, style, true, TimeUnit.HOURS)
-            Assert.assertEquals(
-                TimeUnit.HOURS.toMillis(1),
-                text.precision
+        val styles =
+            intArrayOf(
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
             )
+        for (style in styles) {
+            val text = TimeDifferenceText(0, 1, style, true, TimeUnit.HOURS)
+            Assert.assertEquals(TimeUnit.HOURS.toMillis(1), text.precision)
 
             // Next change is 1ms after the next hour boundary.
-            Truth.assertThat(text.getNextChangeTime(36000035789L))
-                .isEqualTo(36003600001L)
-            Truth.assertThat(text.getNextChangeTime(36003600000L))
-                .isEqualTo(36003600001L)
-            Truth.assertThat(text.getNextChangeTime(36003600001L))
-                .isEqualTo(36007200001L)
-            Truth.assertThat(text.getNextChangeTime(36007199999L))
-                .isEqualTo(36007200001L)
+            Truth.assertThat(text.getNextChangeTime(36000035789L)).isEqualTo(36003600001L)
+            Truth.assertThat(text.getNextChangeTime(36003600000L)).isEqualTo(36003600001L)
+            Truth.assertThat(text.getNextChangeTime(36003600001L)).isEqualTo(36007200001L)
+            Truth.assertThat(text.getNextChangeTime(36007199999L)).isEqualTo(36007200001L)
         }
     }
 
     @Test
     public fun testTimeDifferenceGetPrecisionDayMinimum() {
-        val styles = intArrayOf(
-            ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
-        )
-        for (style in styles) {
-            val text =
-                TimeDifferenceText(0, 1, style, true, TimeUnit.DAYS)
-            Assert.assertEquals(
-                TimeUnit.DAYS.toMillis(1),
-                text.precision
+        val styles =
+            intArrayOf(
+                ComplicationText.DIFFERENCE_STYLE_STOPWATCH,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_WORDS_SINGLE_UNIT,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT
             )
+        for (style in styles) {
+            val text = TimeDifferenceText(0, 1, style, true, TimeUnit.DAYS)
+            Assert.assertEquals(TimeUnit.DAYS.toMillis(1), text.precision)
 
             // Next change is 1ms after the next day boundary.
-            Truth.assertThat(text.getNextChangeTime(8640000035789L))
-                .isEqualTo(8640086400001L)
-            Truth.assertThat(text.getNextChangeTime(8640086400000L))
-                .isEqualTo(8640086400001L)
-            Truth.assertThat(text.getNextChangeTime(8640086400001L))
-                .isEqualTo(8640172800001L)
+            Truth.assertThat(text.getNextChangeTime(8640000035789L)).isEqualTo(8640086400001L)
+            Truth.assertThat(text.getNextChangeTime(8640086400000L)).isEqualTo(8640086400001L)
+            Truth.assertThat(text.getNextChangeTime(8640086400001L)).isEqualTo(8640172800001L)
         }
     }
 
@@ -1540,21 +1566,20 @@
     public fun testParcelTimeDifferenceTextWithoutMinUnit() {
         // GIVEN TimeDifferenceText without min unit
         val refTime: Long = 10000000
-        val originalText = TimeDifferenceText(
-            refTime - 156561,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
-            false,
-            null
-        )
+        val originalText =
+            TimeDifferenceText(
+                refTime - 156561,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_SINGLE_UNIT,
+                false,
+                null
+            )
 
         // WHEN the object is parcelled and unparcelled
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val testTime = refTime +
-            TimeUnit.HOURS.toMillis(2) +
-            TimeUnit.MINUTES.toMillis(35)
+        val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals("3h", newText.getTextAt(mResources, testTime).toString())
         Assert.assertEquals("0m", newText.getTextAt(mResources, refTime).toString())
     }
@@ -1563,13 +1588,14 @@
     public fun testParcelTimeDifferenceTextWithMinUnit() {
         // GIVEN TimeDifferenceText with a minimum unit specified
         val refTime: Long = 10000000
-        val originalText = TimeDifferenceText(
-            refTime - 156561,
-            refTime,
-            ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
-            true,
-            TimeUnit.HOURS
-        )
+        val originalText =
+            TimeDifferenceText(
+                refTime - 156561,
+                refTime,
+                ComplicationText.DIFFERENCE_STYLE_SHORT_DUAL_UNIT,
+                true,
+                TimeUnit.HOURS
+            )
 
         // WHEN the object is parcelled and unparcelled
         val newText = originalText.roundTripParcelable()!!
@@ -1578,4 +1604,4 @@
         val testTime = refTime + TimeUnit.HOURS.toMillis(2) + TimeUnit.MINUTES.toMillis(35)
         Assert.assertEquals("3h", newText.getTextAt(mResources, testTime).toString())
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
index 16ec776..60ebcc8 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
@@ -20,13 +20,13 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
 import com.google.common.truth.Truth
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.util.Calendar
 import java.util.GregorianCalendar
 import java.util.TimeZone
 import java.util.concurrent.TimeUnit
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class TimeFormatTextTest {
@@ -35,15 +35,10 @@
     @Test
     public fun testDefaultStyleFormat() {
         // GIVEN a TimeFormatText object using the default style
-        val tft = TimeFormatText(
-            "E 'in' LLL",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            null
-        )
+        val tft = TimeFormatText("E 'in' LLL", ComplicationText.FORMAT_STYLE_DEFAULT, null)
 
         // WHEN getText is called for a given date
-        val result =
-            tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        val result = tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
 
         // THEN the results are in the default case.
         Assert.assertEquals("Fri in Mar", result)
@@ -52,15 +47,10 @@
     @Test
     public fun testUpperCaseStyleFormat() {
         // GIVEN a TimeFormatText object using the upper case style
-        val tft = TimeFormatText(
-            "E 'in' LLL",
-            ComplicationText.FORMAT_STYLE_UPPER_CASE,
-            null
-        )
+        val tft = TimeFormatText("E 'in' LLL", ComplicationText.FORMAT_STYLE_UPPER_CASE, null)
 
         // WHEN getText is called for a given date
-        val result =
-            tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        val result = tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
 
         // THEN the results are in upper case.
         Assert.assertEquals("FRI IN MAR", result)
@@ -69,15 +59,10 @@
     @Test
     public fun testLowerCaseStyleFormat() {
         // GIVEN a TimeFormatText object using the lower case style
-        val tft = TimeFormatText(
-            "E 'in' LLL",
-            ComplicationText.FORMAT_STYLE_LOWER_CASE,
-            null
-        )
+        val tft = TimeFormatText("E 'in' LLL", ComplicationText.FORMAT_STYLE_LOWER_CASE, null)
 
         // WHEN getText is called for a given date
-        val result =
-            tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        val result = tft.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
 
         // THEN the results are in lower case.
         Assert.assertEquals("fri in mar", result)
@@ -86,13 +71,13 @@
     @Test
     public fun testFormatWithTimeZone() {
         // GIVEN a TimeFormatText object using the default style and a time zone specified.
-        val tft = TimeFormatText(
-            "HH:mm",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("America/Los_Angeles")
-        )
-        val calendar =
-            GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
+        val tft =
+            TimeFormatText(
+                "HH:mm",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("America/Los_Angeles")
+            )
+        val calendar = GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
         calendar[2016, 2, 4, 15, 12] = 58
 
         // WHEN getText is called for a given date
@@ -105,23 +90,17 @@
     @Test
     public fun testReturnSameTime() {
         // GIVEN a TimeFormatText object using the lower case style
-        var tft = TimeFormatText(
-            "HH:mm",
-            ComplicationText.FORMAT_STYLE_LOWER_CASE,
-            null
-        )
+        var tft = TimeFormatText("HH:mm", ComplicationText.FORMAT_STYLE_LOWER_CASE, null)
 
         // WHEN returnsSameText is called for two time in the different period.
         // THEN the result of getText should be different.
-        var testTime1 =
-            TimeUnit.HOURS.toMillis(23) + TimeUnit.MINUTES.toMillis(10)
+        var testTime1 = TimeUnit.HOURS.toMillis(23) + TimeUnit.MINUTES.toMillis(10)
         var testTime2 = testTime1 + TimeUnit.MINUTES.toMillis(30)
         Assert.assertFalse(tft.returnsSameText(testTime1, testTime2))
 
         // WHEN returnsSameText is called for two time in the same period.
         // THEN the result of getText should be the same.
-        testTime1 =
-            TimeUnit.HOURS.toMillis(23) + TimeUnit.MINUTES.toMillis(10)
+        testTime1 = TimeUnit.HOURS.toMillis(23) + TimeUnit.MINUTES.toMillis(10)
         testTime2 = testTime1 + TimeUnit.SECONDS.toMillis(30)
         Assert.assertTrue(tft.returnsSameText(testTime1, testTime2))
 
@@ -142,45 +121,41 @@
 
     @Test
     public fun testTimeFormatWithTimeZone() {
-        val complicationText = TimeFormatText(
-            "HH:mm",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("Asia/Seoul")
-        )
-        val calendar =
-            GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
+        val complicationText =
+            TimeFormatText(
+                "HH:mm",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("Asia/Seoul")
+            )
+        val calendar = GregorianCalendar(TimeZone.getTimeZone("GMT+0"))
         calendar[2016, 2, 4, 18, 52] = 58
-        val result =
-            complicationText.getTextAt(mResources, calendar.timeInMillis)
+        val result = complicationText.getTextAt(mResources, calendar.timeInMillis)
         Assert.assertEquals("03:52", result.toString())
     }
 
     @Test
     public fun testParcelTimeFormatTextWithoutTimeZone() {
         // GIVEN TimeFormatText with no time zone
-        val originalText = TimeFormatText(
-            "EEE 'the' d LLL",
-            ComplicationText.FORMAT_STYLE_LOWER_CASE,
-            null
-        )
+        val originalText =
+            TimeFormatText("EEE 'the' d LLL", ComplicationText.FORMAT_STYLE_LOWER_CASE, null)
 
         // WHEN the object is parcelled and unparcelled
         val newText = originalText.roundTripParcelable()!!
 
         // THEN the object behaves as expected.
-        val result =
-            newText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
+        val result = newText.getTextAt(mResources, GregorianCalendar(2016, 2, 4).timeInMillis)
         Assert.assertEquals("fri the 4 mar", result.toString())
     }
 
     @Test
     public fun testParcelTimeFormatTextWithTimeZone() {
         // GIVEN TimeFormatText with a time zone specified
-        val originalText = TimeFormatText(
-            "EEE 'the' d LLL HH:mm",
-            ComplicationText.FORMAT_STYLE_LOWER_CASE,
-            TimeZone.getTimeZone("GMT+5")
-        )
+        val originalText =
+            TimeFormatText(
+                "EEE 'the' d LLL HH:mm",
+                ComplicationText.FORMAT_STYLE_LOWER_CASE,
+                TimeZone.getTimeZone("GMT+5")
+            )
 
         // WHEN the object is parcelled and unparcelled
         val newText = originalText.roundTripParcelable()!!
@@ -194,87 +169,68 @@
 
     @Test
     public fun nextChangeTimeSeconds() {
-        val timeFormatText = TimeFormatText(
-            "HH:mm:ss",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getDefault()
-        )
+        val timeFormatText =
+            TimeFormatText("HH:mm:ss", ComplicationText.FORMAT_STYLE_DEFAULT, TimeZone.getDefault())
 
         // Next change is at the next second boundary.
-        Truth.assertThat(timeFormatText.getNextChangeTime(1000035789L))
-            .isEqualTo(1000036000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(7000060000L))
-            .isEqualTo(7000061000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(1900000001L))
-            .isEqualTo(1900001000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(1111100999L))
-            .isEqualTo(1111101000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(1000035789L)).isEqualTo(1000036000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(7000060000L)).isEqualTo(7000061000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(1900000001L)).isEqualTo(1900001000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(1111100999L)).isEqualTo(1111101000L)
     }
 
     @Test
     public fun nextChangeTimeMinutely() {
-        val timeFormatText = TimeFormatText(
-            "HH:mm",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("Asia/Seoul")
-        )
+        val timeFormatText =
+            TimeFormatText(
+                "HH:mm",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("Asia/Seoul")
+            )
 
         // Next change is at the next minute boundary.
-        Truth.assertThat(timeFormatText.getNextChangeTime(6000035789L))
-            .isEqualTo(6000060000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(6000060000L))
-            .isEqualTo(6000120000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(6000060001L))
-            .isEqualTo(6000120000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(6000059999L))
-            .isEqualTo(6000060000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(6000035789L)).isEqualTo(6000060000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(6000060000L)).isEqualTo(6000120000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(6000060001L)).isEqualTo(6000120000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(6000059999L)).isEqualTo(6000060000L)
     }
 
     @Test
     public fun nextChangeTimeHourly() {
-        val timeFormatText = TimeFormatText(
-            "d LLL HH",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getDefault()
-        )
+        val timeFormatText =
+            TimeFormatText("d LLL HH", ComplicationText.FORMAT_STYLE_DEFAULT, TimeZone.getDefault())
 
         // Next change is at the next hour boundary.
-        Truth.assertThat(timeFormatText.getNextChangeTime(36000035789L))
-            .isEqualTo(36003600000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(36000600000L))
-            .isEqualTo(36003600000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(36003600000L))
-            .isEqualTo(36007200000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(36007199999L))
-            .isEqualTo(36007200000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(36000035789L)).isEqualTo(36003600000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(36000600000L)).isEqualTo(36003600000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(36003600000L)).isEqualTo(36007200000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(36007199999L)).isEqualTo(36007200000L)
     }
 
     @Test
     public fun nextChangeTimeDailyUtc() {
-        val timeFormatText = TimeFormatText(
-            "d LLL",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("UTC")
-        )
+        val timeFormatText =
+            TimeFormatText(
+                "d LLL",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("UTC")
+            )
 
         // Next change is at the next day boundary.
-        Truth.assertThat(timeFormatText.getNextChangeTime(8640000035789L))
-            .isEqualTo(8640086400000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(8640086399999L))
-            .isEqualTo(8640086400000L)
-        Truth.assertThat(timeFormatText.getNextChangeTime(8640086400000L))
-            .isEqualTo(8640172800000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(8640000035789L)).isEqualTo(8640086400000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(8640086399999L)).isEqualTo(8640086400000L)
+        Truth.assertThat(timeFormatText.getNextChangeTime(8640086400000L)).isEqualTo(8640172800000L)
     }
 
     @Test
     public fun nextChangeTimeDailyTimeZone() {
-        val timeFormatText = TimeFormatText(
-            "d LLL",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("GMT-5")
-        )
-        val calendar: Calendar =
-            GregorianCalendar(TimeZone.getTimeZone("UTC"))
+        val timeFormatText =
+            TimeFormatText(
+                "d LLL",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("GMT-5")
+            )
+        val calendar: Calendar = GregorianCalendar(TimeZone.getTimeZone("UTC"))
         calendar[2018, Calendar.APRIL, 17, 8, 0] = 0
         calendar[Calendar.MILLISECOND] = 0
         val inputTime = calendar.timeInMillis
@@ -282,19 +238,18 @@
         // Next change is at midnight in the specified time zone.
         calendar[2018, Calendar.APRIL, 18, 5, 0] = 0
         val expectedTime = calendar.timeInMillis
-        Truth.assertThat(timeFormatText.getNextChangeTime(inputTime))
-            .isEqualTo(expectedTime)
+        Truth.assertThat(timeFormatText.getNextChangeTime(inputTime)).isEqualTo(expectedTime)
     }
 
     @Test
     public fun nextChangeTimeDailyTimeZoneNextDay() {
-        val timeFormatText = TimeFormatText(
-            "d LLL",
-            ComplicationText.FORMAT_STYLE_DEFAULT,
-            TimeZone.getTimeZone("GMT+5")
-        )
-        val calendar: Calendar =
-            GregorianCalendar(TimeZone.getTimeZone("UTC"))
+        val timeFormatText =
+            TimeFormatText(
+                "d LLL",
+                ComplicationText.FORMAT_STYLE_DEFAULT,
+                TimeZone.getTimeZone("GMT+5")
+            )
+        val calendar: Calendar = GregorianCalendar(TimeZone.getTimeZone("UTC"))
         calendar[2018, Calendar.APRIL, 17, 23, 0] = 0
         calendar[Calendar.MILLISECOND] = 0
         val inputTime = calendar.timeInMillis
@@ -304,65 +259,62 @@
         // is after midnight in GMT+5).
         calendar[2018, Calendar.APRIL, 18, 19, 0] = 0
         val expectedTime = calendar.timeInMillis
-        Truth.assertThat(timeFormatText.getNextChangeTime(inputTime))
-            .isEqualTo(expectedTime)
+        Truth.assertThat(timeFormatText.getNextChangeTime(inputTime)).isEqualTo(expectedTime)
     }
 
     @Test
     public fun testTimeFormatTextGetPrecision() {
-        val dateFormats = arrayOf(
-            "S",
-            "s",
-            "d",
-            "m",
-            "h",
-            "D",
-            "W",
-            "y",
-            "E",
-            "w",
-            "EEE 'the' d LLL HH:mm",
-            "'now time is' HH 'o''clock'",
-            "yyyy-MM-dd",
-            "yyyy-MM-dd HH:mm",
-            "yyyy-MM-dd HH:mmZ",
-            "yyyy-MM-dd HH:mm:ss.SSSZ",
-            "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
-            "yyyy ''' hello'",
-            "yyyy ''''' hello' s",
-            "LLL",
-            "LLL a"
-        )
-        val dateFormatPrecision = longArrayOf(
-            TimeUnit.SECONDS.toMillis(1),
-            TimeUnit.SECONDS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.MINUTES.toMillis(1),
-            TimeUnit.HOURS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.MINUTES.toMillis(1),
-            TimeUnit.HOURS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.MINUTES.toMillis(1),
-            TimeUnit.MINUTES.toMillis(1),
-            TimeUnit.SECONDS.toMillis(1),
-            TimeUnit.SECONDS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.SECONDS.toMillis(1),
-            TimeUnit.DAYS.toMillis(1),
-            TimeUnit.HOURS.toMillis(12)
-        )
-        for (i in dateFormats.indices) {
-            val text = TimeFormatText(
-                dateFormats[i],
-                ComplicationText.FORMAT_STYLE_DEFAULT,
-                null
+        val dateFormats =
+            arrayOf(
+                "S",
+                "s",
+                "d",
+                "m",
+                "h",
+                "D",
+                "W",
+                "y",
+                "E",
+                "w",
+                "EEE 'the' d LLL HH:mm",
+                "'now time is' HH 'o''clock'",
+                "yyyy-MM-dd",
+                "yyyy-MM-dd HH:mm",
+                "yyyy-MM-dd HH:mmZ",
+                "yyyy-MM-dd HH:mm:ss.SSSZ",
+                "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
+                "yyyy ''' hello'",
+                "yyyy ''''' hello' s",
+                "LLL",
+                "LLL a"
             )
+        val dateFormatPrecision =
+            longArrayOf(
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.HOURS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.HOURS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.DAYS.toMillis(1),
+                TimeUnit.HOURS.toMillis(12)
+            )
+        for (i in dateFormats.indices) {
+            val text = TimeFormatText(dateFormats[i], ComplicationText.FORMAT_STYLE_DEFAULT, null)
             Assert.assertEquals(dateFormatPrecision[i], text.precision)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluatorTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluatorTest.kt
index a3019ad..37cae45 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluatorTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ComplicationDataExpressionEvaluatorTest.kt
@@ -17,30 +17,40 @@
 package androidx.wear.watchface.complications.data
 
 import android.support.wearable.complications.ComplicationData as WireComplicationData
+import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.util.Log
+import androidx.core.content.ContextCompat
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicFloat
+import androidx.wear.protolayout.expression.DynamicBuilders.DynamicString
+import androidx.wear.protolayout.expression.StateEntryBuilders.StateEntryValue
+import androidx.wear.protolayout.expression.pipeline.ObservableStateStore
+import androidx.wear.watchface.complications.data.ComplicationDataExpressionEvaluator.Companion.INVALID_DATA
+import androidx.wear.watchface.complications.data.ComplicationDataExpressionEvaluator.Companion.hasExpression
+import com.google.common.truth.Expect
 import com.google.common.truth.Truth.assertThat
-import com.nhaarman.mockitokotlin2.any
-import com.nhaarman.mockitokotlin2.mock
-import com.nhaarman.mockitokotlin2.never
-import com.nhaarman.mockitokotlin2.times
-import com.nhaarman.mockitokotlin2.verify
-import java.util.concurrent.Executor
 import java.util.function.Consumer
-import kotlin.coroutines.ContinuationInterceptor
-import kotlin.coroutines.CoroutineContext
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.asExecutor
-import kotlinx.coroutines.test.advanceUntilIdle
-import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.shareIn
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
 import org.robolectric.shadows.ShadowLog
+import org.robolectric.shadows.ShadowLooper.runUiThreadTasks
 
 @RunWith(SharedRobolectricTestRunner::class)
-@OptIn(ExperimentalCoroutinesApi::class)
 class ComplicationDataExpressionEvaluatorTest {
+    @get:Rule val expect = Expect.create()
+
     private val listener = mock<Consumer<WireComplicationData>>()
 
     @Before
@@ -49,65 +59,320 @@
     }
 
     @Test
-    fun data_notInitialized_setNull() {
-        val evaluator = ComplicationDataExpressionEvaluator(
-            ShortTextComplicationData.Builder(
-                text = PlainComplicationText.Builder("text").build(),
-                contentDescription = PlainComplicationText.Builder("description").build(),
-            ).build().asWireComplicationData(),
-        )
-
-        assertThat(evaluator.data.value).isNull()
+    fun data_notInitialized_setToNull() {
+        ComplicationDataExpressionEvaluator(DATA_WITH_NO_EXPRESSION).use { evaluator ->
+            assertThat(evaluator.data.value).isNull()
+        }
     }
 
     @Test
-    fun data_initialized_setToUnevaluated() {
-        val evaluator = ComplicationDataExpressionEvaluator(UNEVALUATED_DATA)
-        evaluator.init()
+    fun data_noExpression_setToUnevaluated() {
+        ComplicationDataExpressionEvaluator(DATA_WITH_NO_EXPRESSION).use { evaluator ->
+            evaluator.init()
+            runUiThreadTasks()
 
-        assertThat(evaluator.data.value).isEqualTo(UNEVALUATED_DATA)
+            assertThat(evaluator.data.value).isEqualTo(DATA_WITH_NO_EXPRESSION)
+        }
+    }
+
+    /**
+     * Scenarios for testing expressions.
+     *
+     * Each scenario describes the expressed data, the flow of states, and the flow of the evaluated
+     * data output.
+     */
+    enum class DataExpressionScenario(
+        val expressed: WireComplicationData,
+        val states: List<Map<String, StateEntryValue>>,
+        val evaluated: List<WireComplicationData>,
+    ) {
+        SET_IMMEDIATELY_WHEN_ALL_DATA_AVAILABLE(
+            expressed =
+                WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                    .setRangedValueExpression(DynamicFloat.constant(1f))
+                    .setLongText(WireComplicationText(DynamicString.constant("Long Text")))
+                    .setLongTitle(WireComplicationText(DynamicString.constant("Long Title")))
+                    .setShortText(WireComplicationText(DynamicString.constant("Short Text")))
+                    .setShortTitle(WireComplicationText(DynamicString.constant("Short Title")))
+                    .setContentDescription(
+                        WireComplicationText(DynamicString.constant("Description"))
+                    )
+                    .build(),
+            states = listOf(),
+            evaluated =
+                listOf(
+                    WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                        .setRangedValue(1f)
+                        .setRangedValueExpression(DynamicFloat.constant(1f))
+                        .setLongText(
+                            WireComplicationText("Long Text", DynamicString.constant("Long Text"))
+                        )
+                        .setLongTitle(
+                            WireComplicationText("Long Title", DynamicString.constant("Long Title"))
+                        )
+                        .setShortText(
+                            WireComplicationText("Short Text", DynamicString.constant("Short Text"))
+                        )
+                        .setShortTitle(
+                            WireComplicationText(
+                                "Short Title",
+                                DynamicString.constant("Short Title")
+                            )
+                        )
+                        .setContentDescription(
+                            WireComplicationText(
+                                "Description",
+                                DynamicString.constant("Description")
+                            )
+                        )
+                        .build()
+                ),
+        ),
+        SET_ONLY_AFTER_ALL_FIELDS_EVALUATED(
+            expressed =
+                WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                    .setRangedValueExpression(DynamicFloat.fromState("ranged_value"))
+                    .setLongText(WireComplicationText(DynamicString.fromState("long_text")))
+                    .setLongTitle(WireComplicationText(DynamicString.fromState("long_title")))
+                    .setShortText(WireComplicationText(DynamicString.fromState("short_text")))
+                    .setShortTitle(WireComplicationText(DynamicString.fromState("short_title")))
+                    .setContentDescription(
+                        WireComplicationText(DynamicString.fromState("description"))
+                    )
+                    .build(),
+            states =
+                aggregate(
+                    // Each map piles on top of the previous ones.
+                    mapOf("ranged_value" to StateEntryValue.fromFloat(1f)),
+                    mapOf("long_text" to StateEntryValue.fromString("Long Text")),
+                    mapOf("long_title" to StateEntryValue.fromString("Long Title")),
+                    mapOf("short_text" to StateEntryValue.fromString("Short Text")),
+                    mapOf("short_title" to StateEntryValue.fromString("Short Title")),
+                    // Only the last one will trigger an evaluated data.
+                    mapOf("description" to StateEntryValue.fromString("Description")),
+                ),
+            evaluated =
+                listOf(
+                    INVALID_DATA, // Before state is available.
+                    WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                        .setRangedValue(1f)
+                        .setRangedValueExpression(DynamicFloat.fromState("ranged_value"))
+                        .setLongText(
+                            WireComplicationText("Long Text", DynamicString.fromState("long_text"))
+                        )
+                        .setLongTitle(
+                            WireComplicationText(
+                                "Long Title",
+                                DynamicString.fromState("long_title")
+                            )
+                        )
+                        .setShortText(
+                            WireComplicationText(
+                                "Short Text",
+                                DynamicString.fromState("short_text")
+                            )
+                        )
+                        .setShortTitle(
+                            WireComplicationText(
+                                "Short Title",
+                                DynamicString.fromState("short_title")
+                            )
+                        )
+                        .setContentDescription(
+                            WireComplicationText(
+                                "Description",
+                                DynamicString.fromState("description")
+                            )
+                        )
+                        .build()
+                ),
+        ),
+        SET_TO_EVALUATED_IF_ALL_FIELDS_VALID(
+            expressed =
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortTitle(WireComplicationText(DynamicString.fromState("valid")))
+                    .setShortText(WireComplicationText(DynamicString.fromState("valid")))
+                    .build(),
+            states =
+                listOf(
+                    mapOf("valid" to StateEntryValue.fromString("Valid")),
+                ),
+            evaluated =
+                listOf(
+                    INVALID_DATA, // Before state is available.
+                    WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                        .setShortTitle(
+                            WireComplicationText("Valid", DynamicString.fromState("valid"))
+                        )
+                        .setShortText(
+                            WireComplicationText("Valid", DynamicString.fromState("valid"))
+                        )
+                        .build(),
+                ),
+        ),
+        SET_TO_NO_DATA_IF_FIRST_STATE_IS_INVALID(
+            expressed =
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortTitle(WireComplicationText(DynamicString.fromState("valid")))
+                    .setShortText(WireComplicationText(DynamicString.fromState("invalid")))
+                    .build(),
+            states =
+                listOf(
+                    mapOf(),
+                    mapOf("valid" to StateEntryValue.fromString("Valid")),
+                ),
+            evaluated =
+                listOf(
+                    INVALID_DATA, // States invalid after one field changed to valid.
+                ),
+        ),
+        SET_TO_NO_DATA_IF_LAST_STATE_IS_INVALID(
+            expressed =
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortTitle(WireComplicationText(DynamicString.fromState("valid")))
+                    .setShortText(WireComplicationText(DynamicString.fromState("invalid")))
+                    .build(),
+            states =
+                listOf(
+                    mapOf(
+                        "valid" to StateEntryValue.fromString("Valid"),
+                        "invalid" to StateEntryValue.fromString("Valid"),
+                    ),
+                    mapOf("valid" to StateEntryValue.fromString("Valid")),
+                ),
+            evaluated =
+                listOf(
+                    INVALID_DATA, // Before state is available.
+                    WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                        .setShortTitle(
+                            WireComplicationText("Valid", DynamicString.fromState("valid"))
+                        )
+                        .setShortText(
+                            WireComplicationText("Valid", DynamicString.fromState("invalid"))
+                        )
+                        .build(),
+                    INVALID_DATA, // After it was invalidated.
+                ),
+        ),
     }
 
     @Test
-    fun addListener_notInitialized_notInvoked() = runTest {
-        val evaluator = ComplicationDataExpressionEvaluator(UNEVALUATED_DATA)
+    fun data_expression_setToEvaluated() {
+        for (scenario in DataExpressionScenario.values()) {
+            // Defensive copy due to in-place evaluation.
+            val expressed = WireComplicationData.Builder(scenario.expressed).build()
+            val stateStore = ObservableStateStore(mapOf())
+            ComplicationDataExpressionEvaluator(
+                    expressed,
+                    stateStore = stateStore,
+                )
+                .use { evaluator ->
+                    val allEvaluations =
+                        evaluator.data
+                            .filterNotNull()
+                            .shareIn(
+                                CoroutineScope(Dispatchers.Main),
+                                SharingStarted.Eagerly,
+                                replay = 10,
+                            )
+                    evaluator.init()
+                    runUiThreadTasks() // Ensures data sharing started.
 
-        evaluator.addListener(coroutineContext.asExecutor(), listener)
-        advanceUntilIdle()
+                    for (state in scenario.states) {
+                        stateStore.setStateEntryValues(state)
+                        runUiThreadTasks() // Ensures data sharing ended.
+                    }
 
-        verify(listener, never()).accept(any())
+                    expect
+                        .withMessage(scenario.name)
+                        .that(allEvaluations.replayCache)
+                        .isEqualTo(scenario.evaluated)
+                }
+        }
+    }
+
+    enum class HasExpressionDataWithExpressionScenario(val data: WireComplicationData) {
+        RANGED_VALUE(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setRangedValueExpression(DynamicFloat.constant(1f))
+                .build()
+        ),
+        LONG_TEXT(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setLongText(WireComplicationText(DynamicString.constant("Long Text")))
+                .build()
+        ),
+        LONG_TITLE(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setLongTitle(WireComplicationText(DynamicString.constant("Long Title")))
+                .build()
+        ),
+        SHORT_TEXT(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setShortText(WireComplicationText(DynamicString.constant("Short Text")))
+                .build()
+        ),
+        SHORT_TITLE(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setShortTitle(WireComplicationText(DynamicString.constant("Short Title")))
+                .build()
+        ),
+        CONTENT_DESCRIPTION(
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setContentDescription(WireComplicationText(DynamicString.constant("Description")))
+                .build()
+        ),
     }
 
     @Test
-    fun addListener_initialized_invokedWithUnevaluated() = runTest {
-        val evaluator = ComplicationDataExpressionEvaluator(UNEVALUATED_DATA)
-        evaluator.init()
-
-        evaluator.addListener(coroutineContext.asExecutor(), listener)
-        advanceUntilIdle()
-
-        verify(listener, times(1)).accept(UNEVALUATED_DATA)
+    fun hasExpression_dataWithExpression_returnsTrue() {
+        for (scenario in HasExpressionDataWithExpressionScenario.values()) {
+            expect.withMessage(scenario.name).that(hasExpression(scenario.data)).isTrue()
+        }
     }
 
     @Test
-    fun removeListener_notInvokedWithNewData() = runTest {
-        val evaluator = ComplicationDataExpressionEvaluator(UNEVALUATED_DATA)
-        evaluator.addListener(coroutineContext.asExecutor(), listener)
+    fun hasExpression_dataWithoutExpression_returnsFalse() {
+        assertThat(hasExpression(DATA_WITH_NO_EXPRESSION)).isFalse()
+    }
 
-        evaluator.removeListener(listener)
-        evaluator.init() // Should trigger a second call with UNEVALUATED_DATA.
-        advanceUntilIdle()
+    @Test
+    fun compat_notInitialized_listenerNotInvoked() {
+        ComplicationDataExpressionEvaluator.Compat(
+                DATA_WITH_NO_EXPRESSION,
+                ContextCompat.getMainExecutor(getApplicationContext()),
+                listener,
+            )
+            .use {
+                runUiThreadTasks()
 
-        verify(listener, never()).accept(any())
+                verify(listener, never()).accept(any())
+            }
+    }
+
+    @Test
+    fun compat_noExpression_listenerInvokedWithData() {
+        ComplicationDataExpressionEvaluator.Compat(
+                DATA_WITH_NO_EXPRESSION,
+                ContextCompat.getMainExecutor(getApplicationContext()),
+                listener,
+            )
+            .use { evaluator ->
+                evaluator.init()
+                runUiThreadTasks()
+
+                verify(listener, times(1)).accept(DATA_WITH_NO_EXPRESSION)
+            }
     }
 
     private companion object {
-        val UNEVALUATED_DATA: WireComplicationData = ShortTextComplicationData.Builder(
-            text = PlainComplicationText.Builder("text").build(),
-            contentDescription = PlainComplicationText.Builder("description").build(),
-        ).build().asWireComplicationData()
+        val DATA_WITH_NO_EXPRESSION =
+            WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
+                .setRangedValue(10f)
+                .build()
+
+        /** Converts `[{a: A}, {b: B}, {c: C}]` to `[{a: A}, {a: A, b: B}, {a: A, b: B, c: C}]`. */
+        fun <K, V> aggregate(vararg maps: Map<K, V>): List<Map<K, V>> =
+            maps.fold(listOf()) { acc, map -> acc + ((acc.lastOrNull() ?: mapOf()) + map) }
     }
 }
-
-private fun CoroutineContext.asExecutor(): Executor =
-    (get(ContinuationInterceptor) as CoroutineDispatcher).asExecutor()
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
index 0ed46d2..f75fff1 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
@@ -18,8 +18,6 @@
 
 package androidx.wear.watchface.complications.data
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
-import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.annotation.SuppressLint
 import android.app.PendingIntent
 import android.content.ComponentName
@@ -29,6 +27,8 @@
 import android.graphics.Color
 import android.graphics.drawable.Icon
 import android.os.Build
+import android.support.wearable.complications.ComplicationData as WireComplicationData
+import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.util.Log
 import androidx.annotation.RequiresApi
 import androidx.test.core.app.ApplicationProvider
@@ -81,12 +81,13 @@
 
         assertThat(data).isEqualTo(NoDataComplicationData())
         assertThat(data.hashCode()).isEqualTo(NoDataComplicationData().hashCode())
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=null, tapActionLostDueToSerialization=false," +
-                " tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
-                "-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
-                "+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=null, tapActionLostDueToSerialization=false, " +
+                    "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
+                    "-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                    "+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
@@ -122,15 +123,16 @@
 
     @Test
     public fun shortTextComplicationData() {
-        val data = ShortTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .setDataSource(dataSource)
-            .setPersistencePolicy(ComplicationPersistencePolicies.DO_NOT_PERSIST)
-            .setDisplayPolicy(ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED)
-            .build()
+        val data =
+            ShortTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .setDataSource(dataSource)
+                .setPersistencePolicy(ComplicationPersistencePolicies.DO_NOT_PERSIST)
+                .setDisplayPolicy(ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
@@ -144,38 +146,40 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as ShortTextComplicationData
-        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("text")
+        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH)).isEqualTo("text")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("title")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("title")
 
-        assertThat(data.toString()).isEqualTo(
-            "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
-                "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
-                "monochromaticImage=null, smallImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=1, displayPolicy=1)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                    "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
+                    "monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=1, " +
+                    "displayPolicy=1)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun shortTextComplicationData_withImages() {
-        val data = ShortTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            ShortTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
@@ -192,42 +196,41 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as ShortTextComplicationData
-        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("text")
+        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH)).isEqualTo("text")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("title")
-        assertThat(deserialized.monochromaticImage!!.image.uri.toString())
-            .isEqualTo("someuri")
-        assertThat(deserialized.smallImage!!.image.uri.toString())
-            .isEqualTo("someuri2")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("title")
+        assertThat(deserialized.monochromaticImage!!.image.uri.toString()).isEqualTo("someuri")
+        assertThat(deserialized.smallImage!!.image.uri.toString()).isEqualTo("someuri2")
         assertThat(deserialized.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
 
-        assertThat(data.toString()).isEqualTo(
-            "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
-                "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
-                "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
-                "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
-                "type=PHOTO, ambientImage=null), contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "ShortTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                    "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
+                    "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
+                    "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
+                    "type=PHOTO, ambientImage=null), contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @Test
     public fun longTextComplicationData() {
-        val data = LongTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            LongTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
@@ -241,38 +244,40 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as LongTextComplicationData
-        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("text")
+        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH)).isEqualTo("text")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("title")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("title")
 
-        assertThat(data.toString()).isEqualTo(
-            "LongTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
-                "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
-                "monochromaticImage=null, smallImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "LongTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                    "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=title, mTimeDependentText=null, mExpression=null}, " +
+                    "monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun longTextComplicationData_withImages() {
-        val data = LongTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            LongTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
@@ -289,43 +294,44 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as LongTextComplicationData
-        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("text")
+        assertThat(deserialized.text.getTextAt(resources, Instant.EPOCH)).isEqualTo("text")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("title")
-        assertThat(deserialized.monochromaticImage!!.image.uri.toString())
-            .isEqualTo("someuri")
-        assertThat(deserialized.smallImage!!.image.uri.toString())
-            .isEqualTo("someuri2")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("title")
+        assertThat(deserialized.monochromaticImage!!.image.uri.toString()).isEqualTo("someuri")
+        assertThat(deserialized.smallImage!!.image.uri.toString()).isEqualTo("someuri2")
         assertThat(deserialized.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
 
-        assertThat(data.toString()).isEqualTo(
-            "LongTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
-                "mTimeDependentText=null, mExpression=null}, " +
-                "title=ComplicationText{mSurroundingText=title, mTimeDependentText=null, " +
-                "mExpression=null}, monochromaticImage=MonochromaticImage(" +
-                "image=Icon(typ=URI uri=someuri), ambientImage=null), smallImage=SmallImage(" +
-                "image=Icon(typ=URI uri=someuri2), type=PHOTO, ambientImage=null), " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "LongTextComplicationData(text=ComplicationText{mSurroundingText=text, " +
+                    "mTimeDependentText=null, mExpression=null}, " +
+                    "title=ComplicationText{mSurroundingText=title, mTimeDependentText=null, " +
+                    "mExpression=null}, monochromaticImage=MonochromaticImage(" +
+                    "image=Icon(typ=URI uri=someuri), ambientImage=null), smallImage=SmallImage(" +
+                    "image=Icon(typ=URI uri=someuri2), type=PHOTO, ambientImage=null), " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @Test
     public fun rangedValueComplicationData_withFixedValue() {
-        val data = RangedValueComplicationData.Builder(
-            value = 95f, min = 0f, max = 100f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("battery".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    value = 95f,
+                    min = 0f,
+                    max = 100f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("battery".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -348,34 +354,35 @@
         assertThat(deserialized.valueExpression).isNull()
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("battery")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("battery")
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=95.0, valueExpression=null, valueType=0, " +
-                "min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=battery, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=95.0, valueExpression=null, valueType=0, " +
+                    "min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=battery, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun rangedValueComplicationData_withValueExpression() {
-        val data = RangedValueComplicationData.Builder(
-            valueExpression = DynamicFloat.constant(20f),
-            min = 5f,
-            max = 100f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("battery".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    valueExpression = DynamicFloat.constant(20f),
+                    min = 5f,
+                    max = 100f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("battery".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -400,33 +407,36 @@
         assertThat(deserialized.value).isEqualTo(5f) // min as a sensible default
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("battery")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("battery")
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=5.0, " +
-                "valueExpression=FixedFloat{value=20.0}, valueType=0, min=5.0, " +
-                "max=100.0, monochromaticImage=null, smallImage=null, title=ComplicationText{" +
-                "mSurroundingText=battery, mTimeDependentText=null, mExpression=null}, " +
-                "text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
-                "ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=5.0, " +
+                    "valueExpression=FixedFloat{value=20.0}, valueType=0, min=5.0, " +
+                    "max=100.0, monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                    "mSurroundingText=battery, mTimeDependentText=null, mExpression=null}, " +
+                    "text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
+                    "ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @Test
     public fun rangedValueComplicationData_withStringExpression() {
-        val data = RangedValueComplicationData.Builder(
-            value = 95f, min = 0f, max = 100f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle(ComplicationTextExpression(DynamicString.constant("title")))
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    value = 95f,
+                    min = 0f,
+                    max = 100f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle(ComplicationTextExpression(DynamicString.constant("title")))
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -449,34 +459,38 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=95.0, valueExpression=null, valueType=0, " +
-                "min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=(null), mTimeDependentText=null, " +
-                "mExpression=FixedString{value=title}}, text=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=95.0, valueExpression=null, valueType=0, " +
+                    "min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=(null), mTimeDependentText=null, " +
+                    "mExpression=FixedString{value=title}}, text=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun rangedValueComplicationData_withImages() {
-        val data = RangedValueComplicationData.Builder(
-            value = 95f, min = 0f, max = 100f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("battery".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .setValueType(RangedValueComplicationData.TYPE_RATING)
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    value = 95f,
+                    min = 0f,
+                    max = 100f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("battery".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .setValueType(RangedValueComplicationData.TYPE_RATING)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -501,40 +515,41 @@
         assertThat(deserialized.value).isEqualTo(95f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("battery")
-        assertThat(deserialized.monochromaticImage!!.image.uri.toString())
-            .isEqualTo("someuri")
-        assertThat(deserialized.smallImage!!.image.uri.toString())
-            .isEqualTo("someuri2")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("battery")
+        assertThat(deserialized.monochromaticImage!!.image.uri.toString()).isEqualTo("someuri")
+        assertThat(deserialized.smallImage!!.image.uri.toString()).isEqualTo("someuri2")
         assertThat(deserialized.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=95.0, valueExpression=null, " +
-                "valueType=1, min=0.0, max=100.0, " +
-                "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
-                "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
-                "type=PHOTO, ambientImage=null), title=ComplicationText{mSurroundingText=battery," +
-                " mTimeDependentText=null, mExpression=null}, text=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=95.0, valueExpression=null, " +
+                    "valueType=1, min=0.0, max=100.0, " +
+                    "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
+                    "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
+                    "type=PHOTO, ambientImage=null), " +
+                    "title=ComplicationText{mSurroundingText=battery, " +
+                    "mTimeDependentText=null, mExpression=null}, text=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun goalProgressComplicationData_withFixedValue() {
-        val data = GoalProgressComplicationData.Builder(
-            value = 1200f, targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    value = 1200f,
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_GOAL_PROGRESS)
@@ -554,33 +569,34 @@
         assertThat(deserialized.targetValue).isEqualTo(10000f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("steps")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("steps")
 
-        assertThat(data.toString()).isEqualTo(
-            "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
-                "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=steps, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
+                    "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=steps, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun goalProgressComplicationData_withValueExpression() {
-        val data = GoalProgressComplicationData.Builder(
-            valueExpression = DynamicFloat.constant(10f),
-            targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    valueExpression = DynamicFloat.constant(10f),
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_GOAL_PROGRESS)
@@ -602,34 +618,37 @@
         assertThat(deserialized.targetValue).isEqualTo(10000f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("steps")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("steps")
 
-        assertThat(data.toString()).isEqualTo(
-            "GoalProgressComplicationData(value=0.0, valueExpression=" +
-                "FixedFloat{value=10.0}, targetValue=10000.0, " +
-                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
-                "mSurroundingText=steps, mTimeDependentText=null, mExpression=null}, " +
-                "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
-                "description, mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
-                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "GoalProgressComplicationData(value=0.0, valueExpression=" +
+                    "FixedFloat{value=10.0}, targetValue=10000.0, " +
+                    "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                    "mSurroundingText=steps, mTimeDependentText=null, mExpression=null}, " +
+                    "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
+                    "description, mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(" +
+                    "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun goalProgressComplicationData_withColorRamp() {
-        val data = GoalProgressComplicationData.Builder(
-            value = 1200f, targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setDataSource(dataSource)
-            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    value = 1200f,
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setDataSource(dataSource)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_GOAL_PROGRESS)
@@ -650,36 +669,39 @@
         assertThat(deserialized.targetValue).isEqualTo(10000f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("steps")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("steps")
 
-        assertThat(data.toString()).isEqualTo(
-            "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
-                "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=steps, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, " +
-                "-16711936, -16776961], interpolated=true), persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
+                    "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=steps, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                    "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], " +
+                    "interpolated=true), persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun goalProgressComplicationData_withColorRampAndImages() {
-        val data = GoalProgressComplicationData.Builder(
-            value = 1200f, targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    value = 1200f,
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_GOAL_PROGRESS)
@@ -703,41 +725,44 @@
         assertThat(deserialized.targetValue).isEqualTo(10000f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("steps")
-        assertThat(deserialized.monochromaticImage!!.image.uri.toString())
-            .isEqualTo("someuri")
-        assertThat(deserialized.smallImage!!.image.uri.toString())
-            .isEqualTo("someuri2")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("steps")
+        assertThat(deserialized.monochromaticImage!!.image.uri.toString()).isEqualTo("someuri")
+        assertThat(deserialized.smallImage!!.image.uri.toString()).isEqualTo("someuri2")
         assertThat(deserialized.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
 
-        assertThat(data.toString()).isEqualTo(
-            "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
-                "targetValue=10000.0, " +
-                "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
-                "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
-                "type=PHOTO, ambientImage=null), title=ComplicationText{mSurroundingText=steps, " +
-                "mTimeDependentText=null, mExpression=null}, text=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, " +
-                "-16711936, -16776961], interpolated=true), persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "GoalProgressComplicationData(value=1200.0, valueExpression=null, " +
+                    "targetValue=10000.0, " +
+                    "monochromaticImage=MonochromaticImage(image=Icon(typ=URI uri=someuri), " +
+                    "ambientImage=null), smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), " +
+                    "type=PHOTO, ambientImage=null), " +
+                    "title=ComplicationText{mSurroundingText=steps, " +
+                    "mTimeDependentText=null, mExpression=null}, text=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                    "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], " +
+                    "interpolated=true), persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun rangedValueComplicationData_withColorRamp() {
-        val data = RangedValueComplicationData.Builder(
-            value = 95f, min = 0f, max = 100f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("battery".complicationText)
-            .setDataSource(dataSource)
-            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    value = 95f,
+                    min = 0f,
+                    max = 100f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("battery".complicationText)
+                .setDataSource(dataSource)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -761,52 +786,55 @@
         assertThat(deserialized.value).isEqualTo(95f)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("battery")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("battery")
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=95.0, valueExpression=null, " +
-                "valueType=0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
-                "mSurroundingText=battery, mTimeDependentText=null, mExpression=null}, " +
-                "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
-                "description, mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, " +
-                "-16711936, -16776961], interpolated=true), persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=95.0, valueExpression=null, " +
+                    "valueType=0, min=0.0, max=100.0, " +
+                    "monochromaticImage=null, smallImage=null, title=ComplicationText{" +
+                    "mSurroundingText=battery, mTimeDependentText=null, mExpression=null}, " +
+                    "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
+                    "description, mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                    "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], " +
+                    "interpolated=true), persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     fun weightedElementsComplicationDataTruncation() {
-        val data = WeightedElementsComplicationData.Builder(
-            MutableList(WeightedElementsComplicationData.getMaxElements() + 5) {
-                WeightedElementsComplicationData.Element(0.5f, Color.RED)
-            },
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("test".complicationText)
-            .build()
+        val data =
+            WeightedElementsComplicationData.Builder(
+                    MutableList(WeightedElementsComplicationData.getMaxElements() + 5) {
+                        WeightedElementsComplicationData.Element(0.5f, Color.RED)
+                    },
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("test".complicationText)
+                .build()
 
         assertThat(data.elements.size).isEqualTo(WeightedElementsComplicationData.getMaxElements())
     }
 
     @Test
     public fun weightedElementsComplicationData() {
-        val data = WeightedElementsComplicationData.Builder(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
-            ),
-            contentDescription = "content description".complicationText
-        )
-            .setElementBackgroundColor(Color.GRAY)
-            .setTitle("calories".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            WeightedElementsComplicationData.Builder(
+                    listOf(
+                        WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                        WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                        WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                    ),
+                    contentDescription = "content description".complicationText
+                )
+                .setElementBackgroundColor(Color.GRAY)
+                .setTitle("calories".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
@@ -822,48 +850,51 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as WeightedElementsComplicationData
-        assertThat(deserialized.elements).isEqualTo(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+        assertThat(deserialized.elements)
+            .isEqualTo(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                )
             )
-        )
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("calories")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("calories")
 
-        assertThat(data.toString()).isEqualTo(
-            "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5)," +
-                " Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
-                "elementBackgroundColor=-7829368, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5), " +
+                    "Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
+                    "elementBackgroundColor=-7829368, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun weightedElementsComplicationData_withImages() {
-        val data = WeightedElementsComplicationData.Builder(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
-            ),
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("calories".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            WeightedElementsComplicationData.Builder(
+                    listOf(
+                        WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                        WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                        WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                    ),
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("calories".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
@@ -882,46 +913,50 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as WeightedElementsComplicationData
-        assertThat(deserialized.elements).isEqualTo(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+        assertThat(deserialized.elements)
+            .isEqualTo(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                )
             )
-        )
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
-        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
-            .isEqualTo("calories")
-        assertThat(deserialized.monochromaticImage!!.image.uri.toString())
-            .isEqualTo("someuri")
-        assertThat(deserialized.smallImage!!.image.uri.toString())
-            .isEqualTo("someuri2")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo("calories")
+        assertThat(deserialized.monochromaticImage!!.image.uri.toString()).isEqualTo("someuri")
+        assertThat(deserialized.smallImage!!.image.uri.toString()).isEqualTo("someuri2")
         assertThat(deserialized.smallImage!!.type).isEqualTo(SmallImageType.PHOTO)
 
-        assertThat(data.toString()).isEqualTo(
-            "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5)," +
-                " Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
-                "elementBackgroundColor=0, monochromaticImage=MonochromaticImage(" +
-                "image=Icon(typ=URI uri=someuri), ambientImage=null), " +
-                "smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), type=PHOTO, " +
-                "ambientImage=null), title=ComplicationText{mSurroundingText=calories, " +
-                "mTimeDependentText=null, mExpression=null}, text=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5), " +
+                    "Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
+                    "elementBackgroundColor=0, monochromaticImage=MonochromaticImage(" +
+                    "image=Icon(typ=URI uri=someuri), ambientImage=null), " +
+                    "smallImage=SmallImage(image=Icon(typ=URI uri=someuri2), type=PHOTO, " +
+                    "ambientImage=null), title=ComplicationText{mSurroundingText=calories, " +
+                    "mTimeDependentText=null, mExpression=null}, text=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun monochromaticImageComplicationData() {
-        val data = MonochromaticImageComplicationData.Builder(
-            image, "content description".complicationText
-        ).setDataSource(dataSource).build()
+        val data =
+            MonochromaticImageComplicationData.Builder(
+                    image,
+                    "content description".complicationText
+                )
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_ICON)
@@ -934,29 +969,32 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as MonochromaticImageComplicationData
-        assertThat(deserialized.monochromaticImage.image.uri.toString())
-            .isEqualTo("someuri")
+        assertThat(deserialized.monochromaticImage.image.uri.toString()).isEqualTo("someuri")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "MonochromaticImageComplicationData(monochromaticImage=MonochromaticImage(" +
-                "image=Icon(typ=URI uri=someuri), ambientImage=null), contentDescription=" +
-                "ComplicationText{mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "MonochromaticImageComplicationData(monochromaticImage=MonochromaticImage(" +
+                    "image=Icon(typ=URI uri=someuri), ambientImage=null), contentDescription=" +
+                    "ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
     @Test
     public fun smallImageComplicationData() {
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
-        val data = SmallImageComplicationData.Builder(
-            image, "content description".complicationText
-        ).setDataSource(dataSource).build()
+        val data =
+            SmallImageComplicationData.Builder(image, "content description".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SMALL_IMAGE)
@@ -970,22 +1008,23 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as SmallImageComplicationData
-        assertThat(deserialized.smallImage.image.uri.toString())
-            .isEqualTo("someuri")
+        assertThat(deserialized.smallImage.image.uri.toString()).isEqualTo("someuri")
         assertThat(deserialized.smallImage.type).isEqualTo(SmallImageType.PHOTO)
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "SmallImageComplicationData(smallImage=SmallImage(image=Icon(" +
-                "typ=URI uri=someuri), type=PHOTO, ambientImage=null), " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "SmallImageComplicationData(smallImage=SmallImage(image=Icon(" +
+                    "typ=URI uri=someuri), type=PHOTO, ambientImage=null), " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.P)
@@ -994,9 +1033,10 @@
         val bitmapIcon =
             Icon.createWithBitmap(Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888))
         val image = SmallImage.Builder(bitmapIcon, SmallImageType.PHOTO).build()
-        val data = SmallImageComplicationData.Builder(
-            image, "content description".complicationText
-        ).setDataSource(dataSource).build()
+        val data =
+            SmallImageComplicationData.Builder(image, "content description".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SMALL_IMAGE)
@@ -1025,9 +1065,10 @@
     @Test
     public fun backgroundImageComplicationData() {
         val photoImage = Icon.createWithContentUri("someuri")
-        val data = PhotoImageComplicationData.Builder(
-            photoImage, "content description".complicationText
-        ).setDataSource(dataSource).build()
+        val data =
+            PhotoImageComplicationData.Builder(photoImage, "content description".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_LARGE_IMAGE)
@@ -1040,28 +1081,30 @@
             )
         testRoundTripConversions(data)
         val deserialized = serializeAndDeserialize(data) as PhotoImageComplicationData
-        assertThat(deserialized.photoImage.uri.toString())
-            .isEqualTo("someuri")
+        assertThat(deserialized.photoImage.uri.toString()).isEqualTo("someuri")
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "PhotoImageComplicationData(photoImage=Icon(typ=URI uri=someuri), " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "PhotoImageComplicationData(photoImage=Icon(typ=URI uri=someuri), " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noPermissionComplicationData() {
-        val data = NoPermissionComplicationData.Builder()
-            .setText("needs location".complicationText)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            NoPermissionComplicationData.Builder()
+                .setText("needs location".complicationText)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_PERMISSION)
@@ -1076,25 +1119,29 @@
         assertThat(deserialized.text!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("needs location")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoPermissionComplicationData(text=ComplicationText{mSurroundingText=needs location, " +
-                "mTimeDependentText=null, mExpression=null}, title=null, " +
-                "monochromaticImage=null, smallImage=null, tapActionLostDueToSerialization=false," +
-                " tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
-                "-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
-                "+1000000000-12-31T23:59:59.999999999Z), dataSource=ComponentInfo{" +
-                "com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoPermissionComplicationData(text=ComplicationText{" +
+                    "mSurroundingText=needs location, " +
+                    "mTimeDependentText=null, mExpression=null}, title=null, " +
+                    "monochromaticImage=null, smallImage=null, " +
+                    "tapActionLostDueToSerialization=false, " +
+                    "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
+                    "-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                    "+1000000000-12-31T23:59:59.999999999Z), dataSource=ComponentInfo{" +
+                    "com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noPermissionComplicationData_withImages() {
-        val data = NoPermissionComplicationData.Builder()
-            .setText("needs location".complicationText)
-            .setMonochromaticImage(monochromaticImage)
-            .setSmallImage(smallImage)
-            .setDataSource(dataSource)
-            .build()
+        val data =
+            NoPermissionComplicationData.Builder()
+                .setText("needs location".complicationText)
+                .setMonochromaticImage(monochromaticImage)
+                .setSmallImage(smallImage)
+                .setDataSource(dataSource)
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_PERMISSION)
@@ -1112,31 +1159,35 @@
         assertThat(deserialized.text!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("needs location")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoPermissionComplicationData(text=ComplicationText{" +
-                "mSurroundingText=needs location, mTimeDependentText=null, " +
-                "mExpression=null}, title=null, monochromaticImage=MonochromaticImage(" +
-                "image=Icon(typ=URI uri=someuri), ambientImage=null), smallImage=SmallImage(" +
-                "image=Icon(typ=URI uri=someuri2), type=PHOTO, ambientImage=null), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
-                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoPermissionComplicationData(text=ComplicationText{" +
+                    "mSurroundingText=needs location, mTimeDependentText=null, " +
+                    "mExpression=null}, title=null, monochromaticImage=MonochromaticImage(" +
+                    "image=Icon(typ=URI uri=someuri), ambientImage=null), smallImage=SmallImage(" +
+                    "image=Icon(typ=URI uri=someuri2), type=PHOTO, ambientImage=null), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(" +
+                    "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_shortText() {
-        val data = NoDataComplicationData(
-            ShortTextComplicationData.Builder(
-                ComplicationText.PLACEHOLDER,
-                "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                ShortTextComplicationData.Builder(
+                        ComplicationText.PLACEHOLDER,
+                        "content description".complicationText
+                    )
+                    .setTitle(ComplicationText.PLACEHOLDER)
+                    .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                    .setDataSource(dataSource)
+                    .build()
             )
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setDataSource(dataSource)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1162,34 +1213,38 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=ShortTextComplicationData(text=" +
-                "ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null, " +
-                "mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
-                "mExpression=null}, monochromaticImage=MonochromaticImage(" +
-                "image=Icon(typ=RESOURCE pkg= id=0xffffffff), ambientImage=null), " +
-                "smallImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=ShortTextComplicationData(text=" +
+                    "ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null, " +
+                    "mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
+                    "mExpression=null}, monochromaticImage=MonochromaticImage(" +
+                    "image=Icon(typ=RESOURCE pkg= id=0xffffffff), ambientImage=null), " +
+                    "smallImage=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}, tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_longText() {
-        val data = NoDataComplicationData(
-            LongTextComplicationData.Builder(
-                "text".complicationText,
-                "content description".complicationText
-            ).setDataSource(dataSource).build()
-        )
+        val data =
+            NoDataComplicationData(
+                LongTextComplicationData.Builder(
+                        "text".complicationText,
+                        "content description".complicationText
+                    )
+                    .setDataSource(dataSource)
+                    .build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1213,36 +1268,38 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=LongTextComplicationData(" +
-                "text=ComplicationText{mSurroundingText=text, mTimeDependentText=null, " +
-                "mExpression=null}, title=null, monochromaticImage=null, smallImage=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=LongTextComplicationData(" +
+                    "text=ComplicationText{mSurroundingText=text, mTimeDependentText=null, " +
+                    "mExpression=null}, title=null, monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_rangedValue() {
-        val data = NoDataComplicationData(
-            RangedValueComplicationData.Builder(
-                value = RangedValueComplicationData.PLACEHOLDER,
-                min = 0f,
-                max = 100f,
-                "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                RangedValueComplicationData.Builder(
+                        value = RangedValueComplicationData.PLACEHOLDER,
+                        min = 0f,
+                        max = 100f,
+                        "content description".complicationText
+                    )
+                    .setText(ComplicationText.PLACEHOLDER)
+                    .setDataSource(dataSource)
+                    .build()
             )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setDataSource(dataSource)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1270,37 +1327,40 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
-                "value=3.4028235E38, valueExpression=null, valueType=0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
-                "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
-                "mExpression=null}, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
+                    "value=3.4028235E38, valueExpression=null, valueType=0, min=0.0, max=100.0, " +
+                    "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
+                    "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
+                    "mExpression=null}, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=null, " +
+                    "persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_goalProgress() {
-        val data = NoDataComplicationData(
-            GoalProgressComplicationData.Builder(
-                value = GoalProgressComplicationData.PLACEHOLDER,
-                targetValue = 10000f,
-                contentDescription = "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                GoalProgressComplicationData.Builder(
+                        value = GoalProgressComplicationData.PLACEHOLDER,
+                        targetValue = 10000f,
+                        contentDescription = "content description".complicationText
+                    )
+                    .setText(ComplicationText.PLACEHOLDER)
+                    .setDataSource(dataSource)
+                    .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                    .build()
             )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setDataSource(dataSource)
-                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1328,42 +1388,45 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=GoalProgressComplicationData(" +
-                "value=3.4028235E38, valueExpression=null, targetValue=10000.0, " +
-                "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
-                "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
-                "mExpression=null}, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
-                "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], interpolated=false), " +
-                "persistencePolicy=0, displayPolicy=0), tapActionLostDueToSerialization=false, " +
-                "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
-                "-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=GoalProgressComplicationData(" +
+                    "value=3.4028235E38, valueExpression=null, targetValue=10000.0, " +
+                    "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
+                    "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
+                    "mExpression=null}, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                    "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], " +
+                    "interpolated=false), persistencePolicy=0, displayPolicy=0), " +
+                    "tapActionLostDueToSerialization=false, " +
+                    "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
+                    "-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_weightedElements() {
-        val data = NoDataComplicationData(
-            WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
-                ),
-                contentDescription = "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                WeightedElementsComplicationData.Builder(
+                        listOf(
+                            WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                            WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                            WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                        ),
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("calories".complicationText)
+                    .setElementBackgroundColor(Color.GRAY)
+                    .setDataSource(dataSource)
+                    .build()
             )
-                .setTitle("calories".complicationText)
-                .setElementBackgroundColor(Color.GRAY)
-                .setDataSource(dataSource)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1390,40 +1453,42 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=WeightedElementsComplicationData(" +
-                "elements=Element(color=-65536, weight=0.5), Element(color=-16711936, " +
-                "weight=1.0), Element(color=-16776961, weight=2.0), " +
-                "elementBackgroundColor=-7829368, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=WeightedElementsComplicationData(" +
+                    "elements=Element(color=-65536, weight=0.5), Element(color=-16711936, " +
+                    "weight=1.0), Element(color=-16776961, weight=2.0), " +
+                    "elementBackgroundColor=-7829368, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_rangedValue_with_ColorRange() {
-        val data = NoDataComplicationData(
-            RangedValueComplicationData.Builder(
-                value = RangedValueComplicationData.PLACEHOLDER,
-                min = 0f,
-                max = 100f,
-                "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                RangedValueComplicationData.Builder(
+                        value = RangedValueComplicationData.PLACEHOLDER,
+                        min = 0f,
+                        max = 100f,
+                        "content description".complicationText
+                    )
+                    .setText(ComplicationText.PLACEHOLDER)
+                    .setDataSource(dataSource)
+                    .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                    .setValueType(RangedValueComplicationData.TYPE_RATING)
+                    .build()
             )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setDataSource(dataSource)
-                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-                .setValueType(RangedValueComplicationData.TYPE_RATING)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1453,33 +1518,38 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
-                "value=3.4028235E38, valueExpression=null, valueType=1, min=0.0, max=100.0, " +
-                "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
-                "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
-                "mExpression=null}, contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, " +
-                "-16711936, -16776961], interpolated=true), persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=RangedValueComplicationData(" +
+                    "value=3.4028235E38, valueExpression=null, valueType=1, min=0.0, max=100.0, " +
+                    "monochromaticImage=null, smallImage=null, title=null, text=ComplicationText{" +
+                    "mSurroundingText=__placeholder__, mTimeDependentText=null, " +
+                    "mExpression=null}, contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                    "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], " +
+                    "interpolated=true), persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_monochromaticImage() {
-        val data = NoDataComplicationData(
-            MonochromaticImageComplicationData.Builder(
-                MonochromaticImage.PLACEHOLDER,
-                "content description".complicationText
-            ).setDataSource(dataSource).build()
-        )
+        val data =
+            NoDataComplicationData(
+                MonochromaticImageComplicationData.Builder(
+                        MonochromaticImage.PLACEHOLDER,
+                        "content description".complicationText
+                    )
+                    .setDataSource(dataSource)
+                    .build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1503,30 +1573,34 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=MonochromaticImageComplicationData(" +
-                "monochromaticImage=MonochromaticImage(image=Icon(typ=RESOURCE pkg= " +
-                "id=0xffffffff), ambientImage=null), contentDescription=ComplicationText{" +
-                "mSurroundingText=content description, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=MonochromaticImageComplicationData(" +
+                    "monochromaticImage=MonochromaticImage(image=Icon(typ=RESOURCE pkg= " +
+                    "id=0xffffffff), ambientImage=null), contentDescription=ComplicationText{" +
+                    "mSurroundingText=content description, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_smallImage() {
-        val data = NoDataComplicationData(
-            SmallImageComplicationData.Builder(
-                SmallImage.PLACEHOLDER,
-                "content description".complicationText
-            ).setDataSource(dataSource).build()
-        )
+        val data =
+            NoDataComplicationData(
+                SmallImageComplicationData.Builder(
+                        SmallImage.PLACEHOLDER,
+                        "content description".complicationText
+                    )
+                    .setDataSource(dataSource)
+                    .build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1551,30 +1625,34 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=SmallImageComplicationData(smallImage=" +
-                "SmallImage(image=Icon(typ=RESOURCE pkg= id=0xffffffff), type=ICON, " +
-                "ambientImage=null), contentDescription=ComplicationText{mSurroundingText=" +
-                "content description, mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
-                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=SmallImageComplicationData(smallImage=" +
+                    "SmallImage(image=Icon(typ=RESOURCE pkg= id=0xffffffff), type=ICON, " +
+                    "ambientImage=null), contentDescription=ComplicationText{mSurroundingText=" +
+                    "content description, mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     @Test
     public fun noDataComplicationData_photoImage() {
-        val data = NoDataComplicationData(
-            PhotoImageComplicationData.Builder(
-                PhotoImageComplicationData.PLACEHOLDER,
-                "content description".complicationText
-            ).setDataSource(dataSource).build()
-        )
+        val data =
+            NoDataComplicationData(
+                PhotoImageComplicationData.Builder(
+                        PhotoImageComplicationData.PLACEHOLDER,
+                        "content description".complicationText
+                    )
+                    .setDataSource(dataSource)
+                    .build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -1598,20 +1676,21 @@
         assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("content description")
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=PhotoImageComplicationData(" +
-                "photoImage=Icon(typ=RESOURCE pkg= id=0xffffffff), " +
-                "contentDescription=ComplicationText{mSurroundingText=content description, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=PhotoImageComplicationData(" +
+                    "photoImage=Icon(typ=RESOURCE pkg= id=0xffffffff), " +
+                    "contentDescription=ComplicationText{mSurroundingText=content description, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "dataSource=ComponentInfo{com.pkg_a/com.a}, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                    "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
     }
 
     private fun testRoundTripConversions(data: ComplicationData) {
@@ -2027,75 +2106,89 @@
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class TapActionTest {
-    private val mPendingIntent = PendingIntent.getBroadcast(
-        ApplicationProvider.getApplicationContext(),
-        0,
-        Intent(),
-        0
-    )
+    private val mPendingIntent =
+        PendingIntent.getBroadcast(ApplicationProvider.getApplicationContext(), 0, Intent(), 0)
 
     @Test
     public fun shortTextComplicationData() {
         assertThat(
-            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+                ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun longTextComplicationData() {
         assertThat(
-            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+                LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun rangedValueComplicationData() {
         assertThat(
-            RangedValueComplicationData.Builder(
-                value = 95f, min = 0f, max = 100f,
-                contentDescription = ComplicationText.EMPTY
+                RangedValueComplicationData.Builder(
+                        value = 95f,
+                        min = 0f,
+                        max = 100f,
+                        contentDescription = ComplicationText.EMPTY
+                    )
+                    .setText("battery".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
             )
-                .setText("battery".complicationText)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun goalProgressComplicationData() {
         assertThat(
-            @Suppress("NewApi")
-            GoalProgressComplicationData.Builder(
-                value = 1200f, targetValue = 10000f,
-                contentDescription = "content description".complicationText
+                @Suppress("NewApi")
+                GoalProgressComplicationData.Builder(
+                        value = 1200f,
+                        targetValue = 10000f,
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("steps".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
             )
-                .setTitle("steps".complicationText)
-                .setTapAction(mPendingIntent)
-                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-                .build().asWireComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun weightedElementsComplicationData() {
         assertThat(
-            @Suppress("NewApi")
-            WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
-                ),
-                contentDescription = "content description".complicationText
+                @Suppress("NewApi")
+                WeightedElementsComplicationData.Builder(
+                        listOf(
+                            WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                            WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                            WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                        ),
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("calories".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
             )
-                .setTitle("calories".complicationText)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
@@ -2103,12 +2196,13 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
         assertThat(
-            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build()
-                .asWireComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
@@ -2116,108 +2210,137 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         assertThat(
-            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent).build()
-                .asWireComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun photoImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         assertThat(
-            PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent).build()
-                .asWireComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun noDataComplicationData() {
         assertThat(
-            NoDataComplicationData(
-                ShortTextComplicationData.Builder(
-                    ComplicationText.PLACEHOLDER,
-                    ComplicationText.EMPTY
-                ).setTapAction(mPendingIntent).build()
-            ).asWireComplicationData().placeholder?.tapAction
-        ).isEqualTo(mPendingIntent)
+                NoDataComplicationData(
+                        ShortTextComplicationData.Builder(
+                                ComplicationText.PLACEHOLDER,
+                                ComplicationText.EMPTY
+                            )
+                            .setTapAction(mPendingIntent)
+                            .build()
+                    )
+                    .asWireComplicationData()
+                    .placeholder
+                    ?.tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 }
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class RoundtripTapActionTest {
-    private val mPendingIntent = PendingIntent.getBroadcast(
-        ApplicationProvider.getApplicationContext(),
-        0,
-        Intent(),
-        0
-    )
+    private val mPendingIntent =
+        PendingIntent.getBroadcast(ApplicationProvider.getApplicationContext(), 0, Intent(), 0)
 
     @Test
     public fun shortTextComplicationData() {
         assertThat(
-            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+                ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun longTextComplicationData() {
         assertThat(
-            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+                LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun rangedValueComplicationData() {
         assertThat(
-            RangedValueComplicationData.Builder(
-                value = 95f, min = 0f, max = 100f,
-                contentDescription = ComplicationText.EMPTY
+                RangedValueComplicationData.Builder(
+                        value = 95f,
+                        min = 0f,
+                        max = 100f,
+                        contentDescription = ComplicationText.EMPTY
+                    )
+                    .setText("battery".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
             )
-                .setText("battery".complicationText)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun goalProgressComplicationData() {
         assertThat(
-            @Suppress("NewApi")
-            GoalProgressComplicationData.Builder(
-                value = 1200f, targetValue = 10000f,
-                contentDescription = "content description".complicationText
+                @Suppress("NewApi")
+                GoalProgressComplicationData.Builder(
+                        value = 1200f,
+                        targetValue = 10000f,
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("steps".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
             )
-                .setTitle("steps".complicationText)
-                .setTapAction(mPendingIntent)
-                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
-                .build().asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun weightedElementsComplicationData() {
         assertThat(
-            @Suppress("NewApi")
-            WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
-                ),
-                contentDescription = "content description".complicationText
+                @Suppress("NewApi")
+                WeightedElementsComplicationData.Builder(
+                        listOf(
+                            WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                            WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                            WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                        ),
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("calories".complicationText)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
             )
-                .setTitle("calories".complicationText)
-                .setTapAction(mPendingIntent)
-                .build().asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
@@ -2225,13 +2348,14 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
         assertThat(
-            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent)
-                .build()
-                .asWireComplicationData()
-                .toApiComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
@@ -2239,36 +2363,46 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         assertThat(
-            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent).build()
-                .asWireComplicationData()
-                .toApiComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun photoImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         assertThat(
-            PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
-                .setTapAction(mPendingIntent).build()
-                .asWireComplicationData()
-                .toApiComplicationData()
-                .tapAction
-        ).isEqualTo(mPendingIntent)
+                PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
+                    .setTapAction(mPendingIntent)
+                    .build()
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 
     @Test
     public fun noDataComplicationData() {
         assertThat(
-            NoDataComplicationData(
-                MonochromaticImageComplicationData.Builder(
-                    MonochromaticImage.PLACEHOLDER,
-                    ComplicationText.EMPTY
-                ).setTapAction(mPendingIntent).build()
-            ).asWireComplicationData().toApiComplicationData().tapAction
-        ).isEqualTo(mPendingIntent)
+                NoDataComplicationData(
+                        MonochromaticImageComplicationData.Builder(
+                                MonochromaticImage.PLACEHOLDER,
+                                ComplicationText.EMPTY
+                            )
+                            .setTapAction(mPendingIntent)
+                            .build()
+                    )
+                    .asWireComplicationData()
+                    .toApiComplicationData()
+                    .tapAction
+            )
+            .isEqualTo(mPendingIntent)
     }
 }
 
@@ -2280,11 +2414,10 @@
 
     @Test
     public fun shortTextComplicationData() {
-        val data = ShortTextComplicationData.Builder(
-            "text".complicationText, ComplicationText.EMPTY
-        )
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
@@ -2299,9 +2432,10 @@
 
     @Test
     public fun longTextComplicationData() {
-        val data = LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
@@ -2316,13 +2450,16 @@
 
     @Test
     public fun rangedValueComplicationData() {
-        val data = RangedValueComplicationData.Builder(
-            value = 95f, min = 0f, max = 100f,
-            contentDescription = ComplicationText.EMPTY
-        )
-            .setText("battery".complicationText)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    value = 95f,
+                    min = 0f,
+                    max = 100f,
+                    contentDescription = ComplicationText.EMPTY
+                )
+                .setText("battery".complicationText)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_RANGED_VALUE)
@@ -2341,14 +2478,16 @@
 
     @Test
     public fun goalProgressComplicationData() {
-        val data = GoalProgressComplicationData.Builder(
-            value = 1200f, targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .setColorRamp(ColorRamp(intArrayOf(Color.YELLOW, Color.MAGENTA), true))
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    value = 1200f,
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .setColorRamp(ColorRamp(intArrayOf(Color.YELLOW, Color.MAGENTA), true))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_GOAL_PROGRESS)
@@ -2368,17 +2507,18 @@
 
     @Test
     public fun weightedElementsComplicationData() {
-        val data = WeightedElementsComplicationData.Builder(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
-            ),
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("calories".complicationText)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            WeightedElementsComplicationData.Builder(
+                    listOf(
+                        WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                        WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                        WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                    ),
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("calories".complicationText)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
@@ -2399,9 +2539,10 @@
     public fun monochromaticImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
-        val data = MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_ICON)
@@ -2418,9 +2559,10 @@
     public fun smallImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
-        val data = SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_SMALL_IMAGE)
@@ -2437,9 +2579,10 @@
     @Test
     public fun photoImageComplicationData() {
         val photoImage = Icon.createWithContentUri("someuri")
-        val data = PhotoImageComplicationData.Builder(photoImage, ComplicationText.EMPTY)
-            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .build()
+        val data =
+            PhotoImageComplicationData.Builder(photoImage, ComplicationText.EMPTY)
+                .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+                .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_LARGE_IMAGE)
@@ -2454,10 +2597,11 @@
 
     @Test
     public fun noDataComplicationData_shortText() {
-        val data = NoDataComplicationData(
-            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .build(),
-        )
+        val data =
+            NoDataComplicationData(
+                ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .build(),
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2476,10 +2620,11 @@
 
     @Test
     public fun noDataComplicationData_longText() {
-        val data = NoDataComplicationData(
-            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
-                .build()
-        )
+        val data =
+            NoDataComplicationData(
+                LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                    .build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2498,16 +2643,17 @@
 
     @Test
     public fun noDataComplicationData_rangedValue() {
-        val data = NoDataComplicationData(
-            RangedValueComplicationData.Builder(
-                value = 95f,
-                min = 0f,
-                max = 100f,
-                ComplicationText.EMPTY
+        val data =
+            NoDataComplicationData(
+                RangedValueComplicationData.Builder(
+                        value = 95f,
+                        min = 0f,
+                        max = 100f,
+                        ComplicationText.EMPTY
+                    )
+                    .setText("battery".complicationText)
+                    .build()
             )
-                .setText("battery".complicationText)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2530,15 +2676,17 @@
 
     @Test
     public fun noDataComplicationData_goalProgress() {
-        val data = NoDataComplicationData(
-            GoalProgressComplicationData.Builder(
-                value = 1200f, targetValue = 10000f,
-                contentDescription = "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                GoalProgressComplicationData.Builder(
+                        value = 1200f,
+                        targetValue = 10000f,
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("steps".complicationText)
+                    .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                    .build()
             )
-                .setTitle("steps".complicationText)
-                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2564,18 +2712,19 @@
 
     @Test
     public fun noDataComplicationData_weightedElements() {
-        val data = NoDataComplicationData(
-            WeightedElementsComplicationData.Builder(
-                listOf(
-                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
-                ),
-                contentDescription = "content description".complicationText
+        val data =
+            NoDataComplicationData(
+                WeightedElementsComplicationData.Builder(
+                        listOf(
+                            WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                            WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                            WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                        ),
+                        contentDescription = "content description".complicationText
+                    )
+                    .setTitle("calories".complicationText)
+                    .build()
             )
-                .setTitle("calories".complicationText)
-                .build()
-        )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2602,9 +2751,10 @@
     public fun noDataComplicationData_monochromaticImage() {
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
-        val data = NoDataComplicationData(
-            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY).build()
-        )
+        val data =
+            NoDataComplicationData(
+                MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY).build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2625,9 +2775,10 @@
     public fun noDataComplicationData_smallImage() {
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
-        val data = NoDataComplicationData(
-            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY).build()
-        )
+        val data =
+            NoDataComplicationData(
+                SmallImageComplicationData.Builder(image, ComplicationText.EMPTY).build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2648,9 +2799,10 @@
     @Test
     public fun noDataComplicationData_photoImage() {
         val icon = Icon.createWithContentUri("someuri")
-        val data = NoDataComplicationData(
-            PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY).build()
-        )
+        val data =
+            NoDataComplicationData(
+                PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY).build()
+            )
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationData.Builder(WireComplicationData.TYPE_NO_DATA)
@@ -2686,129 +2838,140 @@
 
     @Test
     fun shortText() {
-        val data = ShortTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .build()
+        val data =
+            ShortTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .build()
 
-        assertThat(data.toString()).isEqualTo(
-            "ShortTextComplicationData(text=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
-                "monochromaticImage=null, smallImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
-        assertThat(data.asWireComplicationData().toString()).isEqualTo(
-            "ComplicationData{mType=3, mFields=REDACTED}"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "ShortTextComplicationData(text=ComplicationText{mSurroundingText=REDACTED, " +
+                    "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
+                    "monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{" +
+                    "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
+        assertThat(data.asWireComplicationData().toString())
+            .isEqualTo("ComplicationData{mType=3, mFields=REDACTED}")
     }
 
     @Test
     fun longText() {
-        val data = LongTextComplicationData.Builder(
-            "text".complicationText,
-            "content description".complicationText
-        )
-            .setTitle("title".complicationText)
-            .build()
+        val data =
+            LongTextComplicationData.Builder(
+                    "text".complicationText,
+                    "content description".complicationText
+                )
+                .setTitle("title".complicationText)
+                .build()
 
-        assertThat(data.toString()).isEqualTo(
-            "LongTextComplicationData(text=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
-                "monochromaticImage=null, smallImage=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
-                "displayPolicy=0)"
-        )
-        assertThat(data.asWireComplicationData().toString()).isEqualTo(
-            "ComplicationData{mType=4, mFields=REDACTED}"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "LongTextComplicationData(text=ComplicationText{mSurroundingText=REDACTED, " +
+                    "mTimeDependentText=null, mExpression=null}, title=ComplicationText{" +
+                    "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}, " +
+                    "monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{" +
+                    "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
+        assertThat(data.asWireComplicationData().toString())
+            .isEqualTo("ComplicationData{mType=4, mFields=REDACTED}")
     }
 
     @Test
     fun rangedValue() {
-        val data = RangedValueComplicationData.Builder(
-            50f,
-            0f,
-            100f,
-            "content description".complicationText
-        )
-            .setText("text".complicationText)
-            .setTitle("title".complicationText)
-            .build()
+        val data =
+            RangedValueComplicationData.Builder(
+                    50f,
+                    0f,
+                    100f,
+                    "content description".complicationText
+                )
+                .setText("text".complicationText)
+                .setTitle("title".complicationText)
+                .build()
 
-        assertThat(data.toString()).isEqualTo(
-            "RangedValueComplicationData(value=REDACTED, valueExpression=REDACTED, " +
-                "valueType=0, min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
-                "mExpression=null}, text=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null, mExpression=null}, contentDescription=" +
-                "ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
-                "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(REDACTED), dataSource=null, colorRamp=null, " +
-                "persistencePolicy=0, displayPolicy=0)"
-        )
-        assertThat(data.asWireComplicationData().toString()).isEqualTo(
-            "ComplicationData{mType=5, mFields=REDACTED}"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "RangedValueComplicationData(value=REDACTED, valueExpression=REDACTED, " +
+                    "valueType=0, min=0.0, max=100.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
+                    "mExpression=null}, text=ComplicationText{mSurroundingText=REDACTED, " +
+                    "mTimeDependentText=null, mExpression=null}, contentDescription=" +
+                    "ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
+                    "mExpression=null}), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(REDACTED), dataSource=null, colorRamp=null, " +
+                    "persistencePolicy=0, displayPolicy=0)"
+            )
+        assertThat(data.asWireComplicationData().toString())
+            .isEqualTo("ComplicationData{mType=5, mFields=REDACTED}")
     }
 
     @Test
     @Suppress("NewApi")
     fun goalProgress() {
-        val data = GoalProgressComplicationData.Builder(
-            value = 1200f, targetValue = 10000f,
-            contentDescription = "content description".complicationText
-        )
-            .setTitle("steps".complicationText)
-            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
-            .build()
+        val data =
+            GoalProgressComplicationData.Builder(
+                    value = 1200f,
+                    targetValue = 10000f,
+                    contentDescription = "content description".complicationText
+                )
+                .setTitle("steps".complicationText)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                .build()
 
-        assertThat(data.toString()).isEqualTo(
-            "GoalProgressComplicationData(value=REDACTED, valueExpression=REDACTED, " +
-                "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
-                "title=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
-                "mExpression=null}, text=null, contentDescription=ComplicationText{" +
-                "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(REDACTED), dataSource=null, colorRamp=ColorRamp(colors=[-65536, " +
-                "-16711936, -16776961], interpolated=true), persistencePolicy=0, displayPolicy=0)"
-        )
-        assertThat(data.asWireComplicationData().toString()).isEqualTo(
-            "ComplicationData{mType=13, mFields=REDACTED}"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "GoalProgressComplicationData(value=REDACTED, valueExpression=REDACTED, " +
+                    "targetValue=10000.0, monochromaticImage=null, smallImage=null, " +
+                    "title=ComplicationText{mSurroundingText=REDACTED, mTimeDependentText=null, " +
+                    "mExpression=null}, text=null, contentDescription=ComplicationText{" +
+                    "mSurroundingText=REDACTED, mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
+                    "TimeRange(REDACTED), dataSource=null, colorRamp=ColorRamp(colors=[-65536, " +
+                    "-16711936, -16776961], interpolated=true), persistencePolicy=0, " +
+                    "displayPolicy=0)"
+            )
+        assertThat(data.asWireComplicationData().toString())
+            .isEqualTo("ComplicationData{mType=13, mFields=REDACTED}")
     }
 
     @Test
     fun placeholder() {
-        val data = NoDataComplicationData(
-            LongTextComplicationData.Builder(
-                ComplicationText.PLACEHOLDER,
-                ComplicationText.EMPTY
-            ).build()
-        )
+        val data =
+            NoDataComplicationData(
+                LongTextComplicationData.Builder(
+                        ComplicationText.PLACEHOLDER,
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+            )
 
-        assertThat(data.toString()).isEqualTo(
-            "NoDataComplicationData(placeholder=LongTextComplicationData(" +
-                "text=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null," +
-                " mExpression=null}, title=null, monochromaticImage=null, smallImage=null, " +
-                "contentDescription=ComplicationText{mSurroundingText=REDACTED, " +
-                "mTimeDependentText=null, mExpression=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
-                "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
-                "validTimeRange=TimeRange(REDACTED), persistencePolicy=0, displayPolicy=0)"
-        )
-        assertThat(data.asWireComplicationData().toString()).isEqualTo(
-            "ComplicationData{mType=10, mFields=REDACTED}"
-        )
+        assertThat(data.toString())
+            .isEqualTo(
+                "NoDataComplicationData(placeholder=LongTextComplicationData(" +
+                    "text=ComplicationText{mSurroundingText=__placeholder__, " +
+                    "mTimeDependentText=null, " +
+                    "mExpression=null}, title=null, monochromaticImage=null, smallImage=null, " +
+                    "contentDescription=ComplicationText{mSurroundingText=REDACTED, " +
+                    "mTimeDependentText=null, mExpression=null}), " +
+                    "tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(REDACTED), dataSource=null, persistencePolicy=0, " +
+                    "displayPolicy=0), tapActionLostDueToSerialization=false, tapAction=null, " +
+                    "validTimeRange=TimeRange(REDACTED), persistencePolicy=0, displayPolicy=0)"
+            )
+        assertThat(data.asWireComplicationData().toString())
+            .isEqualTo("ComplicationData{mType=10, mFields=REDACTED}")
     }
 }
 
@@ -2852,15 +3015,16 @@
             max: Float
         ): () -> RangedValueComplicationData = {
             RangedValueComplicationData.Builder(
-                value = value,
-                min = min,
-                max = max,
-                contentDescription = "".complicationText,
-            )
+                    value = value,
+                    min = min,
+                    max = max,
+                    contentDescription = "".complicationText,
+                )
                 .setText("".complicationText)
                 .build()
         }
     }
 }
 
-val String.complicationText get() = PlainComplicationText.Builder(this).build()
+val String.complicationText
+    get() = PlainComplicationText.Builder(this).build()
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
index bbd0815..62e9a0c 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
@@ -27,9 +27,7 @@
     public fun monochromaticImage() {
         val icon = Icon.createWithContentUri("icon")
         val ambientIcon = Icon.createWithContentUri("icon")
-        val image = MonochromaticImage.Builder(icon)
-            .setAmbientImage(ambientIcon)
-            .build()
+        val image = MonochromaticImage.Builder(icon).setAmbientImage(ambientIcon).build()
         assertThat(image.image).isEqualTo(icon)
         assertThat(image.ambientImage).isEqualTo(ambientIcon)
     }
@@ -38,9 +36,8 @@
     public fun smallImage() {
         val icon = Icon.createWithContentUri("icon")
         val ambientIcon = Icon.createWithContentUri("icon")
-        val image = SmallImage.Builder(icon, SmallImageType.PHOTO)
-            .setAmbientImage(ambientIcon)
-            .build()
+        val image =
+            SmallImage.Builder(icon, SmallImageType.PHOTO).setAmbientImage(ambientIcon).build()
         assertThat(image.image).isEqualTo(icon)
         assertThat(image.type).isEqualTo(SmallImageType.PHOTO)
         assertThat(image.ambientImage).isEqualTo(ambientIcon)
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
index e7ddf40..fd7d69d 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
@@ -25,32 +25,29 @@
 internal class ParcelableSubject(metadata: FailureMetadata?, private val subject: Parcelable?) :
     Subject(metadata, subject) {
 
-    private class ParcelableSubjectFactory :
-        Factory<ParcelableSubject, Parcelable> {
-        override fun createSubject(
-            metadata: FailureMetadata?,
-            subject: Parcelable?
-        ) = ParcelableSubject(metadata, subject)
+    private class ParcelableSubjectFactory : Factory<ParcelableSubject, Parcelable> {
+        override fun createSubject(metadata: FailureMetadata?, subject: Parcelable?) =
+            ParcelableSubject(metadata, subject)
     }
 
     fun hasSameSerializationAs(parcelable: Parcelable) {
         check("hasSameSerializationAs()").that(subject).isNotNull()
         check("hasSameSerializationAs()").that(parcelable).isNotNull()
-        check("hasSameSerializationAs()").that(serializeParcelable(subject!!))
+        check("hasSameSerializationAs()")
+            .that(serializeParcelable(subject!!))
             .isEqualTo(serializeParcelable(parcelable))
     }
 
     fun hasDifferentSerializationAs(parcelable: Parcelable) {
         check("hasDifferentSerializationAs()").that(subject).isNotNull()
         check("hasDifferentSerializationAs()").that(parcelable).isNotNull()
-        check("hasDifferentSerializationAs()").that(serializeParcelable(subject!!))
+        check("hasDifferentSerializationAs()")
+            .that(serializeParcelable(subject!!))
             .isNotEqualTo(serializeParcelable(parcelable))
     }
 
     private fun serializeParcelable(parcelable: Parcelable) =
-        Parcel.obtain().apply {
-            parcelable.writeToParcel(this, 0)
-        }.marshall()
+        Parcel.obtain().apply { parcelable.writeToParcel(this, 0) }.marshall()
 
     internal companion object {
         @JvmStatic
@@ -58,8 +55,6 @@
             return Truth.assertAbout(FACTORY).that(parcelable)
         }
 
-        @JvmField
-        val FACTORY: Factory<ParcelableSubject, Parcelable> =
-            ParcelableSubjectFactory()
+        @JvmField val FACTORY: Factory<ParcelableSubject, Parcelable> = ParcelableSubjectFactory()
     }
 }
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
index a77abb9..b46676a 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
@@ -41,13 +41,19 @@
 
     @Test
     fun placeholder_shortText() {
-        val placeholderShortText = NoDataComplicationData(
-            ShortTextComplicationData.Builder(ComplicationText.PLACEHOLDER, contentDescription)
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setSmallImage(SmallImage.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as ShortTextComplicationData
+        val placeholderShortText =
+            NoDataComplicationData(
+                    ShortTextComplicationData.Builder(
+                            ComplicationText.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .setTitle(ComplicationText.PLACEHOLDER)
+                        .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                        .setSmallImage(SmallImage.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as ShortTextComplicationData
 
         assertThat(placeholderShortText.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderShortText.title).isEqualTo(ComplicationText.PLACEHOLDER)
@@ -61,20 +67,21 @@
 
     @Test
     fun normal_shortText() {
-        val placeholderShortText = NoDataComplicationData(
-            ShortTextComplicationData.Builder(text, contentDescription)
-                .setTitle(title)
-                .setMonochromaticImage(monochromaticImage)
-                .setSmallImage(smallImage)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as ShortTextComplicationData
+        val placeholderShortText =
+            NoDataComplicationData(
+                    ShortTextComplicationData.Builder(text, contentDescription)
+                        .setTitle(title)
+                        .setMonochromaticImage(monochromaticImage)
+                        .setSmallImage(smallImage)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as ShortTextComplicationData
 
-        assertThat(placeholderShortText.text.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            text.getTextAt(resources, Instant.EPOCH)
-        )
-        assertThat(placeholderShortText.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            title.getTextAt(resources, Instant.EPOCH)
-        )
+        assertThat(placeholderShortText.text.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(text.getTextAt(resources, Instant.EPOCH))
+        assertThat(placeholderShortText.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(title.getTextAt(resources, Instant.EPOCH))
         assertThat(placeholderShortText.monochromaticImage).isEqualTo(monochromaticImage)
         assertThat(placeholderShortText.smallImage).isEqualTo(smallImage)
         assertThat(placeholderShortText.hasPlaceholderFields()).isFalse()
@@ -82,10 +89,16 @@
 
     @Test
     fun absent_shortText() {
-        val placeholderShortText = NoDataComplicationData(
-            ShortTextComplicationData.Builder(ComplicationText.PLACEHOLDER, contentDescription)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as ShortTextComplicationData
+        val placeholderShortText =
+            NoDataComplicationData(
+                    ShortTextComplicationData.Builder(
+                            ComplicationText.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as ShortTextComplicationData
 
         assertThat(placeholderShortText.title).isNull()
         assertThat(placeholderShortText.monochromaticImage).isNull()
@@ -94,18 +107,23 @@
 
     @Test
     fun placeholder_longText() {
-        val placeholderLongText = NoDataComplicationData(
-            LongTextComplicationData.Builder(ComplicationText.PLACEHOLDER, contentDescription)
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setSmallImage(SmallImage.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as LongTextComplicationData
+        val placeholderLongText =
+            NoDataComplicationData(
+                    LongTextComplicationData.Builder(
+                            ComplicationText.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .setTitle(ComplicationText.PLACEHOLDER)
+                        .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                        .setSmallImage(SmallImage.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as LongTextComplicationData
 
         assertThat(placeholderLongText.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderLongText.title).isEqualTo(ComplicationText.PLACEHOLDER)
-        assertThat(placeholderLongText.monochromaticImage)
-            .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderLongText.monochromaticImage).isEqualTo(MonochromaticImage.PLACEHOLDER)
         assertThat(placeholderLongText.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderLongText.contentDescription!!.getTextAt(resources, Instant.EPOCH))
             .isEqualTo("description")
@@ -114,20 +132,21 @@
 
     @Test
     fun normal_longText() {
-        val placeholderLongText = NoDataComplicationData(
-            LongTextComplicationData.Builder(text, contentDescription)
-                .setTitle(title)
-                .setMonochromaticImage(monochromaticImage)
-                .setSmallImage(smallImage)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as LongTextComplicationData
+        val placeholderLongText =
+            NoDataComplicationData(
+                    LongTextComplicationData.Builder(text, contentDescription)
+                        .setTitle(title)
+                        .setMonochromaticImage(monochromaticImage)
+                        .setSmallImage(smallImage)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as LongTextComplicationData
 
-        assertThat(placeholderLongText.text.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            text.getTextAt(resources, Instant.EPOCH)
-        )
-        assertThat(placeholderLongText.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            title.getTextAt(resources, Instant.EPOCH)
-        )
+        assertThat(placeholderLongText.text.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(text.getTextAt(resources, Instant.EPOCH))
+        assertThat(placeholderLongText.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(title.getTextAt(resources, Instant.EPOCH))
         assertThat(placeholderLongText.monochromaticImage).isEqualTo(monochromaticImage)
         assertThat(placeholderLongText.smallImage).isEqualTo(smallImage)
         assertThat(placeholderLongText.hasPlaceholderFields()).isFalse()
@@ -135,10 +154,16 @@
 
     @Test
     fun absent_longText() {
-        val placeholderLongText = NoDataComplicationData(
-            LongTextComplicationData.Builder(ComplicationText.PLACEHOLDER, contentDescription)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as LongTextComplicationData
+        val placeholderLongText =
+            NoDataComplicationData(
+                    LongTextComplicationData.Builder(
+                            ComplicationText.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as LongTextComplicationData
 
         assertThat(placeholderLongText.title).isNull()
         assertThat(placeholderLongText.monochromaticImage).isNull()
@@ -147,19 +172,22 @@
 
     @Test
     fun placeholder_rangedValue() {
-        val placeholderRangedValue = NoDataComplicationData(
-            RangedValueComplicationData.Builder(
-                value = RangedValueComplicationData.PLACEHOLDER,
-                min = 1f,
-                max = 10f,
-                contentDescription
-            )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setSmallImage(SmallImage.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
+        val placeholderRangedValue =
+            NoDataComplicationData(
+                    RangedValueComplicationData.Builder(
+                            value = RangedValueComplicationData.PLACEHOLDER,
+                            min = 1f,
+                            max = 10f,
+                            contentDescription
+                        )
+                        .setText(ComplicationText.PLACEHOLDER)
+                        .setTitle(ComplicationText.PLACEHOLDER)
+                        .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                        .setSmallImage(SmallImage.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as RangedValueComplicationData
 
         assertThat(placeholderRangedValue.value).isEqualTo(RangedValueComplicationData.PLACEHOLDER)
         assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
@@ -174,21 +202,27 @@
 
     @Test
     fun normal_rangedValue() {
-        val placeholderRangedValue = NoDataComplicationData(
-            RangedValueComplicationData.Builder(value = 7f, min = 1f, max = 10f, contentDescription)
-                .setText(text)
-                .setTitle(title)
-                .setMonochromaticImage(monochromaticImage)
-                .setSmallImage(smallImage)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
+        val placeholderRangedValue =
+            NoDataComplicationData(
+                    RangedValueComplicationData.Builder(
+                            value = 7f,
+                            min = 1f,
+                            max = 10f,
+                            contentDescription
+                        )
+                        .setText(text)
+                        .setTitle(title)
+                        .setMonochromaticImage(monochromaticImage)
+                        .setSmallImage(smallImage)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as RangedValueComplicationData
 
-        assertThat(placeholderRangedValue.text!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            text.getTextAt(resources, Instant.EPOCH)
-        )
-        assertThat(placeholderRangedValue.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            title.getTextAt(resources, Instant.EPOCH)
-        )
+        assertThat(placeholderRangedValue.text!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(text.getTextAt(resources, Instant.EPOCH))
+        assertThat(placeholderRangedValue.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(title.getTextAt(resources, Instant.EPOCH))
         assertThat(placeholderRangedValue.monochromaticImage).isEqualTo(monochromaticImage)
         assertThat(placeholderRangedValue.smallImage).isEqualTo(smallImage)
         assertThat(placeholderRangedValue.value).isEqualTo(7f)
@@ -199,16 +233,19 @@
 
     @Test
     fun titleAbsent_rangedValue() {
-        val placeholderRangedValue = NoDataComplicationData(
-            RangedValueComplicationData.Builder(
-                value = RangedValueComplicationData.PLACEHOLDER,
-                min = 1f,
-                max = 10f,
-                contentDescription
-            )
-                .setText(ComplicationText.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
+        val placeholderRangedValue =
+            NoDataComplicationData(
+                    RangedValueComplicationData.Builder(
+                            value = RangedValueComplicationData.PLACEHOLDER,
+                            min = 1f,
+                            max = 10f,
+                            contentDescription
+                        )
+                        .setText(ComplicationText.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as RangedValueComplicationData
 
         assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.title).isNull()
@@ -219,18 +256,21 @@
     @OptIn(ComplicationExperimental::class)
     @Test
     fun placeholder_goalProgress() {
-        val placeholderGoalProgress = NoDataComplicationData(
-            GoalProgressComplicationData.Builder(
-                value = GoalProgressComplicationData.PLACEHOLDER,
-                targetValue = 10000f,
-                contentDescription
-            )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setSmallImage(SmallImage.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
+        val placeholderGoalProgress =
+            NoDataComplicationData(
+                    GoalProgressComplicationData.Builder(
+                            value = GoalProgressComplicationData.PLACEHOLDER,
+                            targetValue = 10000f,
+                            contentDescription
+                        )
+                        .setText(ComplicationText.PLACEHOLDER)
+                        .setTitle(ComplicationText.PLACEHOLDER)
+                        .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                        .setSmallImage(SmallImage.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as GoalProgressComplicationData
 
         assertThat(placeholderGoalProgress.value).isEqualTo(RangedValueComplicationData.PLACEHOLDER)
         assertThat(placeholderGoalProgress.text).isEqualTo(ComplicationText.PLACEHOLDER)
@@ -246,25 +286,26 @@
     @OptIn(ComplicationExperimental::class)
     @Test
     fun normal_goalProgress() {
-        val placeholderGoalProgress = NoDataComplicationData(
-            GoalProgressComplicationData.Builder(
-                value = 1200f,
-                targetValue = 10000f,
-                contentDescription
-            )
-                .setText(text)
-                .setTitle(title)
-                .setMonochromaticImage(monochromaticImage)
-                .setSmallImage(smallImage)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
+        val placeholderGoalProgress =
+            NoDataComplicationData(
+                    GoalProgressComplicationData.Builder(
+                            value = 1200f,
+                            targetValue = 10000f,
+                            contentDescription
+                        )
+                        .setText(text)
+                        .setTitle(title)
+                        .setMonochromaticImage(monochromaticImage)
+                        .setSmallImage(smallImage)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as GoalProgressComplicationData
 
-        assertThat(placeholderGoalProgress.text!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            text.getTextAt(resources, Instant.EPOCH)
-        )
-        assertThat(placeholderGoalProgress.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
-            title.getTextAt(resources, Instant.EPOCH)
-        )
+        assertThat(placeholderGoalProgress.text!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(text.getTextAt(resources, Instant.EPOCH))
+        assertThat(placeholderGoalProgress.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo(title.getTextAt(resources, Instant.EPOCH))
         assertThat(placeholderGoalProgress.monochromaticImage).isEqualTo(monochromaticImage)
         assertThat(placeholderGoalProgress.smallImage).isEqualTo(smallImage)
         assertThat(placeholderGoalProgress.value).isEqualTo(1200f)
@@ -275,17 +316,20 @@
     @OptIn(ComplicationExperimental::class)
     @Test
     fun placeholder_weightedElements() {
-        val placeholderWeightedElements = NoDataComplicationData(
-            WeightedElementsComplicationData.Builder(
-                elements = WeightedElementsComplicationData.PLACEHOLDER,
-                contentDescription
-            )
-                .setText(ComplicationText.PLACEHOLDER)
-                .setTitle(ComplicationText.PLACEHOLDER)
-                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                .setSmallImage(SmallImage.PLACEHOLDER)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
+        val placeholderWeightedElements =
+            NoDataComplicationData(
+                    WeightedElementsComplicationData.Builder(
+                            elements = WeightedElementsComplicationData.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .setText(ComplicationText.PLACEHOLDER)
+                        .setTitle(ComplicationText.PLACEHOLDER)
+                        .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                        .setSmallImage(SmallImage.PLACEHOLDER)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as WeightedElementsComplicationData
 
         assertThat(placeholderWeightedElements.elements)
             .isEqualTo(WeightedElementsComplicationData.PLACEHOLDER)
@@ -294,37 +338,44 @@
         assertThat(placeholderWeightedElements.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
         assertThat(placeholderWeightedElements.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
-        assertThat(placeholderWeightedElements.contentDescription!!
-            .getTextAt(resources, Instant.EPOCH)).isEqualTo("description")
+        assertThat(
+                placeholderWeightedElements.contentDescription!!.getTextAt(resources, Instant.EPOCH)
+            )
+            .isEqualTo("description")
         assertThat(placeholderWeightedElements.hasPlaceholderFields()).isTrue()
     }
 
     @OptIn(ComplicationExperimental::class)
     @Test
     fun normal_weightedElements() {
-        val weightedElements = NoDataComplicationData(
-            WeightedElementsComplicationData.Builder(
-                elements = listOf(
+        val weightedElements =
+            NoDataComplicationData(
+                    WeightedElementsComplicationData.Builder(
+                            elements =
+                                listOf(
+                                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                                ),
+                            contentDescription
+                        )
+                        .setText(text)
+                        .setTitle(title)
+                        .setMonochromaticImage(monochromaticImage)
+                        .setSmallImage(smallImage)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as WeightedElementsComplicationData
+
+        assertThat(weightedElements.elements)
+            .isEqualTo(
+                listOf(
                     WeightedElementsComplicationData.Element(0.5f, Color.RED),
                     WeightedElementsComplicationData.Element(1f, Color.GREEN),
                     WeightedElementsComplicationData.Element(2f, Color.BLUE),
-                ),
-                contentDescription
+                )
             )
-                .setText(text)
-                .setTitle(title)
-                .setMonochromaticImage(monochromaticImage)
-                .setSmallImage(smallImage)
-                .build()
-        ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
-
-        assertThat(weightedElements.elements).isEqualTo(
-            listOf(
-                WeightedElementsComplicationData.Element(0.5f, Color.RED),
-                WeightedElementsComplicationData.Element(1f, Color.GREEN),
-                WeightedElementsComplicationData.Element(2f, Color.BLUE),
-            )
-        )
         assertThat(weightedElements.text).isEqualTo(text)
         assertThat(weightedElements.title).isEqualTo(title)
         assertThat(weightedElements.monochromaticImage).isEqualTo(monochromaticImage)
@@ -336,29 +387,41 @@
 
     @Test
     fun placeholder_monochromaticImage() {
-        val placeholderMonochromaticImage = NoDataComplicationData(
-            MonochromaticImageComplicationData.Builder(
-                MonochromaticImage.PLACEHOLDER,
-                contentDescription
-            ).build()
-        ).toWireFormatRoundTrip().placeholder as MonochromaticImageComplicationData
+        val placeholderMonochromaticImage =
+            NoDataComplicationData(
+                    MonochromaticImageComplicationData.Builder(
+                            MonochromaticImage.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as MonochromaticImageComplicationData
 
         assertThat(placeholderMonochromaticImage.monochromaticImage)
             .isEqualTo(MonochromaticImage.PLACEHOLDER)
         assertThat(
-            placeholderMonochromaticImage.contentDescription!!.getTextAt(resources, Instant.EPOCH)
-        ).isEqualTo("description")
+                placeholderMonochromaticImage.contentDescription!!.getTextAt(
+                    resources,
+                    Instant.EPOCH
+                )
+            )
+            .isEqualTo("description")
         assertThat(placeholderMonochromaticImage.hasPlaceholderFields()).isTrue()
     }
 
     @Test
     fun normal_monochromaticImage() {
-        val placeholderMonochromaticImage = NoDataComplicationData(
-            MonochromaticImageComplicationData.Builder(
-                monochromaticImage,
-                contentDescription
-            ).build()
-        ).toWireFormatRoundTrip().placeholder as MonochromaticImageComplicationData
+        val placeholderMonochromaticImage =
+            NoDataComplicationData(
+                    MonochromaticImageComplicationData.Builder(
+                            monochromaticImage,
+                            contentDescription
+                        )
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as MonochromaticImageComplicationData
 
         assertThat(placeholderMonochromaticImage.monochromaticImage).isEqualTo(monochromaticImage)
         assertThat(placeholderMonochromaticImage.hasPlaceholderFields()).isFalse()
@@ -366,9 +429,13 @@
 
     @Test
     fun placeholder_smallImage() {
-        val placeholderSmallImage = NoDataComplicationData(
-            SmallImageComplicationData.Builder(SmallImage.PLACEHOLDER, contentDescription).build()
-        ).toWireFormatRoundTrip().placeholder as SmallImageComplicationData
+        val placeholderSmallImage =
+            NoDataComplicationData(
+                    SmallImageComplicationData.Builder(SmallImage.PLACEHOLDER, contentDescription)
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as SmallImageComplicationData
 
         assertThat(placeholderSmallImage.smallImage).isEqualTo(SmallImage.PLACEHOLDER)
         assertThat(placeholderSmallImage.contentDescription!!.getTextAt(resources, Instant.EPOCH))
@@ -378,9 +445,12 @@
 
     @Test
     fun normal_smallImage() {
-        val placeholderSmallImage = NoDataComplicationData(
-            SmallImageComplicationData.Builder(smallImage, contentDescription).build()
-        ).toWireFormatRoundTrip().placeholder as SmallImageComplicationData
+        val placeholderSmallImage =
+            NoDataComplicationData(
+                    SmallImageComplicationData.Builder(smallImage, contentDescription).build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as SmallImageComplicationData
 
         assertThat(placeholderSmallImage.smallImage).isEqualTo(smallImage)
         assertThat(placeholderSmallImage.hasPlaceholderFields()).isFalse()
@@ -388,12 +458,16 @@
 
     @Test
     fun placeholder_photoImage() {
-        val placeholderPhotoImage = NoDataComplicationData(
-            PhotoImageComplicationData.Builder(
-                PhotoImageComplicationData.PLACEHOLDER,
-                contentDescription
-            ).build()
-        ).toWireFormatRoundTrip().placeholder as PhotoImageComplicationData
+        val placeholderPhotoImage =
+            NoDataComplicationData(
+                    PhotoImageComplicationData.Builder(
+                            PhotoImageComplicationData.PLACEHOLDER,
+                            contentDescription
+                        )
+                        .build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as PhotoImageComplicationData
 
         assertThat(placeholderPhotoImage.photoImage)
             .isEqualTo(PhotoImageComplicationData.PLACEHOLDER)
@@ -404,9 +478,12 @@
 
     @Test
     fun normal_photoImage() {
-        val placeholderPhotoImage = NoDataComplicationData(
-            PhotoImageComplicationData.Builder(icon, contentDescription).build()
-        ).toWireFormatRoundTrip().placeholder as PhotoImageComplicationData
+        val placeholderPhotoImage =
+            NoDataComplicationData(
+                    PhotoImageComplicationData.Builder(icon, contentDescription).build()
+                )
+                .toWireFormatRoundTrip()
+                .placeholder as PhotoImageComplicationData
 
         assertThat(placeholderPhotoImage.photoImage).isEqualTo(icon)
         assertThat(placeholderPhotoImage.hasPlaceholderFields()).isFalse()
@@ -425,20 +502,19 @@
         timelineEntry.timelineStartEpochSecond = 100
         timelineEntry.timelineEndEpochSecond = 1000
 
-        val wireLongTextComplication = ComplicationData.Builder(
-            ComplicationType.LONG_TEXT.toWireComplicationType()
-        )
-            .setEndDateTimeMillis(1650988800000)
-            .setDataSource(ComponentName("a", "b"))
-            .setLongText(
-                android.support.wearable.complications.ComplicationText.plainText("longText")
-            )
-            .setIcon(icon)
-            .setSmallImageStyle(IMAGE_STYLE_ICON)
-            .setContentDescription(
-                android.support.wearable.complications.ComplicationText.plainText("test")
-            )
-            .build()
+        val wireLongTextComplication =
+            ComplicationData.Builder(ComplicationType.LONG_TEXT.toWireComplicationType())
+                .setEndDateTimeMillis(1650988800000)
+                .setDataSource(ComponentName("a", "b"))
+                .setLongText(
+                    android.support.wearable.complications.ComplicationText.plainText("longText")
+                )
+                .setIcon(icon)
+                .setSmallImageStyle(IMAGE_STYLE_ICON)
+                .setContentDescription(
+                    android.support.wearable.complications.ComplicationText.plainText("test")
+                )
+                .build()
         wireLongTextComplication.setTimelineEntryCollection(listOf(timelineEntry))
 
         val apiLongTextComplicationData = wireLongTextComplication.toApiComplicationData()
@@ -448,7 +524,10 @@
         assertThat(apiLongTextComplicationData.text.isPlaceholder()).isFalse()
 
         val noDataComplicationData =
-            apiLongTextComplicationData.asWireComplicationData().timelineEntries!!.first()
+            apiLongTextComplicationData
+                .asWireComplicationData()
+                .timelineEntries!!
+                .first()
                 .toApiComplicationData()
 
         assertThat(noDataComplicationData.type).isEqualTo(ComplicationType.NO_DATA)
@@ -463,4 +542,4 @@
 }
 
 fun NoDataComplicationData.toWireFormatRoundTrip() =
-    asWireComplicationData().toApiComplicationData() as NoDataComplicationData
\ No newline at end of file
+    asWireComplicationData().toApiComplicationData() as NoDataComplicationData
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt
index 5b45eb4..aaca557 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt
@@ -25,8 +25,10 @@
     RobolectricTestRunner(testClass) {
 
     override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration =
-        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method)).apply {
-            doNotInstrumentPackage("androidx.wear")
-            doNotInstrumentPackage("android.support.wearable")
-        }.build()
+        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
+            .apply {
+                doNotInstrumentPackage("androidx.wear")
+                doNotInstrumentPackage("android.support.wearable")
+            }
+            .build()
 }
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
index 492d983..2125d4f 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
@@ -16,20 +16,20 @@
 
 package androidx.wear.watchface.complications.data
 
-import android.support.wearable.complications.ComplicationText as WireComplicationText
-import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder as WireTimeDifferenceBuilder
-import android.support.wearable.complications.ComplicationText.TimeFormatBuilder as WireTimeFormatBuilder
 import android.content.Context
 import android.icu.util.TimeZone
+import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.support.wearable.complications.ComplicationText
+import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder as WireTimeDifferenceBuilder
+import android.support.wearable.complications.ComplicationText.TimeFormatBuilder as WireTimeFormatBuilder
 import android.support.wearable.complications.TimeFormatText
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
+import java.time.Instant
+import java.util.concurrent.TimeUnit
 import org.junit.Assert.assertNull
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.time.Instant
-import java.util.concurrent.TimeUnit
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class AsWireComplicationTextTest {
@@ -45,14 +45,15 @@
     @Test
     public fun timeDifferenceText_CountUpTimeReference() {
         val referenceInstant = Instant.parse("2020-12-30T10:15:30.001Z")
-        val text = TimeDifferenceComplicationText.Builder(
-            TimeDifferenceStyle.STOPWATCH,
-            CountUpTimeReference(referenceInstant)
-        )
-            .setText("^1 after lunch")
-            .setDisplayAsNow(false)
-            .setMinimumTimeUnit(TimeUnit.SECONDS)
-            .build()
+        val text =
+            TimeDifferenceComplicationText.Builder(
+                    TimeDifferenceStyle.STOPWATCH,
+                    CountUpTimeReference(referenceInstant)
+                )
+                .setText("^1 after lunch")
+                .setDisplayAsNow(false)
+                .setMinimumTimeUnit(TimeUnit.SECONDS)
+                .build()
 
         ParcelableSubject.assertThat(text.toWireComplicationText())
             .hasSameSerializationAs(
@@ -67,22 +68,22 @@
 
         val twoMinutesThreeSecondAfter =
             Instant.ofEpochMilli(referenceInstant.toEpochMilli() + 2.minutes + 3.seconds)
-        assertThat(
-            text.getTextAt(getResource(), twoMinutesThreeSecondAfter).toString()
-        ).isEqualTo("02:03 after lunch")
+        assertThat(text.getTextAt(getResource(), twoMinutesThreeSecondAfter).toString())
+            .isEqualTo("02:03 after lunch")
     }
 
     @Test
     public fun timeDifferenceText_CountDownTimeReference() {
         val referenceInstant = Instant.parse("2020-12-30T10:15:30.001Z")
-        val text = TimeDifferenceComplicationText.Builder(
-            TimeDifferenceStyle.STOPWATCH,
-            CountDownTimeReference(referenceInstant)
-        )
-            .setText("^1 before lunch")
-            .setDisplayAsNow(false)
-            .setMinimumTimeUnit(TimeUnit.SECONDS)
-            .build()
+        val text =
+            TimeDifferenceComplicationText.Builder(
+                    TimeDifferenceStyle.STOPWATCH,
+                    CountDownTimeReference(referenceInstant)
+                )
+                .setText("^1 before lunch")
+                .setDisplayAsNow(false)
+                .setMinimumTimeUnit(TimeUnit.SECONDS)
+                .build()
 
         ParcelableSubject.assertThat(text.toWireComplicationText())
             .hasSameSerializationAs(
@@ -97,18 +98,18 @@
 
         val twoMinutesThreeSecondBefore =
             Instant.ofEpochMilli(referenceInstant.toEpochMilli() - 2.minutes - 3.seconds)
-        assertThat(
-            text.getTextAt(getResource(), twoMinutesThreeSecondBefore).toString()
-        ).isEqualTo("02:03 before lunch")
+        assertThat(text.getTextAt(getResource(), twoMinutesThreeSecondBefore).toString())
+            .isEqualTo("02:03 before lunch")
     }
 
     @Test
     public fun timeFormatText() {
-        val text = TimeFormatComplicationText.Builder("h:m")
-            .setText("^1 in London")
-            .setStyle(TimeFormatStyle.UPPER_CASE)
-            .setTimeZone(TimeZone.getTimeZone("Europe/London"))
-            .build()
+        val text =
+            TimeFormatComplicationText.Builder("h:m")
+                .setText("^1 in London")
+                .setStyle(TimeFormatStyle.UPPER_CASE)
+                .setTimeZone(TimeZone.getTimeZone("Europe/London"))
+                .build()
 
         ParcelableSubject.assertThat(text.toWireComplicationText())
             .hasSameSerializationAs(
@@ -134,39 +135,30 @@
         assertThat(text.getTextAt(getResource(), Instant.EPOCH)).isEqualTo("abc")
         assertThat(text.getNextChangeTime(Instant.EPOCH)).isEqualTo(Instant.MAX)
         assertThat(text.isAlwaysEmpty()).isFalse()
-        assertThat(
-            text.returnsSameText(
-                Instant.EPOCH,
-                Instant.ofEpochMilli(Long.MAX_VALUE)
-            )
-        ).isTrue()
+        assertThat(text.returnsSameText(Instant.EPOCH, Instant.ofEpochMilli(Long.MAX_VALUE)))
+            .isTrue()
     }
 
     @Test
     public fun timeDifferenceText() {
         val startPoint = Instant.parse("2020-12-30T10:15:30.001Z")
-        val wireText = WireTimeDifferenceBuilder()
-            .setStyle(WireComplicationText.DIFFERENCE_STYLE_STOPWATCH)
-            .setSurroundingText("^1 before lunch")
-            .setShowNowText(false)
-            .setMinimumUnit(TimeUnit.SECONDS)
-            .setReferencePeriodEndMillis(startPoint.toEpochMilli())
-            .build()
+        val wireText =
+            WireTimeDifferenceBuilder()
+                .setStyle(WireComplicationText.DIFFERENCE_STYLE_STOPWATCH)
+                .setSurroundingText("^1 before lunch")
+                .setShowNowText(false)
+                .setMinimumUnit(TimeUnit.SECONDS)
+                .setReferencePeriodEndMillis(startPoint.toEpochMilli())
+                .build()
 
         val text = wireText.toApiComplicationText()
 
         val twoMinutesThreeSecondAfter =
             Instant.ofEpochMilli(startPoint.toEpochMilli() + 2.minutes + 3.seconds)
-        assertThat(
-            text.getTextAt(
-                getResource(),
-                twoMinutesThreeSecondAfter
-            ).toString()
-        ).isEqualTo("02:03 before lunch")
+        assertThat(text.getTextAt(getResource(), twoMinutesThreeSecondAfter).toString())
+            .isEqualTo("02:03 before lunch")
         assertThat(text.getNextChangeTime(twoMinutesThreeSecondAfter))
-            .isEqualTo(
-                Instant.ofEpochMilli(twoMinutesThreeSecondAfter.toEpochMilli() + 1.seconds)
-            )
+            .isEqualTo(Instant.ofEpochMilli(twoMinutesThreeSecondAfter.toEpochMilli() + 1.seconds))
         assertThat(text.isAlwaysEmpty()).isFalse()
         assertThat(text.returnsSameText(twoMinutesThreeSecondAfter, startPoint)).isFalse()
     }
@@ -174,32 +166,34 @@
     @Test
     public fun timeFormatText() {
         val dateTime = Instant.parse("2020-12-30T10:15:20.00Z")
-        val wireText = WireTimeFormatBuilder()
-            .setFormat("h:m")
-            .setStyle(WireComplicationText.FORMAT_STYLE_UPPER_CASE)
-            .setSurroundingText("^1 in London")
-            .setTimeZone(java.util.TimeZone.getTimeZone("Europe/London"))
-            .build()
+        val wireText =
+            WireTimeFormatBuilder()
+                .setFormat("h:m")
+                .setStyle(WireComplicationText.FORMAT_STYLE_UPPER_CASE)
+                .setSurroundingText("^1 in London")
+                .setTimeZone(java.util.TimeZone.getTimeZone("Europe/London"))
+                .build()
 
         val text = wireText.toApiComplicationText()
 
-        assertThat(text.getTextAt(getResource(), dateTime).toString())
-            .isEqualTo("10:15 in London")
+        assertThat(text.getTextAt(getResource(), dateTime).toString()).isEqualTo("10:15 in London")
         assertThat(text.getNextChangeTime(dateTime))
             .isEqualTo(Instant.ofEpochMilli(dateTime.toEpochMilli() + 40.seconds))
         assertThat(text.isAlwaysEmpty()).isFalse()
         assertThat(
-            text.returnsSameText(
-                dateTime,
-                Instant.ofEpochMilli(dateTime.toEpochMilli() + 20.seconds)
+                text.returnsSameText(
+                    dateTime,
+                    Instant.ofEpochMilli(dateTime.toEpochMilli() + 20.seconds)
+                )
             )
-        ).isTrue()
+            .isTrue()
         assertThat(
-            text.returnsSameText(
-                dateTime,
-                Instant.ofEpochMilli(dateTime.toEpochMilli() + 60.seconds)
+                text.returnsSameText(
+                    dateTime,
+                    Instant.ofEpochMilli(dateTime.toEpochMilli() + 60.seconds)
+                )
             )
-        ).isFalse()
+            .isFalse()
     }
 
     @Test
@@ -207,12 +201,13 @@
         val minimumTimeUnit = TimeUnit.SECONDS
 
         val referenceInstant = Instant.parse("2020-12-30T10:15:30.001Z")
-        val text = TimeDifferenceComplicationText.Builder(
-            TimeDifferenceStyle.STOPWATCH,
-            CountUpTimeReference(referenceInstant)
-        )
-            .setMinimumTimeUnit(minimumTimeUnit)
-            .build()
+        val text =
+            TimeDifferenceComplicationText.Builder(
+                    TimeDifferenceStyle.STOPWATCH,
+                    CountUpTimeReference(referenceInstant)
+                )
+                .setMinimumTimeUnit(minimumTimeUnit)
+                .build()
 
         assertThat(minimumTimeUnit).isEqualTo(text.getMinimumTimeUnit())
     }
@@ -220,24 +215,20 @@
     @Test
     public fun testGetMinimumTimeUnit_WithoutTimeDependentTextObject() {
         val referenceInstant = Instant.parse("2020-12-30T10:15:30.001Z")
-        val text = TimeDifferenceComplicationText.Builder(
-            TimeDifferenceStyle.STOPWATCH,
-            CountUpTimeReference(referenceInstant)
-        ).build()
+        val text =
+            TimeDifferenceComplicationText.Builder(
+                    TimeDifferenceStyle.STOPWATCH,
+                    CountUpTimeReference(referenceInstant)
+                )
+                .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)
-        )
+        val tft = TimeFormatText("E 'in' LLL", ComplicationText.FORMAT_STYLE_DEFAULT, null)
+        val text = TimeDifferenceComplicationText(ComplicationText("test", tft))
 
         assertNull(text.getMinimumTimeUnit())
     }
@@ -245,5 +236,7 @@
     private fun getResource() = ApplicationProvider.getApplicationContext<Context>().resources
 }
 
-private val Int.minutes get() = TimeUnit.MINUTES.toMillis(this.toLong())
-private val Int.seconds get() = TimeUnit.SECONDS.toMillis(this.toLong())
+private val Int.minutes
+    get() = TimeUnit.MINUTES.toMillis(this.toLong())
+private val Int.seconds
+    get() = TimeUnit.SECONDS.toMillis(this.toLong())
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
index b1b89809..a9cb532 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
@@ -17,9 +17,9 @@
 package androidx.wear.watchface.complications.data
 
 import com.google.common.truth.Truth.assertThat
+import java.time.Instant
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.time.Instant
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class TimeRangeTest {
@@ -45,10 +45,7 @@
 
     @Test
     public fun betweenTwoTimes() {
-        val range = TimeRange.between(
-            Instant.ofEpochMilli(1000),
-            Instant.ofEpochMilli(2000)
-        )
+        val range = TimeRange.between(Instant.ofEpochMilli(1000), Instant.ofEpochMilli(2000))
         assertThat(range.contains(Instant.ofEpochMilli(100))).isFalse()
         assertThat(range.contains(Instant.ofEpochMilli(999))).isFalse()
         assertThat(range.contains(Instant.ofEpochMilli(1000))).isTrue()
@@ -73,4 +70,4 @@
         assertThat(range.contains(Instant.ofEpochMilli(10000))).isTrue()
         assertThat(range.contains(Instant.ofEpochMilli(Long.MAX_VALUE))).isTrue()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
index 1e2a28c..ee3f572 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
@@ -36,10 +36,7 @@
         assertThatIsWireType(ComplicationType.RANGED_VALUE, WireComplicationData.TYPE_RANGED_VALUE)
         assertThatIsWireType(ComplicationType.MONOCHROMATIC_IMAGE, WireComplicationData.TYPE_ICON)
         assertThatIsWireType(ComplicationType.SMALL_IMAGE, WireComplicationData.TYPE_SMALL_IMAGE)
-        assertThatIsWireType(
-            ComplicationType.PHOTO_IMAGE,
-            WireComplicationData.TYPE_LARGE_IMAGE
-        )
+        assertThatIsWireType(ComplicationType.PHOTO_IMAGE, WireComplicationData.TYPE_LARGE_IMAGE)
         assertThatIsWireType(
             ComplicationType.NO_PERMISSION,
             WireComplicationData.TYPE_NO_PERMISSION
@@ -63,10 +60,7 @@
         assertThatIsApiType(WireComplicationData.TYPE_RANGED_VALUE, ComplicationType.RANGED_VALUE)
         assertThatIsApiType(WireComplicationData.TYPE_ICON, ComplicationType.MONOCHROMATIC_IMAGE)
         assertThatIsApiType(WireComplicationData.TYPE_SMALL_IMAGE, ComplicationType.SMALL_IMAGE)
-        assertThatIsApiType(
-            WireComplicationData.TYPE_LARGE_IMAGE,
-            ComplicationType.PHOTO_IMAGE
-        )
+        assertThatIsApiType(WireComplicationData.TYPE_LARGE_IMAGE, ComplicationType.PHOTO_IMAGE)
         assertThatIsApiType(WireComplicationData.TYPE_NO_PERMISSION, ComplicationType.NO_PERMISSION)
     }
 
diff --git a/wear/watchface/watchface-complications-permission-dialogs-sample/src/main/java/androidx/wear/watchface/complications/permission/dialogs/sample/ComplicationRationalActivity.java b/wear/watchface/watchface-complications-permission-dialogs-sample/src/main/java/androidx/wear/watchface/complications/permission/dialogs/sample/ComplicationRationalActivity.java
index ff2af32..493a96d 100644
--- a/wear/watchface/watchface-complications-permission-dialogs-sample/src/main/java/androidx/wear/watchface/complications/permission/dialogs/sample/ComplicationRationalActivity.java
+++ b/wear/watchface/watchface-complications-permission-dialogs-sample/src/main/java/androidx/wear/watchface/complications/permission/dialogs/sample/ComplicationRationalActivity.java
@@ -34,5 +34,4 @@
 
         findViewById(R.id.ok_button).setOnClickListener(view -> finish());
     }
-
 }
diff --git a/wear/watchface/watchface-complications-rendering/src/androidTest/java/androidx/wear/watchface/complications/rendering/test/ComplicationDrawableAndroidTest.java b/wear/watchface/watchface-complications-rendering/src/androidTest/java/androidx/wear/watchface/complications/rendering/test/ComplicationDrawableAndroidTest.java
index 8ef7443..ad25b88 100644
--- a/wear/watchface/watchface-complications-rendering/src/androidTest/java/androidx/wear/watchface/complications/rendering/test/ComplicationDrawableAndroidTest.java
+++ b/wear/watchface/watchface-complications-rendering/src/androidTest/java/androidx/wear/watchface/complications/rendering/test/ComplicationDrawableAndroidTest.java
@@ -45,8 +45,9 @@
     public void defaultValuesAreLoadedAfterLoadingFromResource() {
         ComplicationDrawable drawable =
                 (ComplicationDrawable)
-                        ApplicationProvider.getApplicationContext().getResources().getDrawable(
-                                R.drawable.default_complication_drawable, null);
+                        ApplicationProvider.getApplicationContext()
+                                .getResources()
+                                .getDrawable(R.drawable.default_complication_drawable, null);
         int textSizeFromResources = drawable.getActiveStyle().getTextSize();
         assertThat(textSizeFromResources).isEqualTo(mDefaultTextSize);
     }
@@ -55,8 +56,9 @@
     public void inflateFromEmptyTag() {
         ComplicationDrawable drawable =
                 (ComplicationDrawable)
-                        ApplicationProvider.getApplicationContext().getResources().getDrawable(
-                                R.drawable.default_complication_drawable, null);
+                        ApplicationProvider.getApplicationContext()
+                                .getResources()
+                                .getDrawable(R.drawable.default_complication_drawable, null);
         assertThat(drawable).isNotNull();
     }
 }
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt
index e5e18b1..c871758 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt
@@ -24,15 +24,15 @@
 import android.util.TypedValue
 import androidx.annotation.CallSuper
 import androidx.annotation.ColorInt
-import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.complications.data.NoDataComplicationData
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.CanvasComplication
+import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.WatchState
-import androidx.wear.watchface.ComplicationSlotBoundsType
+import androidx.wear.watchface.complications.data.ComplicationData
+import androidx.wear.watchface.complications.data.NoDataComplicationData
 import androidx.wear.watchface.style.WatchFaceLayer
+import androidx.wear.watchface.utility.TraceEvent
 import java.time.ZonedDateTime
 
 /**
@@ -41,9 +41,9 @@
  *
  * @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.
+ *   mode and burn in protection needed to render correctly.
  * @param invalidateCallback The [CanvasComplication.InvalidateCallback] associated with which can
- * be used to request screen redrawing and to report updates
+ *   be used to request screen redrawing and to report updates
  */
 public open class CanvasComplicationDrawable
 @SuppressWarnings("ExecutorRegistration") // invalidateCallback is owned by the library and
@@ -69,7 +69,6 @@
                 EXPANSION_DP,
                 Resources.getSystem().displayMetrics
             ),
-
             TypedValue.applyDimension(
                 TypedValue.COMPLEX_UNIT_DIP,
                 STROKE_WIDTH_DP,
@@ -78,17 +77,18 @@
         )
     }
 
-    private val drawableCallback = object : Drawable.Callback {
-        override fun unscheduleDrawable(who: Drawable, what: Runnable) {}
+    private val drawableCallback =
+        object : Drawable.Callback {
+            override fun unscheduleDrawable(who: Drawable, what: Runnable) {}
 
-        @SuppressLint("SyntheticAccessor")
-        override fun invalidateDrawable(who: Drawable) {
-            invalidateCallback.onInvalidate()
+            @SuppressLint("SyntheticAccessor")
+            override fun invalidateDrawable(who: Drawable) {
+                invalidateCallback.onInvalidate()
+            }
+
+            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
         }
 
-        override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
-    }
-
     init {
         drawable.callback = drawableCallback
     }
@@ -122,11 +122,13 @@
         drawable.isInAmbientMode = renderParameters.drawMode == DrawMode.AMBIENT
         drawable.bounds = bounds
         drawable.currentTime = zonedDateTime.toInstant()
-        drawable.isHighlighted = renderParameters.lastComplicationTapDownEvents[slotId]?.let {
-            val startTime = it.tapTime.toEpochMilli()
-            val endTime = it.tapTime.toEpochMilli() + COMPLICATION_HIGHLIGHT_DURATION_MS
-            zonedDateTime.toInstant().toEpochMilli() in startTime until endTime
-        } ?: false
+        drawable.isHighlighted =
+            renderParameters.lastComplicationTapDownEvents[slotId]?.let {
+                val startTime = it.tapTime.toEpochMilli()
+                val endTime = it.tapTime.toEpochMilli() + COMPLICATION_HIGHLIGHT_DURATION_MS
+                zonedDateTime.toInstant().toEpochMilli() in startTime until endTime
+            }
+                ?: false
         drawable.draw(canvas)
     }
 
@@ -138,11 +140,7 @@
         @ColorInt color: Int
     ) {
         if (boundsType == ComplicationSlotBoundsType.ROUND_RECT) {
-            complicationHighlightRenderer.drawComplicationHighlight(
-                canvas,
-                bounds,
-                color
-            )
+            complicationHighlightRenderer.drawComplicationHighlight(canvas, bounds, color)
         }
     }
 
@@ -157,20 +155,18 @@
      *
      * @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.
+     *   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
-        )
-    }
+    ): Unit =
+        TraceEvent("CanvasComplicationDrawable.setIdAndData").use {
+            _data = complicationData
+            drawable.setComplicationData(complicationData, loadDrawablesAsynchronous)
+        }
 }
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
index 3fd9b54..9f1416d 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
@@ -35,27 +35,26 @@
 import androidx.annotation.IntRange
 import androidx.annotation.Px
 import androidx.annotation.VisibleForTesting
+import androidx.wear.watchface.ComplicationHelperActivity
 import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationType.NO_DATA
 import androidx.wear.watchface.complications.data.ComplicationType.NO_PERMISSION
 import androidx.wear.watchface.complications.data.ComplicationType.RANGED_VALUE
 import androidx.wear.watchface.complications.data.NoDataComplicationData
-import androidx.wear.watchface.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.time.Instant
+import org.xmlpull.v1.XmlPullParser
+import org.xmlpull.v1.XmlPullParserException
 
 /**
- * A styleable drawable object that draws complicationSlots. You can create a ComplicationDrawable from
- * XML inflation or by using one of the constructor methods.
+ * A styleable drawable object that draws complicationSlots. 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.
+ * To construct a ComplicationDrawable programmatically, use the [ComplicationDrawable] constructor.
+ * Afterwards, styling attributes you want to modify can be set via set methods.
  *
  * ```
  * val complicationDrawable = ComplicationDrawable(context)
@@ -65,15 +64,13 @@
  *
  * <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.
+ * 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:
- *
+ * 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.complication.rendering.ComplicationDrawable
@@ -85,10 +82,8 @@
  * </android.support.wearable.complication.rendering.ComplicationDrawable>
  * ```
  *
- *
- * A top-level `drawable` tag with the `class` attribute may also be used to
- * construct a ComplicationDrawable from an XML file:
- *
+ * 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
@@ -101,9 +96,9 @@
  * </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.
+ * 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) {
@@ -116,6 +111,7 @@
  * ```
  *
  * <h4>Syntax:</h4>
+ *
  * ```
  * <?xml version="1.0" encoding="utf-8"?>
  * <android.support.wearable.complication.rendering.ComplicationDrawable
@@ -178,13 +174,11 @@
  * 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.
-     */
+    /** Returns the [Context] used to render the complication. */
     public var context: Context? = null
         private set
 
-    /** Returns complication renderer.  */
+    /** Returns complication renderer. */
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
     @get:JvmName("getComplicationRenderer")
     internal var complicationRenderer: ComplicationRenderer? = null
@@ -225,8 +219,8 @@
     public var isBurnInProtectionOn: Boolean = false
 
     /**
-     * Whether the complication is currently highlighted. This may be called by a watch face when
-     * a complication is tapped.
+     * 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.
@@ -278,8 +272,8 @@
      * 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 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(drawable: ComplicationDrawable)
@@ -297,8 +291,10 @@
             setStyleToDefaultValues(ambientStyle, context.resources)
         }
         if (!alreadyStyled) {
-            highlightDuration = context.resources
-                .getInteger(R.integer.complicationDrawable_highlightDurationMs).toLong()
+            highlightDuration =
+                context.resources
+                    .getInteger(R.integer.complicationDrawable_highlightDurationMs)
+                    .toLong()
         }
         complicationRenderer = ComplicationRenderer(this.context, activeStyle, ambientStyle)
         val nonNullComplicationRenderer = complicationRenderer!!
@@ -322,26 +318,29 @@
         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)
-            )
+            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)
-            )
+            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)
-            )
+            complicationStyle.titleColor =
+                a.getColor(
+                    R.styleable.ComplicationDrawable_titleColor,
+                    r.getColor(R.color.complicationDrawable_titleColor, null)
+                )
         }
         if (a.hasValue(R.styleable.ComplicationDrawable_textTypeface)) {
             complicationStyle.setTextTypeface(
@@ -360,88 +359,95 @@
             )
         }
         if (a.hasValue(R.styleable.ComplicationDrawable_textSize)) {
-            complicationStyle.textSize = a.getDimensionPixelSize(
-                R.styleable.ComplicationDrawable_textSize,
-                r.getDimensionPixelSize(R.dimen.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)
-            )
+            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)
-            )
+            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)
-            )
+            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)
-            )
+            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)
-            )
+            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)
-            )
+            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)
-            )
+            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)
-            )
+            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
+            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
+            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
+            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)
-            )
+            complicationStyle.highlightColor =
+                a.getColor(
+                    R.styleable.ComplicationDrawable_highlightColor,
+                    r.getColor(R.color.complicationDrawable_highlightColor, null)
+                )
         }
         a.recycle()
     }
@@ -451,10 +457,10 @@
      * 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 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
+     * @param attrs Base set of attribute values
+     * @param theme Ignored by ComplicationDrawable
      */
     @Throws(XmlPullParserException::class, IOException::class)
     public override fun inflate(
@@ -477,7 +483,7 @@
         inflateStyle(true, r, parser)
         while (
             parser.next().also { type = it } != XmlPullParser.END_DOCUMENT &&
-            (type != XmlPullParser.END_TAG || parser.depth > outerDepth)
+                (type != XmlPullParser.END_TAG || parser.depth > outerDepth)
         ) {
             if (type != XmlPullParser.START_TAG) {
                 continue
@@ -540,16 +546,15 @@
     override fun getOpacity(): Int = PixelFormat.OPAQUE
 
     protected override fun onBoundsChange(bounds: Rect) {
-        complicationRenderer?.let {
-            it.bounds = bounds
-        }
+        complicationRenderer?.let { it.bounds = bounds }
     }
 
-    /** If the ranged value progress should be hidden when [ComplicationData] is of type
+    /**
+     * If the ranged value progress should be hidden when [ComplicationData] is of type
      * [RANGED_VALUE].
      *
      * @attr ref androidx.wear.watchface.complicationSlots.rendering.R
-     * .styleable#ComplicationDrawable_rangedValueProgressHidden
+     *   .styleable#ComplicationDrawable_rangedValueProgressHidden
      */
     public var isRangedValueProgressHidden: Boolean = false
         set(rangedValueProgressHidden) {
@@ -561,8 +566,8 @@
      * Sets the complication data to be drawn.
      *
      * @param complicationData The [ComplicationData] to set
-     * @param loadDrawablesAsync If true any drawables should be loaded asynchronously,
-     * otherwise they will be loaded synchronously.
+     * @param loadDrawablesAsync If true any drawables should be loaded asynchronously, otherwise
+     *   they will be loaded synchronously.
      */
     public fun setComplicationData(
         complicationData: ComplicationData,
@@ -601,45 +606,43 @@
         private set
 
     init {
-        complicationRenderer?.setComplicationData(
-            complicationData.asWireComplicationData(),
-            false
-        )
+        complicationRenderer?.setComplicationData(complicationData.asWireComplicationData(), false)
     }
 
     /**
      * 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.
+     * 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.
+     * 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.
+     *   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
+        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
+        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
@@ -648,11 +651,12 @@
                 if (context!!::class.java.name == "androidx.wear.watchface.WatchFaceService") {
                     context!!.startActivity(
                         ComplicationHelperActivity.createPermissionRequestHelperIntent(
-                            context!!,
-                            ComponentName(context!!, context!!.javaClass),
-                            /* complicationDenied */ null,
-                            /* complicationRationale */null
-                        ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                                context!!,
+                                ComponentName(context!!, context!!.javaClass),
+                                /* complicationDenied */ null,
+                                /* complicationRationale */ null
+                            )
+                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                     )
                 } else {
                     return false
@@ -678,7 +682,8 @@
         return true
     }
 
-    /** The duration for the complication to stay highlighted after calling the [onTap] method.
+    /**
+     * 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
@@ -687,7 +692,7 @@
             field = highlightDurationMillis
         }
 
-    /** Builds styles and syncs them with the complication renderer.  */
+    /** Builds styles and syncs them with the complication renderer. */
     @JvmName(name = "updateStyleIfRequired")
     internal fun updateStyleIfRequired() {
         if (activeStyle.isDirty || ambientStyle.isDirty) {
@@ -724,9 +729,9 @@
          * Creates a ComplicationDrawable from a resource.
          *
          * @param context The [Context] to load the resource from
-         * @param id      The id of the resource to load
+         * @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.
+         *   doesn't exist.
          */
         @JvmStatic
         public fun getDrawable(context: Context, id: Int): ComplicationDrawable? {
@@ -743,12 +748,14 @@
             style.titleColor = r.getColor(R.color.complicationDrawable_titleColor, null)
             style.setTextTypeface(
                 Typeface.create(
-                    r.getString(R.string.complicationDrawable_textTypeface), Typeface.NORMAL
+                    r.getString(R.string.complicationDrawable_textTypeface),
+                    Typeface.NORMAL
                 )
             )
             style.setTitleTypeface(
                 Typeface.create(
-                    r.getString(R.string.complicationDrawable_titleTypeface), Typeface.NORMAL
+                    r.getString(R.string.complicationDrawable_titleTypeface),
+                    Typeface.NORMAL
                 )
             )
             style.textSize = r.getDimensionPixelSize(R.dimen.complicationDrawable_textSize)
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt
index ca6f60a..d6b809c 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt
@@ -32,30 +32,28 @@
     @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 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
-    }
+    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
+     * 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
-    ) {
+    public fun drawComplicationHighlight(canvas: Canvas, bounds: Rect, @ColorInt color: Int) {
         outlinePaint.color = color
         val radius = bounds.height() / 2.0f
         if (bounds.width() == bounds.height()) {
@@ -63,19 +61,9 @@
             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, transparentWhitePaint)
 
-            canvas.drawCircle(
-                ctrX,
-                ctrY,
-                radius + outlineExpansion,
-                outlinePaint
-            )
+            canvas.drawCircle(ctrX, ctrY, radius + outlineExpansion, outlinePaint)
         } else {
             canvas.drawRoundRect(
                 RectF(
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
index f44dadb..e411088 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
@@ -85,12 +85,10 @@
      * padding and gravity. Testing this class with DEBUG_MODE set to true causes a test to fail so
      * it's only meant to be true on local builds.
      */
-    @VisibleForTesting
-    static final boolean DEBUG_MODE = false;
+    @VisibleForTesting static final boolean DEBUG_MODE = false;
 
     /** The gap between the in progress stroke and the remain stroke. */
-    @VisibleForTesting
-    static final int STROKE_GAP_IN_DEGREES = 4;
+    @VisibleForTesting static final int STROKE_GAP_IN_DEGREES = 4;
 
     /** The gap between in progress stroke for scores. */
     static final int STROKE_GAP_IN_DEGREES_FOR_SCORE = 15;
@@ -99,8 +97,7 @@
      * Starting angle for ranged value, i.e. in progress part will start from this angle. As it's
      * drawn clockwise, -90 corresponds to 12 o'clock on a watch.
      */
-    @VisibleForTesting
-    static final int RANGED_VALUE_START_ANGLE = -90;
+    @VisibleForTesting static final int RANGED_VALUE_START_ANGLE = -90;
 
     /** Size fraction used for drawing icons. 1.0 here means no padding is applied. */
     private static final float ICON_SIZE_FRACTION = 1.0f;
@@ -118,8 +115,7 @@
     private static final float TEXT_PADDING_HEIGHT_FRACTION = 0.1f;
 
     /** Used to apply a grey color to a placeholder. */
-    @VisibleForTesting
-    static final Paint PLACEHOLDER_PAINT = createPlaceHolderPaint();
+    @VisibleForTesting static final Paint PLACEHOLDER_PAINT = createPlaceHolderPaint();
 
     /** Defines the placeholder shape for WeightedElementsComplicationData. */
     private static final float[] PLACEHOLDER_WEIGHTS = {3.0f, 2.0f, 1.0f};
@@ -153,8 +149,8 @@
 
     /** Used to apply a grey tint to a placeholder icon. */
     @VisibleForTesting
-    static final ColorFilter PLACEHOLDER_COLOR_FILTER = new PorterDuffColorFilter(
-            Color.LTGRAY, PorterDuff.Mode.SRC_IN);
+    static final ColorFilter PLACEHOLDER_COLOR_FILTER =
+            new PorterDuffColorFilter(Color.LTGRAY, PorterDuff.Mode.SRC_IN);
 
     /** Context is required for localization. */
     private final Context mContext;
@@ -170,31 +166,19 @@
     private boolean mHasNoData;
 
     // Below drawables will be null until they are fully loaded.
-    @Nullable
-    Drawable mIcon;
-    @Nullable
-    Drawable mBurnInProtectionIcon;
-    @Nullable
-    Drawable mSmallImage;
-    @Nullable
-    Drawable mBurnInProtectionSmallImage;
-    @Nullable
-    Drawable mLargeImage;
+    @Nullable Drawable mIcon;
+    @Nullable Drawable mBurnInProtectionIcon;
+    @Nullable Drawable mSmallImage;
+    @Nullable Drawable mBurnInProtectionSmallImage;
+    @Nullable Drawable mLargeImage;
 
-    @VisibleForTesting
-    boolean mIsPlaceholderIcon;
-    @VisibleForTesting
-    boolean mIsPlaceholderSmallImage;
-    @VisibleForTesting
-    boolean mIsPlaceholderLargeImage;
-    @VisibleForTesting
-    boolean mIsPlaceholderRangedValue;
-    @VisibleForTesting
-    boolean mIsPlaceholderWeightedElements;
-    @VisibleForTesting
-    boolean mIsPlaceholderTitle;
-    @VisibleForTesting
-    boolean mIsPlaceholderText;
+    @VisibleForTesting boolean mIsPlaceholderIcon;
+    @VisibleForTesting boolean mIsPlaceholderSmallImage;
+    @VisibleForTesting boolean mIsPlaceholderLargeImage;
+    @VisibleForTesting boolean mIsPlaceholderRangedValue;
+    @VisibleForTesting boolean mIsPlaceholderWeightedElements;
+    @VisibleForTesting boolean mIsPlaceholderTitle;
+    @VisibleForTesting boolean mIsPlaceholderText;
     boolean mIsPlaceholder;
 
     // Drawables for rendering rounded images
@@ -203,11 +187,9 @@
     private RoundedDrawable mRoundedSmallImage = null;
 
     // Text renderers
-    @VisibleForTesting
-    TextRenderer mMainTextRenderer = new TextRenderer();
+    @VisibleForTesting TextRenderer mMainTextRenderer = new TextRenderer();
 
-    @VisibleForTesting
-    TextRenderer mSubTextRenderer = new TextRenderer();
+    @VisibleForTesting TextRenderer mSubTextRenderer = new TextRenderer();
 
     // Bounds for components. NB we want to avoid allocations in watch face rendering code to
     // reduce GC pressure.
@@ -222,34 +204,28 @@
     private final RectF mRangedValueBoundsF = new RectF();
 
     // Paint sets for active and ambient modes.
-    @VisibleForTesting
-    PaintSet mActivePaintSet = null;
+    @VisibleForTesting PaintSet mActivePaintSet = null;
     PaintSet mActivePaintSetLostTapAction = null;
-    @VisibleForTesting
-    PaintSet mAmbientPaintSet = null;
+    @VisibleForTesting PaintSet mAmbientPaintSet = null;
     PaintSet mAmbientPaintSetLostTapAction = null;
 
     // Paints for texts
-    @Nullable
-    private TextPaint mMainTextPaint = null;
-    @Nullable
-    private TextPaint mSubTextPaint = null;
+    @Nullable private TextPaint mMainTextPaint = null;
+    @Nullable private TextPaint mSubTextPaint = null;
 
     // Styles for active and ambient modes.
     private ComplicationStyle mActiveStyle;
     private ComplicationStyle mAmbientStyle;
 
-    @Nullable
-    private Paint mDebugPaint;
+    @Nullable private Paint mDebugPaint;
 
-    @Nullable
-    private OnInvalidateListener mInvalidateListener;
+    @Nullable private OnInvalidateListener mInvalidateListener;
 
     /**
      * Initializes complication renderer.
      *
-     * @param context      Current [Context].
-     * @param activeStyle  ComplicationSlot style to be used when in active mode.
+     * @param context Current [Context].
+     * @param activeStyle ComplicationSlot style to be used when in active mode.
      * @param ambientStyle ComplicationSlot style to be used when in ambient mode.
      */
     ComplicationRenderer(
@@ -266,7 +242,7 @@
     /**
      * Updates the complication styles in active and ambient modes
      *
-     * @param activeStyle  complication style in active mode
+     * @param activeStyle complication style in active mode
      * @param ambientStyle complication style in ambient mode
      */
     public void updateStyle(
@@ -286,10 +262,9 @@
     /**
      * Sets the complication data to be rendered.
      *
-     * @param data               ComplicationSlot data to be rendered. If this is null, nothing
-     *                           is drawn.
-     * @param loadDrawablesAsync If true any drawables will be loaded asynchronously, otherwise
-     *                           they will be loaded synchronously.
+     * @param data ComplicationSlot data to be rendered. If this is null, nothing is drawn.
+     * @param loadDrawablesAsync If true any drawables will be loaded asynchronously, otherwise they
+     *     will be loaded synchronously.
      */
     public void setComplicationData(@Nullable ComplicationData data, boolean loadDrawablesAsync) {
         if (Objects.equals(mComplicationData, data)) {
@@ -322,20 +297,19 @@
                         data.hasSmallImage() && ImageKt.isPlaceholder(data.getSmallImage());
                 mIsPlaceholderLargeImage =
                         data.hasLargeImage() && ImageKt.isPlaceholder(data.getLargeImage());
-                mIsPlaceholderRangedValue = data.hasRangedValue()
-                        && data.getRangedValue() == RangedValueComplicationData.PLACEHOLDER;
-                mIsPlaceholderWeightedElements = data.getElementWeights() != null
-                        && data.getElementWeights().length == 0;
+                mIsPlaceholderRangedValue =
+                        data.hasRangedValue()
+                                && data.getRangedValue() == RangedValueComplicationData.PLACEHOLDER;
+                mIsPlaceholderWeightedElements =
+                        data.getElementWeights() != null && data.getElementWeights().length == 0;
                 if (data.getType() == ComplicationData.TYPE_LONG_TEXT) {
                     mIsPlaceholderTitle =
                             data.hasLongTitle() && data.getLongTitle().isPlaceholder();
-                    mIsPlaceholderText =
-                            data.hasLongText() && data.getLongText().isPlaceholder();
+                    mIsPlaceholderText = data.hasLongText() && data.getLongText().isPlaceholder();
                 } else {
                     mIsPlaceholderTitle =
                             data.hasShortTitle() && data.getShortTitle().isPlaceholder();
-                    mIsPlaceholderText =
-                            data.hasShortText() && data.getShortText().isPlaceholder();
+                    mIsPlaceholderText = data.hasShortText() && data.getShortText().isPlaceholder();
                 }
                 mComplicationData = data;
                 mHasNoData = false;
@@ -431,14 +405,13 @@
      * Renders complication data on a canvas. Does nothing if the current data is null, has type
      * 'empty' or 'not configured', or is not active.
      *
-     * @param canvas           canvas to be drawn on.
-     * @param currentTime      current time as an {@link Instant}
-     * @param inAmbientMode    true if the device is in ambient mode.
-     * @param lowBitAmbient    true if the screen supports fewer bits for each color in ambient
-     *                         mode.
+     * @param canvas canvas to be drawn on.
+     * @param currentTime current time as an {@link Instant}
+     * @param inAmbientMode true if the device is in ambient mode.
+     * @param lowBitAmbient true if the screen supports fewer bits for each color in ambient mode.
      * @param burnInProtection true if burn-in protection is required.
      * @param showTapHighlight true if the complication should be drawn with a highlighted effect,
-     *                         to provide visual feedback after a tap.
+     *     to provide visual feedback after a tap.
      */
     public void draw(
             @NonNull Canvas canvas,
@@ -459,13 +432,16 @@
         // reinitialize.
         if (inAmbientMode
                 && (mAmbientPaintSet.mLowBitAmbient != lowBitAmbient
-                || mAmbientPaintSet.mBurnInProtection != burnInProtection)) {
+                        || mAmbientPaintSet.mBurnInProtection != burnInProtection)) {
             mAmbientPaintSet = new PaintSet(mAmbientStyle, true, lowBitAmbient, burnInProtection);
         }
         // Choose the correct paint set to use
-        PaintSet currentPaintSet = mComplicationData.getTapActionLostDueToSerialization()
-                ? (inAmbientMode ? mAmbientPaintSetLostTapAction : mActivePaintSetLostTapAction) :
-                (inAmbientMode ? mAmbientPaintSet : mActivePaintSet);
+        PaintSet currentPaintSet =
+                mComplicationData.getTapActionLostDueToSerialization()
+                        ? (inAmbientMode
+                                ? mAmbientPaintSetLostTapAction
+                                : mActivePaintSetLostTapAction)
+                        : (inAmbientMode ? mAmbientPaintSet : mActivePaintSet);
         // Update complication texts
         updateComplicationTexts(currentTime.toEpochMilli());
         canvas.save();
@@ -503,24 +479,28 @@
         if (mComplicationData.hasShortText()) {
             mMainTextRenderer.setMaxLines(1);
             mMainTextRenderer.setText(
-                    mComplicationData.getShortText().getTextAt(
-                            mContext.getResources(), currentTimeMillis));
+                    mComplicationData
+                            .getShortText()
+                            .getTextAt(mContext.getResources(), currentTimeMillis));
             if (mComplicationData.getShortTitle() != null) {
                 mSubTextRenderer.setText(
-                        mComplicationData.getShortTitle().getTextAt(
-                                mContext.getResources(), currentTimeMillis));
+                        mComplicationData
+                                .getShortTitle()
+                                .getTextAt(mContext.getResources(), currentTimeMillis));
             } else {
                 mSubTextRenderer.setText("");
             }
         }
         if (mComplicationData.hasLongText()) {
             mMainTextRenderer.setText(
-                    mComplicationData.getLongText().getTextAt(
-                            mContext.getResources(), currentTimeMillis));
+                    mComplicationData
+                            .getLongText()
+                            .getTextAt(mContext.getResources(), currentTimeMillis));
             if (mComplicationData.getLongTitle() != null) {
                 mSubTextRenderer.setText(
-                        mComplicationData.getLongTitle().getTextAt(
-                                mContext.getResources(), currentTimeMillis));
+                        mComplicationData
+                                .getLongTitle()
+                                .getTextAt(mContext.getResources(), currentTimeMillis));
                 // If long text has title, only show one line from each
                 mMainTextRenderer.setMaxLines(1);
             } else {
@@ -581,19 +561,21 @@
             // Avoid drawing two placeholder text fields of the same length.
             if (!mSubTextBounds.isEmpty()
                     && (mComplicationData.getType() == ComplicationData.TYPE_SHORT_TEXT
-                    || mComplicationData.getType() == ComplicationData.TYPE_LONG_TEXT)) {
+                            || mComplicationData.getType() == ComplicationData.TYPE_LONG_TEXT)) {
                 width = mMainTextBounds.width() * 0.4f;
                 height = mMainTextBounds.height() * 0.9f;
             } else {
                 width = mMainTextBounds.width();
                 height = mMainTextBounds.height() * 0.75f;
             }
-            canvas.drawRoundRect(mMainTextBounds.left,
+            canvas.drawRoundRect(
+                    mMainTextBounds.left,
                     mMainTextBounds.top + height * 0.1f,
                     mMainTextBounds.left + width,
                     mMainTextBounds.top + height,
                     mMainTextBounds.width() * 0.05f,
-                    mMainTextBounds.height() * 0.1f, PLACEHOLDER_PAINT);
+                    mMainTextBounds.height() * 0.1f,
+                    PLACEHOLDER_PAINT);
         } else {
             mMainTextRenderer.draw(canvas, mMainTextBounds);
         }
@@ -613,10 +595,14 @@
         }
 
         if (isPlaceholder) {
-            canvas.drawRoundRect(mSubTextBounds.left,
+            canvas.drawRoundRect(
+                    mSubTextBounds.left,
                     mSubTextBounds.bottom - mSubTextBounds.height() * 0.9f,
-                    mSubTextBounds.right, mSubTextBounds.bottom, mSubTextBounds.width() * 0.05f,
-                    mSubTextBounds.height() * 0.1f, PLACEHOLDER_PAINT);
+                    mSubTextBounds.right,
+                    mSubTextBounds.bottom,
+                    mSubTextBounds.width() * 0.05f,
+                    mSubTextBounds.height() * 0.1f,
+                    PLACEHOLDER_PAINT);
         } else {
             mSubTextRenderer.draw(canvas, mSubTextBounds);
         }
@@ -672,22 +658,30 @@
 
         float startAngle = RANGED_VALUE_START_ANGLE + gap / 2.0f;
         switch (valueType) {
-            case RangedValueComplicationData.TYPE_RATING: {
-                float sweepAngle = 360.0f - gap / 2;
-                drawProgressBarArc(canvas, isPlaceholder, paintSet, startAngle, sweepAngle);
+            case RangedValueComplicationData.TYPE_RATING:
+                {
+                    float sweepAngle = 360.0f - gap / 2;
+                    drawProgressBarArc(canvas, isPlaceholder, paintSet, startAngle, sweepAngle);
 
-                // Draw the progress indicator.
-                float strokeWidth = paintSet.mInProgressPaint.getStrokeWidth();
-                float radiusX = mRangedValueBoundsF.width() * 0.5f;
-                float radiusY = mRangedValueBoundsF.height() * 0.5f;
-                float x = mRangedValueBoundsF.centerX()
-                        + radiusX * (float) cos(toRadians(startAngle + inProgressAngle));
-                float y = mRangedValueBoundsF.centerY()
-                        + radiusY * (float) sin(toRadians(startAngle + inProgressAngle));
-                canvas.drawCircle(x, y, strokeWidth,
-                        isPlaceholder ? PLACEHOLDER_PROGRESS_PAINT : paintSet.mInProgressPaint);
-                break;
-            }
+                    // Draw the progress indicator.
+                    float strokeWidth = paintSet.mInProgressPaint.getStrokeWidth();
+                    float radiusX = mRangedValueBoundsF.width() * 0.5f;
+                    float radiusY = mRangedValueBoundsF.height() * 0.5f;
+                    float x =
+                            mRangedValueBoundsF.centerX()
+                                    + radiusX
+                                            * (float) cos(toRadians(startAngle + inProgressAngle));
+                    float y =
+                            mRangedValueBoundsF.centerY()
+                                    + radiusY
+                                            * (float) sin(toRadians(startAngle + inProgressAngle));
+                    canvas.drawCircle(
+                            x,
+                            y,
+                            strokeWidth,
+                            isPlaceholder ? PLACEHOLDER_PROGRESS_PAINT : paintSet.mInProgressPaint);
+                    break;
+                }
 
             default:
             case RangedValueComplicationData.TYPE_UNDEFINED:
@@ -700,7 +694,7 @@
                             mRangedValueBoundsF,
                             startAngle + inProgressAngle + gap,
                             remainderAngle,
-                            /* useCenter = */ false,
+                            /* useCenter= */ false,
                             paintSet.mRemainingPaint);
                 }
                 break;
@@ -722,7 +716,7 @@
             rangedValue = 75.0f;
         }
 
-        float value =  Math.min(rangedMaxValue, Math.max(0f, rangedValue));
+        float value = Math.min(rangedMaxValue, Math.max(0f, rangedValue));
         float interval = rangedMaxValue;
         float progress = interval > 0 ? value / interval : 0;
         float gap = STROKE_GAP_IN_DEGREES_FOR_SCORE;
@@ -739,7 +733,11 @@
         float sweepAngle = 360.0f - gap / 2;
 
         // Draw the fixed length progress arc.
-        drawProgressBarArc(canvas, isPlaceholder, paintSet, startAngle,
+        drawProgressBarArc(
+                canvas,
+                isPlaceholder,
+                paintSet,
+                startAngle,
                 sweepAngle - OVER_ACHIEVEMENT_ARC_LENGTH);
 
         // Draw the fixed length over-achievement achievement arc, resenting progress past the
@@ -750,7 +748,7 @@
                 mRangedValueBoundsF,
                 startAngle + sweepAngle - OVER_ACHIEVEMENT_ARC_LENGTH,
                 OVER_ACHIEVEMENT_ARC_LENGTH,
-                /* useCenter = */ false,
+                /* useCenter= */ false,
                 paintSet.mInProgressPaint);
 
         paintSet.mInProgressPaint.setColor(prevColor);
@@ -759,18 +757,27 @@
         float strokeWidth = paintSet.mInProgressPaint.getStrokeWidth();
         float radiusX = mRangedValueBoundsF.width() * 0.5f;
         float radiusY = mRangedValueBoundsF.height() * 0.5f;
-        float x = mRangedValueBoundsF.centerX()
-                + radiusX * (float) cos(toRadians(startAngle + inProgressAngle));
-        float y = mRangedValueBoundsF.centerY()
-                + radiusY * (float) sin(toRadians(startAngle + inProgressAngle));
-        canvas.drawCircle(x, y, strokeWidth,
+        float x =
+                mRangedValueBoundsF.centerX()
+                        + radiusX * (float) cos(toRadians(startAngle + inProgressAngle));
+        float y =
+                mRangedValueBoundsF.centerY()
+                        + radiusY * (float) sin(toRadians(startAngle + inProgressAngle));
+        canvas.drawCircle(
+                x,
+                y,
+                strokeWidth,
                 isPlaceholder ? PLACEHOLDER_PROGRESS_PAINT : paintSet.mInProgressPaint);
 
         mRangedValueBoundsF.inset(-insetAmount, -insetAmount);
     }
 
-    private void drawProgressBarArc(Canvas canvas, boolean isPlaceholder, PaintSet paintSet,
-            float startAngle, float sweepAngle) {
+    private void drawProgressBarArc(
+            Canvas canvas,
+            boolean isPlaceholder,
+            PaintSet paintSet,
+            float startAngle,
+            float sweepAngle) {
         int[] colorRamp = mComplicationData.getColorRamp();
         if (colorRamp != null) {
             if (!checkNotNull(mComplicationData.isColorRampInterpolated())) {
@@ -781,11 +788,14 @@
 
             // Set up the SweepGradient shader, rotated so the start is at the top (12 o'clock).
             SweepGradient gradient =
-                    new SweepGradient(mRangedValueBoundsF.centerX(), mRangedValueBoundsF.centerY(),
-                            colorRamp, /* positions= */ null);
+                    new SweepGradient(
+                            mRangedValueBoundsF.centerX(),
+                            mRangedValueBoundsF.centerY(),
+                            colorRamp,
+                            /* positions= */ null);
             Matrix matrix = new Matrix();
-            matrix.postRotate(startAngle,
-                    mRangedValueBoundsF.centerX(), mRangedValueBoundsF.centerY());
+            matrix.postRotate(
+                    startAngle, mRangedValueBoundsF.centerX(), mRangedValueBoundsF.centerY());
             gradient.setLocalMatrix(matrix);
             paintSet.mInProgressPaint.setShader(gradient);
         }
@@ -799,8 +809,12 @@
     }
 
     private void drawNonInterpolatedColorRampArc(
-            Canvas canvas, boolean isPlaceholder, PaintSet paintSet,
-            float startAngle, float sweepAngle, int[] colorRamp) {
+            Canvas canvas,
+            boolean isPlaceholder,
+            PaintSet paintSet,
+            float startAngle,
+            float sweepAngle,
+            int[] colorRamp) {
         // We need to draw the arc in segments of equal color.
         float segmentSweepAngle = sweepAngle / (float) colorRamp.length;
         int prevColor = paintSet.mInProgressPaint.getColor();
@@ -835,14 +849,14 @@
             paintSet.mInProgressPaint.setColor(mComplicationData.getElementBackgroundColor());
             canvas.drawArc(
                     mRangedValueBoundsF,
-                    /* startAngle = */ 0f,
-                    /* sweepAngle = */ 360.0f,
-                    /* useCenter = */ false,
+                    /* startAngle= */ 0f,
+                    /* sweepAngle= */ 360.0f,
+                    /* useCenter= */ false,
                     paintSet.mInProgressPaint);
         }
 
-        float[] weights = isPlaceholder ? PLACEHOLDER_WEIGHTS :
-                mComplicationData.getElementWeights();
+        float[] weights =
+                isPlaceholder ? PLACEHOLDER_WEIGHTS : mComplicationData.getElementWeights();
         int[] colors = mComplicationData.getElementColors();
         float sum = 0;
         for (float weight : weights) {
@@ -862,7 +876,7 @@
                     mRangedValueBoundsF,
                     angle,
                     sweepLength,
-                    /* useCenter = */ false,
+                    /* useCenter= */ false,
                     isPlaceholder ? PLACEHOLDER_PROGRESS_PAINT : paintSet.mInProgressPaint);
             angle += sweepLength + WEIGHTED_ANGLE_GAP;
         }
@@ -882,8 +896,8 @@
             if (paintSet.isInBurnInProtectionMode() && mBurnInProtectionIcon != null) {
                 icon = mBurnInProtectionIcon;
             }
-            icon.setColorFilter(mIsPlaceholder ? PLACEHOLDER_COLOR_FILTER :
-                    paintSet.mIconColorFilter);
+            icon.setColorFilter(
+                    mIsPlaceholder ? PLACEHOLDER_COLOR_FILTER : paintSet.mIconColorFilter);
             drawIconOnCanvas(canvas, mIconBounds, icon);
         } else if (isPlaceholder) {
             canvas.drawRect(mIconBounds, PLACEHOLDER_PAINT);
@@ -975,10 +989,10 @@
             return Math.max(
                     getBorderRadius(currentStyle)
                             - Math.min(
-                            Math.min(imageBounds.left, mBounds.width() - imageBounds.right),
-                            Math.min(
-                                    imageBounds.top,
-                                    mBounds.height() - imageBounds.bottom)),
+                                    Math.min(imageBounds.left, mBounds.width() - imageBounds.right),
+                                    Math.min(
+                                            imageBounds.top,
+                                            mBounds.height() - imageBounds.bottom)),
                     0);
         }
     }
@@ -1113,11 +1127,14 @@
         mBurnInProtectionIcon = null;
         if (mComplicationData != null) {
             icon = mComplicationData.hasIcon() ? mComplicationData.getIcon() : null;
-            burnInProtectionIcon = mComplicationData.hasBurnInProtectionIcon()
-                    ? mComplicationData.getBurnInProtectionIcon() : null;
+            burnInProtectionIcon =
+                    mComplicationData.hasBurnInProtectionIcon()
+                            ? mComplicationData.getBurnInProtectionIcon()
+                            : null;
             burnInProtectionSmallImage =
                     mComplicationData.hasBurnInProtectionSmallImage()
-                            ? mComplicationData.getBurnInProtectionSmallImage() : null;
+                            ? mComplicationData.getBurnInProtectionSmallImage()
+                            : null;
             smallImage =
                     mComplicationData.hasSmallImage() ? mComplicationData.getSmallImage() : null;
             largeImage =
@@ -1234,11 +1251,14 @@
         mBurnInProtectionIcon = null;
         if (mComplicationData != null) {
             icon = mComplicationData.hasIcon() ? mComplicationData.getIcon() : null;
-            burnInProtectionIcon = mComplicationData.hasBurnInProtectionIcon()
-                    ? mComplicationData.getBurnInProtectionIcon() : null;
+            burnInProtectionIcon =
+                    mComplicationData.hasBurnInProtectionIcon()
+                            ? mComplicationData.getBurnInProtectionIcon()
+                            : null;
             burnInProtectionSmallImage =
                     mComplicationData.hasBurnInProtectionSmallImage()
-                            ? mComplicationData.getBurnInProtectionSmallImage() : null;
+                            ? mComplicationData.getBurnInProtectionSmallImage()
+                            : null;
             smallImage =
                     mComplicationData.hasSmallImage() ? mComplicationData.getSmallImage() : null;
             largeImage =
@@ -1333,7 +1353,7 @@
             mIconColorFilter =
                     antiAlias
                             ? new PorterDuffColorFilter(
-                            style.getIconColor(), PorterDuff.Mode.SRC_IN)
+                                    style.getIconColor(), PorterDuff.Mode.SRC_IN)
                             : new ColorMatrixColorFilter(
                                     createSingleColorMatrix(style.getIconColor()));
 
@@ -1362,7 +1382,7 @@
             if (style.getBorderStyle() == ComplicationStyle.BORDER_STYLE_DASHED) {
                 mBorderPaint.setPathEffect(
                         new DashPathEffect(
-                                new float[]{style.getBorderDashWidth(), style.getBorderDashGap()},
+                                new float[] {style.getBorderDashWidth(), style.getBorderDashGap()},
                                 0));
             }
             if (style.getBorderStyle() == ComplicationStyle.BORDER_STYLE_NONE) {
@@ -1392,11 +1412,11 @@
         @VisibleForTesting
         static ColorMatrix createSingleColorMatrix(int color) {
             return new ColorMatrix(
-                    new float[]{
-                            0, 0, 0, 0, Color.red(color),
-                            0, 0, 0, 0, Color.green(color),
-                            0, 0, 0, 0, Color.blue(color),
-                            0, 0, 0, 255, SINGLE_COLOR_FILTER_ALPHA_CUTOFF * -255
+                    new float[] {
+                        0, 0, 0, 0, Color.red(color),
+                        0, 0, 0, 0, Color.green(color),
+                        0, 0, 0, 0, Color.blue(color),
+                        0, 0, 0, 255, SINGLE_COLOR_FILTER_ALPHA_CUTOFF * -255
                     });
         }
     }
@@ -1455,7 +1475,9 @@
         return mSubTextBounds;
     }
 
-    /** @param outRect Object that receives the computation of the complication's inner bounds */
+    /**
+     * @param outRect Object that receives the computation of the complication's inner bounds
+     */
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
     public void getComplicationInnerBounds(@NonNull Rect outRect) {
         LayoutUtils.getInnerBounds(
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt
index 3e91f21..de9df7a 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt
@@ -25,9 +25,7 @@
 import androidx.annotation.RestrictTo
 import androidx.wear.watchface.complications.data.SmallImageType
 
-/**
- * Defines attributes to customize appearance of rendered [ ].
- */
+/** Defines attributes to customize appearance of rendered [ ]. */
 public class ComplicationStyle {
     /**
      * Constants used to define border styles for complicationSlots.
@@ -36,28 +34,30 @@
      */
     @Retention(AnnotationRetention.SOURCE)
     @IntDef(BORDER_STYLE_NONE, BORDER_STYLE_SOLID, BORDER_STYLE_DASHED)
-    @RestrictTo(
-        RestrictTo.Scope.LIBRARY_GROUP
-    )
+    @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 }
+        set(@ColorInt backgroundColor: Int) {
+            field = backgroundColor
+        }
 
-    /** The background drawable to be used, or null if there's no background drawable.  */
+    /** 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.
+     * 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 }
+        set(@ColorInt textColor: Int) {
+            field = textColor
+        }
 
     /**
      * The color to render the title with. Title color is used for rendering short title and long
@@ -66,56 +66,45 @@
     @ColorInt
     public var titleColor: Int = SECONDARY_COLOR_DEFAULT
         @ColorInt get() = field
-        set(@ColorInt titleColor: Int) { field = titleColor }
+        set(@ColorInt titleColor: Int) {
+            field = titleColor
+        }
 
-    /** The typeface to be used for short and long text.  */
+    /** 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.  */
+    /** 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 mTextSize = TEXT_SIZE_DEFAULT
 
-    @Px
-    private var mTitleSize = 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 mIconColor = PRIMARY_COLOR_DEFAULT
 
-    @ColorInt
-    private var mBorderColor = BORDER_COLOR_DEFAULT
+    @ColorInt private var mBorderColor = BORDER_COLOR_DEFAULT
 
-    @BorderStyle
-    private var mBorderStyle = BORDER_STYLE_SOLID
+    @BorderStyle private var mBorderStyle = BORDER_STYLE_SOLID
 
-    @Px
-    private var mBorderDashWidth = DASH_WIDTH_DEFAULT
+    @Px private var mBorderDashWidth = DASH_WIDTH_DEFAULT
 
-    @Px
-    private var mBorderDashGap = DASH_GAP_DEFAULT
+    @Px private var mBorderDashGap = DASH_GAP_DEFAULT
 
-    @Px
-    private var mBorderRadius = BORDER_RADIUS_DEFAULT
+    @Px private var mBorderRadius = BORDER_RADIUS_DEFAULT
 
-    @Px
-    private var mBorderWidth = BORDER_WIDTH_DEFAULT
+    @Px private var mBorderWidth = BORDER_WIDTH_DEFAULT
 
-    @Px
-    private var mRangedValueRingWidth = RING_WIDTH_DEFAULT
+    @Px private var mRangedValueRingWidth = RING_WIDTH_DEFAULT
 
-    @ColorInt
-    private var mRangedValuePrimaryColor = PRIMARY_COLOR_DEFAULT
+    @ColorInt private var mRangedValuePrimaryColor = PRIMARY_COLOR_DEFAULT
 
-    @ColorInt
-    private var mRangedValueSecondaryColor = SECONDARY_COLOR_DEFAULT
+    @ColorInt private var mRangedValueSecondaryColor = SECONDARY_COLOR_DEFAULT
 
-    @ColorInt
-    private var mHighlightColor = HIGHLIGHT_COLOR_DEFAULT
+    @ColorInt private var mHighlightColor = HIGHLIGHT_COLOR_DEFAULT
 
     @get:JvmName(name = "isDirty")
     internal var isDirty: Boolean = true
@@ -152,8 +141,8 @@
     }
 
     /**
-     * The color filter used in active mode when rendering large images and small images
-     * with style [SmallImageType.PHOTO].
+     * The color filter used in active mode when rendering large images and small images with style
+     * [SmallImageType.PHOTO].
      */
     public var imageColorFilter: ColorFilter?
         get() = mImageColorFilter
@@ -162,7 +151,7 @@
             isDirty = true
         }
 
-    /** The color for tinting icons.  */
+    /** The color for tinting icons. */
     public var iconColor: Int
         @ColorInt get() = mIconColor
         set(@ColorInt iconColor) {
@@ -186,9 +175,7 @@
             isDirty = true
         }
 
-    /**
-     * The color to render the complication border with.
-     */
+    /** The color to render the complication border with. */
     public var borderColor: Int
         @ColorInt get() = mBorderColor
         set(@ColorInt borderColor) {
@@ -196,17 +183,16 @@
             isDirty = true
         }
 
-    /**
-     * The style to render the complication border with.
-     */
+    /** 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
-            }
+            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]. */
@@ -217,9 +203,7 @@
             isDirty = true
         }
 
-    /**
-     * The dash gap to be used when drawing borders of type [.BORDER_STYLE_DASHED].
-     */
+    /** The dash gap to be used when drawing borders of type [.BORDER_STYLE_DASHED]. */
     public var borderDashGap: Int
         @Px get() = mBorderDashGap
         set(@Px borderDashGap) {
@@ -227,10 +211,10 @@
             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.
+     * 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
@@ -239,9 +223,7 @@
             isDirty = true
         }
 
-    /**
-     * The width to render the complication border with.
-     */
+    /** The width to render the complication border with. */
     public var borderWidth: Int
         @Px get() = mBorderWidth
         set(@Px borderWidth) {
@@ -303,25 +285,27 @@
 
     /**
      * Returns a copy of the ComplicationStyle [tint]ed by [tintColor].
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    fun asTinted(tintColor: Int): ComplicationStyle = ComplicationStyle(this).apply {
-        backgroundColor = tint(backgroundColor, tintColor)
-        borderColor = tint(borderColor, tintColor)
-        highlightColor = tint(highlightColor, tintColor)
-        iconColor = tint(iconColor, tintColor)
-        rangedValuePrimaryColor = tint(rangedValuePrimaryColor, tintColor)
-        rangedValueSecondaryColor = tint(rangedValueSecondaryColor, tintColor)
-        textColor = tint(textColor, tintColor)
-        titleColor = tint(titleColor, tintColor)
-    }
+    fun asTinted(tintColor: Int): ComplicationStyle =
+        ComplicationStyle(this).apply {
+            backgroundColor = tint(backgroundColor, tintColor)
+            borderColor = tint(borderColor, tintColor)
+            highlightColor = tint(highlightColor, tintColor)
+            iconColor = tint(iconColor, tintColor)
+            rangedValuePrimaryColor = tint(rangedValuePrimaryColor, tintColor)
+            rangedValueSecondaryColor = tint(rangedValueSecondaryColor, tintColor)
+            textColor = tint(textColor, tintColor)
+            titleColor = tint(titleColor, tintColor)
+        }
 
     public companion object {
-        /** Style where the borders are not drawn.  */
+        /** Style where the borders are not drawn. */
         public const val BORDER_STYLE_NONE: Int = 0
 
-        /** Style where the borders are drawn without any gap.  */
+        /** Style where the borders are drawn without any gap. */
         public const val BORDER_STYLE_SOLID: Int = 1
 
         /**
@@ -331,55 +315,49 @@
          */
         public const val BORDER_STYLE_DASHED: Int = 2
 
-        /** Default primary color.  */
+        /** Default primary color. */
         private const val PRIMARY_COLOR_DEFAULT = Color.WHITE
 
-        /** Default secondary color.  */
+        /** Default secondary color. */
         private const val SECONDARY_COLOR_DEFAULT = Color.LTGRAY
 
-        /** Default background color.  */
+        /** Default background color. */
         private const val BACKGROUND_COLOR_DEFAULT = Color.BLACK
 
-        /** Default background color.  */
+        /** Default background color. */
         private const val HIGHLIGHT_COLOR_DEFAULT = Color.LTGRAY
 
-        /** Default border color.  */
+        /** 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 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 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 width. */
+        @Px private const val DASH_WIDTH_DEFAULT = 3
 
-        /** Default dash gap.  */
-        @Px
-        private const val DASH_GAP_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 border width. */
+        @Px private const val BORDER_WIDTH_DEFAULT = 1
 
-        /** Default ring width.  */
-        @Px
-        private const val RING_WIDTH_DEFAULT = 2
+        /** 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
+        /** Default border radius. */
+        @Px public const val BORDER_RADIUS_DEFAULT: Int = Int.MAX_VALUE
 
         /** Computes the luminance of [color] and applies that to [tint]. */
         internal fun tint(color: Int, tint: Int): Int {
             // See https://en.wikipedia.org/wiki/Relative_luminance
-            val luminance = (Color.red(color).toFloat() * (0.2126f / 255.0f)) +
-                (Color.green(color).toFloat() * (0.7152f / 255.0f)) +
-                (Color.blue(color).toFloat() * (0.0722f / 255.0f))
+            val luminance =
+                (Color.red(color).toFloat() * (0.2126f / 255.0f)) +
+                    (Color.green(color).toFloat() * (0.7152f / 255.0f)) +
+                    (Color.blue(color).toFloat() * (0.0722f / 255.0f))
 
             return Color.argb(
                 Color.alpha(color).toFloat() / 255.0f,
@@ -389,4 +367,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt
index e1ed591..2719673 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt
@@ -28,8 +28,8 @@
 import java.time.ZonedDateTime
 
 /**
- * Helper for rendering a [ComplicationSlot] to a GLES20 texture. To use call [renderToTexture]
- * and then [bind] before drawing.
+ * Helper for rendering a [ComplicationSlot] to a GLES20 texture. To use call [renderToTexture] and
+ * then [bind] before drawing.
  *
  * @param complicationSlot The [ComplicationSlot] to render to texture.
  * @param textureWidth The width of the texture in pixels to create.
@@ -43,11 +43,7 @@
     private val textureType: Int
 ) {
     private val texture = createTexture(textureType)
-    private val bitmap = Bitmap.createBitmap(
-        textureWidth,
-        textureHeight,
-        Bitmap.Config.ARGB_8888
-    )
+    private val bitmap = Bitmap.createBitmap(textureWidth, textureHeight, Bitmap.Config.ARGB_8888)
     private val canvas = Canvas(bitmap)
     private val bounds = Rect(0, 0, textureWidth, textureHeight)
 
@@ -79,26 +75,10 @@
         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
-        )
+        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/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/RoundedDrawable.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/RoundedDrawable.java
index a187cc1..e2db21d 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/RoundedDrawable.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/RoundedDrawable.java
@@ -90,7 +90,9 @@
         canvas.restore();
     }
 
-    /** @deprecated This method is no longer used in graphics optimizations */
+    /**
+     * @deprecated This method is no longer used in graphics optimizations
+     */
     @Override
     @Deprecated
     public int getOpacity() {
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
index d5caf43..a477b58 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
@@ -102,15 +102,15 @@
     private static final int SPACE_CHARACTER = 0x20;
 
     private static final Class<?>[] SPAN_ALLOW_LIST =
-            new Class<?>[]{
-                    ForegroundColorSpan.class,
-                    LocaleSpan.class,
-                    SubscriptSpan.class,
-                    SuperscriptSpan.class,
-                    StrikethroughSpan.class,
-                    StyleSpan.class,
-                    TypefaceSpan.class,
-                    UnderlineSpan.class
+            new Class<?>[] {
+                ForegroundColorSpan.class,
+                LocaleSpan.class,
+                SubscriptSpan.class,
+                SuperscriptSpan.class,
+                StrikethroughSpan.class,
+                StyleSpan.class,
+                TypefaceSpan.class,
+                UnderlineSpan.class
             };
 
     private final Rect mBounds = new Rect();
@@ -207,7 +207,8 @@
             for (Object span : spans) {
                 if (!isSpanAllowed(span)) {
                     builder.removeSpan(span);
-                    Log.w(TAG,
+                    Log.w(
+                            TAG,
                             "Removing unsupported span of type " + span.getClass().getSimpleName());
                 }
             }
@@ -268,7 +269,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/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/LayoutHelper.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/LayoutHelper.java
index 771e0fc..d0c0dcd 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/LayoutHelper.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/utils/LayoutHelper.java
@@ -152,7 +152,7 @@
     }
 
     /**
-     * @param outRect {@link Rect}  that receives the computed bounds for the long text
+     * @param outRect {@link Rect} that receives the computed bounds for the long text
      */
     public void getLongTextBounds(@NonNull Rect outRect) {
         outRect.setEmpty();
@@ -174,7 +174,7 @@
     }
 
     /**
-     * @param outRect {@link Rect}  that receives the computed bounds for the long title text
+     * @param outRect {@link Rect} that receives the computed bounds for the long title text
      */
     public void getLongTitleBounds(@NonNull Rect outRect) {
         outRect.setEmpty();
diff --git a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawableTest.kt b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawableTest.kt
index f3d831e..ade836b 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawableTest.kt
+++ b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawableTest.kt
@@ -27,12 +27,12 @@
 import androidx.wear.watchface.TapEvent
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito
 import java.time.Instant
 import java.time.ZoneId
 import java.time.ZonedDateTime
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito
 
 @RunWith(ComplicationsTestRunner::class)
 public class CanvasComplicationDrawableTest {
@@ -45,11 +45,12 @@
     private val canvas = Canvas(bitmap)
     private val zonedDateTime =
         ZonedDateTime.ofInstant(Instant.ofEpochMilli(1234), ZoneId.of("UTC"))
-    private val canvasComplicationDrawable = CanvasComplicationDrawable(
-        complicationDrawable,
-        watchState.asWatchState(),
-        invalidateCallback
-    )
+    private val canvasComplicationDrawable =
+        CanvasComplicationDrawable(
+            complicationDrawable,
+            watchState.asWatchState(),
+            invalidateCallback
+        )
     private val slotId = 100
 
     @Test
@@ -119,12 +120,13 @@
 
     @Test
     public fun render_highlight() {
-        val renderParameters = RenderParameters(
-            DrawMode.INTERACTIVE,
-            setOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS),
-            null,
-            mapOf(slotId to TapEvent(50, 50, Instant.ofEpochMilli(1100)))
-        )
+        val renderParameters =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                setOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS),
+                null,
+                mapOf(slotId to TapEvent(50, 50, Instant.ofEpochMilli(1100)))
+            )
 
         val t1099 = ZonedDateTime.ofInstant(Instant.ofEpochMilli(1099), ZoneId.of("UTC"))
         canvasComplicationDrawable.render(canvas, bounds, t1099, renderParameters, slotId)
@@ -134,22 +136,24 @@
         canvasComplicationDrawable.render(canvas, bounds, t1100, renderParameters, slotId)
         assertThat(complicationDrawable.isHighlighted).isTrue()
 
-        val t1099_plus = ZonedDateTime.ofInstant(
-            Instant.ofEpochMilli(
-                1099 + CanvasComplicationDrawable.COMPLICATION_HIGHLIGHT_DURATION_MS
-            ),
-            ZoneId.of("UTC")
-        )
+        val t1099_plus =
+            ZonedDateTime.ofInstant(
+                Instant.ofEpochMilli(
+                    1099 + CanvasComplicationDrawable.COMPLICATION_HIGHLIGHT_DURATION_MS
+                ),
+                ZoneId.of("UTC")
+            )
 
         canvasComplicationDrawable.render(canvas, bounds, t1099_plus, renderParameters, slotId)
         assertThat(complicationDrawable.isHighlighted).isTrue()
 
-        val t1100_plus = ZonedDateTime.ofInstant(
-            Instant.ofEpochMilli(
-                1100 + CanvasComplicationDrawable.COMPLICATION_HIGHLIGHT_DURATION_MS
-            ),
-            ZoneId.of("UTC")
-        )
+        val t1100_plus =
+            ZonedDateTime.ofInstant(
+                Instant.ofEpochMilli(
+                    1100 + CanvasComplicationDrawable.COMPLICATION_HIGHLIGHT_DURATION_MS
+                ),
+                ZoneId.of("UTC")
+            )
         canvasComplicationDrawable.render(canvas, bounds, t1100_plus, renderParameters, slotId)
         assertThat(complicationDrawable.isHighlighted).isFalse()
     }
diff --git a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
index e9b11db..5baf25b 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
+++ b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
@@ -60,6 +60,8 @@
 import androidx.wear.watchface.complications.data.NoDataComplicationData;
 import androidx.wear.watchface.style.CurrentUserStyleRepository;
 
+import kotlin.coroutines.Continuation;
+
 import org.jetbrains.annotations.Nullable;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -73,8 +75,6 @@
 import java.time.ZonedDateTime;
 import java.util.concurrent.TimeUnit;
 
-import kotlin.coroutines.Continuation;
-
 /** Tests for {@link ComplicationDrawable}. */
 @RunWith(ComplicationsTestRunner.class)
 @DoNotInstrument
@@ -89,16 +89,11 @@
     private androidx.wear.watchface.complications.data.ComplicationData mComplicationData;
     private int mDefaultTextSize;
 
-    @Mock
-    Canvas mMockCanvas;
-    @Mock
-    Drawable mMockDrawableActive;
-    @Mock
-    Drawable mMockDrawableAmbient;
-    @Mock
-    PendingIntent mMockPendingIntent;
-    @Mock
-    Drawable.Callback mMockDrawableCallback;
+    @Mock Canvas mMockCanvas;
+    @Mock Drawable mMockDrawableActive;
+    @Mock Drawable mMockDrawableAmbient;
+    @Mock PendingIntent mMockPendingIntent;
+    @Mock Drawable.Callback mMockDrawableCallback;
 
     @SuppressWarnings("deprecation") // b/251211092
     @Before
@@ -108,9 +103,8 @@
         mComplicationDrawable.setCallback(mMockDrawableCallback);
 
         ComplicationData complicationData =
-                new ComplicationData.Builder(
-                        ComplicationData.TYPE_SHORT_TEXT
-                ).setShortText(ComplicationText.plainText("hede"))
+                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                        .setShortText(ComplicationText.plainText("hede"))
                         .build();
         mComplicationData = DataKt.toApiComplicationData(complicationData);
         mDefaultTextSize =
@@ -127,8 +121,7 @@
 
     @Test
     public void callingDrawWithTimeOnCanvasBeforeSetContextThrowsAnException() {
-        assertThrows(
-                IllegalStateException.class, () -> mComplicationDrawable.draw(mMockCanvas));
+        assertThrows(IllegalStateException.class, () -> mComplicationDrawable.draw(mMockCanvas));
     }
 
     @Test
@@ -313,10 +306,10 @@
         ColorFilter ambientCF = new PorterDuffColorFilter(AMBIENT_COLOR, Mode.SRC_IN);
         mComplicationDrawable.getActiveStyle().setImageColorFilter(activeCF);
         mComplicationDrawable.getAmbientStyle().setImageColorFilter(ambientCF);
-        assertThat(mComplicationDrawable.getActiveStyle().getImageColorFilter()).isEqualTo(
-                activeCF);
-        assertThat(mComplicationDrawable.getAmbientStyle().getImageColorFilter()).isEqualTo(
-                ambientCF);
+        assertThat(mComplicationDrawable.getActiveStyle().getImageColorFilter())
+                .isEqualTo(activeCF);
+        assertThat(mComplicationDrawable.getAmbientStyle().getImageColorFilter())
+                .isEqualTo(ambientCF);
     }
 
     @Test
@@ -365,8 +358,7 @@
         int textSizeFromConstructor = mComplicationDrawable.getActiveStyle().getTextSize();
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         int textSizeFromResources = mComplicationDrawable.getActiveStyle().getTextSize();
-        assertThat(textSizeFromConstructor)
-                .isEqualTo(new ComplicationStyle().getTextSize());
+        assertThat(textSizeFromConstructor).isEqualTo(new ComplicationStyle().getTextSize());
         assertThat(textSizeFromResources).isEqualTo(mDefaultTextSize);
     }
 
@@ -384,13 +376,11 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .build()
-                    ),
-                true
-        );
+                        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();
@@ -401,14 +391,12 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .setTapAction(mMockPendingIntent)
-                            .build()
-                ),
-                true
-        );
+                        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();
@@ -421,14 +409,12 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .setTapAction(mMockPendingIntent)
-                        .build()
-                ),
-                true
-        );
+                        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();
@@ -439,14 +425,12 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .setTapAction(mMockPendingIntent)
-                        .build()
-                ),
-                true
-        );
+                        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));
 
@@ -461,14 +445,12 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .setTapAction(mMockPendingIntent)
-                            .build()
-                ),
-                true
-        );
+                        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));
@@ -494,14 +476,12 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                            .setShortText(ComplicationText.plainText("rofl"))
-                            .setShortTitle(ComplicationText.plainText("copter"))
-                            .setTapAction(mMockPendingIntent)
-                            .build()
-                ),
-                true
-        );
+                        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);
@@ -536,17 +516,15 @@
 
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                        new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()
-                ),
-                true
-        );
+                        new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()),
+                true);
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isTrue();
 
         Application context = ApplicationProvider.getApplicationContext();
         Intent expected =
                 ComplicationHelperActivity.createPermissionRequestHelperIntent(
-                        context, new ComponentName(context, context.getClass()), null, null)
+                                context, new ComponentName(context, context.getClass()), null, null)
                         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         Intent actual = shadowOf(context).getNextStartedActivity();
 
@@ -562,10 +540,8 @@
 
         mComplicationDrawable.setComplicationData(
                 DataKt.toApiComplicationData(
-                    new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()
-                ),
-                true
-        );
+                        new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()),
+                true);
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isFalse();
 
@@ -630,11 +606,11 @@
         mComplicationDrawable.getActiveStyle().setBorderWidth(borderWidth);
         mComplicationDrawable.getActiveStyle().setHighlightColor(highlightColor);
         mComplicationDrawable.getActiveStyle().setIconColor(iconColor);
-        mComplicationDrawable.getActiveStyle().setRangedValuePrimaryColor(
-                rangedValuePrimaryColor);
+        mComplicationDrawable.getActiveStyle().setRangedValuePrimaryColor(rangedValuePrimaryColor);
         mComplicationDrawable.getActiveStyle().setRangedValueRingWidth(rangedValueRingWidth);
-        mComplicationDrawable.getActiveStyle().setRangedValueSecondaryColor(
-                rangedValueSecondaryColor);
+        mComplicationDrawable
+                .getActiveStyle()
+                .setRangedValueSecondaryColor(rangedValueSecondaryColor);
         mComplicationDrawable.getActiveStyle().setTextColor(textColor);
         mComplicationDrawable.getActiveStyle().setTextSize(textSize);
         mComplicationDrawable.getActiveStyle().setTitleColor(titleColor);
@@ -649,12 +625,15 @@
         mComplicationDrawable.getAmbientStyle().setBorderWidth(borderWidthAmbient);
         mComplicationDrawable.getAmbientStyle().setHighlightColor(highlightColorAmbient);
         mComplicationDrawable.getAmbientStyle().setIconColor(iconColorAmbient);
-        mComplicationDrawable.getAmbientStyle().setRangedValuePrimaryColor(
-                rangedValuePrimaryColorAmbient);
-        mComplicationDrawable.getAmbientStyle().setRangedValueRingWidth(
-                rangedValueRingWidthAmbient);
-        mComplicationDrawable.getAmbientStyle().setRangedValueSecondaryColor(
-                rangedValueSecondaryColorAmbient);
+        mComplicationDrawable
+                .getAmbientStyle()
+                .setRangedValuePrimaryColor(rangedValuePrimaryColorAmbient);
+        mComplicationDrawable
+                .getAmbientStyle()
+                .setRangedValueRingWidth(rangedValueRingWidthAmbient);
+        mComplicationDrawable
+                .getAmbientStyle()
+                .setRangedValueSecondaryColor(rangedValueSecondaryColorAmbient);
         mComplicationDrawable.getAmbientStyle().setTextColor(textColorAmbient);
         mComplicationDrawable.getAmbientStyle().setTextSize(textSizeAmbient);
         mComplicationDrawable.getAmbientStyle().setTitleColor(titleColorAmbient);
@@ -713,13 +692,23 @@
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.getActiveStyle().setBackgroundColor(123);
 
-        assertThat(mComplicationDrawable.getComplicationRenderer().mActivePaintSet
-                .mBackgroundPaint.getColor()).isNotEqualTo(123);
+        assertThat(
+                        mComplicationDrawable
+                                .getComplicationRenderer()
+                                .mActivePaintSet
+                                .mBackgroundPaint
+                                .getColor())
+                .isNotEqualTo(123);
 
         mComplicationDrawable.updateStyleIfRequired();
 
-        assertThat(mComplicationDrawable.getComplicationRenderer().mActivePaintSet
-                .mBackgroundPaint.getColor()).isEqualTo(123);
+        assertThat(
+                        mComplicationDrawable
+                                .getComplicationRenderer()
+                                .mActivePaintSet
+                                .mBackgroundPaint
+                                .getColor())
+                .isEqualTo(123);
     }
 
     /** Proxies necessary methods to Robolectric application. */
@@ -743,7 +732,8 @@
         @SuppressWarnings("deprecation")
         @Nullable
         @Override
-        protected Object createWatchFace(@NonNull SurfaceHolder surfaceHolder,
+        protected Object createWatchFace(
+                @NonNull SurfaceHolder surfaceHolder,
                 @NonNull WatchState watchState,
                 @NonNull ComplicationSlotsManager complicationSlotsManager,
                 @NonNull CurrentUserStyleRepository currentUserStyleRepository,
@@ -751,17 +741,23 @@
             return new WatchFace(
                     WatchFaceType.ANALOG,
                     new Renderer.CanvasRenderer(
-                            surfaceHolder, currentUserStyleRepository, watchState,
-                            CanvasType.SOFTWARE, 16L) {
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            CanvasType.SOFTWARE,
+                            16L) {
                         @Override
-                        public void renderHighlightLayer(@NonNull Canvas canvas,
-                                @NonNull Rect bounds, @NonNull ZonedDateTime zonedDateTime) {}
+                        public void renderHighlightLayer(
+                                @NonNull Canvas canvas,
+                                @NonNull Rect bounds,
+                                @NonNull ZonedDateTime zonedDateTime) {}
 
                         @Override
-                        public void render(@NonNull Canvas canvas, @NonNull Rect bounds,
+                        public void render(
+                                @NonNull Canvas canvas,
+                                @NonNull Rect bounds,
                                 @NonNull ZonedDateTime zonedDateTime) {}
-                    }
-            );
+                    });
         }
     }
 }
diff --git a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
index b014c3b..47dead1 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
+++ b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
@@ -93,18 +93,12 @@
     private ComplicationRenderer mComplicationRenderer;
     private Rect mComplicationBounds;
 
-    @Mock
-    private Icon mMockIcon;
-    @Mock
-    private Icon mMockBurnInProtectionIcon;
-    @Mock
-    private Icon mMockSmallImage;
-    @Mock
-    private Icon mMockBurnInProtectionSmallImage;
-    @Mock
-    private Canvas mMockCanvas;
-    @Mock
-    private OnInvalidateListener mMockInvalidateListener;
+    @Mock private Icon mMockIcon;
+    @Mock private Icon mMockBurnInProtectionIcon;
+    @Mock private Icon mMockSmallImage;
+    @Mock private Icon mMockBurnInProtectionSmallImage;
+    @Mock private Canvas mMockCanvas;
+    @Mock private OnInvalidateListener mMockInvalidateListener;
     private final Resources mResurces = ApplicationProvider.getApplicationContext().getResources();
 
     @SuppressWarnings("deprecation") // b/251211092
@@ -130,10 +124,11 @@
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA).build(), true);
         assertThat(mComplicationRenderer.getComplicationData().getType())
                 .isEqualTo(TYPE_SHORT_TEXT);
-        assertThat(mComplicationRenderer
-                .getComplicationData()
-                .getShortText()
-                .getTextAt(mResurces, REFERENCE_TIME.toEpochMilli()))
+        assertThat(
+                        mComplicationRenderer
+                                .getComplicationData()
+                                .getShortText()
+                                .getTextAt(mResurces, REFERENCE_TIME.toEpochMilli()))
                 .isEqualTo(noDataText);
     }
 
@@ -254,21 +249,21 @@
         ComplicationRenderer.PaintSet thirdPaintSet = mComplicationRenderer.mAmbientPaintSet;
         // THEN different paint sets are used for every call
         assertThat(
-                firstPaintSet.mIsAmbientStyle
-                        && firstPaintSet.mLowBitAmbient
-                        && firstPaintSet.mBurnInProtection)
+                        firstPaintSet.mIsAmbientStyle
+                                && firstPaintSet.mLowBitAmbient
+                                && firstPaintSet.mBurnInProtection)
                 .isTrue();
         assertThat(firstPaintSet).isNotEqualTo(secondPaintSet);
         assertThat(
-                secondPaintSet.mIsAmbientStyle
-                        && secondPaintSet.mLowBitAmbient
-                        && !secondPaintSet.mBurnInProtection)
+                        secondPaintSet.mIsAmbientStyle
+                                && secondPaintSet.mLowBitAmbient
+                                && !secondPaintSet.mBurnInProtection)
                 .isTrue();
         assertThat(secondPaintSet).isNotEqualTo(thirdPaintSet);
         assertThat(
-                thirdPaintSet.mIsAmbientStyle
-                        && !thirdPaintSet.mLowBitAmbient
-                        && !thirdPaintSet.mBurnInProtection)
+                        thirdPaintSet.mIsAmbientStyle
+                                && !thirdPaintSet.mLowBitAmbient
+                                && !thirdPaintSet.mBurnInProtection)
                 .isTrue();
     }
 
@@ -436,8 +431,8 @@
         public float remaining;
         public float gap;
 
-        RangedArcsTestData(int min, int max, int value, float progress, float remaining,
-                float gap) {
+        RangedArcsTestData(
+                int min, int max, int value, float progress, float remaining, float gap) {
             this.min = min;
             this.max = max;
             this.value = value;
@@ -578,9 +573,7 @@
         newStyle.setBorderStyle(ComplicationStyle.BORDER_STYLE_SOLID);
         newStyle.setBorderRadius((int) radius);
         newStyle.setBorderWidth(borderWidth);
-        mComplicationRenderer.updateStyle(
-                newStyle,
-                new ComplicationStyle());
+        mComplicationRenderer.updateStyle(newStyle, new ComplicationStyle());
         // WHEN the complication is drawn in active mode and as highlighted
         mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, true);
         RectF bounds = new RectF(mComplicationBounds);
@@ -610,83 +603,113 @@
     public void placeholderLongTextIsDrawnAsPlaceholder() {
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
-                        .setPlaceholder(new ComplicationData.Builder(
-                                ComplicationData.TYPE_LONG_TEXT)
-                                .setLongText(PLACEHOLDER_COMPLICATION_TEXT)
-                                .build())
+                        .setPlaceholder(
+                                new ComplicationData.Builder(ComplicationData.TYPE_LONG_TEXT)
+                                        .setLongText(PLACEHOLDER_COMPLICATION_TEXT)
+                                        .build())
                         .build(),
                 true);
 
         mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, true);
 
-        verify(mMockCanvas).drawRoundRect(anyFloat(), anyFloat(), anyFloat(), anyFloat(),
-                anyFloat(), anyFloat(), eq(ComplicationRenderer.PLACEHOLDER_PAINT));
+        verify(mMockCanvas)
+                .drawRoundRect(
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(ComplicationRenderer.PLACEHOLDER_PAINT));
     }
 
     @Test
     public void placeholderShortTextIsDrawnAsPlaceholder() {
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
-                        .setPlaceholder(new ComplicationData.Builder(
-                                TYPE_SHORT_TEXT)
-                                .setShortText(PLACEHOLDER_COMPLICATION_TEXT)
-                                .build())
+                        .setPlaceholder(
+                                new ComplicationData.Builder(TYPE_SHORT_TEXT)
+                                        .setShortText(PLACEHOLDER_COMPLICATION_TEXT)
+                                        .build())
                         .build(),
                 true);
 
         mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, true);
 
-        verify(mMockCanvas).drawRoundRect(anyFloat(), anyFloat(), anyFloat(), anyFloat(),
-                anyFloat(), anyFloat(), eq(ComplicationRenderer.PLACEHOLDER_PAINT));
+        verify(mMockCanvas)
+                .drawRoundRect(
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(ComplicationRenderer.PLACEHOLDER_PAINT));
     }
 
     @Test
     public void placeholderLongTitleIsDrawnAsPlaceholder() {
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
-                        .setPlaceholder(new ComplicationData.Builder(
-                                ComplicationData.TYPE_LONG_TEXT)
-                                .setLongText(ComplicationText.plainText("Hi"))
-                                .setLongTitle(PLACEHOLDER_COMPLICATION_TEXT)
-                                .build())
+                        .setPlaceholder(
+                                new ComplicationData.Builder(ComplicationData.TYPE_LONG_TEXT)
+                                        .setLongText(ComplicationText.plainText("Hi"))
+                                        .setLongTitle(PLACEHOLDER_COMPLICATION_TEXT)
+                                        .build())
                         .build(),
                 true);
 
         mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, true);
 
-        verify(mMockCanvas).drawRoundRect(anyFloat(), anyFloat(), anyFloat(), anyFloat(),
-                anyFloat(), anyFloat(), eq(ComplicationRenderer.PLACEHOLDER_PAINT));
+        verify(mMockCanvas)
+                .drawRoundRect(
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(ComplicationRenderer.PLACEHOLDER_PAINT));
     }
 
     @Test
     public void placeholderShortTitleIsDrawnAsPlaceholder() {
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
-                        .setPlaceholder(new ComplicationData.Builder(
-                                TYPE_SHORT_TEXT)
-                                .setShortText(ComplicationText.plainText("Hi"))
-                                .setShortTitle(PLACEHOLDER_COMPLICATION_TEXT)
-                                .build())
+                        .setPlaceholder(
+                                new ComplicationData.Builder(TYPE_SHORT_TEXT)
+                                        .setShortText(ComplicationText.plainText("Hi"))
+                                        .setShortTitle(PLACEHOLDER_COMPLICATION_TEXT)
+                                        .build())
                         .build(),
                 true);
 
         mComplicationRenderer.draw(mMockCanvas, REFERENCE_TIME, false, false, false, true);
 
-        verify(mMockCanvas).drawRoundRect(anyFloat(), anyFloat(), anyFloat(), anyFloat(),
-                anyFloat(), anyFloat(), eq(ComplicationRenderer.PLACEHOLDER_PAINT));
+        verify(mMockCanvas)
+                .drawRoundRect(
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(ComplicationRenderer.PLACEHOLDER_PAINT));
     }
 
     @Test
     public void iconIsTintedWithPlaceholderTintForPlaceholderComplication() {
         mComplicationRenderer.setComplicationData(
                 new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA)
-                        .setPlaceholder(new ComplicationData.Builder(
-                                TYPE_SHORT_TEXT)
-                                .setShortText(ComplicationText.plainText("Hi"))
-                                .setIcon(Icon.createWithBitmap(
-                                        Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565)))
-                                .setShortTitle(PLACEHOLDER_COMPLICATION_TEXT)
-                                .build())
+                        .setPlaceholder(
+                                new ComplicationData.Builder(TYPE_SHORT_TEXT)
+                                        .setShortText(ComplicationText.plainText("Hi"))
+                                        .setIcon(
+                                                Icon.createWithBitmap(
+                                                        Bitmap.createBitmap(
+                                                                100, 100, Bitmap.Config.RGB_565)))
+                                        .setShortTitle(PLACEHOLDER_COMPLICATION_TEXT)
+                                        .build())
                         .build(),
                 false);
 
@@ -776,8 +799,12 @@
         assertThat(mComplicationRenderer.mMainTextRenderer.getPaint())
                 .isEqualTo(mComplicationRenderer.mActivePaintSet.mPrimaryTextPaint);
 
-        verify(mMockCanvas, atLeastOnce()).drawRoundRect(any(), anyFloat(), anyFloat(),
-                eq(mComplicationRenderer.mActivePaintSet.mBorderPaint));
+        verify(mMockCanvas, atLeastOnce())
+                .drawRoundRect(
+                        any(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(mComplicationRenderer.mActivePaintSet.mBorderPaint));
     }
 
     @Test
@@ -795,8 +822,12 @@
         assertThat(mComplicationRenderer.mMainTextRenderer.getPaint())
                 .isEqualTo(mComplicationRenderer.mActivePaintSetLostTapAction.mPrimaryTextPaint);
 
-        verify(mMockCanvas, atLeastOnce()).drawRoundRect(any(), anyFloat(), anyFloat(),
-                eq(mComplicationRenderer.mActivePaintSetLostTapAction.mBorderPaint));
+        verify(mMockCanvas, atLeastOnce())
+                .drawRoundRect(
+                        any(),
+                        anyFloat(),
+                        anyFloat(),
+                        eq(mComplicationRenderer.mActivePaintSetLostTapAction.mBorderPaint));
     }
 
     @Test
@@ -1145,8 +1176,9 @@
     public void placeholderIcon() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new MonochromaticImageComplicationData.Builder(
-                                MonochromaticImage.PLACEHOLDER, EMPTY_TEXT).build())
+                                new MonochromaticImageComplicationData.Builder(
+                                                MonochromaticImage.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderIcon).isTrue();
@@ -1156,8 +1188,9 @@
     public void placeholderSmallImage() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new SmallImageComplicationData.Builder(
-                                SmallImage.PLACEHOLDER, EMPTY_TEXT).build())
+                                new SmallImageComplicationData.Builder(
+                                                SmallImage.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderSmallImage).isTrue();
@@ -1167,8 +1200,9 @@
     public void placeholderPhotoImage() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new PhotoImageComplicationData.Builder(
-                                PhotoImageComplicationData.PLACEHOLDER, EMPTY_TEXT).build())
+                                new PhotoImageComplicationData.Builder(
+                                                PhotoImageComplicationData.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderLargeImage).isTrue();
@@ -1180,10 +1214,13 @@
                 androidx.wear.watchface.complications.data.ComplicationText.PLACEHOLDER;
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new RangedValueComplicationData.Builder(
-                                RangedValueComplicationData.PLACEHOLDER, 0f, 100f, EMPTY_TEXT)
-                                .setTitle(placeholderText)
-                                .build())
+                                new RangedValueComplicationData.Builder(
+                                                RangedValueComplicationData.PLACEHOLDER,
+                                                0f,
+                                                100f,
+                                                EMPTY_TEXT)
+                                        .setTitle(placeholderText)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderRangedValue).isTrue();
@@ -1196,18 +1233,18 @@
 
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new ShortTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
-                                .setTitle(placeholderText)
-                                .build())
+                                new ShortTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
+                                        .setTitle(placeholderText)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderText).isTrue();
 
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new LongTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
-                                .setTitle(placeholderText)
-                                .build())
+                                new LongTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
+                                        .setTitle(placeholderText)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderText).isTrue();
@@ -1220,15 +1257,16 @@
 
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new ShortTextComplicationData.Builder(placeholderText, EMPTY_TEXT).build()
-                )
+                                new ShortTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderText).isTrue();
 
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new LongTextComplicationData.Builder(placeholderText, EMPTY_TEXT).build())
+                                new LongTextComplicationData.Builder(placeholderText, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.mIsPlaceholderText).isTrue();
@@ -1238,8 +1276,9 @@
     public void placeholderIcon_notLoadedAsync() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new MonochromaticImageComplicationData.Builder(
-                                MonochromaticImage.PLACEHOLDER, EMPTY_TEXT).build())
+                                new MonochromaticImageComplicationData.Builder(
+                                                MonochromaticImage.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
@@ -1249,8 +1288,9 @@
     public void placeholderSmallImage_notLoadedAsync() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new SmallImageComplicationData.Builder(
-                                SmallImage.PLACEHOLDER, EMPTY_TEXT).build())
+                                new SmallImageComplicationData.Builder(
+                                                SmallImage.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
@@ -1260,8 +1300,9 @@
     public void placeholderPhotoImage_notLoadedAsync() {
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
-                        new PhotoImageComplicationData.Builder(
-                                PhotoImageComplicationData.PLACEHOLDER, EMPTY_TEXT).build())
+                                new PhotoImageComplicationData.Builder(
+                                                PhotoImageComplicationData.PLACEHOLDER, EMPTY_TEXT)
+                                        .build())
                         .asWireComplicationData(),
                 true);
         assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
diff --git a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationStyleTest.kt b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationStyleTest.kt
index 34b2ac7..35505e3 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationStyleTest.kt
+++ b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationStyleTest.kt
@@ -38,8 +38,9 @@
             .isEqualTo(Color.argb(127, 100, 0, 0))
 
         assertThat(
-            ComplicationStyle.tint(Color.argb(127, 50, 100, 200), Color.argb(0, 127, 127, 255))
-        ).isEqualTo(Color.argb(127, 48, 48, 97))
+                ComplicationStyle.tint(Color.argb(127, 50, 100, 200), Color.argb(0, 127, 127, 255))
+            )
+            .isEqualTo(Color.argb(127, 48, 48, 97))
     }
 
     @Test
@@ -59,4 +60,4 @@
         assertThat(tintedComplicationStyle.titleColor)
             .isEqualTo(ComplicationStyle.tint(Color.LTGRAY, Color.RED))
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications/api/current.ignore b/wear/watchface/watchface-complications/api/current.ignore
new file mode 100644
index 0000000..5d6e1bd
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetrieverKt:
+    Removed class androidx.wear.watchface.complications.ComplicationDataSourceInfoRetrieverKt
diff --git a/wear/watchface/watchface-complications/api/current.txt b/wear/watchface/watchface-complications/api/current.txt
index ad56e5f..53d23f2 100644
--- a/wear/watchface/watchface-complications/api/current.txt
+++ b/wear/watchface/watchface-complications/api/current.txt
@@ -35,9 +35,6 @@
     ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
   }
 
-  public final class ComplicationDataSourceInfoRetrieverKt {
-  }
-
   public final class ComplicationSlotBounds {
     ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds, java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeMargins);
     ctor @Deprecated public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
diff --git a/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt
index ad56e5f..53d23f2 100644
--- a/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt
@@ -35,9 +35,6 @@
     ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
   }
 
-  public final class ComplicationDataSourceInfoRetrieverKt {
-  }
-
   public final class ComplicationSlotBounds {
     ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds, java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeMargins);
     ctor @Deprecated public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
diff --git a/wear/watchface/watchface-complications/api/restricted_current.ignore b/wear/watchface/watchface-complications/api/restricted_current.ignore
index 447539a..b776ca1 100644
--- a/wear/watchface/watchface-complications/api/restricted_current.ignore
+++ b/wear/watchface/watchface-complications/api/restricted_current.ignore
@@ -1,4 +1,8 @@
 // Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.complications.ComplicationDataSourceInfoRetrieverKt:
+    Removed class androidx.wear.watchface.complications.ComplicationDataSourceInfoRetrieverKt
+
+
 RemovedMethod: androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy#DefaultComplicationDataSourcePolicy(androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat):
     Removed constructor androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy(androidx.wear.watchface.complications.data.DefaultComplicationDataSourcePolicyWireFormat)
 RemovedMethod: androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy#toWireFormat():
diff --git a/wear/watchface/watchface-complications/api/restricted_current.txt b/wear/watchface/watchface-complications/api/restricted_current.txt
index ad56e5f..53d23f2 100644
--- a/wear/watchface/watchface-complications/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications/api/restricted_current.txt
@@ -35,9 +35,6 @@
     ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
   }
 
-  public final class ComplicationDataSourceInfoRetrieverKt {
-  }
-
   public final class ComplicationSlotBounds {
     ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds, java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeMargins);
     ctor @Deprecated public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
diff --git a/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt b/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
index 230310b..74757d2 100644
--- a/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
+++ b/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.watchface.complications
 
-import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.app.Service
 import android.content.ComponentName
 import android.content.Context
@@ -25,6 +24,7 @@
 import android.graphics.drawable.Icon
 import android.os.Build
 import android.os.IBinder
+import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
 import androidx.annotation.RequiresApi
@@ -37,10 +37,10 @@
 import androidx.wear.watchface.complications.data.PlainComplicationText
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import com.google.common.truth.Truth.assertThat
+import java.time.Instant
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.time.Instant
 
 private const val LEFT_COMPLICATION_ID = 101
 private const val RIGHT_COMPLICATION_ID = 102
@@ -62,39 +62,49 @@
     private val dataSourceIcon2: Icon =
         Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888))
 
-    private val dataSourceInfos = mapOf(
-        LEFT_COMPLICATION_ID to ComplicationDataSourceInfo(
-            "DataSourceApp1",
-            "DataSource1",
-            dataSourceIcon1,
-            ComplicationType.SHORT_TEXT,
-            dataSource1
-        ),
-        RIGHT_COMPLICATION_ID to ComplicationDataSourceInfo(
-            "DataSourceApp2",
-            "DataSource2",
-            dataSourceIcon2,
-            ComplicationType.LONG_TEXT,
-            dataSource2
+    private val dataSourceInfos =
+        mapOf(
+            LEFT_COMPLICATION_ID to
+                ComplicationDataSourceInfo(
+                    "DataSourceApp1",
+                    "DataSource1",
+                    dataSourceIcon1,
+                    ComplicationType.SHORT_TEXT,
+                    dataSource1
+                ),
+            RIGHT_COMPLICATION_ID to
+                ComplicationDataSourceInfo(
+                    "DataSourceApp2",
+                    "DataSource2",
+                    dataSourceIcon2,
+                    ComplicationType.LONG_TEXT,
+                    dataSource2
+                )
         )
-    )
-    private val previewData = mapOf(
-        dataSource1 to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("Left").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-        dataSource2 to
-            LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("Right").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-        dataSource3 to
-            LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("DataSource3").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-    )
+    private val previewData =
+        mapOf(
+            dataSource1 to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Left").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+            dataSource2 to
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Right").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+            dataSource3 to
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("DataSource3").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+        )
 
     override fun getProviderInfos(
         watchFaceComponentName: ComponentName,
@@ -103,11 +113,13 @@
         if (watchFaceComponentName != watchFaceComponent) {
             return null
         }
-        return ArrayList<WireComplicationProviderInfo?>().apply {
-            for (id in ids) {
-                add(dataSourceInfos[id]?.toWireComplicationProviderInfo())
+        return ArrayList<WireComplicationProviderInfo?>()
+            .apply {
+                for (id in ids) {
+                    add(dataSourceInfos[id]?.toWireComplicationProviderInfo())
+                }
             }
-        }.toTypedArray()
+            .toTypedArray()
     }
 
     override fun getApiVersion() = IProviderInfoService.API_VERSION
@@ -128,10 +140,11 @@
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
     private val serviceIntent = Intent(context, TestProviderInfoService::class.java)
-    private val complicationDataSourceInfoRetriever = ComplicationDataSourceInfoRetriever(
-        ApplicationProvider.getApplicationContext<Context>(),
-        serviceIntent
-    )
+    private val complicationDataSourceInfoRetriever =
+        ComplicationDataSourceInfoRetriever(
+            ApplicationProvider.getApplicationContext<Context>(),
+            serviceIntent
+        )
 
     @Test
     public fun retrieveComplicationDataSourceInfo() {
@@ -163,9 +176,8 @@
                     dataSource1,
                     ComplicationType.SHORT_TEXT
                 ) as ShortTextComplicationData
-            assertThat(
-                complicationData.text.getTextAt(context.resources, Instant.EPOCH)
-            ).isEqualTo("Left")
+            assertThat(complicationData.text.getTextAt(context.resources, Instant.EPOCH))
+                .isEqualTo("Left")
             complicationDataSourceInfoRetriever.close()
         }
     }
@@ -179,4 +191,4 @@
         // This should not crash.
         complicationDataSourceInfoRetriever.close()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt b/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
index 1624c19f..e14eca1 100644
--- a/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
+++ b/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
@@ -21,8 +21,8 @@
 import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.MediumTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.test.R
 import com.google.common.truth.Truth.assertThat
@@ -49,44 +49,43 @@
         val bounds = ComplicationSlotBounds.inflate(context.resources, parser, 1.0f, 1.0f)!!
 
         // SHORT_TEXT, LONG_TEXT and RANGED_VALUE should match the input
-        assertThat(
-            bounds.perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
-        ).isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
-        assertThat(
-            bounds.perComplicationTypeMargins[ComplicationType.SHORT_TEXT]
-        ).isEqualTo(RectF(0.1f, 0.2f, 0.3f, 0.4f))
+        assertThat(bounds.perComplicationTypeBounds[ComplicationType.SHORT_TEXT])
+            .isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
+        assertThat(bounds.perComplicationTypeMargins[ComplicationType.SHORT_TEXT])
+            .isEqualTo(RectF(0.1f, 0.2f, 0.3f, 0.4f))
 
         val widthPixels = context.resources.displayMetrics.widthPixels
 
-        assertThat(
-            bounds.perComplicationTypeBounds[ComplicationType.LONG_TEXT]
-        ).isEqualTo(RectF(
-            96f * context.resources.displayMetrics.density / widthPixels,
-            96f * context.resources.displayMetrics.density / widthPixels,
-            192f * context.resources.displayMetrics.density / widthPixels,
-            192f * context.resources.displayMetrics.density / widthPixels
-        ))
+        assertThat(bounds.perComplicationTypeBounds[ComplicationType.LONG_TEXT])
+            .isEqualTo(
+                RectF(
+                    96f * context.resources.displayMetrics.density / widthPixels,
+                    96f * context.resources.displayMetrics.density / widthPixels,
+                    192f * context.resources.displayMetrics.density / widthPixels,
+                    192f * context.resources.displayMetrics.density / widthPixels
+                )
+            )
         assertThat(bounds.perComplicationTypeMargins[ComplicationType.LONG_TEXT]).isEqualTo(RectF())
 
-        assertThat(
-            bounds.perComplicationTypeBounds[ComplicationType.RANGED_VALUE]
-        ).isEqualTo(RectF(0.3f, 0.3f, 0.5f, 0.7f))
+        assertThat(bounds.perComplicationTypeBounds[ComplicationType.RANGED_VALUE])
+            .isEqualTo(RectF(0.3f, 0.3f, 0.5f, 0.7f))
 
         val center = context.resources.getDimension(R.dimen.complication_center) / widthPixels
         val halfSize =
             context.resources.getDimension(R.dimen.complication_size) / widthPixels / 2.0f
-        assertThat(
-            bounds.perComplicationTypeBounds[ComplicationType.SMALL_IMAGE]
-        ).isEqualTo(RectF(
-            center - halfSize, center - halfSize, center + halfSize, center + halfSize
-        ))
+        assertThat(bounds.perComplicationTypeBounds[ComplicationType.SMALL_IMAGE])
+            .isEqualTo(
+                RectF(center - halfSize, center - halfSize, center + halfSize, center + halfSize)
+            )
 
         // All other types should have been backfilled with an empty rect.
         for (type in ComplicationType.values()) {
-            if (type != ComplicationType.SHORT_TEXT &&
-                type != ComplicationType.LONG_TEXT &&
-                type != ComplicationType.RANGED_VALUE &&
-                type != ComplicationType.SMALL_IMAGE) {
+            if (
+                type != ComplicationType.SHORT_TEXT &&
+                    type != ComplicationType.LONG_TEXT &&
+                    type != ComplicationType.RANGED_VALUE &&
+                    type != ComplicationType.SMALL_IMAGE
+            ) {
                 assertThat(bounds.perComplicationTypeBounds[type]).isEqualTo(RectF())
             }
         }
diff --git a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
index dbc4246..be55134 100644
--- a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
@@ -15,7 +15,6 @@
  */
 package androidx.wear.watchface.complications
 
-import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.annotation.SuppressLint
 import android.content.ComponentName
 import android.content.Context
@@ -24,6 +23,7 @@
 import android.graphics.drawable.Icon
 import android.os.Build
 import android.os.IBinder
+import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
 import android.util.Log
@@ -47,28 +47,27 @@
 import androidx.wear.watchface.complications.data.SmallImageType
 import androidx.wear.watchface.complications.data.toApiComplicationData
 import androidx.wear.watchface.utility.TraceEvent
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.suspendCancellableCoroutine
 import java.lang.IllegalArgumentException
 import kotlin.coroutines.resume
 import kotlin.coroutines.resumeWithException
 import kotlinx.coroutines.CancellableContinuation
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
  * Retrieves [Result] for a watch face's complications.
  *
- *
  * To use construct an instance and call [retrieveComplicationDataSourceInfo] which returns an array
  * of [Result] objects.
  *
- *
  * Further calls to [retrieveComplicationDataSourceInfo] 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.
+ * class, but [close] must be called when it is no longer needed. Once release has been called,
+ * further retrieval attempts will fail.
  */
 public class ComplicationDataSourceInfoRetriever : AutoCloseable {
     /** Results for [retrieveComplicationDataSourceInfo]. */
-    public class Result internal constructor(
+    public class Result
+    internal constructor(
         /** The id for the complication slot, as passed to [retrieveComplicationDataSourceInfo]. */
         public val slotId: Int,
 
@@ -87,17 +86,13 @@
 
         @SuppressLint("SyntheticAccessor")
         override fun onBindingDied(name: ComponentName?) {
-            synchronized(lock) {
-                closed = true
-            }
+            synchronized(lock) { closed = true }
             deferredService.completeExceptionally(ServiceDisconnectedException())
         }
 
         @SuppressLint("SyntheticAccessor")
         override fun onServiceDisconnected(name: ComponentName) {
-            synchronized(lock) {
-                closed = true
-            }
+            synchronized(lock) { closed = true }
             deferredService.completeExceptionally(ServiceDisconnectedException())
         }
     }
@@ -108,9 +103,7 @@
     private val deferredService = CompletableDeferred<IProviderInfoService>()
     private val lock = Any()
 
-    /**
-     * @hide
-     */
+    /** @hide */
     @VisibleForTesting
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public var closed: Boolean = false
@@ -122,7 +115,9 @@
     }
 
     /** @param context the current context */
-    public constructor(context: Context) : this(
+    public constructor(
+        context: Context
+    ) : this(
         context,
         Intent(ACTION_GET_COMPLICATION_CONFIG).apply { setPackage(PROVIDER_INFO_SERVICE_PACKAGE) }
     )
@@ -130,9 +125,7 @@
     /** Exception thrown if the service disconnects. */
     public class ServiceDisconnectedException : Exception()
 
-    /**
-     * @hide
-     */
+    /** @hide */
     @VisibleForTesting
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public constructor(service: IProviderInfoService) {
@@ -140,16 +133,15 @@
     }
 
     /**
-     * Requests [Result] for the specified complication ids on the specified
-     * watch face. When the info is received, the listener will receive a callback for each id.
-     * These callbacks will occur on the main thread.
-     *
+     * Requests [Result] for the specified complication ids on the specified watch face. When the
+     * info is received, the listener will receive a callback for each id. These callbacks will
+     * occur on the main thread.
      *
      * This will only work if the package of the current app is the same as the package of the
      * specified watch face.
      *
-     * @param watchFaceComponent the ComponentName of the WatchFaceService for which info is
-     * being requested
+     * @param watchFaceComponent the ComponentName of the WatchFaceService for which info is being
+     *   requested
      * @param watchFaceComplicationIds ids of the complications that info is being requested for
      * @return An array of [Result]. If the look up fails null will be returned.
      * @throws [ServiceDisconnectedException] if the service disconnected during the call.
@@ -161,18 +153,14 @@
     ): Array<Result>? =
         TraceEvent("ComplicationDataSourceInfoRetriever.retrieveComplicationDataSourceInfo").use {
             synchronized(lock) {
-                require(!closed) {
-                    "retrieveComplicationDataSourceInfo called after close"
-                }
+                require(!closed) { "retrieveComplicationDataSourceInfo called after close" }
             }
-            awaitDeferredService().getProviderInfos(
-                watchFaceComponent, watchFaceComplicationIds
-            )?.mapIndexed { index, info ->
-                Result(
-                    watchFaceComplicationIds[index],
-                    info?.toApiComplicationDataSourceInfo()
-                )
-            }?.toTypedArray()
+            awaitDeferredService()
+                .getProviderInfos(watchFaceComponent, watchFaceComplicationIds)
+                ?.mapIndexed { index, info ->
+                    Result(watchFaceComplicationIds[index], info?.toApiComplicationDataSourceInfo())
+                }
+                ?.toTypedArray()
         }
 
     /**
@@ -182,11 +170,11 @@
      * data based on the name and icon of the provider.
      *
      * @param complicationDataSourceComponent The [ComponentName] of the complication data source
-     * from which preview data is requested.
+     *   from which preview data is requested.
      * @param complicationType The requested [ComplicationType] for the preview data.
      * @return The preview [ComplicationData] or `null` if the complication data source component
-     * doesn't exist, or if it doesn't support complicationType, or if the remote service doesn't
-     * support this API.
+     *   doesn't exist, or if it doesn't support complicationType, or if the remote service doesn't
+     *   support this API.
      * @throws [ServiceDisconnectedException] if the service disconnected during the call.
      */
     @Throws(ServiceDisconnectedException::class)
@@ -194,48 +182,45 @@
     public suspend fun retrievePreviewComplicationData(
         complicationDataSourceComponent: ComponentName,
         complicationType: ComplicationType
-    ): ComplicationData? = TraceEvent(
-        "ComplicationDataSourceInfoRetriever.requestPreviewComplicationData"
-    ).use {
-        synchronized(lock) {
-            require(!closed) {
-                "retrievePreviewComplicationData called after close"
+    ): ComplicationData? =
+        TraceEvent("ComplicationDataSourceInfoRetriever.requestPreviewComplicationData").use {
+            synchronized(lock) {
+                require(!closed) { "retrievePreviewComplicationData called after close" }
             }
-        }
-        val service = awaitDeferredService()
-        if (service.apiVersion < 1) {
-            return null
-        }
+            val service = awaitDeferredService()
+            if (service.apiVersion < 1) {
+                return null
+            }
 
-        return suspendCancellableCoroutine { continuation ->
-            val callback = PreviewComplicationDataCallback(service, continuation)
-            if (!service.requestPreviewComplicationData(
-                    complicationDataSourceComponent,
-                    complicationType.toWireComplicationType(),
-                    callback
-                )
-            ) {
-                callback.safeUnlinkToDeath()
-                continuation.resume(null)
+            return suspendCancellableCoroutine { continuation ->
+                val callback = PreviewComplicationDataCallback(service, continuation)
+                if (
+                    !service.requestPreviewComplicationData(
+                        complicationDataSourceComponent,
+                        complicationType.toWireComplicationType(),
+                        callback
+                    )
+                ) {
+                    callback.safeUnlinkToDeath()
+                    continuation.resume(null)
+                }
             }
         }
-    }
 
     private class PreviewComplicationDataCallback(
         val service: IProviderInfoService,
         var continuation: CancellableContinuation<ComplicationData?>?
     ) : IPreviewComplicationDataCallback.Stub() {
-        val deathObserver: IBinder.DeathRecipient = IBinder.DeathRecipient {
-            continuation?.resumeWithException(ServiceDisconnectedException())
-        }
+        val deathObserver: IBinder.DeathRecipient =
+            IBinder.DeathRecipient {
+                continuation?.resumeWithException(ServiceDisconnectedException())
+            }
 
         init {
             service.asBinder().linkToDeath(deathObserver, 0)
 
             // Not a huge deal but we might as well unlink the deathObserver.
-            continuation?.invokeOnCancellation {
-                safeUnlinkToDeath()
-            }
+            continuation?.invokeOnCancellation { safeUnlinkToDeath() }
         }
 
         override fun updateComplicationData(
@@ -264,15 +249,14 @@
         }
 
     /**
-     * Releases the connection to the complication system used by this class. This must
-     * be called when the retriever is no longer needed.
-     *
+     * Releases the connection to the complication system used by this class. This must be called
+     * when the retriever is no longer needed.
      *
      * Any outstanding or subsequent futures returned by [retrieveComplicationDataSourceInfo] will
      * resolve with null.
      *
-     * This class implements the Java `AutoClosable` interface and
-     * may be used with try-with-resources.
+     * This class implements the Java `AutoClosable` interface and may be used with
+     * try-with-resources.
      */
     override fun close() {
         synchronized(lock) {
@@ -297,7 +281,7 @@
     private companion object {
         private const val TAG = "ComplicationDataS"
 
-        /** The package of the service that supplies complication data source info.  */
+        /** The package of the service that supplies complication data source info. */
         private const val PROVIDER_INFO_SERVICE_PACKAGE = "com.google.android.wearable.app"
         private const val ACTION_GET_COMPLICATION_CONFIG =
             "android.support.wearable.complications.ACTION_GET_COMPLICATION_CONFIG"
@@ -305,10 +289,9 @@
 }
 
 /**
- * Holder of details of a complication data source, for use by watch faces (for example,
- * to show the current complication data source in settings). A
- * [ComplicationDataSourceInfoRetriever] can be used to obtain references of this class for each
- * of a watch face's complications.
+ * Holder of details of a complication data source, for use by watch faces (for example, to show the
+ * current complication data source in settings). A [ComplicationDataSourceInfoRetriever] can be
+ * used to obtain references of this class for each of a watch face's complications.
  */
 public class ComplicationDataSourceInfo(
     /** The name of the application containing the complication data source. */
@@ -333,67 +316,55 @@
     /**
      * Lazily constructed fallback preview [ComplicationData] based on this
      * ComplicationDataSourceInfo. This is useful when
-     * [ComplicationDataSourceInfoRetriever.retrievePreviewComplicationData] returns `null` (e.g.
-     * on a pre-android R device).
+     * [ComplicationDataSourceInfoRetriever.retrievePreviewComplicationData] returns `null` (e.g. on
+     * a pre-android R device).
      */
     public val fallbackPreviewData: ComplicationData by lazy {
         val contentDescription = PlainComplicationText.Builder(name).build()
         when (type) {
             ComplicationType.SHORT_TEXT ->
                 ShortTextComplicationData.Builder(
-                    PlainComplicationText.Builder(
-                        name.take(ShortTextComplicationData.MAX_TEXT_LENGTH)
-                    ).build(),
-                    contentDescription
-                ).setMonochromaticImage(
-                    MonochromaticImage.Builder(icon).build()
-                ).build()
-
+                        PlainComplicationText.Builder(
+                                name.take(ShortTextComplicationData.MAX_TEXT_LENGTH)
+                            )
+                            .build(),
+                        contentDescription
+                    )
+                    .setMonochromaticImage(MonochromaticImage.Builder(icon).build())
+                    .build()
             ComplicationType.LONG_TEXT ->
                 LongTextComplicationData.Builder(
-                    PlainComplicationText.Builder(name).build(),
-                    contentDescription
-                ).setMonochromaticImage(
-                    MonochromaticImage.Builder(icon).build()
-                ).build()
-
+                        PlainComplicationText.Builder(name).build(),
+                        contentDescription
+                    )
+                    .setMonochromaticImage(MonochromaticImage.Builder(icon).build())
+                    .build()
             ComplicationType.SMALL_IMAGE ->
                 SmallImageComplicationData.Builder(
-                    SmallImage.Builder(icon, SmallImageType.ICON).build(),
-                    contentDescription
-                ).build()
-
+                        SmallImage.Builder(icon, SmallImageType.ICON).build(),
+                        contentDescription
+                    )
+                    .build()
             ComplicationType.MONOCHROMATIC_IMAGE ->
                 MonochromaticImageComplicationData.Builder(
-                    MonochromaticImage.Builder(icon).build(),
-                    contentDescription
-                ).build()
-
+                        MonochromaticImage.Builder(icon).build(),
+                        contentDescription
+                    )
+                    .build()
             ComplicationType.PHOTO_IMAGE ->
-                PhotoImageComplicationData.Builder(
-                    icon,
-                    contentDescription
-                ).build()
-
+                PhotoImageComplicationData.Builder(icon, contentDescription).build()
             ComplicationType.RANGED_VALUE ->
-                RangedValueComplicationData.Builder(
-                    42f,
-                    0f,
-                    100f,
-                    contentDescription
-                ).setMonochromaticImage(MonochromaticImage.Builder(icon).build())
+                RangedValueComplicationData.Builder(42f, 0f, 100f, contentDescription)
+                    .setMonochromaticImage(MonochromaticImage.Builder(icon).build())
                     .setText(PlainComplicationText.Builder(name).build())
                     .build()
-
             else -> NoDataComplicationData()
         }
     }
 
     init {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-            require(componentName != null) {
-                "ComponentName is required on Android R and above"
-            }
+            require(componentName != null) { "ComponentName is required on Android R and above" }
         }
     }
 
@@ -433,17 +404,21 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireComplicationProviderInfo(): WireComplicationProviderInfo =
         WireComplicationProviderInfo(
-            appName, name, icon, type.toWireComplicationType(),
+            appName,
+            name,
+            icon,
+            type.toWireComplicationType(),
             componentName
         )
 }
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public fun WireComplicationProviderInfo.toApiComplicationDataSourceInfo() =
     ComplicationDataSourceInfo(
-        appName!!, providerName!!, providerIcon!!, fromWireType(complicationType),
+        appName!!,
+        providerName!!,
+        providerIcon!!,
+        fromWireType(complicationType),
         providerComponentName
     )
diff --git a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
index f0d847e..9a24586 100644
--- a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
@@ -45,9 +45,9 @@
  * lowest id that intersects the coordinates, if any, is selected.
  *
  * @param perComplicationTypeBounds Per [ComplicationType] fractional unit-square screen space
- * complication bounds.
+ *   complication bounds.
  * @param perComplicationTypeMargins Per [ComplicationType] fractional unit-square screen space
- * complication margins for tap detection (doesn't affect rendering).
+ *   complication margins for tap detection (doesn't affect rendering).
  */
 public class ComplicationSlotBounds(
     public val perComplicationTypeBounds: Map<ComplicationType, RectF>,
@@ -59,10 +59,9 @@
             "ComplicationSlotBounds(Map<ComplicationType, RectF>, Map<ComplicationType, RectF>)"
         )
     )
-    constructor(perComplicationTypeBounds: Map<ComplicationType, RectF>) : this(
-        perComplicationTypeBounds,
-        perComplicationTypeBounds.mapValues { RectF() }
-    )
+    constructor(
+        perComplicationTypeBounds: Map<ComplicationType, RectF>
+    ) : this(perComplicationTypeBounds, perComplicationTypeBounds.mapValues { RectF() })
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -116,12 +115,8 @@
             "perComplicationTypeMargins must contain entries for each ComplicationType"
         }
         for (type in ComplicationType.values()) {
-            require(perComplicationTypeBounds.containsKey(type)) {
-                "Missing bounds for $type"
-            }
-            require(perComplicationTypeMargins.containsKey(type)) {
-                "Missing margins for $type"
-            }
+            require(perComplicationTypeBounds.containsKey(type)) { "Missing bounds for $type" }
+            require(perComplicationTypeMargins.containsKey(type)) { "Missing margins for $type" }
         }
     }
 
@@ -131,11 +126,11 @@
         internal const val NODE_NAME = "ComplicationSlotBounds"
 
         /**
-         * Constructs a [ComplicationSlotBounds] from a potentially incomplete
-         * Map<ComplicationType, RectF>, backfilling with empty [RectF]s. This method is necessary
-         * because there can be a skew between the version of the library between the watch face and
-         * the system which would otherwise be problematic if new complication types have been
-         * introduced.
+         * Constructs a [ComplicationSlotBounds] from a potentially incomplete Map<ComplicationType,
+         * RectF>, backfilling with empty [RectF]s. This method is necessary because there can be a
+         * skew between the version of the library between the watch face and the system which would
+         * otherwise be problematic if new complication types have been introduced.
+         *
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -169,65 +164,62 @@
             parser.iterate {
                 when (parser.name) {
                     NODE_NAME -> {
-                        val rect = if (parser.hasValue("left"))
-                            RectF(
-                                parser.requireAndGet("left", resources, complicationScaleX),
-                                parser.requireAndGet("top", resources, complicationScaleY),
-                                parser.requireAndGet("right", resources, complicationScaleX),
-                                parser.requireAndGet("bottom", resources, complicationScaleY)
-                            )
-                        else if (parser.hasValue("center_x")) {
-                            val halfWidth =
-                                parser.requireAndGet("size_x", resources, complicationScaleX) / 2.0f
-                            val halfHeight =
-                                parser.requireAndGet("size_y", resources, complicationScaleY) / 2.0f
-                            val centerX =
-                                parser.requireAndGet("center_x", resources, complicationScaleX)
-                            val centerY =
-                                parser.requireAndGet("center_y", resources, complicationScaleY)
-                            RectF(
-                                centerX - halfWidth,
-                                centerY - halfHeight,
-                                centerX + halfWidth,
-                                centerY + halfHeight
-                            )
-                        } else {
-                            throw IllegalArgumentException("$NODE_NAME must " +
-                                "either define top, bottom, left, right" +
-                                "or center_x, center_y, size_x, size_y should be specified")
-                        }
-                        val margin = RectF(
-                            parser.get("marginLeft", resources, complicationScaleX) ?: 0f,
-                            parser.get("marginTop", resources, complicationScaleY) ?: 0f,
-                            parser.get("marginRight", resources, complicationScaleX) ?: 0f,
-                            parser.get("marginBottom", resources, complicationScaleY) ?: 0f
-                        )
-                        if (null != parser.getAttributeValue(
-                                NAMESPACE_APP,
-                                "complicationType"
-                            )
-                        ) {
-                            val complicationType = ComplicationType.fromWireType(
-                                parser.getAttributeIntValue(
-                                    NAMESPACE_APP,
-                                    "complicationType",
-                                    0
+                        val rect =
+                            if (parser.hasValue("left"))
+                                RectF(
+                                    parser.requireAndGet("left", resources, complicationScaleX),
+                                    parser.requireAndGet("top", resources, complicationScaleY),
+                                    parser.requireAndGet("right", resources, complicationScaleX),
+                                    parser.requireAndGet("bottom", resources, complicationScaleY)
                                 )
+                            else if (parser.hasValue("center_x")) {
+                                val halfWidth =
+                                    parser.requireAndGet("size_x", resources, complicationScaleX) /
+                                        2.0f
+                                val halfHeight =
+                                    parser.requireAndGet("size_y", resources, complicationScaleY) /
+                                        2.0f
+                                val centerX =
+                                    parser.requireAndGet("center_x", resources, complicationScaleX)
+                                val centerY =
+                                    parser.requireAndGet("center_y", resources, complicationScaleY)
+                                RectF(
+                                    centerX - halfWidth,
+                                    centerY - halfHeight,
+                                    centerX + halfWidth,
+                                    centerY + halfHeight
+                                )
+                            } else {
+                                throw IllegalArgumentException(
+                                    "$NODE_NAME must " +
+                                        "either define top, bottom, left, right" +
+                                        "or center_x, center_y, size_x, size_y should be specified"
+                                )
+                            }
+                        val margin =
+                            RectF(
+                                parser.get("marginLeft", resources, complicationScaleX) ?: 0f,
+                                parser.get("marginTop", resources, complicationScaleY) ?: 0f,
+                                parser.get("marginRight", resources, complicationScaleX) ?: 0f,
+                                parser.get("marginBottom", resources, complicationScaleY) ?: 0f
                             )
-                            require(
-                                !perComplicationTypeBounds.contains(complicationType)
-                            ) {
+                        if (null != parser.getAttributeValue(NAMESPACE_APP, "complicationType")) {
+                            val complicationType =
+                                ComplicationType.fromWireType(
+                                    parser.getAttributeIntValue(
+                                        NAMESPACE_APP,
+                                        "complicationType",
+                                        0
+                                    )
+                                )
+                            require(!perComplicationTypeBounds.contains(complicationType)) {
                                 "Duplicate $complicationType"
                             }
                             perComplicationTypeBounds[complicationType] = rect
                             perComplicationTypeMargins[complicationType] = margin
                         } else {
                             for (complicationType in ComplicationType.values()) {
-                                require(
-                                    !perComplicationTypeBounds.contains(
-                                        complicationType
-                                    )
-                                ) {
+                                require(!perComplicationTypeBounds.contains(complicationType)) {
                                     "Duplicate $complicationType"
                                 }
                                 perComplicationTypeBounds[complicationType] = rect
@@ -254,17 +246,11 @@
     scale: Float
 ): Float {
     val value = get(id, resources, scale)
-    require(value != null) {
-        "${ComplicationSlotBounds.NODE_NAME} must define '$id'"
-    }
+    require(value != null) { "${ComplicationSlotBounds.NODE_NAME} must define '$id'" }
     return value
 }
 
-internal fun XmlResourceParser.get(
-    id: String,
-    resources: Resources,
-    scale: Float
-): Float? {
+internal fun XmlResourceParser.get(id: String, resources: Resources, scale: Float): Float? {
     val stringValue = getAttributeValue(NAMESPACE_APP, id) ?: return null
     val resId = getAttributeResourceValue(NAMESPACE_APP, id, 0)
     if (resId != 0) {
@@ -296,4 +282,4 @@
     dos.writeFloat(right)
     dos.writeFloat(top)
     dos.writeFloat(bottom)
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
index b7ae041..4ba1f81 100644
--- a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
@@ -26,11 +26,11 @@
 import java.util.ArrayList
 
 /**
- * A watch face may wish to try and set one or more non-system data sources as the default
- * data source for a complication. If a complication data source can't be used for some reason (e.g.
- * it isn't installed or it doesn't support the requested type, or the watch face lacks the
- * necessary permission) then the next one will be tried. A system complication data source acts
- * as a final fallback in case no non-system data sources can be used.
+ * A watch face may wish to try and set one or more non-system data sources as the default data
+ * source for a complication. If a complication data source can't be used for some reason (e.g. it
+ * isn't installed or it doesn't support the requested type, or the watch face lacks the necessary
+ * permission) then the next one will be tried. A system complication data source acts as a final
+ * fallback in case no non-system data sources can be used.
  *
  * If the DefaultComplicationDataSourcePolicy is empty then no default is set.
  */
@@ -54,8 +54,7 @@
     public val secondaryDataSourceDefaultType: ComplicationType?
 
     /** Fallback in case none of the non-system data sources could be used. */
-    @DataSourceId
-    public val systemDataSourceFallback: Int
+    @DataSourceId public val systemDataSourceFallback: Int
 
     /** The default [ComplicationType] for [systemDataSourceFallback]. */
     public val systemDataSourceFallbackDefaultType: ComplicationType
@@ -86,8 +85,7 @@
         }
 
         this.systemDataSourceFallback = systemDataSourceFallback
-        this.systemDataSourceFallbackDefaultType =
-            systemDataSourceFallbackDefaultType
+        this.systemDataSourceFallbackDefaultType = systemDataSourceFallbackDefaultType
     }
 
     /** No default complication data source. */
@@ -100,9 +98,7 @@
         systemDataSourceFallbackDefaultType = ComplicationType.NOT_CONFIGURED
     }
 
-    /**
-     * Uses [systemProvider] as the default complication data source.
-     */
+    /** Uses [systemProvider] as the default complication data source. */
     @Deprecated(
         "Use a constructor that sets the DefaultTypes",
         ReplaceWith("DefaultComplicationDataSourcePolicy(Int, ComplicationType)")
@@ -145,10 +141,7 @@
                 " ComplicationType)"
         )
     )
-    public constructor(
-        dataSource: ComponentName,
-        @DataSourceId systemDataSourceFallback: Int
-    ) {
+    public constructor(dataSource: ComponentName, @DataSourceId systemDataSourceFallback: Int) {
         primaryDataSource = dataSource
         primaryDataSourceDefaultType = null
         secondaryDataSource = null
@@ -162,14 +155,14 @@
      * not present then [systemDataSourceFallback] will be used instead.
      *
      * @param primaryDataSource The data source to try.
-     * @param primaryDataSourceDefaultType The default [ComplicationType] if
-     * primaryDataSource is selected. Note Pre-R this will be ignored in favour of
-     * [systemDataSourceFallbackDefaultType].
+     * @param primaryDataSourceDefaultType The default [ComplicationType] if primaryDataSource is
+     *   selected. Note Pre-R this will be ignored in favour of
+     *   [systemDataSourceFallbackDefaultType].
      * @param systemDataSourceFallback The system data source to fall back on if neither provider is
-     * available.
+     *   available.
      * @param systemDataSourceFallbackDefaultType The default [ComplicationType] if
-     * systemDataSourceFallback is selected.
-    */
+     *   systemDataSourceFallback is selected.
+     */
     public constructor(
         primaryDataSource: ComponentName,
         primaryDataSourceDefaultType: ComplicationType,
@@ -215,17 +208,17 @@
      * [systemDataSourceFallback] will be used instead.
      *
      * @param primaryDataSource The first data source to try.
-     * @param primaryDataSourceDefaultType The default [ComplicationType] if
-     * primaryDataSource is selected. Note Pre-R this will be ignored in favour of
-     * [systemDataSourceFallbackDefaultType].
+     * @param primaryDataSourceDefaultType The default [ComplicationType] if primaryDataSource is
+     *   selected. Note Pre-R this will be ignored in favour of
+     *   [systemDataSourceFallbackDefaultType].
      * @param secondaryDataSource The second data source to try.
-     * @param secondaryDataSourceDefaultType The default [ComplicationType] if
-     * secondaryDataSource is selected. Note Pre-R this will be ignored in favour of
-     * [systemDataSourceFallbackDefaultType].
+     * @param secondaryDataSourceDefaultType The default [ComplicationType] if secondaryDataSource
+     *   is selected. Note Pre-R this will be ignored in favour of
+     *   [systemDataSourceFallbackDefaultType].
      * @param systemDataSourceFallback The system data source to fall back on if neither provider is
-     * available.
+     *   available.
      * @param systemDataSourceFallbackDefaultType The default [ComplicationType] if
-     * systemDataSourceFallback is selected.
+     *   systemDataSourceFallback is selected.
      */
     public constructor(
         primaryDataSource: ComponentName,
@@ -249,36 +242,38 @@
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun dataSourcesAsList(): ArrayList<ComponentName> = ArrayList<ComponentName>().apply {
-        primaryDataSource?.let { add(it) }
-        secondaryDataSource?.let { add(it) }
-    }
+    public fun dataSourcesAsList(): ArrayList<ComponentName> =
+        ArrayList<ComponentName>().apply {
+            primaryDataSource?.let { add(it) }
+            secondaryDataSource?.let { add(it) }
+        }
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public constructor(wireFormat: DefaultComplicationDataSourcePolicyWireFormat) : this(
+    public constructor(
+        wireFormat: DefaultComplicationDataSourcePolicyWireFormat
+    ) : this(
         wireFormat.mDefaultDataSourcesToTry,
         wireFormat.mFallbackSystemDataSource,
         ComplicationType.fromWireType(wireFormat.mPrimaryDataSourceDefaultType),
         ComplicationType.fromWireType(wireFormat.mSecondaryDataSourceDefaultType),
         ComplicationType.fromWireType(wireFormat.mDefaultType)
-    ) {
-    }
+    ) {}
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): DefaultComplicationDataSourcePolicyWireFormat {
-        val systemDataSourceFallbackDefaultType = systemDataSourceFallbackDefaultType
-            .toWireComplicationType()
+        val systemDataSourceFallbackDefaultType =
+            systemDataSourceFallbackDefaultType.toWireComplicationType()
 
         return DefaultComplicationDataSourcePolicyWireFormat(
             dataSourcesAsList(),
             systemDataSourceFallback,
             systemDataSourceFallbackDefaultType,
-            primaryDataSourceDefaultType
-                ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType,
-            secondaryDataSourceDefaultType
-                ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType
+            primaryDataSourceDefaultType?.toWireComplicationType()
+                ?: systemDataSourceFallbackDefaultType,
+            secondaryDataSourceDefaultType?.toWireComplicationType()
+                ?: systemDataSourceFallbackDefaultType
         )
     }
 
@@ -363,14 +358,19 @@
             require(parser.hasValue("systemDataSourceFallback")) {
                 "A $nodeName must have a systemDataSourceFallback attribute"
             }
-            val systemDataSourceFallback = parser.getAttributeIntValue(
-                NAMESPACE_APP, "systemDataSourceFallback", 0)
+            val systemDataSourceFallback =
+                parser.getAttributeIntValue(NAMESPACE_APP, "systemDataSourceFallback", 0)
             require(parser.hasValue("systemDataSourceFallbackDefaultType")) {
                 "A $nodeName must have a systemDataSourceFallbackDefaultType attribute"
             }
-            val systemDataSourceFallbackDefaultType = ComplicationType.fromWireType(
-                parser.getAttributeIntValue(
-                    NAMESPACE_APP, "systemDataSourceFallbackDefaultType", 0))
+            val systemDataSourceFallbackDefaultType =
+                ComplicationType.fromWireType(
+                    parser.getAttributeIntValue(
+                        NAMESPACE_APP,
+                        "systemDataSourceFallbackDefaultType",
+                        0
+                    )
+                )
             return when {
                 secondaryDataSource != null -> {
                     require(primaryDataSource != null) {
@@ -393,7 +393,6 @@
                         systemDataSourceFallbackDefaultType
                     )
                 }
-
                 primaryDataSource != null -> {
                     require(primaryDataSourceDefaultType != null) {
                         "If a primaryDataSource is specified, a " +
@@ -406,7 +405,6 @@
                         systemDataSourceFallbackDefaultType
                     )
                 }
-
                 else -> {
                     DefaultComplicationDataSourcePolicy(
                         systemDataSourceFallback,
diff --git a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
index 9a7e6ce..b1aa875 100644
--- a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
@@ -27,16 +27,15 @@
     public companion object {
         // NEXT AVAILABLE DATA SOURCE ID: 17
 
-        /** Specifies that no complication data source should be used.  */
+        /** Specifies that no complication data source should be used. */
         public const val NO_DATA_SOURCE: Int = -1
 
         /**
          * Id for the 'watch battery' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports the following types:
          * [ComplicationType.MONOCHROMATIC_IMAGE], [ComplicationType.SHORT_TEXT],
@@ -48,8 +47,8 @@
          * Id for the 'date' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports only [ComplicationType.SHORT_TEXT].
          */
@@ -59,8 +58,8 @@
          * Id for the 'time and date' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports only [ComplicationType.SHORT_TEXT].
          */
@@ -81,8 +80,8 @@
          * Id for the 'world clock' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports only [ComplicationType.SHORT_TEXT].
          */
@@ -92,8 +91,8 @@
          * Id for the 'app shortcut' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports the following types:
          * [ComplicationType.SMALL_IMAGE], [ComplicationType.LONG_TEXT].
@@ -104,8 +103,8 @@
          * Id for the 'unread notification count' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports the following types:
          * [ComplicationType.MONOCHROMATIC_IMAGE], [ComplicationType.SHORT_TEXT].
@@ -147,8 +146,8 @@
          * Id for the 'day of week' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports only [ComplicationType.SHORT_TEXT].
          */
@@ -172,8 +171,8 @@
          * Id for the 'day and date' complication complication data source.
          *
          * This is a safe complication data source, 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.
+         * will be able to receive data from it even before the RECEIVE_COMPLICATION_DATA permission
+         * has been granted.
          *
          * This complication data source supports only [ComplicationType.SHORT_TEXT].
          */
@@ -200,9 +199,7 @@
         DATA_SOURCE_FAVORITE_CONTACT,
         DATA_SOURCE_DAY_AND_DATE
     )
-    @RestrictTo(
-        RestrictTo.Scope.LIBRARY_GROUP
-    )
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @Retention(AnnotationRetention.SOURCE)
     public annotation class DataSourceId
 }
diff --git a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/XmlUtils.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/XmlUtils.kt
index bb237b3..b7cbd9f 100644
--- a/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/XmlUtils.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/XmlUtils.kt
@@ -24,9 +24,7 @@
 import androidx.annotation.RestrictTo
 import org.xmlpull.v1.XmlPullParser
 
-/**
- * Exception to be thrown if an incorrect node is reached during parsing.
- */
+/** Exception to be thrown if an incorrect node is reached during parsing. */
 /** @hide */
 class IllegalNodeException(parser: XmlResourceParser) :
     IllegalArgumentException("Unexpected node ${parser.name} at line ${parser.lineNumber}")
@@ -61,9 +59,7 @@
         type = next()
     } while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG)
 
-    require(name == expectedNode) {
-        "Expected a $expectedNode node but is $name"
-    }
+    require(name == expectedNode) { "Expected a $expectedNode node but is $name" }
 }
 
 /**
@@ -75,11 +71,7 @@
  * @param name the name of the attribute.
  * @hide
  */
-fun getStringRefAttribute(
-    resources: Resources,
-    parser: XmlResourceParser,
-    name: String
-): String? {
+fun getStringRefAttribute(resources: Resources, parser: XmlResourceParser, name: String): String? {
     return if (parser.hasValue(name)) {
         val resId = parser.getAttributeResourceValue(NAMESPACE_APP, name, 0)
         if (resId == 0) {
@@ -99,11 +91,7 @@
  * @param name the name of the attribute.
  * @hide
  */
-fun getIntRefAttribute(
-    resources: Resources,
-    parser: XmlResourceParser,
-    name: String
-): Int? {
+fun getIntRefAttribute(resources: Resources, parser: XmlResourceParser, name: String): Int? {
     return if (parser.hasValue(name)) {
         val resId = parser.getAttributeResourceValue(NAMESPACE_APP, name, 0)
         if (resId == 0) {
diff --git a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
index 7115a09..ded8016 100644
--- a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
+++ b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
@@ -32,8 +32,8 @@
 import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.complications.data.SmallImageComplicationData
 import com.google.common.truth.Truth.assertThat
-import org.mockito.Mockito
 import kotlin.jvm.java
+import org.mockito.Mockito
 
 @org.junit.runner.RunWith(SharedRobolectricTestRunner::class)
 public class ComplicationDataSourceInfoRetrieverTest {
@@ -54,20 +54,22 @@
 
             val testData: ComplicationData =
                 LongTextComplicationData.Builder(
-                    PlainComplicationText.Builder("Test Text")
-                        .build(),
-                    ComplicationText.Companion.EMPTY
-                ).build()
+                        PlainComplicationText.Builder("Test Text").build(),
+                        ComplicationText.Companion.EMPTY
+                    )
+                    .build()
 
             Mockito.doAnswer {
-                val callback = it.arguments[2] as IPreviewComplicationDataCallback
-                callback.updateComplicationData(testData.asWireComplicationData())
-                true
-            }.`when`(mockService).requestPreviewComplicationData(
-                org.mockito.ArgumentMatchers.eq(component),
-                org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
-                org.mockito.ArgumentMatchers.any()
-            )
+                    val callback = it.arguments[2] as IPreviewComplicationDataCallback
+                    callback.updateComplicationData(testData.asWireComplicationData())
+                    true
+                }
+                .`when`(mockService)
+                .requestPreviewComplicationData(
+                    org.mockito.ArgumentMatchers.eq(component),
+                    org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+                    org.mockito.ArgumentMatchers.any()
+                )
 
             val previewData =
                 complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
@@ -76,11 +78,14 @@
                 )!!
             assertThat(previewData.type).isEqualTo(type)
             assertThat(
-                (previewData as LongTextComplicationData).text.getTextAt(
-                    ApplicationProvider.getApplicationContext<Context>().resources,
-                    java.time.Instant.EPOCH
+                    (previewData as LongTextComplicationData)
+                        .text
+                        .getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            java.time.Instant.EPOCH
+                        )
                 )
-            ).isEqualTo("Test Text")
+                .isEqualTo("Test Text")
         }
     }
 
@@ -94,21 +99,24 @@
             Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
 
             Mockito.doAnswer {
-                val callback = it.arguments[2] as IPreviewComplicationDataCallback
-                callback.updateComplicationData(null)
-                true
-            }.`when`(mockService).requestPreviewComplicationData(
-                org.mockito.ArgumentMatchers.eq(component),
-                org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
-                org.mockito.ArgumentMatchers.any()
-            )
+                    val callback = it.arguments[2] as IPreviewComplicationDataCallback
+                    callback.updateComplicationData(null)
+                    true
+                }
+                .`when`(mockService)
+                .requestPreviewComplicationData(
+                    org.mockito.ArgumentMatchers.eq(component),
+                    org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+                    org.mockito.ArgumentMatchers.any()
+                )
 
             assertThat(
-                complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
-                    component,
-                    type
+                    complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
+                        component,
+                        type
+                    )
                 )
-            ).isNull()
+                .isNull()
         }
     }
 
@@ -122,11 +130,12 @@
             Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
 
             assertThat(
-                complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
-                    component,
-                    type
+                    complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
+                        component,
+                        type
+                    )
                 )
-            ).isNull()
+                .isNull()
         }
     }
 
@@ -138,151 +147,180 @@
             val type = ComplicationType.LONG_TEXT
             Mockito.`when`(mockService.apiVersion).thenReturn(1)
             Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
-            Mockito.doAnswer {
-                false
-            }.`when`(mockService).requestPreviewComplicationData(
-                org.mockito.ArgumentMatchers.eq(component),
-                org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
-                org.mockito.ArgumentMatchers.any()
-            )
+            Mockito.doAnswer { false }
+                .`when`(mockService)
+                .requestPreviewComplicationData(
+                    org.mockito.ArgumentMatchers.eq(component),
+                    org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+                    org.mockito.ArgumentMatchers.any()
+                )
 
             assertThat(
-                complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
-                    component,
-                    type
+                    complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
+                        component,
+                        type
+                    )
                 )
-            ).isNull()
+                .isNull()
         }
     }
 
     @org.junit.Test
     public fun complicationDataSourceInfo_NullComponentName() {
-        val complicationDataSourceInfo = ComplicationDataSourceInfo(
-            "appName",
-            "name",
-            android.graphics.drawable.Icon.createWithContentUri("icon"),
-            ComplicationType.SHORT_TEXT,
-            componentName = null
-        )
+        val complicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "appName",
+                "name",
+                android.graphics.drawable.Icon.createWithContentUri("icon"),
+                ComplicationType.SHORT_TEXT,
+                componentName = null
+            )
         assertThat(complicationDataSourceInfo.componentName).isNull()
-        assertThat(complicationDataSourceInfo.toString()).isEqualTo(
-            "ComplicationDataSourceInfo(appName=appName, name=name, type=SHORT_TEXT" +
-                ", icon=Icon(typ=URI uri=icon), componentName=null)"
-        )
+        assertThat(complicationDataSourceInfo.toString())
+            .isEqualTo(
+                "ComplicationDataSourceInfo(appName=appName, name=name, type=SHORT_TEXT" +
+                    ", icon=Icon(typ=URI uri=icon), componentName=null)"
+            )
     }
 
     @org.junit.Test
     public fun createShortTextFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val shortTextPreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.SHORT_TEXT,
-            componentName = null
-        ).fallbackPreviewData as ShortTextComplicationData
+        val shortTextPreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.SHORT_TEXT,
+                    componentName = null
+                )
+                .fallbackPreviewData as ShortTextComplicationData
+        assertThat(shortTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH))
+            .isEqualTo("complic")
         assertThat(
-            shortTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complic")
-        assertThat(
-            shortTextPreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
+                shortTextPreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
+            )
+            .isEqualTo("complicationName")
         assertThat(shortTextPreviewData.monochromaticImage!!.image).isEqualTo(icon)
     }
 
     @org.junit.Test
     public fun createLongTextFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val longTextPreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.LONG_TEXT,
-            componentName = null
-        ).fallbackPreviewData as LongTextComplicationData
+        val longTextPreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.LONG_TEXT,
+                    componentName = null
+                )
+                .fallbackPreviewData as LongTextComplicationData
+        assertThat(longTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH))
+            .isEqualTo("complicationName")
         assertThat(
-            longTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
-        assertThat(
-            longTextPreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
+                longTextPreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
+            )
+            .isEqualTo("complicationName")
         assertThat(longTextPreviewData.monochromaticImage!!.image).isEqualTo(icon)
     }
 
     @org.junit.Test
     public fun createSmallImageFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val smallImagePreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.SMALL_IMAGE,
-            componentName = null
-        ).fallbackPreviewData as SmallImageComplicationData
+        val smallImagePreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.SMALL_IMAGE,
+                    componentName = null
+                )
+                .fallbackPreviewData as SmallImageComplicationData
         assertThat(smallImagePreviewData.smallImage.image).isEqualTo(icon)
         assertThat(
-            smallImagePreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
+                smallImagePreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
+            )
+            .isEqualTo("complicationName")
     }
 
     @org.junit.Test
     public fun createPhotoImageFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val photoImagePreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.PHOTO_IMAGE,
-            componentName = null
-        ).fallbackPreviewData as PhotoImageComplicationData
+        val photoImagePreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.PHOTO_IMAGE,
+                    componentName = null
+                )
+                .fallbackPreviewData as PhotoImageComplicationData
         assertThat(photoImagePreviewData.photoImage).isEqualTo(icon)
         assertThat(
-            photoImagePreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
+                photoImagePreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
+            )
+            .isEqualTo("complicationName")
     }
 
     @org.junit.Test
     public fun createMonochromaticImageFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val monochromaticImagePreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            componentName = null
-        ).fallbackPreviewData as MonochromaticImageComplicationData
-        assertThat(monochromaticImagePreviewData.monochromaticImage.image)
-            .isEqualTo(icon)
+        val monochromaticImagePreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    componentName = null
+                )
+                .fallbackPreviewData as MonochromaticImageComplicationData
+        assertThat(monochromaticImagePreviewData.monochromaticImage.image).isEqualTo(icon)
         assertThat(
-            monochromaticImagePreviewData.contentDescription!!.getTextAt(
-                resources,
-                java.time.Instant.EPOCH
+                monochromaticImagePreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
             )
-        ).isEqualTo("complicationName")
+            .isEqualTo("complicationName")
     }
 
     @org.junit.Test
     public fun createRangedValueFallbackPreviewData() {
         val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
-        val rangedValuePreviewData = ComplicationDataSourceInfo(
-            "applicationName",
-            "complicationName",
-            icon,
-            ComplicationType.RANGED_VALUE,
-            componentName = null
-        ).fallbackPreviewData as RangedValueComplicationData
+        val rangedValuePreviewData =
+            ComplicationDataSourceInfo(
+                    "applicationName",
+                    "complicationName",
+                    icon,
+                    ComplicationType.RANGED_VALUE,
+                    componentName = null
+                )
+                .fallbackPreviewData as RangedValueComplicationData
         assertThat(rangedValuePreviewData.min).isEqualTo(0.0f)
         assertThat(rangedValuePreviewData.max).isEqualTo(100.0f)
         assertThat(rangedValuePreviewData.value).isEqualTo(42.0f)
-        assertThat(
-            rangedValuePreviewData.text!!.getTextAt(resources, java.time.Instant.EPOCH)
-        ).isEqualTo("complicationName")
+        assertThat(rangedValuePreviewData.text!!.getTextAt(resources, java.time.Instant.EPOCH))
+            .isEqualTo("complicationName")
         assertThat(rangedValuePreviewData.monochromaticImage!!.image).isEqualTo(icon)
         assertThat(
-            rangedValuePreviewData.contentDescription!!.getTextAt(
-                resources,
-                java.time.Instant.EPOCH
+                rangedValuePreviewData.contentDescription!!.getTextAt(
+                    resources,
+                    java.time.Instant.EPOCH
+                )
             )
-        ).isEqualTo("complicationName")
+            .isEqualTo("complicationName")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
index 0e5262a..468eae9 100644
--- a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
+++ b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationSlotBoundsTest.kt
@@ -26,15 +26,14 @@
 class ComplicationSlotBoundsTest {
     @Test
     public fun createFromPartialMap() {
-        val complicationSlotBounds = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f)
+        val complicationSlotBounds =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f))
             )
-        )
 
         val bounds = complicationSlotBounds.perComplicationTypeBounds
 
@@ -67,72 +66,65 @@
 
     @Test
     fun equality() {
-        val complicationSlotBoundsA = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f)
+        val complicationSlotBoundsA =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f))
             )
-        )
 
-        val complicationSlotBoundsB = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f)
+        val complicationSlotBoundsB =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f))
             )
-        )
 
-        val complicationSlotBoundsC = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f)
+        val complicationSlotBoundsC =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f))
             )
-        )
 
-        val complicationSlotBoundsD = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(3f, 2f, 1f, 0f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f)
+        val complicationSlotBoundsD =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(3f, 2f, 1f, 0f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.4f, 0.3f, 0.2f, 0.1f))
             )
-        )
 
-        val complicationSlotBoundsE = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f)
+        val complicationSlotBoundsE =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f))
             )
-        )
 
-        val complicationSlotBoundsF = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f)
-            ),
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f)
+        val complicationSlotBoundsF =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f)),
+                mapOf(ComplicationType.SHORT_TEXT to RectF(3f, 2f, 1f, 0f))
             )
-        )
 
-        val complicationSlotBoundsG = ComplicationSlotBounds.createFromPartialMap(
-            mapOf(
-                ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            emptyMap()
-        )
+        val complicationSlotBoundsG =
+            ComplicationSlotBounds.createFromPartialMap(
+                mapOf(
+                    ComplicationType.SHORT_TEXT to RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT to RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                emptyMap()
+            )
 
         assertThat(complicationSlotBoundsA).isEqualTo(complicationSlotBoundsB)
         assertThat(complicationSlotBoundsA).isNotEqualTo(complicationSlotBoundsC)
@@ -141,4 +133,4 @@
         assertThat(complicationSlotBoundsA).isNotEqualTo(complicationSlotBoundsF)
         assertThat(complicationSlotBoundsA).isNotEqualTo(complicationSlotBoundsG)
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
index 3ea24e0..cab63c6 100644
--- a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
+++ b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
@@ -25,8 +25,10 @@
     RobolectricTestRunner(testClass) {
 
     override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration =
-        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method)).apply {
-            doNotInstrumentPackage("androidx.wear")
-            doNotInstrumentPackage("android.support.wearable")
-        }.build()
+        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
+            .apply {
+                doNotInstrumentPackage("androidx.wear")
+                doNotInstrumentPackage("android.support.wearable")
+            }
+            .build()
 }
diff --git a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
index 624d10d..6e1566a 100644
--- a/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
+++ b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
@@ -17,10 +17,10 @@
 package androidx.wear.watchface.complications
 
 import com.google.common.truth.Truth.assertWithMessage
+import kotlin.reflect.KProperty
 import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
-import kotlin.reflect.KProperty
 
 @RunWith(SharedRobolectricTestRunner::class)
 public class SystemDataSourcesTest {
@@ -34,12 +34,8 @@
                 return
             }
             // Must be final and const.
-            assertWithMessage("${member.name} should be final")
-                .that(member.isFinal)
-                .isTrue()
-            assertWithMessage("${member.name} should be const")
-                .that(member.isConst)
-                .isTrue()
+            assertWithMessage("${member.name} should be final").that(member.isFinal).isTrue()
+            assertWithMessage("${member.name} should be const").that(member.isConst).isTrue()
             when (val value = member.getter.call(SystemDataSources.Companion)) {
                 is Int -> {
                     valuesMap[value]?.let {
@@ -51,4 +47,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
index f339375..e2b8183 100644
--- a/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
+++ b/wear/watchface/watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
@@ -40,7 +40,7 @@
     /**
      * API version number. This should be incremented every time a new method is added.
      */
-    const int API_VERSION = 7;
+    const int API_VERSION = 8;
 
     /** Indicates a "down" touch event on the watch face. */
     const int TAP_TYPE_DOWN = 0;
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
index bf8a056..b2a8463 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
@@ -34,8 +34,7 @@
         public const val KEY_BOUNDS: String = "KEY_BOUNDS"
         public const val KEY_TEXT: String = "KEY_TEXT"
 
-        @SuppressWarnings("IntentName")
-        public const val KEY_TAP_ACTION: String = "KEY_TAP_ACTION"
+        @SuppressWarnings("IntentName") public const val KEY_TAP_ACTION: String = "KEY_TAP_ACTION"
 
         // Keys for [WatchFaceStyle].
         public const val KEY_COMPONENT: String = "component"
@@ -98,8 +97,7 @@
         public const val COMMAND_TOUCH_CANCEL: String = "android.wallpaper.touch_cancel"
 
         // Various binder extras.
-        @SuppressWarnings("ActionValue")
-        public const val EXTRA_BINDER: String = "binder"
+        @SuppressWarnings("ActionValue") public const val EXTRA_BINDER: String = "binder"
 
         @SuppressWarnings("ActionValue")
         public const val EXTRA_AMBIENT_MODE: String = "ambient_mode"
@@ -139,17 +137,17 @@
          * Property in bundle passed to [Engine.onPropertiesChanged] to indicate whether burn-in
          * protection is required. When this property is set to true, views are shifted around
          * periodically in ambient mode. To ensure that content isn't shifted off the screen, watch
-         * faces should avoid placing content within 10 pixels of the edge of the screen. Watch faces
-         * should also avoid solid white areas to prevent pixel burn-in. Both of these requirements only
-         * apply in ambient mode, and only when this property is set to true.
+         * faces should avoid placing content within 10 pixels of the edge of the screen. Watch
+         * faces should also avoid solid white areas to prevent pixel burn-in. Both of these
+         * requirements only apply in ambient mode, and only when this property is set to true.
          */
         public const val PROPERTY_BURN_IN_PROTECTION: String = "burn_in_protection"
 
         /**
-         * Property in bundle passed to [Engine.onPropertiesChanged] to indicate whether the
-         * device has low-bit ambient mode. When this property is set to true, the screen supports fewer
-         * bits for each color in ambient mode. In this case, watch faces should disable anti-aliasing
-         * in ambient mode.
+         * Property in bundle passed to [Engine.onPropertiesChanged] to indicate whether the device
+         * has low-bit ambient mode. When this property is set to true, the screen supports fewer
+         * bits for each color in ambient mode. In this case, watch faces should disable
+         * anti-aliasing in ambient mode.
          */
         public const val PROPERTY_LOW_BIT_AMBIENT: String = "low_bit_ambient"
 
@@ -168,8 +166,8 @@
             "androidx.wear.watchface.MULTIPLE_INSTANCES_ALLOWED"
 
         /**
-         * Metadata flag indicating the watch face service exposes flavors. The system will
-         * access them only if this flag is present in manifest.
+         * Metadata flag indicating the watch face service exposes flavors. The system will access
+         * them only if this flag is present in manifest.
          */
         public const val META_DATA_FLAVORS_SUPPORTED: String =
             "androidx.wear.watchface.FLAVORS_SUPPORTED"
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/ParcelableWrapper.kt b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/ParcelableWrapper.kt
index 735eeaa..66619e6 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/ParcelableWrapper.kt
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/ParcelableWrapper.kt
@@ -56,4 +56,4 @@
             unparcel = unparceler
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/SharedMemoryImage.kt b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/SharedMemoryImage.kt
index ebaabf8..2f2bb0a 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/SharedMemoryImage.kt
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/SharedMemoryImage.kt
@@ -37,56 +37,56 @@
         /** Stores a [Bitmap] in shared memory and serializes it as a bundle. */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @Suppress("DEPRECATION")
-        public fun ashmemWriteImageBundle(
-            bitmap: Bitmap
-        ): Bundle = TraceEvent("SharedMemoryImage.ashmemWriteImageBundle").use {
-            val ashmem =
-                SharedMemory.create("WatchFace.Screenshot.Bitmap", bitmap.allocationByteCount)
-            var byteBuffer: ByteBuffer? = null
-            try {
-                byteBuffer = ashmem.mapReadWrite()
-                bitmap.copyPixelsToBuffer(byteBuffer)
-                return Bundle().apply {
-                    this.putInt(Constants.KEY_BITMAP_WIDTH_PX, bitmap.width)
-                    this.putInt(Constants.KEY_BITMAP_HEIGHT_PX, bitmap.height)
-                    this.putInt(Constants.KEY_BITMAP_CONFIG_ORDINAL, bitmap.config.ordinal)
-                    this.putParcelable(Constants.KEY_SCREENSHOT, ashmem)
-                }
-            } finally {
-                if (byteBuffer != null) {
-                    SharedMemory.unmap(byteBuffer)
+        public fun ashmemWriteImageBundle(bitmap: Bitmap): Bundle =
+            TraceEvent("SharedMemoryImage.ashmemWriteImageBundle").use {
+                val ashmem =
+                    SharedMemory.create("WatchFace.Screenshot.Bitmap", bitmap.allocationByteCount)
+                var byteBuffer: ByteBuffer? = null
+                try {
+                    byteBuffer = ashmem.mapReadWrite()
+                    bitmap.copyPixelsToBuffer(byteBuffer)
+                    return Bundle().apply {
+                        this.putInt(Constants.KEY_BITMAP_WIDTH_PX, bitmap.width)
+                        this.putInt(Constants.KEY_BITMAP_HEIGHT_PX, bitmap.height)
+                        this.putInt(Constants.KEY_BITMAP_CONFIG_ORDINAL, bitmap.config.ordinal)
+                        this.putParcelable(Constants.KEY_SCREENSHOT, ashmem)
+                    }
+                } finally {
+                    if (byteBuffer != null) {
+                        SharedMemory.unmap(byteBuffer)
+                    }
                 }
             }
-        }
 
-        /**
-         * Deserializes a [Bundle] containing a [Bitmap] serialized by [ashmemWriteImageBundle].
-         */
+        /** Deserializes a [Bundle] containing a [Bitmap] serialized by [ashmemWriteImageBundle]. */
         @Suppress("DEPRECATION")
-        public fun ashmemReadImageBundle(
-            bundle: Bundle
-        ): Bitmap = TraceEvent("SharedMemoryImage.ashmemReadImageBundle").use {
-            bundle.classLoader = SharedMemory::class.java.classLoader
-            val ashmem = bundle.getParcelable<SharedMemory>(Constants.KEY_SCREENSHOT)
-                ?: throw IllegalStateException("Bundle did not contain " + Constants.KEY_SCREENSHOT)
-            val width = bundle.getInt(Constants.KEY_BITMAP_WIDTH_PX)
-            val height = bundle.getInt(Constants.KEY_BITMAP_HEIGHT_PX)
-            val configOrdinal = bundle.getInt(Constants.KEY_BITMAP_CONFIG_ORDINAL)
-            var byteBuffer: ByteBuffer? = null
-            try {
-                val bitmap = Bitmap.createBitmap(
-                    width,
-                    height,
-                    Bitmap.Config.values().find { it.ordinal == configOrdinal }!!
-                )
-                byteBuffer = ashmem.mapReadOnly()
-                bitmap.copyPixelsFromBuffer(byteBuffer)
-                return bitmap
-            } finally {
-                if (byteBuffer != null) {
-                    SharedMemory.unmap(byteBuffer)
+        public fun ashmemReadImageBundle(bundle: Bundle): Bitmap =
+            TraceEvent("SharedMemoryImage.ashmemReadImageBundle").use {
+                bundle.classLoader = SharedMemory::class.java.classLoader
+                val ashmem =
+                    bundle.getParcelable<SharedMemory>(Constants.KEY_SCREENSHOT)
+                        ?: throw IllegalStateException(
+                            "Bundle did not contain " + Constants.KEY_SCREENSHOT
+                        )
+                val width = bundle.getInt(Constants.KEY_BITMAP_WIDTH_PX)
+                val height = bundle.getInt(Constants.KEY_BITMAP_HEIGHT_PX)
+                val configOrdinal = bundle.getInt(Constants.KEY_BITMAP_CONFIG_ORDINAL)
+                var byteBuffer: ByteBuffer? = null
+                try {
+                    val bitmap =
+                        Bitmap.createBitmap(
+                            width,
+                            height,
+                            Bitmap.Config.values().find { it.ordinal == configOrdinal }!!
+                        )
+                    byteBuffer = ashmem.mapReadOnly()
+                    bitmap.copyPixelsFromBuffer(byteBuffer)
+                    return bitmap
+                } finally {
+                    if (byteBuffer != null) {
+                        SharedMemory.unmap(byteBuffer)
+                    }
                 }
             }
-        }
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/WatchFaceStyle.kt b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/WatchFaceStyle.kt
index f237a83..6d7cf18 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/WatchFaceStyle.kt
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/WatchFaceStyle.kt
@@ -28,8 +28,8 @@
  * A style descriptor for watch faces.
  *
  * <p>Parameters here affect how the system UI will be drawn over a watch face. An instance of this
- * class should be passed in to [WatchFaceService.Engine.setWatchFaceStyle] in the `onCreate`
- * method of your [WatchFaceService.Engine.onCreate] override.
+ * class should be passed in to [WatchFaceService.Engine.setWatchFaceStyle] in the `onCreate` method
+ * of your [WatchFaceService.Engine.onCreate] override.
  *
  * <p>To construct a WatchFaceStyle use [WatchFaceStyle.Builder].
  *
@@ -62,9 +62,7 @@
                 putBoolean(Constants.KEY_SHOW_UNREAD_INDICATOR, showUnreadCountIndicator)
                 putBoolean(Constants.KEY_HIDE_NOTIFICATION_INDICATOR, hideNotificationIndicator)
                 putBoolean(Constants.KEY_ACCEPTS_TAPS, acceptsTapEvents)
-                compatBundle?.let {
-                    putAll(compatBundle)
-                }
+                compatBundle?.let { putAll(compatBundle) }
             }
         )
     }
@@ -104,14 +102,14 @@
         public const val DEFAULT_ACCENT_COLOR: Int = Color.WHITE
 
         /**
-         * Whether to put a semi-transparent black background behind the status bar to make it visible
-         * on white backgrounds.
+         * Whether to put a semi-transparent black background behind the status bar to make it
+         * visible on white backgrounds.
          */
         public const val PROTECT_STATUS_BAR: Int = 0x1
 
         /**
-         * Whether to put a semi-transparent black background behind the "Ok Google" string to make it
-         * visible on a white background.
+         * Whether to put a semi-transparent black background behind the "Ok Google" string to make
+         * it visible on a white background.
          */
         public const val PROTECT_HOTWORD_INDICATOR: Int = 0x2
 
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/AccessibilityUtils.java b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/AccessibilityUtils.java
index 054835b..de457e4 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/AccessibilityUtils.java
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/AccessibilityUtils.java
@@ -91,28 +91,30 @@
             switch (data.getType()) {
                 case ComplicationData.TYPE_NO_PERMISSION:
                     typeSpecificText =
-                        ComplicationText.plainText(context.getString(R.string.a11y_no_permission));
+                            ComplicationText.plainText(
+                                    context.getString(R.string.a11y_no_permission));
                     break;
                 case ComplicationData.TYPE_NO_DATA:
                     typeSpecificText =
-                        ComplicationText.plainText(context.getString(R.string.a11y_no_data));
+                            ComplicationText.plainText(context.getString(R.string.a11y_no_data));
                     break;
-                case ComplicationData.TYPE_RANGED_VALUE: {
-                    // Most likely the range info is already in the short text.
-                    if (hasTextOrTitle) {
-                        typeSpecificText = null;
-                    } else {
-                        float value = data.getRangedValue();
-                        float max = data.getRangedMaxValue();
-                        // TODO(fuego): what do do with min? should we even say max? should it
-                        // be a percentage?
-                        typeSpecificText =
-                                ComplicationText.plainText(
-                                        context.getString(
-                                                R.string.a11y_template_range, value, max));
+                case ComplicationData.TYPE_RANGED_VALUE:
+                    {
+                        // Most likely the range info is already in the short text.
+                        if (hasTextOrTitle) {
+                            typeSpecificText = null;
+                        } else {
+                            float value = data.getRangedValue();
+                            float max = data.getRangedMaxValue();
+                            // TODO(fuego): what do do with min? should we even say max? should it
+                            // be a percentage?
+                            typeSpecificText =
+                                    ComplicationText.plainText(
+                                            context.getString(
+                                                    R.string.a11y_template_range, value, max));
+                        }
                     }
-                }
-                break;
+                    break;
                 default:
                     typeSpecificText = null;
             }
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/ContentDescriptionLabel.java b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/ContentDescriptionLabel.java
index f31fb55..33dbfb9 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/ContentDescriptionLabel.java
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/ContentDescriptionLabel.java
@@ -34,7 +34,8 @@
 
 import java.util.Objects;
 
-/** Holds labels for screen regions which should respond to accessibility events.
+/**
+ * Holds labels for screen regions which should respond to accessibility events.
  *
  * @hide
  */
@@ -120,9 +121,7 @@
         return mText;
     }
 
-    /**
-     * Returns the optional {@link PendingIntent} to launch when this label is tapped.
-     */
+    /** Returns the optional {@link PendingIntent} to launch when this label is tapped. */
     @Nullable
     public PendingIntent getTapAction() {
         return mTapAction;
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
index 45c6efc..c7bd40c 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(LIBRARY_GROUP)
 package android.support.wearable.watchface.accessibility;
 
diff --git a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/package-info.java b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
index 4b57c76..6323b63 100644
--- a/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
+++ b/wear/watchface/watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(LIBRARY_GROUP)
 package android.support.wearable.watchface;
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java
index fac6dbd..7b20c45 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java
@@ -28,6 +28,7 @@
 
 /**
  * Used for sending details of an exception over aidl.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/HeadlessWatchFaceInstanceParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/HeadlessWatchFaceInstanceParams.java
index 5de4167..230bbad 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/HeadlessWatchFaceInstanceParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/HeadlessWatchFaceInstanceParams.java
@@ -65,7 +65,9 @@
     /** Used by VersionedParcelable. */
     HeadlessWatchFaceInstanceParams() {}
 
-    /** @deprecated Use the other constructor instead. */
+    /**
+     * @deprecated Use the other constructor instead.
+     */
     @Deprecated
     public HeadlessWatchFaceInstanceParams(
             @NonNull ComponentName watchFaceName,
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/IdTypeAndDefaultProviderPolicyWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/IdTypeAndDefaultProviderPolicyWireFormat.java
index 80dbab7..f1bd49c7 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/IdTypeAndDefaultProviderPolicyWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/IdTypeAndDefaultProviderPolicyWireFormat.java
@@ -40,8 +40,8 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage")
-public final class IdTypeAndDefaultProviderPolicyWireFormat implements VersionedParcelable,
-        Parcelable {
+public final class IdTypeAndDefaultProviderPolicyWireFormat
+        implements VersionedParcelable, Parcelable {
     /** The watch's ID for the complication. */
     @ParcelField(1)
     int mId;
@@ -58,8 +58,7 @@
     int mDefaultProviderType;
 
     /** Used by VersionedParcelable. */
-    IdTypeAndDefaultProviderPolicyWireFormat() {
-    }
+    IdTypeAndDefaultProviderPolicyWireFormat() {}
 
     public IdTypeAndDefaultProviderPolicyWireFormat(
             int id,
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParams.java
index d3e8b68..1f12d2c 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParams.java
@@ -82,8 +82,7 @@
     String mAuxiliaryComponentPackageName;
 
     /** Used by VersionedParcelable. */
-    WallpaperInteractiveWatchFaceInstanceParams() {
-    }
+    WallpaperInteractiveWatchFaceInstanceParams() {}
 
     public WallpaperInteractiveWatchFaceInstanceParams(
             @NonNull String instanceId,
@@ -132,8 +131,7 @@
     }
 
     public void setIdAndComplicationDataWireFormats(
-            @Nullable List<IdAndComplicationDataWireFormat> idAndComplicationDataWireFormats
-    ) {
+            @Nullable List<IdAndComplicationDataWireFormat> idAndComplicationDataWireFormats) {
         mIdAndComplicationDataWireFormats = idAndComplicationDataWireFormats;
     }
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WatchFaceRenderParams.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WatchFaceRenderParams.java
index bc54dab..4a3801c 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WatchFaceRenderParams.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/control/data/WatchFaceRenderParams.java
@@ -60,8 +60,7 @@
     UserStyleWireFormat mUserStyle;
 
     /**
-     * The complications to render with. If null then the current complication data is used
-     * instead.
+     * The complications to render with. If null then the current complication data is used instead.
      */
     @ParcelField(100)
     @Nullable
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/BoundingArcWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/BoundingArcWireFormat.java
index 9c85b21..9836c49 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/BoundingArcWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/BoundingArcWireFormat.java
@@ -45,8 +45,7 @@
     float mArcThickness = 0.0f;
 
     /** Used by VersionedParcelable. */
-    BoundingArcWireFormat() {
-    }
+    BoundingArcWireFormat() {}
 
     public BoundingArcWireFormat(float arcStartAngle, float totalArcAngle, float arcThickness) {
         mArcStartAngle = arcStartAngle;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationSlotMetadataWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationSlotMetadataWireFormat.java
index d017c5c..365105f 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationSlotMetadataWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationSlotMetadataWireFormat.java
@@ -103,8 +103,7 @@
     List<RectF> mComplicationMargins;
 
     /** Used by VersionedParcelable. */
-    ComplicationSlotMetadataWireFormat() {
-    }
+    ComplicationSlotMetadataWireFormat() {}
 
     @ComplicationExperimental
     public ComplicationSlotMetadataWireFormat(
@@ -172,7 +171,7 @@
 
     /**
      * @deprecated Use the other constructor with primaryDataSourceDefaultType &
-     * secondaryDataSourceDefaultType instead.
+     *     secondaryDataSourceDefaultType instead.
      */
     @Deprecated
     public ComplicationSlotMetadataWireFormat(
@@ -247,8 +246,8 @@
     }
 
     /**
-     * @return The {@link ComplicationData.ComplicationType} for
-     * {@link #getFallbackSystemDataSource}.
+     * @return The {@link ComplicationData.ComplicationType} for {@link
+     *     #getFallbackSystemDataSource}.
      */
     @ComplicationData.ComplicationType
     public int getDefaultDataSourceType() {
@@ -256,27 +255,29 @@
     }
 
     /**
-     * @return The {@link ComplicationData.ComplicationType} for the first entry from
-     * {@link #getDefaultDataSourcesToTry}.
+     * @return The {@link ComplicationData.ComplicationType} for the first entry from {@link
+     *     #getDefaultDataSourcesToTry}.
      */
     @ComplicationData.ComplicationType
     public int getPrimaryDataSourceDefaultType() {
         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
         // and old client.
         return (mPrimaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
-                ? mDefaultType : mPrimaryDataSourceDefaultType;
+                ? mDefaultType
+                : mPrimaryDataSourceDefaultType;
     }
 
     /**
-     * @return The {@link ComplicationData.ComplicationType} for the second entry from
-     * {@link #getDefaultDataSourcesToTry}.
+     * @return The {@link ComplicationData.ComplicationType} for the second entry from {@link
+     *     #getDefaultDataSourcesToTry}.
      */
     @ComplicationData.ComplicationType
     public int getSecondaryDataSourceDefaultType() {
         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
         // and old client.
         return (mSecondaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
-                ? mDefaultType : mSecondaryDataSourceDefaultType;
+                ? mDefaultType
+                : mSecondaryDataSourceDefaultType;
     }
 
     public boolean isInitiallyEnabled() {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationStateWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationStateWireFormat.java
index 8b34d3d..af1ad65 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationStateWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/ComplicationStateWireFormat.java
@@ -115,8 +115,7 @@
     private static final int NULL_NAME_RESOURCE_ID = 0;
 
     /** Used by VersionedParcelable. */
-    ComplicationStateWireFormat() {
-    }
+    ComplicationStateWireFormat() {}
 
     @ComplicationExperimental
     public ComplicationStateWireFormat(
@@ -153,7 +152,8 @@
         mComplicationConfigExtras = complicationConfigExtras;
         mNameResourceId = (nameResourceId != null) ? nameResourceId : NULL_NAME_RESOURCE_ID;
         mScreenReaderNameResourceId =
-                (screenReaderNameResourceId != null) ? screenReaderNameResourceId
+                (screenReaderNameResourceId != null)
+                        ? screenReaderNameResourceId
                         : NULL_NAME_RESOURCE_ID;
         mBoundingArc = boundingArc;
     }
@@ -191,7 +191,8 @@
         mComplicationConfigExtras = complicationConfigExtras;
         mNameResourceId = (nameResourceId != null) ? nameResourceId : NULL_NAME_RESOURCE_ID;
         mScreenReaderNameResourceId =
-                (screenReaderNameResourceId != null) ? screenReaderNameResourceId
+                (screenReaderNameResourceId != null)
+                        ? screenReaderNameResourceId
                         : NULL_NAME_RESOURCE_ID;
     }
 
@@ -274,7 +275,9 @@
         return mFallbackSystemProvider;
     }
 
-    /** @deprecated Use {@link #getDefaultDataSourceType} instead. */
+    /**
+     * @deprecated Use {@link #getDefaultDataSourceType} instead.
+     */
     @Deprecated
     @ComplicationData.ComplicationType
     public int getDefaultProviderType() {
@@ -290,27 +293,29 @@
     }
 
     /**
-     * @return The {@link ComplicationData.ComplicationType} for the first entry from
-     * {@link #getDefaultDataSourcesToTry}.
+     * @return The {@link ComplicationData.ComplicationType} for the first entry from {@link
+     *     #getDefaultDataSourcesToTry}.
      */
     @ComplicationData.ComplicationType
     public int getPrimaryDataSourceDefaultType() {
         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
         // and old client.
         return (mPrimaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
-                ? mDefaultType : mPrimaryDataSourceDefaultType;
+                ? mDefaultType
+                : mPrimaryDataSourceDefaultType;
     }
 
     /**
-     * @return The {@link ComplicationData.ComplicationType} for the second entry from
-     * {@link #getDefaultDataSourcesToTry}.
+     * @return The {@link ComplicationData.ComplicationType} for the second entry from {@link
+     *     #getDefaultDataSourcesToTry}.
      */
     @ComplicationData.ComplicationType
     public int getSecondaryDataSourceDefaultType() {
         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
         // and old client.
         return (mSecondaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
-                ? mDefaultType : mSecondaryDataSourceDefaultType;
+                ? mDefaultType
+                : mSecondaryDataSourceDefaultType;
     }
 
     public boolean isEnabled() {
@@ -342,7 +347,8 @@
 
     @Nullable
     public Integer getScreenReaderNameResourceId() {
-        return mScreenReaderNameResourceId != NULL_NAME_RESOURCE_ID ? mScreenReaderNameResourceId
+        return mScreenReaderNameResourceId != NULL_NAME_RESOURCE_ID
+                ? mScreenReaderNameResourceId
                 : null;
     }
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
index 07ccd8a..c4c0253 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
@@ -49,8 +49,7 @@
     ComplicationData mComplicationData;
 
     /** Used by VersionedParcelable. */
-    IdAndComplicationDataWireFormat() {
-    }
+    IdAndComplicationDataWireFormat() {}
 
     public IdAndComplicationDataWireFormat(int id, @NonNull ComplicationData complicationData) {
         mId = id;
@@ -109,6 +108,10 @@
     @Override
     public String toString() {
         return "IdAndComplicationDataWireFormat{"
-                + "mId=" + mId + ", mComplicationData=" + mComplicationData + '}';
+                + "mId="
+                + mId
+                + ", mComplicationData="
+                + mComplicationData
+                + '}';
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationStateWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationStateWireFormat.java
index 972aa55..f36b33d 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationStateWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationStateWireFormat.java
@@ -46,8 +46,7 @@
     ComplicationStateWireFormat mComplicationState;
 
     /** Used by VersionedParcelable. */
-    IdAndComplicationStateWireFormat() {
-    }
+    IdAndComplicationStateWireFormat() {}
 
     public IdAndComplicationStateWireFormat(
             int id, @NonNull ComplicationStateWireFormat complicationState) {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndTapEventWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndTapEventWireFormat.java
index db67687a..4e5dca1 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndTapEventWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndTapEventWireFormat.java
@@ -54,14 +54,9 @@
     @Px
     long mCalendarTapTimeMillis;
 
-    IdAndTapEventWireFormat() {
-    }
+    IdAndTapEventWireFormat() {}
 
-    public IdAndTapEventWireFormat(
-            int id,
-            int x,
-            int y,
-            long calendarTapTimeMillis) {
+    public IdAndTapEventWireFormat(int id, int x, int y, long calendarTapTimeMillis) {
         mId = id;
         mX = x;
         mY = y;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/LayerParameterWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/LayerParameterWireFormat.java
index 2993bba..08ced45 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/LayerParameterWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/LayerParameterWireFormat.java
@@ -28,10 +28,10 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for Map<{@link androidx.wear.watchface.style.Layer},
- * {@link androidx.wear.watchface.LayerMode}>
+ * Wire format for Map<{@link androidx.wear.watchface.style.Layer}, {@link
+ * androidx.wear.watchface.LayerMode}>
  *
- * Unfortunately we can't ever add new members to this because we use it in lists and
+ * <p>Unfortunately we can't ever add new members to this because we use it in lists and
  * VersionedParcelable isn't fully backwards compatible when new members are added to lists.
  *
  * @hide
@@ -48,8 +48,7 @@
     @ParcelField(2)
     int mLayerMode;
 
-    LayerParameterWireFormat() {
-    }
+    LayerParameterWireFormat() {}
 
     public LayerParameterWireFormat(int layer, int layerMode) {
         mLayer = layer;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
index 327e951..867e51c 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
@@ -44,20 +44,20 @@
     public static int ELEMENT_TYPE_NONE = 0;
 
     /**
-     * Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is
-     * {@link androidx.wear.watchface.HighlightedElement.AllComplications}.
+     * 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}.
+     * 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}.
+     * Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is {@link
+     * androidx.wear.watchface.HighlightedElement.UserStyle}.
      */
     public static int ELEMENT_TYPE_USER_STYLE = 3;
 
@@ -66,29 +66,29 @@
     int mDrawMode;
 
     /**
-     * A bitfield where each bit represents one layer in the set of
-     * {@link androidx.wear.watchface.style.WatchFaceLayer}s.
+     * A bitfield where each bit represents one layer in the set of {@link
+     * androidx.wear.watchface.style.WatchFaceLayer}s.
      */
     @ParcelField(2)
     int mWatchFaceLayerSetBitfield;
 
     /**
-     * One of {@link #ELEMENT_TYPE_NONE}, {@link #ELEMENT_TYPE_ALL_COMPLICATIONS},
-     * {@link #ELEMENT_TYPE_COMPLICATION} or {@link #ELEMENT_TYPE_USER_STYLE}.
+     * One of {@link #ELEMENT_TYPE_NONE}, {@link #ELEMENT_TYPE_ALL_COMPLICATIONS}, {@link
+     * #ELEMENT_TYPE_COMPLICATION} or {@link #ELEMENT_TYPE_USER_STYLE}.
      */
     @ParcelField(3)
     int mElementType;
 
     /**
-     * Optional ID of a single complication slot to render highlighted, only used with
-     * {@link #ELEMENT_TYPE_COMPLICATION}.
+     * Optional ID of a single complication slot to render highlighted, only used with {@link
+     * #ELEMENT_TYPE_COMPLICATION}.
      */
     @ParcelField(4)
     int mElementComplicationSlotId;
 
     /**
-     * Optional UserStyleSetting to render highlighted, only non-null with
-     * {@link #ELEMENT_TYPE_USER_STYLE}.
+     * Optional UserStyleSetting to render highlighted, only non-null with {@link
+     * #ELEMENT_TYPE_USER_STYLE}.
      */
     @ParcelField(5)
     @Nullable
@@ -103,8 +103,8 @@
     int mHighlightTint;
 
     /**
-     * Specifies the tint for everything else. Only used when {@link #mElementType} isn't
-     * {@link #ELEMENT_TYPE_NONE}.
+     * Specifies the tint for everything else. Only used when {@link #mElementType} isn't {@link
+     * #ELEMENT_TYPE_NONE}.
      */
     @ParcelField(7)
     @ColorInt
@@ -117,8 +117,7 @@
     @Nullable
     List<IdAndTapEventWireFormat> mIdAndTapEventWireFormats;
 
-    RenderParametersWireFormat() {
-    }
+    RenderParametersWireFormat() {}
 
     public RenderParametersWireFormat(
             int drawMode,
@@ -213,5 +212,4 @@
                     return new RenderParametersWireFormat[size];
                 }
             };
-
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceColorsWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceColorsWireFormat.java
index 19a72c7..8e4e8ca 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceColorsWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceColorsWireFormat.java
@@ -43,13 +43,9 @@
     int mTertiaryColor;
 
     /** Used by VersionedParcelable. */
-    WatchFaceColorsWireFormat() {
-    }
+    WatchFaceColorsWireFormat() {}
 
-    public WatchFaceColorsWireFormat(
-            int primaryColor,
-            int secondaryColor,
-            int tertiaryColor) {
+    public WatchFaceColorsWireFormat(int primaryColor, int secondaryColor, int tertiaryColor) {
         mPrimaryColor = primaryColor;
         mSecondaryColor = secondaryColor;
         mTertiaryColor = tertiaryColor;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceOverlayStyleWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceOverlayStyleWireFormat.java
index 35cafa0..34e1673 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceOverlayStyleWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchFaceOverlayStyleWireFormat.java
@@ -37,7 +37,7 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage")
-public class WatchFaceOverlayStyleWireFormat implements VersionedParcelable, Parcelable  {
+public class WatchFaceOverlayStyleWireFormat implements VersionedParcelable, Parcelable {
     @ParcelField(1)
     boolean mHasBackgroundColor;
 
@@ -53,8 +53,7 @@
     WatchFaceOverlayStyleWireFormat() {}
 
     public WatchFaceOverlayStyleWireFormat(
-            @Nullable Color backgroundColor,
-            @Nullable Color foregroundColor) {
+            @Nullable Color backgroundColor, @Nullable Color foregroundColor) {
         if (backgroundColor == null) {
             mHasBackgroundColor = false;
         } else {
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchUiState.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchUiState.java
index 41ec071..ea6ce3c 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchUiState.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/WatchUiState.java
@@ -45,9 +45,7 @@
     /** Used by VersionedParcelable. */
     WatchUiState() {}
 
-    public WatchUiState(
-            boolean inAmbientMode,
-            int interruptionFilter) {
+    public WatchUiState(boolean inAmbientMode, int interruptionFilter) {
         mInAmbientMode = inAmbientMode;
         mInterruptionFilter = interruptionFilter;
     }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/editor/data/EditorStateWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/editor/data/EditorStateWireFormat.java
index 5a9ea93..83608f1 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/editor/data/EditorStateWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/editor/data/EditorStateWireFormat.java
@@ -62,8 +62,7 @@
     Bundle mPreviewImageBundle;
 
     /** Used by VersionedParcelable. */
-    EditorStateWireFormat() {
-    }
+    EditorStateWireFormat() {}
 
     public EditorStateWireFormat(
             @Nullable String watchFaceInstanceId,
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanOptionWireFormat.java
index f2675ac..68d5fdc 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanOptionWireFormat.java
@@ -29,8 +29,7 @@
 @VersionedParcelize
 public class BooleanOptionWireFormat extends OptionWireFormat {
 
-    BooleanOptionWireFormat() {
-    }
+    BooleanOptionWireFormat() {}
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanUserStyleSettingWireFormat.java
index a25fc96..68aea9c 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/BooleanUserStyleSettingWireFormat.java
@@ -37,7 +37,9 @@
 
     BooleanUserStyleSettingWireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public BooleanUserStyleSettingWireFormat(
             @NonNull String id,
@@ -60,7 +62,15 @@
             @NonNull List<Integer> affectsLayers,
             @Nullable Bundle onWatchFaceEditorBundle,
             @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles) {
-        super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                defaultOptionIndex,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
index b64f7ac..8807f86 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
@@ -45,8 +45,8 @@
     public int mComplicationSlotId;
 
     /**
-     * VersionedParcelable doesn't support boxed Boolean so we set this to one of
-     * ENABLED_UNKNOWN, ENABLED_YES, ENABLED_NO.
+     * VersionedParcelable doesn't support boxed Boolean so we set this to one of ENABLED_UNKNOWN,
+     * ENABLED_YES, ENABLED_NO.
      */
     @ParcelField(2)
     public int mEnabled;
@@ -62,15 +62,13 @@
     // IMPORTANT: DO NOT EXTEND THIS FILE! IT WILL NOT BE BACKWARDS COMPATIBLE :(
     // Instead extend ComplicationsOptionWireFormat.
 
-    ComplicationOverlayWireFormat() {
-    }
+    ComplicationOverlayWireFormat() {}
 
     public ComplicationOverlayWireFormat(
             int complicationSlotId,
             @Nullable Boolean enabled,
             @Nullable Map<Integer, RectF> perComplicationTypeBounds,
-            @Nullable Integer accessibilityTraversalIndex
-    ) {
+            @Nullable Integer accessibilityTraversalIndex) {
         mComplicationSlotId = complicationSlotId;
         if (enabled != null) {
             mEnabled = enabled ? ENABLED_YES : ENABLED_NO;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsOptionWireFormat.java
index 3cf7353..712b4fd 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsOptionWireFormat.java
@@ -46,9 +46,8 @@
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
     /**
-     * Great care should be taken to ensure backwards compatibility of the versioned parcelable
-     * if {@link ComplicationOverlayWireFormat} is ever
-     * extended.
+     * Great care should be taken to ensure backwards compatibility of the versioned parcelable if
+     * {@link ComplicationOverlayWireFormat} is ever extended.
      */
     @ParcelField(100)
     @NonNull
@@ -67,8 +66,7 @@
     @Nullable
     public List<Integer> mComplicationScreenReaderNameResourceIds;
 
-    ComplicationsOptionWireFormat() {
-    }
+    ComplicationsOptionWireFormat() {}
 
     public ComplicationsOptionWireFormat(
             @NonNull byte[] id,
@@ -77,8 +75,7 @@
             @NonNull ComplicationOverlayWireFormat[] complicationOverlays,
             @Nullable List<PerComplicationTypeMargins> complicationOverlaysMargins,
             @Nullable List<Integer> complicationNameResourceIds,
-            @Nullable List<Integer> complicationScreenReaderNameResourceIds
-    ) {
+            @Nullable List<Integer> complicationScreenReaderNameResourceIds) {
         super(id);
         mDisplayName = displayName;
         mIcon = icon;
@@ -88,15 +85,15 @@
         mComplicationScreenReaderNameResourceIds = complicationScreenReaderNameResourceIds;
     }
 
-    /** @deprecated Use a constructor with perComplicationTypeMargins instead. */
+    /**
+     * @deprecated Use a constructor with perComplicationTypeMargins instead.
+     */
     @Deprecated
     public ComplicationsOptionWireFormat(
             @NonNull byte[] id,
             @NonNull CharSequence displayName,
             @Nullable Icon icon,
-            @NonNull ComplicationOverlayWireFormat[]
-                    complicationOverlays
-    ) {
+            @NonNull ComplicationOverlayWireFormat[] complicationOverlays) {
         super(id);
         mDisplayName = displayName;
         mIcon = icon;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsUserStyleSettingWireFormat.java
index d7c9869..243f172 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationsUserStyleSettingWireFormat.java
@@ -40,8 +40,7 @@
     @ParcelField(104)
     public List<CharSequence> mPerOptionScreenReaderNames;
 
-    ComplicationsUserStyleSettingWireFormat() {
-    }
+    ComplicationsUserStyleSettingWireFormat() {}
 
     public ComplicationsUserStyleSettingWireFormat(
             @NonNull String id,
@@ -54,8 +53,16 @@
             @Nullable Bundle onWatchFaceEditorBundle,
             @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles,
             @Nullable List<CharSequence> perOptionScreenReaderNames) {
-        super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                defaultOptionIndex,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
         mPerOptionScreenReaderNames = perOptionScreenReaderNames;
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOption2WireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOption2WireFormat.java
new file mode 100644
index 0000000..4697b4f
--- /dev/null
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOption2WireFormat.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.wear.watchface.style.data;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.versionedparcelable.VersionedParcelize;
+
+/**
+ * Wire format for {@link androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption2}.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@VersionedParcelize
+public class CustomValueOption2WireFormat extends OptionWireFormat {
+    CustomValueOption2WireFormat() {}
+
+    // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
+
+    public CustomValueOption2WireFormat(@NonNull byte[] id) {
+        super(id);
+    }
+}
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOptionWireFormat.java
index e9bde47..442b66f 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueOptionWireFormat.java
@@ -21,16 +21,14 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for {@link
- * androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption}.
+ * Wire format for {@link androidx.wear.watchface.style.CustomValueStyleSetting.CustomValueOption}.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class CustomValueOptionWireFormat extends OptionWireFormat {
-    CustomValueOptionWireFormat() {
-    }
+    CustomValueOptionWireFormat() {}
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSetting2WireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSetting2WireFormat.java
new file mode 100644
index 0000000..119c11b
--- /dev/null
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSetting2WireFormat.java
@@ -0,0 +1,74 @@
+/*
+ * 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.data;
+
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.versionedparcelable.VersionedParcelize;
+
+import java.util.List;
+
+/**
+ * Wire format for {@link androidx.wear.watchface.style.CustomValueStyleSetting2}.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@VersionedParcelize
+public class CustomValueUserStyleSetting2WireFormat extends UserStyleSettingWireFormat {
+
+    CustomValueUserStyleSetting2WireFormat() {}
+
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
+    @Deprecated
+    public CustomValueUserStyleSetting2WireFormat(
+            @NonNull String id,
+            @NonNull CharSequence displayName,
+            @NonNull CharSequence description,
+            @Nullable Icon icon,
+            @NonNull List<OptionWireFormat> options,
+            @NonNull List<Integer> affectsLayers) {
+        super(id, displayName, description, icon, options, 0, affectsLayers);
+    }
+
+    public CustomValueUserStyleSetting2WireFormat(
+            @NonNull String id,
+            @NonNull CharSequence displayName,
+            @NonNull CharSequence description,
+            @Nullable Icon icon,
+            @NonNull List<OptionWireFormat> options,
+            @NonNull List<Integer> affectsLayers,
+            @Nullable Bundle onWatchFaceEditorBundle,
+            @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles) {
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                0,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
+    }
+}
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java
index b0b2c4b..99ef84f 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/CustomValueUserStyleSettingWireFormat.java
@@ -35,10 +35,11 @@
 @VersionedParcelize
 public class CustomValueUserStyleSettingWireFormat extends UserStyleSettingWireFormat {
 
-    CustomValueUserStyleSettingWireFormat() {
-    }
+    CustomValueUserStyleSettingWireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public CustomValueUserStyleSettingWireFormat(
             @NonNull String id,
@@ -59,7 +60,15 @@
             @NonNull List<Integer> affectsLayers,
             @Nullable Bundle onWatchFaceEditorBundle,
             @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles) {
-        super(id, displayName, description, icon, options, 0, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                0,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeOptionWireFormat.java
index 4a35f5e..b77747b 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeOptionWireFormat.java
@@ -21,16 +21,15 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for
- * {@link androidx.wear.watchface.style.DoubleRangeUserStyleSetting.DoubleRangeOption}.
+ * Wire format for {@link
+ * androidx.wear.watchface.style.DoubleRangeUserStyleSetting.DoubleRangeOption}.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class DoubleRangeOptionWireFormat extends OptionWireFormat {
-    DoubleRangeOptionWireFormat() {
-    }
+    DoubleRangeOptionWireFormat() {}
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeUserStyleSettingWireFormat.java
index 6d80e69..7d41075 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/DoubleRangeUserStyleSettingWireFormat.java
@@ -37,7 +37,9 @@
 
     DoubleRangeUserStyleSettingWireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public DoubleRangeUserStyleSettingWireFormat(
             @NonNull String id,
@@ -46,7 +48,7 @@
             @Nullable Icon icon,
             @NonNull List<OptionWireFormat> options,
             int defaultOptionIndex,
-            @NonNull List<Integer> affectsLayers)  {
+            @NonNull List<Integer> affectsLayers) {
         super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers);
     }
 
@@ -59,8 +61,16 @@
             int defaultOptionIndex,
             @NonNull List<Integer> affectsLayers,
             @Nullable Bundle onWatchFaceEditorBundle,
-            @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles)  {
-        super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+            @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles) {
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                defaultOptionIndex,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListOptionWireFormat.java
index 9f98992..a2b74b2 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListOptionWireFormat.java
@@ -25,8 +25,7 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for
- * {@link androidx.wear.watchface.style.ListUserStyleSetting.ListOption}.
+ * Wire format for {@link androidx.wear.watchface.style.ListUserStyleSetting.ListOption}.
  *
  * @hide
  */
@@ -45,14 +44,10 @@
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
-    ListOptionWireFormat() {
-    }
+    ListOptionWireFormat() {}
 
     public ListOptionWireFormat(
-            @NonNull byte[] id,
-            @NonNull CharSequence displayName,
-            @Nullable Icon icon
-    ) {
+            @NonNull byte[] id, @NonNull CharSequence displayName, @Nullable Icon icon) {
         super(id);
         this.mDisplayName = displayName;
         this.mIcon = icon;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListUserStyleSettingWireFormat.java
index 7669556..d5692bd 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/ListUserStyleSettingWireFormat.java
@@ -53,8 +53,16 @@
             @Nullable Bundle onWatchFaceEditorBundle,
             @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles,
             @Nullable List<CharSequence> perOptionScreenReaderNames) {
-        super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                defaultOptionIndex,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
         mPerOptionScreenReaderNames = perOptionScreenReaderNames;
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeOptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeOptionWireFormat.java
index 8819bef..1e8fe19 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeOptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeOptionWireFormat.java
@@ -21,16 +21,14 @@
 import androidx.versionedparcelable.VersionedParcelize;
 
 /**
- * Wire format for
- * {@link androidx.wear.watchface.style.LongRangeUserStyleSetting.LongRangeOption}.
+ * Wire format for {@link androidx.wear.watchface.style.LongRangeUserStyleSetting.LongRangeOption}.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 public class LongRangeOptionWireFormat extends OptionWireFormat {
-    LongRangeOptionWireFormat() {
-    }
+    LongRangeOptionWireFormat() {}
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeUserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeUserStyleSettingWireFormat.java
index 8931d18..29b16c2 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeUserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/LongRangeUserStyleSettingWireFormat.java
@@ -37,7 +37,9 @@
 
     LongRangeUserStyleSettingWireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public LongRangeUserStyleSettingWireFormat(
             @NonNull String id,
@@ -60,7 +62,15 @@
             @NonNull List<Integer> affectsLayers,
             @Nullable Bundle onWatchFaceEditorBundle,
             @Nullable List<Bundle> perOptionOnWatchFaceEditorBundles) {
-        super(id, displayName, description, icon, options, defaultOptionIndex, affectsLayers,
-                onWatchFaceEditorBundle, perOptionOnWatchFaceEditorBundles);
+        super(
+                id,
+                displayName,
+                description,
+                icon,
+                options,
+                defaultOptionIndex,
+                affectsLayers,
+                onWatchFaceEditorBundle,
+                perOptionOnWatchFaceEditorBundles);
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/OptionWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/OptionWireFormat.java
index d3469fb..bbd3f90 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/OptionWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/OptionWireFormat.java
@@ -43,8 +43,7 @@
 
     // WARNING: This class is held in a list and can't change due to flaws in VersionedParcelable.
 
-    OptionWireFormat() {
-    }
+    OptionWireFormat() {}
 
     public OptionWireFormat(@NonNull byte[] id) {
         mId = id;
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/PerComplicationTypeMargins.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/PerComplicationTypeMargins.java
index 6d13989..6fc142b 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/PerComplicationTypeMargins.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/PerComplicationTypeMargins.java
@@ -34,12 +34,9 @@
     @NonNull
     public Map<Integer, RectF> mPerComplicationTypeMargins;
 
-    PerComplicationTypeMargins() {
-    }
+    PerComplicationTypeMargins() {}
 
-    public PerComplicationTypeMargins(
-            @NonNull Map<Integer, RectF> perComplicationTypeMargins
-    ) {
+    public PerComplicationTypeMargins(@NonNull Map<Integer, RectF> perComplicationTypeMargins) {
         mPerComplicationTypeMargins = perComplicationTypeMargins;
     }
 }
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorWireFormat.java
index 38d23cd..ca2cbb2 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorWireFormat.java
@@ -31,9 +31,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorsWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorsWireFormat.java
index fb96d27..d524df0 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorsWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleFlavorsWireFormat.java
@@ -30,9 +30,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSchemaWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSchemaWireFormat.java
index 2bb0ad5..6647729 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSchemaWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSchemaWireFormat.java
@@ -30,9 +30,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSettingWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSettingWireFormat.java
index 13609b0..30b8b3e 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSettingWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleSettingWireFormat.java
@@ -62,15 +62,11 @@
     @Nullable
     public Icon mIcon = null;
 
-    /**
-     * The default option index, used if nothing has been selected within the options list.
-     */
+    /** The default option index, used if nothing has been selected within the options list. */
     @ParcelField(5)
     public int mDefaultOptionIndex;
 
-    /**
-     * Used by the style configuration UI. Describes which rendering layers this style affects.
-     */
+    /** Used by the style configuration UI. Describes which rendering layers this style affects. */
     @ParcelField(6)
     @NonNull
     public List<Integer> mAffectsLayers;
@@ -80,7 +76,7 @@
      * may be an exhaustive list, or just examples to populate a ListView in case the
      * UserStyleCategory isn't supported by the UI (e.g. a new WatchFace with an old Companion).
      *
-     * OptionWireFormat can't change because VersionedParcelable has a design flaw, if the format
+     * <p>OptionWireFormat can't change because VersionedParcelable has a design flaw, if the format
      * changes the reader can't determine the correct size of the list and data afterwards
      * (including elements of this list) will get corrupted.
      */
@@ -96,9 +92,7 @@
     @ParcelField(101)
     public List<Integer> mOptionChildIndices = null;
 
-    /**
-     * Contains OnWatchFaceData.
-     */
+    /** Contains OnWatchFaceData. */
     @Nullable
     @ParcelField(102)
     public Bundle mOnWatchFaceEditorBundle = null;
@@ -115,7 +109,9 @@
 
     UserStyleSettingWireFormat() {}
 
-    /** @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles. */
+    /**
+     * @deprecated use a constructor with List<Bundle> perOptionOnWatchFaceEditorBundles.
+     */
     @Deprecated
     public UserStyleSettingWireFormat(
             @NonNull String id,
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleWireFormat.java
index f64c168..9798b92 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/style/data/UserStyleWireFormat.java
@@ -30,9 +30,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @VersionedParcelize(allowSerialization = true)
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
diff --git a/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt b/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
index 8709b6d..28f4655 100644
--- a/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
+++ b/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
@@ -24,30 +24,27 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
 import androidx.concurrent.futures.ResolvableFuture
-import androidx.wear.watchface.complications.ComplicationDataSourceInfo
-import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.client.ComplicationSlotState
 import androidx.wear.watchface.client.HeadlessWatchFaceClient
 import androidx.wear.watchface.client.WatchFaceId
+import androidx.wear.watchface.complications.ComplicationDataSourceInfo
+import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import com.google.common.util.concurrent.ListenableFuture
+import java.time.Instant
+import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.launch
-import java.time.Instant
-import kotlin.coroutines.CoroutineContext
 
-/**
- * [ListenableFuture]-based compatibility wrapper around [EditorSession]'s suspending methods.
- */
-public class ListenableEditorSession(
-    private val wrappedEditorSession: EditorSession
-) : EditorSession {
+/** [ListenableFuture]-based compatibility wrapper around [EditorSession]'s suspending methods. */
+public class ListenableEditorSession(private val wrappedEditorSession: EditorSession) :
+    EditorSession {
     public companion object {
         /**
          * Constructs a [ListenableFuture] for a [ListenableEditorSession] for an on watch face
@@ -68,17 +65,17 @@
         ): ListenableFuture<ListenableEditorSession?> {
             val result = ResolvableFuture.create<ListenableEditorSession?>()
             val coroutineScope =
-                CoroutineScope(object : CoroutineDispatcher() {
-                    override fun dispatch(context: CoroutineContext, block: Runnable) {
-                        block.run()
+                CoroutineScope(
+                    object : CoroutineDispatcher() {
+                        override fun dispatch(context: CoroutineContext, block: Runnable) {
+                            block.run()
+                        }
                     }
-                })
+                )
             coroutineScope.launch {
                 try {
                     result.set(
-                        ListenableEditorSession(
-                            EditorSession.createOnWatchEditorSession(activity)
-                        )
+                        ListenableEditorSession(EditorSession.createOnWatchEditorSession(activity))
                     )
                 } catch (e: Exception) {
                     result.setException(e)
@@ -93,7 +90,7 @@
          * @param activity The [ComponentActivity] associated with the EditorSession.
          * @param editIntent [Intent] sent by SysUI to launch the editing session.
          * @param headlessWatchFaceClient The [HeadlessWatchFaceClient] that backs the constructed
-         * EditorSession.
+         *   EditorSession.
          */
         @JvmStatic
         @RequiresApi(27)
@@ -102,13 +99,14 @@
             activity: ComponentActivity,
             editIntent: Intent,
             headlessWatchFaceClient: HeadlessWatchFaceClient
-        ): ListenableEditorSession = ListenableEditorSession(
-            EditorSession.createHeadlessEditorSession(
-                activity,
-                editIntent,
-                headlessWatchFaceClient
+        ): ListenableEditorSession =
+            ListenableEditorSession(
+                EditorSession.createHeadlessEditorSession(
+                    activity,
+                    editIntent,
+                    headlessWatchFaceClient
+                )
             )
-        )
     }
 
     private fun getCoroutineScope(): CoroutineScope =
@@ -127,13 +125,13 @@
     override val userStyleSchema: UserStyleSchema by wrappedEditorSession::userStyleSchema
 
     override val complicationSlotsState: StateFlow<Map<Int, ComplicationSlotState>> by
-    wrappedEditorSession::complicationSlotsState
+        wrappedEditorSession::complicationSlotsState
 
     override val complicationsPreviewData: StateFlow<Map<Int, ComplicationData>> by
-    wrappedEditorSession::complicationsPreviewData
+        wrappedEditorSession::complicationsPreviewData
 
     override val complicationsDataSourceInfo: StateFlow<Map<Int, ComplicationDataSourceInfo?>> by
-    wrappedEditorSession::complicationsDataSourceInfo
+        wrappedEditorSession::complicationsDataSourceInfo
 
     @Suppress("INAPPLICABLE_JVM_NAME")
     @get:JvmName("isCommitChangesOnClose")
@@ -141,7 +139,7 @@
 
     @get:SuppressWarnings("AutoBoxing")
     override val backgroundComplicationSlotId: Int? by
-    wrappedEditorSession::backgroundComplicationSlotId
+        wrappedEditorSession::backgroundComplicationSlotId
 
     @SuppressWarnings("AutoBoxing")
     override fun getComplicationSlotIdAt(x: Int, y: Int): Int? =
@@ -151,11 +149,12 @@
         renderParameters: RenderParameters,
         instant: Instant,
         slotIdToComplicationData: Map<Int, ComplicationData>?
-    ): Bitmap = wrappedEditorSession.renderWatchFaceToBitmap(
-        renderParameters,
-        instant,
-        slotIdToComplicationData
-    )
+    ): Bitmap =
+        wrappedEditorSession.renderWatchFaceToBitmap(
+            renderParameters,
+            instant,
+            slotIdToComplicationData
+        )
 
     /** [ListenableFuture] wrapper around [EditorSession.openComplicationDataSourceChooser]. */
     public fun listenableOpenComplicationDataSourceChooser(
@@ -174,9 +173,10 @@
         return future
     }
 
-    override suspend fun openComplicationDataSourceChooser(complicationSlotId: Int):
-        ChosenComplicationDataSource? =
-            wrappedEditorSession.openComplicationDataSourceChooser(complicationSlotId)
+    override suspend fun openComplicationDataSourceChooser(
+        complicationSlotId: Int
+    ): ChosenComplicationDataSource? =
+        wrappedEditorSession.openComplicationDataSourceChooser(complicationSlotId)
 
     override fun close() {
         wrappedEditorSession.close()
diff --git a/wear/watchface/watchface-editor/api/current.ignore b/wear/watchface/watchface-editor/api/current.ignore
new file mode 100644
index 0000000..5bed420
--- /dev/null
+++ b/wear/watchface/watchface-editor/api/current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.editor.EditorSessionKt:
+    Removed class androidx.wear.watchface.editor.EditorSessionKt
+RemovedClass: androidx.wear.watchface.editor.WatchFaceEditorContractKt:
+    Removed class androidx.wear.watchface.editor.WatchFaceEditorContractKt
diff --git a/wear/watchface/watchface-editor/api/current.txt b/wear/watchface/watchface-editor/api/current.txt
index a3e0615..6a24f7f 100644
--- a/wear/watchface/watchface-editor/api/current.txt
+++ b/wear/watchface/watchface-editor/api/current.txt
@@ -71,9 +71,6 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) throws kotlinx.coroutines.TimeoutCancellationException;
   }
 
-  public final class EditorSessionKt {
-  }
-
   public final class PreviewScreenshotParams {
     ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
     method public java.time.Instant getInstant();
@@ -93,8 +90,5 @@
   public static final class WatchFaceEditorContract.Companion {
   }
 
-  public final class WatchFaceEditorContractKt {
-  }
-
 }
 
diff --git a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
index a3e0615..6a24f7f 100644
--- a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
@@ -71,9 +71,6 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) throws kotlinx.coroutines.TimeoutCancellationException;
   }
 
-  public final class EditorSessionKt {
-  }
-
   public final class PreviewScreenshotParams {
     ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
     method public java.time.Instant getInstant();
@@ -93,8 +90,5 @@
   public static final class WatchFaceEditorContract.Companion {
   }
 
-  public final class WatchFaceEditorContractKt {
-  }
-
 }
 
diff --git a/wear/watchface/watchface-editor/api/restricted_current.ignore b/wear/watchface/watchface-editor/api/restricted_current.ignore
new file mode 100644
index 0000000..5bed420
--- /dev/null
+++ b/wear/watchface/watchface-editor/api/restricted_current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.editor.EditorSessionKt:
+    Removed class androidx.wear.watchface.editor.EditorSessionKt
+RemovedClass: androidx.wear.watchface.editor.WatchFaceEditorContractKt:
+    Removed class androidx.wear.watchface.editor.WatchFaceEditorContractKt
diff --git a/wear/watchface/watchface-editor/api/restricted_current.txt b/wear/watchface/watchface-editor/api/restricted_current.txt
index a3e0615..6a24f7f 100644
--- a/wear/watchface/watchface-editor/api/restricted_current.txt
+++ b/wear/watchface/watchface-editor/api/restricted_current.txt
@@ -71,9 +71,6 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession>) throws kotlinx.coroutines.TimeoutCancellationException;
   }
 
-  public final class EditorSessionKt {
-  }
-
   public final class PreviewScreenshotParams {
     ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
     method public java.time.Instant getInstant();
@@ -93,8 +90,5 @@
   public static final class WatchFaceEditorContract.Companion {
   }
 
-  public final class WatchFaceEditorContractKt {
-  }
-
 }
 
diff --git a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
index 796e82ca..1c3d8e7 100644
--- a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
+++ b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
@@ -28,10 +28,10 @@
 import android.widget.Button
 import androidx.annotation.RestrictTo
 import androidx.fragment.app.Fragment
-import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.RenderParameters.HighlightLayer
+import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.editor.ChosenComplicationDataSource
 import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.widget.SwipeDismissFrameLayout
@@ -39,9 +39,7 @@
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 
-/**
- * This fragment lets the user select a non-background complication to configure.
- */
+/** This fragment lets the user select a non-background complication to configure. */
 internal class ComplicationConfigFragment : Fragment() {
 
     override fun onCreateView(
@@ -49,10 +47,7 @@
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
-        return ConfigView(
-            requireContext(),
-            activity as WatchFaceConfigActivity
-        ).apply {
+        return ConfigView(requireContext(), activity as WatchFaceConfigActivity).apply {
             isSwipeable = true
             addCallback(
                 object : SwipeDismissFrameLayout.Callback() {
@@ -77,7 +72,6 @@
 )
 internal class ConfigView(
     context: Context,
-
     private val watchFaceConfigActivity: WatchFaceConfigActivity
 ) : SwipeDismissFrameLayout(context) {
 
@@ -88,9 +82,10 @@
     private val complicationButtons =
         watchFaceConfigActivity.editorSession.complicationSlotsState.value.mapValues { entry ->
             // TODO(alexclarke): This button is a Rect which makes the tap animation look bad.
-            if (entry.value.fixedComplicationDataSource ||
-                !entry.value.isEnabled ||
-                entry.key == watchFaceConfigActivity.editorSession.backgroundComplicationSlotId
+            if (
+                entry.value.fixedComplicationDataSource ||
+                    !entry.value.isEnabled ||
+                    entry.key == watchFaceConfigActivity.editorSession.backgroundComplicationSlotId
             ) {
                 // Do not create a button for fixed complicationSlots, disabled complicationSlots,
                 // or background complicationSlots.
@@ -99,20 +94,22 @@
                 Button(context).apply {
                     // Make the button transparent unless tapped upon.
                     setBackgroundResource(
-                        TypedValue().apply {
-                            context.theme.resolveAttribute(
-                                android.R.attr.selectableItemBackground,
-                                this,
-                                true
-                            )
-                        }.resourceId
+                        TypedValue()
+                            .apply {
+                                context.theme.resolveAttribute(
+                                    android.R.attr.selectableItemBackground,
+                                    this,
+                                    true
+                                )
+                            }
+                            .resourceId
                     )
                     setOnClickListener { onComplicationButtonClicked(entry.key) }
                     setOnLongClickListener {
                         watchFaceConfigActivity.coroutineScope.launch {
                             val dataSourceInfo =
-                                watchFaceConfigActivity.editorSession
-                                    .complicationsDataSourceInfo.value[entry.key]
+                                watchFaceConfigActivity.editorSession.complicationsDataSourceInfo
+                                    .value[entry.key]
                             it.tooltipText =
                                 dataSourceInfo?.name ?: "Empty complication data source"
                         }
@@ -120,9 +117,7 @@
                         // default handler.
                         false
                     }
-                    entry.value.nameResourceId?.let {
-                        contentDescription = context.getString(it)
-                    }
+                    entry.value.nameResourceId?.let { contentDescription = context.getString(it) }
                     addView(this)
                 }
             }
@@ -147,12 +142,7 @@
             button?.width = rect.width()
             button?.height = rect.width()
             button?.layoutParams = LayoutParams(rect.width(), rect.height())
-            button?.layout(
-                rect.left,
-                rect.top,
-                rect.right,
-                rect.bottom
-            )
+            button?.layout(rect.left, rect.top, rect.right, rect.bottom)
         }
     }
 
@@ -172,25 +162,25 @@
 
     override fun onDraw(canvas: Canvas) {
         val editingSession = watchFaceConfigActivity.editorSession
-        val bitmap = editingSession.renderWatchFaceToBitmap(
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                HighlightLayer(
-                    RenderParameters.HighlightedElement.AllComplicationSlots,
-                    Color.RED, // Red complication highlight.
-                    Color.argb(128, 0, 0, 0) // Darken everything else.
-                )
-            ),
-            editingSession.previewReferenceInstant,
-            previewComplicationData.value
-        )
+        val bitmap =
+            editingSession.renderWatchFaceToBitmap(
+                RenderParameters(
+                    DrawMode.INTERACTIVE,
+                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                    HighlightLayer(
+                        RenderParameters.HighlightedElement.AllComplicationSlots,
+                        Color.RED, // Red complication highlight.
+                        Color.argb(128, 0, 0, 0) // Darken everything else.
+                    )
+                ),
+                editingSession.previewReferenceInstant,
+                previewComplicationData.value
+            )
         canvas.drawBitmap(bitmap, drawRect, drawRect, null)
     }
 
     private fun updateUi(
-        @Suppress("UNUSED_PARAMETER")
-        chosenComplicationDataSource: ChosenComplicationDataSource?
+        @Suppress("UNUSED_PARAMETER") chosenComplicationDataSource: ChosenComplicationDataSource?
     ) {
         // The fragment can use the chosen complication to update the UI.
     }
diff --git a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
index c3ba72d..6050261 100644
--- a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
+++ b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
@@ -64,13 +64,10 @@
     companion object {
         const val SETTINGS_ID = "SETTINGS_ID"
 
-        fun newInstance(
-            settingIds: ArrayList<String>
-        ) = ConfigFragment().apply {
-            arguments = Bundle().apply {
-                this.putStringArrayList(SETTINGS_ID, settingIds)
+        fun newInstance(settingIds: ArrayList<String>) =
+            ConfigFragment().apply {
+                arguments = Bundle().apply { this.putStringArrayList(SETTINGS_ID, settingIds) }
             }
-        }
     }
 
     private var lifecycleObserver = LifecycleEventObserver { _, event ->
@@ -91,14 +88,15 @@
     ): View {
         settingIds = requireArguments().getStringArrayList(SETTINGS_ID)!!
 
-        view = inflater.inflate(R.layout.config_layout, container, false) as
-            SwipeDismissFrameLayout
+        view = inflater.inflate(R.layout.config_layout, container, false) as SwipeDismissFrameLayout
 
-        view.addCallback(object : SwipeDismissFrameLayout.Callback() {
-            override fun onDismissed(layout: SwipeDismissFrameLayout) {
-                parentFragmentManager.popBackStackImmediate()
+        view.addCallback(
+            object : SwipeDismissFrameLayout.Callback() {
+                override fun onDismissed(layout: SwipeDismissFrameLayout) {
+                    parentFragmentManager.popBackStackImmediate()
+                }
             }
-        })
+        )
 
         return view
     }
@@ -115,10 +113,11 @@
             configOptions.add(
                 ConfigOption(
                     id = Constants.KEY_COMPLICATIONS_SETTINGS,
-                    icon = Icon.createWithResource(
-                        context,
-                        R.drawable.ic_elements_settings_complications
-                    ),
+                    icon =
+                        Icon.createWithResource(
+                            context,
+                            R.drawable.ic_elements_settings_complications
+                        ),
                     title = resources.getString(R.string.settings_complications),
                     summary = "",
                     highlight = false
@@ -143,11 +142,7 @@
             )
         }
 
-        configViewAdapter = ConfigViewAdapter(
-            requireContext(),
-            configOptions,
-            this::onItemClick
-        )
+        configViewAdapter = ConfigViewAdapter(requireContext(), configOptions, this::onItemClick)
         view.findViewById<WearableRecyclerView>(R.id.configOptionsList).apply {
             adapter = configViewAdapter
             isEdgeItemsCenteringEnabled = true
@@ -159,30 +154,27 @@
 
     private fun createBackgroundConfigOption(): ConfigOption {
         // Initially assume there is no background image data source.
-        val backgroundConfigOption = ConfigOption(
-            id = Constants.KEY_BACKGROUND_IMAGE_SETTINGS,
-            icon = Icon.createWithResource(
-                context,
-                R.drawable.ic_elements_comps_bg
-            ),
-            title = getResources().getString(R.string.settings_background_image),
-            summary = resources.getString(R.string.none_background_image_provider),
-            highlight = false
-        )
+        val backgroundConfigOption =
+            ConfigOption(
+                id = Constants.KEY_BACKGROUND_IMAGE_SETTINGS,
+                icon = Icon.createWithResource(context, R.drawable.ic_elements_comps_bg),
+                title = getResources().getString(R.string.settings_background_image),
+                summary = resources.getString(R.string.none_background_image_provider),
+                highlight = false
+            )
 
         // Update the summary with the actual background complication data source name, if there is
         // one.
         watchFaceConfigActivity.coroutineScope.launch {
             val dataSourceInfoRetriever =
                 ComplicationDataSourceInfoRetriever(activity as WatchFaceConfigActivity)
-            val infoArray = dataSourceInfoRetriever.retrieveComplicationDataSourceInfo(
-                watchFaceConfigActivity.editorSession.watchFaceComponentName,
-                intArrayOf(watchFaceConfigActivity.editorSession.backgroundComplicationSlotId!!)
-            )
+            val infoArray =
+                dataSourceInfoRetriever.retrieveComplicationDataSourceInfo(
+                    watchFaceConfigActivity.editorSession.watchFaceComponentName,
+                    intArrayOf(watchFaceConfigActivity.editorSession.backgroundComplicationSlotId!!)
+                )
             infoArray?.let {
-                it[0].info?.apply {
-                    backgroundConfigOption.summary = name
-                }
+                it[0].info?.apply { backgroundConfigOption.summary = name }
                 configViewAdapter.notifyDataSetChanged()
             }
             dataSourceInfoRetriever.close()
@@ -199,7 +191,6 @@
         when (configOption.id) {
             Constants.KEY_COMPLICATIONS_SETTINGS ->
                 watchFaceConfigActivity.fragmentController.showComplicationConfigSelectionFragment()
-
             Constants.KEY_BACKGROUND_IMAGE_SETTINGS -> {
                 watchFaceConfigActivity.coroutineScope.launch {
                     watchFaceConfigActivity.fragmentController.showComplicationConfig(
@@ -207,7 +198,6 @@
                     )
                 }
             }
-
             else -> {
                 watchFaceConfigActivity.fragmentController.showStyleConfigFragment(
                     configOption.id,
@@ -242,10 +232,7 @@
          * @param icon the icon to wrap.
          * @return the wrapped icon.
          */
-        fun wrapIcon(
-            context: Context,
-            icon: Drawable
-        ): Drawable {
+        fun wrapIcon(context: Context, icon: Drawable): Drawable {
             if (icon is LayerDrawable && icon.findDrawableByLayerId(R.id.nested_icon) != null) {
                 return icon // icon was already wrapped, return the icon without modifying it
             }
@@ -272,15 +259,12 @@
         }
     }
 
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ConfigViewHolder(
-        LayoutInflater.from(parent.context).inflate(
-            R.layout.configlist_item_layout,
-            parent,
-            false
-        )
-    ).apply {
-        itemView.setOnClickListener { clickListener(configOption!!) }
-    }
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+        ConfigViewHolder(
+                LayoutInflater.from(parent.context)
+                    .inflate(R.layout.configlist_item_layout, parent, false)
+            )
+            .apply { itemView.setOnClickListener { clickListener(configOption!!) } }
 
     override fun onBindViewHolder(holder: ConfigViewHolder, position: Int) {
         val configOption = configOptions[position]
diff --git a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
index 378905c..924ec20 100644
--- a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
+++ b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
@@ -40,6 +40,7 @@
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting
+import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting2
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
@@ -51,9 +52,7 @@
 import androidx.wear.widget.WearableLinearLayoutManager
 import androidx.wear.widget.WearableRecyclerView
 
-/**
- * Fragment for selecting a userStyle setting within a particular setting.
- */
+/** Fragment for selecting a userStyle setting within a particular setting. */
 internal class StyleConfigFragment : Fragment(), ClickListener {
 
     private lateinit var settingId: String
@@ -66,20 +65,21 @@
         const val USER_STYLE = "USER_STYLE"
         const val STYLE_SCHEMA = "STYLE_SCHEMA"
 
-        fun newInstance(
-            settingId: String,
-            styleSchema: UserStyleSchema,
-            userStyle: UserStyle
-        ) = StyleConfigFragment().apply {
-            arguments = Bundle().apply {
-                putCharSequence(SETTING_ID, settingId)
-                putParcelable(
-                    STYLE_SCHEMA,
-                    ParcelUtils.toParcelable(styleSchema.toWireFormat())
-                )
-                putParcelable(USER_STYLE, ParcelUtils.toParcelable(userStyle.toWireFormat()))
+        fun newInstance(settingId: String, styleSchema: UserStyleSchema, userStyle: UserStyle) =
+            StyleConfigFragment().apply {
+                arguments =
+                    Bundle().apply {
+                        putCharSequence(SETTING_ID, settingId)
+                        putParcelable(
+                            STYLE_SCHEMA,
+                            ParcelUtils.toParcelable(styleSchema.toWireFormat())
+                        )
+                        putParcelable(
+                            USER_STYLE,
+                            ParcelUtils.toParcelable(userStyle.toWireFormat())
+                        )
+                    }
             }
-        }
     }
 
     override fun onCreateView(
@@ -106,7 +106,6 @@
                 }
                 booleanStyle.visibility = View.VISIBLE
             }
-
             is ListUserStyleSetting -> {
                 styleOptionsList.adapter =
                     ListStyleSettingViewAdapter(
@@ -119,7 +118,6 @@
                 styleOptionsList.layoutManager = WearableLinearLayoutManager(context)
                 styleOptionsList.visibility = View.VISIBLE
             }
-
             is ComplicationSlotsUserStyleSetting -> {
                 styleOptionsList.adapter =
                     ComplicationsStyleSettingViewAdapter(
@@ -131,17 +129,16 @@
                 styleOptionsList.layoutManager = WearableLinearLayoutManager(context)
                 styleOptionsList.visibility = View.VISIBLE
             }
-
             is CustomValueUserStyleSetting -> {
-                // TODO(alexclarke): Implement.
+                // Not supported, ignore.
             }
-
+            is CustomValueUserStyleSetting2 -> {
+                // Not supported, ignore.
+            }
             is DoubleRangeUserStyleSetting -> {
                 val rangedStyleSetting = styleSetting as DoubleRangeUserStyleSetting
-                val minValue =
-                    (rangedStyleSetting.options.first() as DoubleRangeOption).value
-                val maxValue =
-                    (rangedStyleSetting.options.last() as DoubleRangeOption).value
+                val minValue = (rangedStyleSetting.options.first() as DoubleRangeOption).value
+                val maxValue = (rangedStyleSetting.options.last() as DoubleRangeOption).value
                 val delta = (maxValue - minValue) / 100.0f
                 val value = (userStyleOption as DoubleRangeOption).value.toFloat()
                 rangedStyle.progress = ((value - minValue) / delta).toInt()
@@ -149,23 +146,22 @@
                     setUserStyleOption(DoubleRangeOption(minValue + delta * it.toFloat()))
                 }
             }
-
             is LongRangeUserStyleSetting -> {
                 val longRangeStyleSetting = styleSetting as LongRangeUserStyleSetting
                 rangedStyle.min = longRangeStyleSetting.minimumValue.toInt()
                 rangedStyle.max = longRangeStyleSetting.maximumValue.toInt()
                 rangedStyle.progress = (userStyleOption as LongRangeOption).value.toInt()
-                setupRangedStyle(rangedStyle) {
-                    setUserStyleOption(LongRangeOption(it.toLong()))
-                }
+                setupRangedStyle(rangedStyle) { setUserStyleOption(LongRangeOption(it.toLong())) }
             }
         }
 
-        view.addCallback(object : SwipeDismissFrameLayout.Callback() {
-            override fun onDismissed(layout: SwipeDismissFrameLayout) {
-                parentFragmentManager.popBackStackImmediate()
+        view.addCallback(
+            object : SwipeDismissFrameLayout.Callback() {
+                override fun onDismissed(layout: SwipeDismissFrameLayout) {
+                    parentFragmentManager.popBackStackImmediate()
+                }
             }
-        })
+        )
 
         return view
     }
@@ -173,11 +169,8 @@
     private fun setupRangedStyle(rangedStyle: SeekBar, onProgressChanged: (progress: Int) -> Unit) {
         rangedStyle.setOnSeekBarChangeListener(
             object : SeekBar.OnSeekBarChangeListener {
-                override fun onProgressChanged(
-                    seekBar: SeekBar,
-                    progress: Int,
-                    fromUser: Boolean
-                ) = onProgressChanged(progress)
+                override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) =
+                    onProgressChanged(progress)
 
                 override fun onStartTrackingTouch(seekBar: SeekBar) {}
 
@@ -192,20 +185,22 @@
     private fun readOptionsFromArguments() {
         settingId = requireArguments().getCharSequence(SETTING_ID).toString()
 
-        styleSchema = UserStyleSchema(
-            ParcelUtils.fromParcelable<UserStyleSchemaWireFormat>(
-                requireArguments().getParcelable(STYLE_SCHEMA)!!
-            )!!
-        )
-
-        userStyle = UserStyle(
-            UserStyleData(
-                ParcelUtils.fromParcelable<UserStyleWireFormat>(
-                    requireArguments().getParcelable(USER_STYLE)!!
+        styleSchema =
+            UserStyleSchema(
+                ParcelUtils.fromParcelable<UserStyleSchemaWireFormat>(
+                    requireArguments().getParcelable(STYLE_SCHEMA)!!
                 )!!
-            ),
-            styleSchema
-        )
+            )
+
+        userStyle =
+            UserStyle(
+                UserStyleData(
+                    ParcelUtils.fromParcelable<UserStyleWireFormat>(
+                        requireArguments().getParcelable(USER_STYLE)!!
+                    )!!
+                ),
+                styleSchema
+            )
 
         styleSetting = styleSchema[UserStyleSetting.Id(settingId)]!!
     }
@@ -213,9 +208,11 @@
     internal fun setUserStyleOption(userStyleOption: UserStyleSetting.Option) {
         val watchFaceConfigActivity = (activity as WatchFaceConfigActivity)
         val editorSession = watchFaceConfigActivity.editorSession
-        editorSession.userStyle.value = editorSession.userStyle.value.toMutableUserStyle().apply {
-            this[styleSetting] = userStyleOption
-        }.toUserStyle()
+        editorSession.userStyle.value =
+            editorSession.userStyle.value
+                .toMutableUserStyle()
+                .apply { this[styleSetting] = userStyleOption }
+                .toUserStyle()
     }
 
     override fun onItemClick(userStyleOption: UserStyleSetting.Option) {
@@ -277,17 +274,18 @@
 
     private val handler = Handler(Looper.getMainLooper())
 
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = StyleSettingViewHolder(
-        LayoutInflater.from(parent.context).inflate(
-            R.layout.stylelist_item_layout, parent, false
-        )
-    ).apply {
-        itemView.setOnClickListener {
-            currentSelection = userStyleOption!!
-            this@ListStyleSettingViewAdapter.notifyDataSetChanged()
-            clickListener.onItemClick(userStyleOption!!)
-        }
-    }
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+        StyleSettingViewHolder(
+                LayoutInflater.from(parent.context)
+                    .inflate(R.layout.stylelist_item_layout, parent, false)
+            )
+            .apply {
+                itemView.setOnClickListener {
+                    currentSelection = userStyleOption!!
+                    this@ListStyleSettingViewAdapter.notifyDataSetChanged()
+                    clickListener.onItemClick(userStyleOption!!)
+                }
+            }
 
     override fun onBindViewHolder(holder: StyleSettingViewHolder, position: Int) {
         val styleOption = styleOptions[position]
@@ -315,25 +313,21 @@
     override fun getItemCount() = styleOptions.size
 }
 
-/**
- * An adapter for [ComplicationSlotsUserStyleSetting]. This is a very minimal placeholder UI.
- */
+/** An adapter for [ComplicationSlotsUserStyleSetting]. This is a very minimal placeholder UI. */
 internal class ComplicationsStyleSettingViewAdapter(
     private val context: Context,
     private val styleOptions: List<ComplicationSlotsOption>,
     private val clickListener: ClickListener
-) :
-    RecyclerView.Adapter<StyleSettingViewHolder>() {
+) : RecyclerView.Adapter<StyleSettingViewHolder>() {
 
     private val handler = Handler(Looper.getMainLooper())
 
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = StyleSettingViewHolder(
-        LayoutInflater.from(parent.context).inflate(
-            R.layout.stylelist_item_layout, parent, false
-        )
-    ).apply {
-        itemView.setOnClickListener { clickListener.onItemClick(userStyleOption!!) }
-    }
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+        StyleSettingViewHolder(
+                LayoutInflater.from(parent.context)
+                    .inflate(R.layout.stylelist_item_layout, parent, false)
+            )
+            .apply { itemView.setOnClickListener { clickListener.onItemClick(userStyleOption!!) } }
 
     override fun onBindViewHolder(holder: StyleSettingViewHolder, position: Int) {
         val styleOption = styleOptions[position]
diff --git a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
index 947000c..90c5e0e 100644
--- a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
+++ b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
@@ -38,8 +38,8 @@
     fun showConfigFragment()
 
     /**
-     * Show the [ComplicationConfigFragment] which lets the user select the complication
-     * they want to configure.
+     * Show the [ComplicationConfigFragment] which lets the user select the complication they want
+     * to configure.
      */
     fun showComplicationConfigSelectionFragment()
 
@@ -112,13 +112,12 @@
                     }
 
                     /**
-                     * Displays a config screen which allows the user to select the data source for the
-                     * complication.
+                     * Displays a config screen which allows the user to select the data source for
+                     * the complication.
                      */
                     @SuppressWarnings("deprecation")
-                    override suspend fun showComplicationConfig(
-                        complicationSlotId: Int
-                    ) = editorSession.openComplicationDataSourceChooser(complicationSlotId)
+                    override suspend fun showComplicationConfig(complicationSlotId: Int) =
+                        editorSession.openComplicationDataSourceChooser(complicationSlotId)
                 }
             )
         }
@@ -127,8 +126,7 @@
     private fun focusCurrentFragment() {
         val curFragment = supportFragmentManager.findFragmentById(android.R.id.content)
         if (curFragment != null) {
-            curFragment.view?.importantForAccessibility =
-                View.IMPORTANT_FOR_ACCESSIBILITY_YES
+            curFragment.view?.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
         }
 
         // Clear focus on the old fragment that is behind the new one, and announce the new title.
@@ -149,21 +147,17 @@
             .commit()
     }
 
-    private fun init(
-        editorSession: EditorSession,
-        fragmentController: FragmentController
-    ) {
+    private fun init(editorSession: EditorSession, fragmentController: FragmentController) {
         this.editorSession = editorSession
         this.fragmentController = fragmentController
 
-        supportFragmentManager
-            .addOnBackStackChangedListener {
-                if (supportFragmentManager.backStackEntryCount == 0) {
-                    finish()
-                } else {
-                    focusCurrentFragment()
-                }
+        supportFragmentManager.addOnBackStackChangedListener {
+            if (supportFragmentManager.backStackEntryCount == 0) {
+                finish()
+            } else {
+                focusCurrentFragment()
             }
+        }
 
         var topLevelOptionCount = editorSession.userStyleSchema.rootUserStyleSettings.size
         val hasBackgroundComplication = editorSession.backgroundComplicationSlotId != null
@@ -184,8 +178,7 @@
 
             // For a single complication go directly to the complication data source selector.
             numComplications == 1 -> {
-                val onlyComplication =
-                    editorSession.complicationSlotsState.value.entries.first()
+                val onlyComplication = editorSession.complicationSlotsState.value.entries.first()
                 coroutineScope.launch {
                     val chosenComplicationProvider =
                         fragmentController.showComplicationConfig(onlyComplication.key)
@@ -199,8 +192,7 @@
             // For a single style, go select the option.
             editorSession.userStyleSchema.rootUserStyleSettings.size == 1 -> {
                 // There should only be a single userStyle setting if we get here.
-                val onlyStyleSetting =
-                    editorSession.userStyleSchema.rootUserStyleSettings.first()
+                val onlyStyleSetting = editorSession.userStyleSchema.rootUserStyleSettings.first()
                 fragmentController.showStyleConfigFragment(
                     onlyStyleSetting.id.value,
                     editorSession.userStyleSchema,
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
index 2b85444..943df16 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
@@ -30,12 +30,6 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.wear.watchface.complications.ComplicationDataSourceInfo
-import androidx.wear.watchface.complications.ComplicationSlotBounds
-import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
-import androidx.wear.watchface.complications.SystemDataSources
-import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.complications.data.LongTextComplicationData
 import androidx.wear.watchface.CanvasComplication
 import androidx.wear.watchface.ComplicationDataSourceChooserIntent
 import androidx.wear.watchface.ComplicationHelperActivity
@@ -45,20 +39,26 @@
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.client.WatchFaceId
 import androidx.wear.watchface.client.asApiEditorState
+import androidx.wear.watchface.complications.ComplicationDataSourceInfo
+import androidx.wear.watchface.complications.ComplicationSlotBounds
+import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
+import androidx.wear.watchface.complications.SystemDataSources
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.data.LongTextComplicationData
 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.assertThat
+import java.time.Instant
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.CompletableDeferred
 import org.junit.After
 import org.junit.Assert
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito
-import java.time.Instant
-import java.util.concurrent.TimeUnit
 
 private const val TIMEOUT_MS = 500L
 
@@ -83,18 +83,22 @@
     private val leftComplication =
         @Suppress("DEPRECATION")
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            LEFT_COMPLICATION_ID,
-            { _, _, -> mockLeftCanvasComplication },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-            ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                LEFT_COMPLICATION_ID,
+                { _, _,
+                    ->
+                    mockLeftCanvasComplication
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
+                ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+            )
+            .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
     private val mockRightCanvasComplication =
@@ -106,23 +110,25 @@
     private val rightComplication =
         @Suppress("DEPRECATION")
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            RIGHT_COMPLICATION_ID,
-            { _, _, -> mockRightCanvasComplication },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-            ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                RIGHT_COMPLICATION_ID,
+                { _, _,
+                    ->
+                    mockRightCanvasComplication
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
+                ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+            )
+            .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
-    private val backgroundHandlerThread = HandlerThread("TestBackgroundThread").apply {
-        start()
-    }
+    private val backgroundHandlerThread = HandlerThread("TestBackgroundThread").apply { start() }
 
     private val backgroundHandler = Handler(backgroundHandlerThread.looper)
 
@@ -150,22 +156,25 @@
             TestComplicationDataSourceInfoRetrieverProvider()
 
         return ActivityScenario.launch(
-            WatchFaceEditorContract().createIntent(
-                ApplicationProvider.getApplicationContext<Context>(),
-                EditorRequest(
-                    testComponentName,
-                    testEditorPackageName,
-                    null,
-                    watchFaceId,
-                    null,
-                    null
-                )
-            ).apply {
-                component = ComponentName(
+            WatchFaceEditorContract()
+                .createIntent(
                     ApplicationProvider.getApplicationContext<Context>(),
-                    OnWatchFaceEditingTestActivity::class.java
+                    EditorRequest(
+                        testComponentName,
+                        testEditorPackageName,
+                        null,
+                        watchFaceId,
+                        null,
+                        null
+                    )
                 )
-            }
+                .apply {
+                    component =
+                        ComponentName(
+                            ApplicationProvider.getApplicationContext<Context>(),
+                            OnWatchFaceEditingTestActivity::class.java
+                        )
+                }
         )
     }
 
@@ -181,27 +190,28 @@
     @Test
     public fun listenableOpenComplicationDataSourceChooser() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
-        val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
-            "TestDataSource3App",
-            "TestDataSource3",
-            Icon.createWithBitmap(
-                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-            ),
-            ComplicationType.LONG_TEXT,
-            dataSource3
-        )
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred(
-            Intent().apply {
-                putExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                    chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
-                )
-            }
-        )
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val chosenComplicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "TestDataSource3App",
+                "TestDataSource3",
+                Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                ComplicationType.LONG_TEXT,
+                dataSource3
+            )
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred(
+                Intent().apply {
+                    putExtra(
+                        ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                        chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+                    )
+                }
+            )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var listenableEditorSession: ListenableEditorSession
         scenario.onActivity { activity ->
@@ -209,13 +219,13 @@
         }
 
         /**
-         * Invoke [TestComplicationHelperActivity] which will change the data source (and hence
-         * the preview data) for [LEFT_COMPLICATION_ID].
+         * Invoke [TestComplicationHelperActivity] which will change the data source (and hence the
+         * preview data) for [LEFT_COMPLICATION_ID].
          */
         val chosenComplicationDataSource =
-            listenableEditorSession.listenableOpenComplicationDataSourceChooser(
-                LEFT_COMPLICATION_ID
-            ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+            listenableEditorSession
+                .listenableOpenComplicationDataSourceChooser(LEFT_COMPLICATION_ID)
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         assertThat(chosenComplicationDataSource).isNotNull()
         checkNotNull(chosenComplicationDataSource)
         assertThat(chosenComplicationDataSource.complicationSlotId).isEqualTo(LEFT_COMPLICATION_ID)
@@ -230,20 +240,22 @@
                 as LongTextComplicationData
 
         assertThat(
-            previewComplication.text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                previewComplication.text.getTextAt(
+                    ApplicationProvider.getApplicationContext<Context>().resources,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo("DataSource3")
+            .isEqualTo("DataSource3")
     }
 
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun doNotCommitChangesOnClose() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList()
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList()
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -260,11 +272,14 @@
             // Select [blueStyleOption] and [gothicStyleOption], which are the last options in the
             // corresponding setting definitions.
             listenableEditorSession.userStyle.value =
-                listenableEditorSession.userStyle.value.toMutableUserStyle().apply {
-                    listenableEditorSession.userStyleSchema.userStyleSettings.forEach {
-                        this[it] = it.options.last()
+                listenableEditorSession.userStyle.value
+                    .toMutableUserStyle()
+                    .apply {
+                        listenableEditorSession.userStyleSchema.userStyleSettings.forEach {
+                            this[it] = it.options.last()
+                        }
                     }
-                }.toUserStyle()
+                    .toUserStyle()
 
             // This should cause the style on the to be reverted back to the initial style.
             listenableEditorSession.commitChangesOnClose = false
@@ -272,10 +287,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
         assertThat(result.userStyle.userStyleMap[colorStyleSetting.id.value])
             .isEqualTo(blueStyleOption.id.value)
         assertThat(result.userStyle.userStyleMap[watchHandStyleSetting.id.value])
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index fb6ed5d..58e4a50 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.watchface.editor
 
-import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.content.ComponentName
@@ -36,6 +35,7 @@
 import android.os.HandlerThread
 import android.os.IBinder
 import android.os.Looper
+import android.support.wearable.complications.ComplicationProviderInfo as WireComplicationProviderInfo
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
 import android.support.wearable.watchface.Constants
@@ -47,27 +47,19 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
-import androidx.wear.watchface.complications.ComplicationDataSourceInfo
-import androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever
-import androidx.wear.watchface.complications.ComplicationSlotBounds
-import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
-import androidx.wear.watchface.complications.SystemDataSources
-import androidx.wear.watchface.complications.data.ComplicationText
-import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.complications.data.EmptyComplicationData
-import androidx.wear.watchface.complications.data.LongTextComplicationData
-import androidx.wear.watchface.complications.data.PlainComplicationText
-import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.BroadcastsObserver
 import androidx.wear.watchface.CanvasComplication
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.ComplicationDataSourceChooserIntent
 import androidx.wear.watchface.ComplicationHelperActivity
 import androidx.wear.watchface.ComplicationSlot
+import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.ComplicationSlotsManager
+import androidx.wear.watchface.DEFAULT_INSTANCE_ID
 import androidx.wear.watchface.MutableWatchState
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.Renderer
+import androidx.wear.watchface.SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceHostApi
 import androidx.wear.watchface.WatchFaceImpl
@@ -77,12 +69,20 @@
 import androidx.wear.watchface.client.DeviceConfig
 import androidx.wear.watchface.client.WatchFaceId
 import androidx.wear.watchface.client.asApiEditorState
+import androidx.wear.watchface.complications.ComplicationDataSourceInfo
+import androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever
+import androidx.wear.watchface.complications.ComplicationSlotBounds
+import androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy
+import androidx.wear.watchface.complications.SystemDataSources
+import androidx.wear.watchface.complications.data.ComplicationData
+import androidx.wear.watchface.complications.data.ComplicationText
+import androidx.wear.watchface.complications.data.ComplicationType
+import androidx.wear.watchface.complications.data.EmptyComplicationData
+import androidx.wear.watchface.complications.data.LongTextComplicationData
+import androidx.wear.watchface.complications.data.PlainComplicationText
+import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
-import androidx.wear.watchface.ComplicationSlotBoundsType
-import androidx.wear.watchface.DEFAULT_INSTANCE_ID
-import androidx.wear.watchface.SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX
-import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.editor.EditorSession.Companion.EDITING_SESSION_TIMEOUT
 import androidx.wear.watchface.editor.data.EditorStateWireFormat
 import androidx.wear.watchface.style.CurrentUserStyleRepository
@@ -94,6 +94,13 @@
 import androidx.wear.watchface.style.UserStyleSetting.Option
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
+import java.lang.IllegalArgumentException
+import java.time.Instant
+import java.time.ZonedDateTime
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeUnit.MILLISECONDS
+import kotlin.test.assertFailsWith
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -106,7 +113,6 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
-import kotlin.test.assertFailsWith
 import org.junit.After
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNotNull
@@ -115,21 +121,15 @@
 import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
 import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mockito
-import org.mockito.Mockito.`when`
 import org.mockito.Mockito.doAnswer
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
-import java.lang.IllegalArgumentException
-import java.time.Instant
-import java.time.ZonedDateTime
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.TimeUnit.MILLISECONDS
-import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mockito.`when`
 
 public const val LEFT_COMPLICATION_ID: Int = 1000
 public const val RIGHT_COMPLICATION_ID: Int = 1001
@@ -147,18 +147,18 @@
 private const val PROVIDER_CHOOSER_RESULT_EXTRA_VALUE = "PROVIDER_CHOOSER_RESULT_EXTRA_VALUE"
 
 internal val redStyleOption = ListOption(Option.Id("red_style"), "Red", "Red", icon = null)
-internal val greenStyleOption =
-    ListOption(Option.Id("green_style"), "Green", "Green", icon = null)
+internal val greenStyleOption = ListOption(Option.Id("green_style"), "Green", "Green", icon = null)
 internal val blueStyleOption = ListOption(Option.Id("blue_style"), "Blue", "Blue", icon = null)
 internal val colorStyleList = listOf(redStyleOption, greenStyleOption, blueStyleOption)
-internal val colorStyleSetting = UserStyleSetting.ListUserStyleSetting(
-    UserStyleSetting.Id("color_style_setting"),
-    "Colors",
-    "Watchface colorization", /* icon = */
-    null,
-    colorStyleList,
-    listOf(WatchFaceLayer.BASE)
-)
+internal val colorStyleSetting =
+    UserStyleSetting.ListUserStyleSetting(
+        UserStyleSetting.Id("color_style_setting"),
+        "Colors",
+        "Watchface colorization",
+        /* icon = */ null,
+        colorStyleList,
+        listOf(WatchFaceLayer.BASE)
+    )
 
 internal val classicStyleOption =
     ListOption(Option.Id("classic_style"), "Classic", "Classic", icon = null)
@@ -166,30 +166,31 @@
     ListOption(Option.Id("modern_style"), "Modern", "Modern", icon = null)
 internal val gothicStyleOption =
     ListOption(Option.Id("gothic_style"), "Gothic", "Gothic", icon = null)
-internal val watchHandStyleList =
-    listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
-internal val watchHandStyleSetting = UserStyleSetting.ListUserStyleSetting(
-    UserStyleSetting.Id("hand_style_setting"),
-    "Hand Style",
-    "Hand visual look", /* icon = */
-    null,
-    watchHandStyleList,
-    listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-)
+internal val watchHandStyleList = listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
+internal val watchHandStyleSetting =
+    UserStyleSetting.ListUserStyleSetting(
+        UserStyleSetting.Id("hand_style_setting"),
+        "Hand Style",
+        "Hand visual look",
+        /* icon = */ null,
+        watchHandStyleList,
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+    )
 
-private val mockInvalidateCallback =
-    Mockito.mock(CanvasComplication.InvalidateCallback::class.java)
+private val mockInvalidateCallback = Mockito.mock(CanvasComplication.InvalidateCallback::class.java)
 private val placeholderWatchState = MutableWatchState().asWatchState()
-private val mockLeftCanvasComplication = CanvasComplicationDrawable(
-    ComplicationDrawable(),
-    placeholderWatchState,
-    mockInvalidateCallback
-)
-private val mockRightCanvasComplication = CanvasComplicationDrawable(
-    ComplicationDrawable(),
-    placeholderWatchState,
-    mockInvalidateCallback
-)
+private val mockLeftCanvasComplication =
+    CanvasComplicationDrawable(
+        ComplicationDrawable(),
+        placeholderWatchState,
+        mockInvalidateCallback
+    )
+private val mockRightCanvasComplication =
+    CanvasComplicationDrawable(
+        ComplicationDrawable(),
+        placeholderWatchState,
+        mockInvalidateCallback
+    )
 private val mockBackgroundCanvasComplication =
     CanvasComplicationDrawable(
         ComplicationDrawable(),
@@ -198,11 +199,13 @@
     )
 private val backgroundComplication =
     ComplicationSlot.createBackgroundComplicationSlotBuilder(
-        BACKGROUND_COMPLICATION_ID,
-        { _, _ -> mockBackgroundCanvasComplication },
-        emptyList(),
-        DefaultComplicationDataSourcePolicy()
-    ).setEnabled(false).build()
+            BACKGROUND_COMPLICATION_ID,
+            { _, _ -> mockBackgroundCanvasComplication },
+            emptyList(),
+            DefaultComplicationDataSourcePolicy()
+        )
+        .setEnabled(false)
+        .build()
 
 private val bothComplicationsOption =
     UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
@@ -221,8 +224,10 @@
         null,
         listOf(
             UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder(
-                RIGHT_COMPLICATION_ID
-            ).setEnabled(false).build()
+                    RIGHT_COMPLICATION_ID
+                )
+                .setEnabled(false)
+                .build()
         )
     )
 private val rightOnlyComplicationsOption =
@@ -233,22 +238,26 @@
         null,
         listOf(
             UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder(
-                LEFT_COMPLICATION_ID
-            ).setEnabled(false).build()
+                    LEFT_COMPLICATION_ID
+                )
+                .setEnabled(false)
+                .build()
         )
     )
-private val complicationsStyleSetting = UserStyleSetting.ComplicationSlotsUserStyleSetting(
-    UserStyleSetting.Id("complications_style_setting"),
-    "AllComplicationSlots",
-    "Number and position",
-    icon = null,
-    complicationConfig = listOf(
-        bothComplicationsOption,
-        leftOnlyComplicationsOption,
-        rightOnlyComplicationsOption
-    ),
-    affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-)
+private val complicationsStyleSetting =
+    UserStyleSetting.ComplicationSlotsUserStyleSetting(
+        UserStyleSetting.Id("complications_style_setting"),
+        "AllComplicationSlots",
+        "Number and position",
+        icon = null,
+        complicationConfig =
+            listOf(
+                bothComplicationsOption,
+                leftOnlyComplicationsOption,
+                rightOnlyComplicationsOption
+            ),
+        affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+    )
 
 /** A trivial [WatchFaceService] used for testing headless editor instances. */
 public class TestHeadlessWatchFaceService : WatchFaceService() {
@@ -264,33 +273,35 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.ANALOG,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.SOFTWARE,
-            100
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                when (currentUserStyleRepository.userStyle.value[colorStyleSetting]!!) {
-                    redStyleOption -> canvas.drawColor(Color.RED)
-                    greenStyleOption -> canvas.drawColor(Color.GREEN)
-                    blueStyleOption -> canvas.drawColor(Color.BLUE)
+    ) =
+        WatchFace(
+            WatchFaceType.ANALOG,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.SOFTWARE,
+                    100
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    when (currentUserStyleRepository.userStyle.value[colorStyleSetting]!!) {
+                        redStyleOption -> canvas.drawColor(Color.RED)
+                        greenStyleOption -> canvas.drawColor(Color.GREEN)
+                        blueStyleOption -> canvas.drawColor(Color.BLUE)
+                    }
+                }
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    // NOP
                 }
             }
-
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                // NOP
-            }
-        }
-    )
+        )
 }
 
 /** Trivial "editor" which exposes the EditorSession for testing. */
@@ -306,7 +317,8 @@
 
     internal companion object {
         internal var complicationDataSourceInfoRetrieverProvider:
-            ComplicationDataSourceInfoRetrieverProvider? = null
+            ComplicationDataSourceInfoRetrieverProvider? =
+            null
     }
 
     public val immediateCoroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main.immediate)
@@ -315,11 +327,12 @@
         super.onCreate(savedInstanceState)
         immediateCoroutineScope.launch {
             try {
-                editorSession = EditorSession.createOnWatchEditorSessionImpl(
-                    this@OnWatchFaceEditingTestActivity,
-                    intent!!,
-                    complicationDataSourceInfoRetrieverProvider!!
-                )
+                editorSession =
+                    EditorSession.createOnWatchEditorSessionImpl(
+                        this@OnWatchFaceEditingTestActivity,
+                        intent!!,
+                        complicationDataSourceInfoRetrieverProvider!!
+                    )
             } catch (e: Exception) {
                 onCreateException = e
             } finally {
@@ -340,39 +353,49 @@
         Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888))
 
     private val watchFaceComponent = ComponentName("test.package", "test.class")
-    private val dataSourceInfos = mapOf(
-        LEFT_COMPLICATION_ID to ComplicationDataSourceInfo(
-            "DataSourceApp1",
-            "DataSource1",
-            dataSourceIcon1,
-            ComplicationType.SHORT_TEXT,
-            dataSource1
-        ),
-        RIGHT_COMPLICATION_ID to ComplicationDataSourceInfo(
-            "DataSourceApp2",
-            "DataSource2",
-            dataSourceIcon2,
-            ComplicationType.LONG_TEXT,
-            dataSource2
+    private val dataSourceInfos =
+        mapOf(
+            LEFT_COMPLICATION_ID to
+                ComplicationDataSourceInfo(
+                    "DataSourceApp1",
+                    "DataSource1",
+                    dataSourceIcon1,
+                    ComplicationType.SHORT_TEXT,
+                    dataSource1
+                ),
+            RIGHT_COMPLICATION_ID to
+                ComplicationDataSourceInfo(
+                    "DataSourceApp2",
+                    "DataSource2",
+                    dataSourceIcon2,
+                    ComplicationType.LONG_TEXT,
+                    dataSource2
+                )
         )
-    )
-    private val previewData = mapOf(
-        dataSource1 to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("Left").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-        dataSource2 to
-            LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("Right").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-        dataSource3 to
-            LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("DataSource3").build(),
-                ComplicationText.EMPTY
-            ).build().asWireComplicationData(),
-    )
+    private val previewData =
+        mapOf(
+            dataSource1 to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Left").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+            dataSource2 to
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Right").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+            dataSource3 to
+                LongTextComplicationData.Builder(
+                        PlainComplicationText.Builder("DataSource3").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .build()
+                    .asWireComplicationData(),
+        )
 
     public lateinit var lastComplicationDataSourceInfoRetriever: ComplicationDataSourceInfoRetriever
 
@@ -389,11 +412,13 @@
         if (watchFaceComponent != this.watchFaceComponent) {
             return null
         }
-        return ArrayList<WireComplicationProviderInfo?>().apply {
-            for (id in ids) {
-                add(dataSourceInfos[id]?.toWireComplicationProviderInfo())
+        return ArrayList<WireComplicationProviderInfo?>()
+            .apply {
+                for (id in ids) {
+                    add(dataSourceInfos[id]?.toWireComplicationProviderInfo())
+                }
             }
-        }.toTypedArray()
+            .toTypedArray()
     }
 
     override fun getApiVersion(): Int = 1
@@ -468,10 +493,8 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 public class EditorSessionTest {
-    private val headlessWatchFaceComponentName = ComponentName(
-        "test.package",
-        TestHeadlessWatchFaceService::class.qualifiedName!!
-    )
+    private val headlessWatchFaceComponentName =
+        ComponentName("test.package", TestHeadlessWatchFaceService::class.qualifiedName!!)
     private val testEditorPackageName = "test.package"
     private val testInstanceId = WatchFaceId(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "1")
     private lateinit var editorDelegate: WatchFace.EditorDelegate
@@ -487,66 +510,65 @@
 
     private val leftComplication =
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            LEFT_COMPLICATION_ID,
-            { _, _ -> mockLeftCanvasComplication },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-
-            DefaultComplicationDataSourcePolicy(
-                ComponentName("com.primary.package", "com.primary.app"),
-                ComplicationType.LONG_TEXT,
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
-                ComplicationType.SHORT_TEXT
-            ),
-            ComplicationSlotBounds(
-                ComplicationType.values().associateWith {
-                    if (it == ComplicationType.LONG_TEXT) {
-                        RectF(0.1f, 0.4f, 0.4f, 0.6f)
-                    } else {
-                        RectF(0.3f, 0.4f, 0.4f, 0.6f)
-                    }
-                },
-                ComplicationType.values().associateWith { RectF() }
+                LEFT_COMPLICATION_ID,
+                { _, _ -> mockLeftCanvasComplication },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(
+                    ComponentName("com.primary.package", "com.primary.app"),
+                    ComplicationType.LONG_TEXT,
+                    SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                    ComplicationType.SHORT_TEXT
+                ),
+                ComplicationSlotBounds(
+                    ComplicationType.values().associateWith {
+                        if (it == ComplicationType.LONG_TEXT) {
+                            RectF(0.1f, 0.4f, 0.4f, 0.6f)
+                        } else {
+                            RectF(0.3f, 0.4f, 0.4f, 0.6f)
+                        }
+                    },
+                    ComplicationType.values().associateWith { RectF() }
+                )
             )
-        )
             .build()
 
     private val rightComplication =
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            RIGHT_COMPLICATION_ID,
-            { _, _ -> mockRightCanvasComplication },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(
-                ComponentName("com.primary.package", "com.primary.app"),
-                ComplicationType.LONG_TEXT,
-                ComponentName("com.secondary.package", "com.secondary.app"),
-                ComplicationType.PHOTO_IMAGE,
-                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
-                ComplicationType.SHORT_TEXT
-            ),
-            @Suppress("DEPRECATION")
-            ComplicationSlotBounds(
-                ComplicationType.values().associateWith {
-                    if (it == ComplicationType.LONG_TEXT) {
-                        RectF(0.6f, 0.4f, 0.9f, 0.6f)
-                    } else {
-                        RectF(0.6f, 0.4f, 0.7f, 0.6f)
-                    }
-                },
-                ComplicationType.values().associateWith { RectF() }
+                RIGHT_COMPLICATION_ID,
+                { _, _ -> mockRightCanvasComplication },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(
+                    ComponentName("com.primary.package", "com.primary.app"),
+                    ComplicationType.LONG_TEXT,
+                    ComponentName("com.secondary.package", "com.secondary.app"),
+                    ComplicationType.PHOTO_IMAGE,
+                    SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                    ComplicationType.SHORT_TEXT
+                ),
+                @Suppress("DEPRECATION")
+                ComplicationSlotBounds(
+                    ComplicationType.values().associateWith {
+                        if (it == ComplicationType.LONG_TEXT) {
+                            RectF(0.6f, 0.4f, 0.9f, 0.6f)
+                        } else {
+                            RectF(0.6f, 0.4f, 0.7f, 0.6f)
+                        }
+                    },
+                    ComplicationType.values().associateWith { RectF() }
+                )
             )
-        )
             .setConfigExtras(
                 Bundle().apply {
                     putString(PROVIDER_CHOOSER_EXTRA_KEY, PROVIDER_CHOOSER_EXTRA_VALUE)
@@ -576,47 +598,46 @@
         complicationSlotsManager.listenForStyleChanges(CoroutineScope(Dispatchers.Main.immediate))
 
         // Mocking getters and setters with mockito at the same time is hard so we do this instead.
-        editorDelegate = object : WatchFace.EditorDelegate {
-            private val backgroundHandlerThread = HandlerThread("TestBackgroundThread").apply {
-                start()
-            }
+        editorDelegate =
+            object : WatchFace.EditorDelegate {
+                private val backgroundHandlerThread =
+                    HandlerThread("TestBackgroundThread").apply { start() }
 
-            private val backgroundHandler = Handler(backgroundHandlerThread.looper)
+                private val backgroundHandler = Handler(backgroundHandlerThread.looper)
 
-            override val userStyleSchema = userStyleRepository.schema
-            override var userStyle: UserStyle
-                get() = userStyleRepository.userStyle.value
-                set(value) {
-                    userStyleRepository.updateUserStyle(value)
+                override val userStyleSchema = userStyleRepository.schema
+                override var userStyle: UserStyle
+                    get() = userStyleRepository.userStyle.value
+                    set(value) {
+                        userStyleRepository.updateUserStyle(value)
+                    }
+
+                override val complicationSlotsManager = complicationSlotsManager
+                override val screenBounds = this@EditorSessionTest.screenBounds
+                override val previewReferenceInstant = previewReferenceInstant
+                override val backgroundThreadHandler = backgroundHandler
+                override val complicationDeniedDialogIntent =
+                    this@EditorSessionTest.complicationDeniedDialogIntent
+                override val complicationRationaleDialogIntent =
+                    this@EditorSessionTest.complicationRationaleDialogIntent
+
+                override fun renderWatchFaceToBitmap(
+                    renderParameters: RenderParameters,
+                    instant: Instant,
+                    slotIdToComplicationData: Map<Int, ComplicationData>?
+                ) = fakeBitmap
+
+                override fun onDestroy() {
+                    onDestroyLatch.countDown()
+                    backgroundHandlerThread.quitSafely()
                 }
 
-            override val complicationSlotsManager = complicationSlotsManager
-            override val screenBounds = this@EditorSessionTest.screenBounds
-            override val previewReferenceInstant = previewReferenceInstant
-            override val backgroundThreadHandler = backgroundHandler
-            override val complicationDeniedDialogIntent =
-                this@EditorSessionTest.complicationDeniedDialogIntent
-            override val complicationRationaleDialogIntent =
-                this@EditorSessionTest.complicationRationaleDialogIntent
-
-            override fun renderWatchFaceToBitmap(
-                renderParameters: RenderParameters,
-                instant: Instant,
-                slotIdToComplicationData:
-                    Map<Int, ComplicationData>?
-            ) = fakeBitmap
-
-            override fun onDestroy() {
-                onDestroyLatch.countDown()
-                backgroundHandlerThread.quitSafely()
+                override fun setComplicationSlotConfigExtrasChangeCallback(
+                    callback: WatchFace.ComplicationSlotConfigExtrasChangeCallback?
+                ) {
+                    complicationSlotsManager.configExtrasChangeCallback = callback
+                }
             }
-
-            override fun setComplicationSlotConfigExtrasChangeCallback(
-                callback: WatchFace.ComplicationSlotConfigExtrasChangeCallback?
-            ) {
-                complicationSlotsManager.configExtrasChangeCallback = callback
-            }
-        }
         if (!shouldTimeout) {
             WatchFace.registerEditorDelegate(watchComponentName, editorDelegate)
         }
@@ -628,39 +649,45 @@
             return ActivityScenario.launch(
                 Intent().apply {
                     putExtra(Constants.EXTRA_WATCH_FACE_COMPONENT, watchComponentName)
-                    component = ComponentName(
-                        ApplicationProvider.getApplicationContext<Context>(),
-                        OnWatchFaceEditingTestActivity::class.java
-                    )
+                    component =
+                        ComponentName(
+                            ApplicationProvider.getApplicationContext<Context>(),
+                            OnWatchFaceEditingTestActivity::class.java
+                        )
                 }
             )
         }
 
         return ActivityScenario.launch(
-            WatchFaceEditorContract().createIntent(
-                ApplicationProvider.getApplicationContext<Context>(),
-                EditorRequest(
-                    watchComponentName,
-                    testEditorPackageName,
-                    initialUserStyle,
-                    watchFaceId,
-                    headlessDeviceConfig,
-                    previewScreenshotParams
-                )
-            ).apply {
-                component = ComponentName(
+            WatchFaceEditorContract()
+                .createIntent(
                     ApplicationProvider.getApplicationContext<Context>(),
-                    OnWatchFaceEditingTestActivity::class.java
+                    EditorRequest(
+                        watchComponentName,
+                        testEditorPackageName,
+                        initialUserStyle,
+                        watchFaceId,
+                        headlessDeviceConfig,
+                        previewScreenshotParams
+                    )
                 )
-            }
+                .apply {
+                    component =
+                        ComponentName(
+                            ApplicationProvider.getApplicationContext<Context>(),
+                            OnWatchFaceEditingTestActivity::class.java
+                        )
+                }
         )
     }
 
     private fun createOnWatchFaceEditingTestActivityThatThrowsTimeoutException():
         ActivityScenario<OnWatchFaceEditingTestActivity> =
-            createOnWatchFaceEditingTestActivity(
-                emptyList(), emptyList(), /* other params are default */ shouldTimeout = true
-            )
+        createOnWatchFaceEditingTestActivity(
+            emptyList(),
+            emptyList(), /* other params are default */
+            shouldTimeout = true
+        )
 
     @After
     public fun tearDown() {
@@ -692,19 +719,16 @@
 
     @Test
     public fun watchFaceComponentName_headless() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            emptyList(),
-            headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
-            watchComponentName = headlessWatchFaceComponentName
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                emptyList(),
+                headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
+                watchComponentName = headlessWatchFaceComponentName
+            )
         lateinit var activity: OnWatchFaceEditingTestActivity
-        scenario.onActivity {
-            activity = it
-        }
-        runBlocking {
-            activity.deferredDone.await()
-        }
+        scenario.onActivity { activity = it }
+        runBlocking { activity.deferredDone.await() }
         assertThat(activity.editorSession.watchFaceComponentName)
             .isEqualTo(headlessWatchFaceComponentName)
     }
@@ -719,19 +743,16 @@
 
     @Test
     public fun instanceId_headless() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            emptyList(),
-            headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
-            watchComponentName = headlessWatchFaceComponentName
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                emptyList(),
+                headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
+                watchComponentName = headlessWatchFaceComponentName
+            )
         lateinit var activity: OnWatchFaceEditingTestActivity
-        scenario.onActivity {
-            activity = it
-        }
-        runBlocking {
-            activity.deferredDone.await()
-        }
+        scenario.onActivity { activity = it }
+        runBlocking { activity.deferredDone.await() }
         assertThat(activity.editorSession.watchFaceId.id).isEqualTo(testInstanceId.id)
     }
 
@@ -745,25 +766,26 @@
 
     @Test
     public fun previewReferenceInstant() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            emptyList(),
-            previewReferenceInstant = Instant.ofEpochMilli(54321L)
-        )
-        scenario.onActivity {
-            assertThat(it.editorSession.previewReferenceInstant).isEqualTo(
-                Instant.ofEpochMilli(54321L)
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                emptyList(),
+                previewReferenceInstant = Instant.ofEpochMilli(54321L)
             )
+        scenario.onActivity {
+            assertThat(it.editorSession.previewReferenceInstant)
+                .isEqualTo(Instant.ofEpochMilli(54321L))
         }
     }
 
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun userStyleSchema() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList()
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList()
+            )
         scenario.onActivity {
             val userStyleSchema = it.editorSession.userStyleSchema
             assertThat(userStyleSchema.userStyleSettings.size).isEqualTo(2)
@@ -781,24 +803,22 @@
 
     @Test
     public fun backgroundComplicationId() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(emptyList(), listOf(backgroundComplication))
         scenario.onActivity {
-            assertThat(it.editorSession.backgroundComplicationSlotId).isEqualTo(
-                BACKGROUND_COMPLICATION_ID
-            )
+            assertThat(it.editorSession.backgroundComplicationSlotId)
+                .isEqualTo(BACKGROUND_COMPLICATION_ID)
         }
     }
 
     @Test
     @Suppress("DEPRECATION") // defaultDataSourceType
     public fun complicationState() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             val complicationSlotsState = it.editorSession.complicationSlotsState.value
             assertThat(complicationSlotsState.size).isEqualTo(3)
@@ -812,14 +832,11 @@
             assertThat(leftSlot.defaultDataSourcePolicy.primaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.LONG_TEXT)
             assertThat(leftSlot.defaultDataSourcePolicy.secondaryDataSource).isNull()
-            assertThat(leftSlot.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
-                .isNull()
-            assertThat(leftSlot.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
-            )
-            assertThat(
-                leftSlot.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
-            ).isEqualTo(ComplicationType.SHORT_TEXT)
+            assertThat(leftSlot.defaultDataSourcePolicy.secondaryDataSourceDefaultType).isNull()
+            assertThat(leftSlot.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET)
+            assertThat(leftSlot.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
+                .isEqualTo(ComplicationType.SHORT_TEXT)
             assertThat(leftSlot.defaultDataSourceType).isEqualTo(ComplicationType.SHORT_TEXT)
 
             val rightSlot = complicationSlotsState[RIGHT_COMPLICATION_ID]!!
@@ -835,9 +852,8 @@
                 .isEqualTo(ComponentName("com.secondary.package", "com.secondary.app"))
             assertThat(rightSlot.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.PHOTO_IMAGE)
-            assertThat(
-                rightSlot.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
-            ).isEqualTo(ComplicationType.SHORT_TEXT)
+            assertThat(rightSlot.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
+                .isEqualTo(ComplicationType.SHORT_TEXT)
             assertThat(rightSlot.defaultDataSourceType).isEqualTo(ComplicationType.SHORT_TEXT)
 
             val backgroundSlot = complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!
@@ -860,30 +876,30 @@
             )
         val fixedLeftComplication =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                LEFT_COMPLICATION_ID,
-                { _, _ -> mockLeftCanvasComplication },
-                listOf(
-                    ComplicationType.RANGED_VALUE,
-                    ComplicationType.LONG_TEXT,
-                    ComplicationType.SHORT_TEXT,
-                    ComplicationType.MONOCHROMATIC_IMAGE,
-                    ComplicationType.SMALL_IMAGE
-                ),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                    LEFT_COMPLICATION_ID,
+                    { _, _ -> mockLeftCanvasComplication },
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.LONG_TEXT,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
                 .setFixedComplicationDataSource(true)
                 .build()
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(fixedLeftComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(emptyList(), listOf(fixedLeftComplication))
         scenario.onActivity {
             assertTrue(
-                it.editorSession.complicationSlotsState.value[
-                    LEFT_COMPLICATION_ID
-                ]!!.fixedComplicationDataSource
+                it.editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!
+                    .fixedComplicationDataSource
             )
 
             try {
@@ -903,10 +919,11 @@
 
     @Test
     public fun getPreviewData_null_dataSourceInfo() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
@@ -914,9 +931,7 @@
 
                 val dataSourceInfoRetriever =
                     ComplicationDataSourceInfoRetriever(mockProviderInfoService)
-                assertThat(
-                    editorSession.getPreviewData(dataSourceInfoRetriever, null)
-                ).isNull()
+                assertThat(editorSession.getPreviewData(dataSourceInfoRetriever, null)).isNull()
                 dataSourceInfoRetriever.close()
             }
         }
@@ -924,10 +939,11 @@
 
     @Test
     public fun getPreviewData() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
@@ -940,19 +956,23 @@
                 `when`(mockProviderInfoService.asBinder()).thenReturn(mockBinder)
 
                 doAnswer {
-                    val callback = it.arguments[2] as IPreviewComplicationDataCallback
-                    callback.updateComplicationData(
-                        ShortTextComplicationData.Builder(
-                            PlainComplicationText.Builder(complicationText).build(),
-                            ComplicationText.EMPTY
-                        ).build().asWireComplicationData()
+                        val callback = it.arguments[2] as IPreviewComplicationDataCallback
+                        callback.updateComplicationData(
+                            ShortTextComplicationData.Builder(
+                                    PlainComplicationText.Builder(complicationText).build(),
+                                    ComplicationText.EMPTY
+                                )
+                                .build()
+                                .asWireComplicationData()
+                        )
+                        true
+                    }
+                    .`when`(mockProviderInfoService)
+                    .requestPreviewComplicationData(
+                        eq(dataSourceComponentName),
+                        eq(complicationType.toWireComplicationType()),
+                        any()
                     )
-                    true
-                }.`when`(mockProviderInfoService).requestPreviewComplicationData(
-                    eq(dataSourceComponentName),
-                    eq(complicationType.toWireComplicationType()),
-                    any()
-                )
 
                 val complicationDataSourceInfoRetriever =
                     ComplicationDataSourceInfoRetriever(mockProviderInfoService)
@@ -972,11 +992,14 @@
                 val result = deferredPreviewData.await()
                 assertThat(result).isInstanceOf(ShortTextComplicationData::class.java)
                 assertThat(
-                    (result as ShortTextComplicationData).text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        (result as ShortTextComplicationData)
+                            .text
+                            .getTextAt(
+                                ApplicationProvider.getApplicationContext<Context>().resources,
+                                Instant.EPOCH
+                            )
                     )
-                ).isEqualTo(complicationText)
+                    .isEqualTo(complicationText)
 
                 complicationDataSourceInfoRetriever.close()
             }
@@ -985,10 +1008,11 @@
 
     @Test
     public fun getPreviewData_dataSourceSendsWrongType() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
@@ -1001,19 +1025,23 @@
                 `when`(mockProviderInfoService.asBinder()).thenReturn(mockBinder)
 
                 doAnswer {
-                    val callback = it.arguments[2] as IPreviewComplicationDataCallback
-                    callback.updateComplicationData(
-                        ShortTextComplicationData.Builder(
-                            PlainComplicationText.Builder(complicationText).build(),
-                            ComplicationText.EMPTY
-                        ).build().asWireComplicationData()
+                        val callback = it.arguments[2] as IPreviewComplicationDataCallback
+                        callback.updateComplicationData(
+                            ShortTextComplicationData.Builder(
+                                    PlainComplicationText.Builder(complicationText).build(),
+                                    ComplicationText.EMPTY
+                                )
+                                .build()
+                                .asWireComplicationData()
+                        )
+                        true
+                    }
+                    .`when`(mockProviderInfoService)
+                    .requestPreviewComplicationData(
+                        eq(dataSourceComponentName),
+                        eq(complicationType.toWireComplicationType()),
+                        any()
                     )
-                    true
-                }.`when`(mockProviderInfoService).requestPreviewComplicationData(
-                    eq(dataSourceComponentName),
-                    eq(complicationType.toWireComplicationType()),
-                    any()
-                )
 
                 val complicationDataSourceInfoRetriever =
                     ComplicationDataSourceInfoRetriever(mockProviderInfoService)
@@ -1033,11 +1061,14 @@
                 val result = deferredPreviewData.await()
                 assertThat(result).isInstanceOf(LongTextComplicationData::class.java)
                 assertThat(
-                    (result as LongTextComplicationData).text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        (result as LongTextComplicationData)
+                            .text
+                            .getTextAt(
+                                ApplicationProvider.getApplicationContext<Context>().resources,
+                                Instant.EPOCH
+                            )
                     )
-                ).isEqualTo("dataSource") // Fallback has been used.
+                    .isEqualTo("dataSource") // Fallback has been used.
 
                 complicationDataSourceInfoRetriever.close()
             }
@@ -1047,10 +1078,11 @@
     @Test
     @SdkSuppress(maxSdkVersion = 28)
     public fun getPreviewData_preRFallback() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
@@ -1059,24 +1091,26 @@
 
                 val complicationDataSourceInfoRetriever =
                     ComplicationDataSourceInfoRetriever(mockProviderInfoService)
-                val previewComplication = editorSession.getPreviewData(
-                    complicationDataSourceInfoRetriever,
-                    // Construct a ComplicationDataSourceInfo with null componentName.
-                    ComplicationDataSourceInfo(
-                        "dataSource.app",
-                        "dataSource",
-                        dataSourceIcon,
-                        complicationType,
-                        null,
-                    )
-                ) as ShortTextComplicationData
+                val previewComplication =
+                    editorSession.getPreviewData(
+                        complicationDataSourceInfoRetriever,
+                        // Construct a ComplicationDataSourceInfo with null componentName.
+                        ComplicationDataSourceInfo(
+                            "dataSource.app",
+                            "dataSource",
+                            dataSourceIcon,
+                            complicationType,
+                            null,
+                        )
+                    ) as ShortTextComplicationData
 
                 assertThat(
-                    previewComplication.text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        previewComplication.text.getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            Instant.EPOCH
+                        )
                     )
-                ).isEqualTo("dataSou")
+                    .isEqualTo("dataSou")
 
                 complicationDataSourceInfoRetriever.close()
             }
@@ -1086,10 +1120,11 @@
     @Test
     @SdkSuppress(minSdkVersion = 30)
     public fun getPreviewData_postRFallback() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
@@ -1098,30 +1133,33 @@
 
                 `when`(mockProviderInfoService.apiVersion).thenReturn(1)
                 `when`(
-                    mockProviderInfoService.requestPreviewComplicationData(
-                        eq(dataSourceComponentName),
-                        eq(complicationType.toWireComplicationType()),
-                        any(IPreviewComplicationDataCallback::class.java)
+                        mockProviderInfoService.requestPreviewComplicationData(
+                            eq(dataSourceComponentName),
+                            eq(complicationType.toWireComplicationType()),
+                            any(IPreviewComplicationDataCallback::class.java)
+                        )
                     )
-                ).thenReturn(false) // Triggers the ExecutionException.
+                    .thenReturn(false) // Triggers the ExecutionException.
 
-                val previewComplication = editorSession.getPreviewData(
-                    ComplicationDataSourceInfoRetriever(mockProviderInfoService),
-                    ComplicationDataSourceInfo(
-                        "dataSource.app",
-                        "dataSource",
-                        dataSourceIcon,
-                        complicationType,
-                        dataSourceComponentName
-                    )
-                ) as ShortTextComplicationData
+                val previewComplication =
+                    editorSession.getPreviewData(
+                        ComplicationDataSourceInfoRetriever(mockProviderInfoService),
+                        ComplicationDataSourceInfo(
+                            "dataSource.app",
+                            "dataSource",
+                            dataSourceIcon,
+                            complicationType,
+                            dataSourceComponentName
+                        )
+                    ) as ShortTextComplicationData
 
                 assertThat(
-                    previewComplication.text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        previewComplication.text.getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            Instant.EPOCH
+                        )
                     )
-                ).isEqualTo("dataSou") // Fallback truncates for short text.
+                    .isEqualTo("dataSou") // Fallback truncates for short text.
             }
         }
     }
@@ -1130,41 +1168,38 @@
     @Test
     public fun launchComplicationDataSourceChooser() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
-        val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
-            "TestDataSource3App",
-            "TestDataSource3",
-            Icon.createWithBitmap(
-                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-            ),
-            ComplicationType.LONG_TEXT,
-            dataSource3
-        )
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred(
-            Intent().apply {
-                putExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                    chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
-                )
-            }
-        )
+        val chosenComplicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "TestDataSource3App",
+                "TestDataSource3",
+                Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                ComplicationType.LONG_TEXT,
+                dataSource3
+            )
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred(
+                Intent().apply {
+                    putExtra(
+                        ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                        chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+                    )
+                }
+            )
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
-            assertThat(
-                editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds
-            ).isEqualTo(Rect(120, 160, 160, 240))
-            assertThat(
-                editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name
-            ).isEqualTo("DataSource1")
+            assertThat(editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds)
+                .isEqualTo(Rect(120, 160, 160, 240))
+            assertThat(editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name)
+                .isEqualTo("DataSource1")
 
             /**
              * Invoke [TestComplicationHelperActivity] which will change the complication data
@@ -1187,75 +1222,76 @@
                     as LongTextComplicationData
 
             assertThat(
-                previewComplication.text.getTextAt(
-                    ApplicationProvider.getApplicationContext<Context>().resources,
-                    Instant.EPOCH
+                    previewComplication.text.getTextAt(
+                        ApplicationProvider.getApplicationContext<Context>().resources,
+                        Instant.EPOCH
+                    )
                 )
-            ).isEqualTo("DataSource3")
+                .isEqualTo("DataSource3")
+
+            assertThat(editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name)
+                .isEqualTo("TestDataSource3")
 
             assertThat(
-                editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name
-            ).isEqualTo("TestDataSource3")
-
-            assertThat(
-                TestComplicationHelperActivity.lastIntent?.extras?.getString(
-                    ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID
+                    TestComplicationHelperActivity.lastIntent
+                        ?.extras
+                        ?.getString(ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID)
                 )
-            ).isEqualTo(testInstanceId.id)
+                .isEqualTo(testInstanceId.id)
 
             assertThat(
-                (TestComplicationHelperActivity.lastIntent?.getParcelableExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED
-                ) as Intent?)?.action
-            ).isEqualTo(
-                complicationDeniedDialogIntent.action
-            )
+                    (TestComplicationHelperActivity.lastIntent?.getParcelableExtra(
+                            ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED
+                        ) as Intent?)
+                        ?.action
+                )
+                .isEqualTo(complicationDeniedDialogIntent.action)
 
             assertThat(
-                (TestComplicationHelperActivity.lastIntent?.getParcelableExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE
-                ) as Intent?)?.action
-            ).isEqualTo(
-                complicationRationaleDialogIntent.action
-            )
+                    (TestComplicationHelperActivity.lastIntent?.getParcelableExtra(
+                            ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE
+                        ) as Intent?)
+                        ?.action
+                )
+                .isEqualTo(complicationRationaleDialogIntent.action)
 
             // Selecting a LONG_TEXT complication should enlarge the complication's bounds due to
             // it's set up.
-            assertThat(
-                editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds
-            ).isEqualTo(Rect(40, 160, 160, 240))
+            assertThat(editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds)
+                .isEqualTo(Rect(40, 160, 160, 240))
         }
     }
 
     @Test
     public fun launchComplicationDataSourceChooserTwiceBackToBack() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred(
-            Intent().apply {
-                putExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                    ComplicationDataSourceInfo(
-                        "TestDataSource3App",
-                        "TestDataSource3",
-                        Icon.createWithBitmap(
-                            Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-                        ),
-                        ComplicationType.LONG_TEXT,
-                        dataSource3
-                    ).toWireComplicationProviderInfo()
-                )
-            }
-        )
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred(
+                Intent().apply {
+                    putExtra(
+                        ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                        ComplicationDataSourceInfo(
+                                "TestDataSource3App",
+                                "TestDataSource3",
+                                Icon.createWithBitmap(
+                                    Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+                                ),
+                                ComplicationType.LONG_TEXT,
+                                dataSource3
+                            )
+                            .toWireComplicationProviderInfo()
+                    )
+                }
+            )
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
             assertThat(editorSession.openComplicationDataSourceChooser(LEFT_COMPLICATION_ID))
@@ -1272,15 +1308,14 @@
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
         TestComplicationHelperActivity.resultIntent = CompletableDeferred()
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
             // This won't complete till later.
@@ -1302,14 +1337,15 @@
                         putExtra(
                             ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
                             ComplicationDataSourceInfo(
-                                "TestDataSource3App",
-                                "TestDataSource3",
-                                Icon.createWithBitmap(
-                                    Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-                                ),
-                                ComplicationType.LONG_TEXT,
-                                dataSource3
-                            ).toWireComplicationProviderInfo()
+                                    "TestDataSource3App",
+                                    "TestDataSource3",
+                                    Icon.createWithBitmap(
+                                        Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+                                    ),
+                                    ComplicationType.LONG_TEXT,
+                                    dataSource3
+                                )
+                                .toWireComplicationProviderInfo()
                         )
                     }
                 )
@@ -1324,15 +1360,14 @@
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
         TestComplicationHelperActivity.resultIntent = CompletableDeferred(Intent())
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
             /**
@@ -1355,24 +1390,20 @@
     public fun launchComplicationDataSourceChooser_cancel() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
         // NB CompletableDeferred(null) doesn't do what we expect...
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred<Intent?>().apply {
-            complete(null)
-        }
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred<Intent?>().apply { complete(null) }
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
-            /**
-             * Invoke [TestComplicationHelperActivity] which will simulate the user canceling.
-             */
+            /** Invoke [TestComplicationHelperActivity] which will simulate the user canceling. */
             assertThat(editorSession.openComplicationDataSourceChooser(LEFT_COMPLICATION_ID))
                 .isNull()
         }
@@ -1382,34 +1413,33 @@
     @Test
     public fun launchComplicationDataSourceChooser_ComplicationConfigExtrasToHelper() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
-        val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
-            "TestDataSource3App",
-            "TestDataSource3",
-            Icon.createWithBitmap(
-                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-            ),
-            ComplicationType.LONG_TEXT,
-            dataSource3
-        )
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred(
-            Intent().apply {
-                putExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                    chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
-                )
-                putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
-            }
-        )
+        val chosenComplicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "TestDataSource3App",
+                "TestDataSource3",
+                Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                ComplicationType.LONG_TEXT,
+                dataSource3
+            )
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred(
+                Intent().apply {
+                    putExtra(
+                        ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                        chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+                    )
+                    putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+                }
+            )
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
             val chosenComplicationDataSource =
@@ -1422,15 +1452,15 @@
                 chosenComplicationDataSourceInfo,
                 chosenComplicationDataSource.complicationDataSourceInfo
             )
-            assertThat(
-                chosenComplicationDataSource.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY]
-            ).isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+            assertThat(chosenComplicationDataSource.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY])
+                .isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
 
             assertThat(
-                TestComplicationHelperActivity.lastIntent?.extras?.getString(
-                    PROVIDER_CHOOSER_EXTRA_KEY
+                    TestComplicationHelperActivity.lastIntent
+                        ?.extras
+                        ?.getString(PROVIDER_CHOOSER_EXTRA_KEY)
                 )
-            ).isEqualTo(PROVIDER_CHOOSER_EXTRA_VALUE)
+                .isEqualTo(PROVIDER_CHOOSER_EXTRA_VALUE)
         }
     }
 
@@ -1442,32 +1472,31 @@
         // Invoke the data source chooser without checking for permissions first.
         ComplicationHelperActivity.skipPermissionCheck = true
 
-        val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
-            "TestDataSource3App",
-            "TestDataSource3",
-            Icon.createWithBitmap(
-                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-            ),
-            ComplicationType.LONG_TEXT,
-            dataSource3
-        )
-        TestComplicationDataSourceChooserActivity.resultIntent = Intent().apply {
-            putExtra(
-                ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+        val chosenComplicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "TestDataSource3App",
+                "TestDataSource3",
+                Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                ComplicationType.LONG_TEXT,
+                dataSource3
             )
-            putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
-        }
+        TestComplicationDataSourceChooserActivity.resultIntent =
+            Intent().apply {
+                putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                    chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+                )
+                putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+            }
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
             val chosenComplicationDataSource =
@@ -1480,15 +1509,15 @@
                 chosenComplicationDataSourceInfo,
                 chosenComplicationDataSource.complicationDataSourceInfo
             )
-            assertThat(
-                chosenComplicationDataSource.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY]
-            ).isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+            assertThat(chosenComplicationDataSource.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY])
+                .isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
 
             assertThat(
-                TestComplicationDataSourceChooserActivity.lastIntent?.extras?.getString(
-                    PROVIDER_CHOOSER_EXTRA_KEY
+                    TestComplicationDataSourceChooserActivity.lastIntent
+                        ?.extras
+                        ?.getString(PROVIDER_CHOOSER_EXTRA_KEY)
                 )
-            ).isEqualTo(PROVIDER_CHOOSER_EXTRA_VALUE)
+                .isEqualTo(PROVIDER_CHOOSER_EXTRA_VALUE)
         }
     }
 
@@ -1499,56 +1528,56 @@
         // Invoke the data source chooser without checking for permissions first.
         ComplicationHelperActivity.skipPermissionCheck = true
 
-        val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
-            "TestDataSource3App",
-            "TestDataSource3",
-            Icon.createWithBitmap(
-                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-            ),
-            ComplicationType.LONG_TEXT,
-            dataSource3
-        )
-        TestComplicationDataSourceChooserActivity.lastIntent = null
-        TestComplicationDataSourceChooserActivity.resultIntent = Intent().apply {
-            putExtra(
-                ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+        val chosenComplicationDataSourceInfo =
+            ComplicationDataSourceInfo(
+                "TestDataSource3App",
+                "TestDataSource3",
+                Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)),
+                ComplicationType.LONG_TEXT,
+                dataSource3
             )
-        }
+        TestComplicationDataSourceChooserActivity.lastIntent = null
+        TestComplicationDataSourceChooserActivity.resultIntent =
+            Intent().apply {
+                putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                    chosenComplicationDataSourceInfo.toWireComplicationProviderInfo()
+                )
+            }
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication)
+            )
 
         lateinit var editorSession: EditorSession
-        scenario.onActivity { activity ->
-            editorSession = activity.editorSession
-        }
+        scenario.onActivity { activity -> editorSession = activity.editorSession }
 
         runBlocking {
-            rightComplication.configExtras = Bundle().apply {
-                putString(PROVIDER_CHOOSER_EXTRA_KEY, "Updated")
-            }
+            rightComplication.configExtras =
+                Bundle().apply { putString(PROVIDER_CHOOSER_EXTRA_KEY, "Updated") }
 
             val chosenComplicationDataSource =
                 editorSession.openComplicationDataSourceChooser(RIGHT_COMPLICATION_ID)
             assertThat(chosenComplicationDataSource).isNotNull()
 
             assertThat(
-                TestComplicationDataSourceChooserActivity.lastIntent?.extras?.getString(
-                    PROVIDER_CHOOSER_EXTRA_KEY
+                    TestComplicationDataSourceChooserActivity.lastIntent
+                        ?.extras
+                        ?.getString(PROVIDER_CHOOSER_EXTRA_KEY)
                 )
-            ).isEqualTo("Updated")
+                .isEqualTo("Updated")
         }
     }
 
     @Test
     public fun getComplicationIdAt() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication, backgroundComplication)
+            )
         scenario.onActivity {
             assertThat(it.editorSession.getComplicationSlotIdAt(0, 0)).isEqualTo(null)
             assertThat(it.editorSession.getComplicationSlotIdAt(125, 165))
@@ -1564,27 +1593,30 @@
 
         scenario.onActivity {
             assertThat(
-                it.editorSession.renderWatchFaceToBitmap(
-                    RenderParameters.DEFAULT_INTERACTIVE,
-                    Instant.ofEpochMilli(1234L),
-                    null
+                    it.editorSession.renderWatchFaceToBitmap(
+                        RenderParameters.DEFAULT_INTERACTIVE,
+                        Instant.ofEpochMilli(1234L),
+                        null
+                    )
                 )
-            ).isEqualTo(fakeBitmap)
+                .isEqualTo(fakeBitmap)
         }
     }
 
     @Test
     public fun initialUserStyle() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication),
-            initialUserStyle = UserStyleData(
-                mapOf(
-                    colorStyleSetting.id.value to greenStyleOption.id.value,
-                    watchHandStyleSetting.id.value to modernStyleOption.id.value,
-                )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication),
+                initialUserStyle =
+                    UserStyleData(
+                        mapOf(
+                            colorStyleSetting.id.value to greenStyleOption.id.value,
+                            watchHandStyleSetting.id.value to modernStyleOption.id.value,
+                        )
+                    )
             )
-        )
 
         scenario.onActivity { activity ->
             assertThat(activity.editorSession.userStyle.value[colorStyleSetting])
@@ -1597,10 +1629,11 @@
     @Suppress("NewApi", "Deprecation") // result.watchFaceId,  deprecation: userStyleSettings
     @Test
     public fun userStyleAndComplicationPreviewDataInEditorObserver() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -1616,10 +1649,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
 
         assertThat(result.userStyle.userStyleMap[colorStyleSetting.id.value])
             .isEqualTo(blueStyleOption.id.value)
@@ -1635,23 +1668,25 @@
             .isEqualTo(gothicStyleOption.id.value)
 
         assertThat(result.previewComplicationsData.size).isEqualTo(2)
-        val leftComplicationData = result.previewComplicationsData[LEFT_COMPLICATION_ID] as
-            ShortTextComplicationData
+        val leftComplicationData =
+            result.previewComplicationsData[LEFT_COMPLICATION_ID] as ShortTextComplicationData
         assertThat(
-            leftComplicationData.text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                leftComplicationData.text.getTextAt(
+                    ApplicationProvider.getApplicationContext<Context>().resources,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo("Left")
+            .isEqualTo("Left")
 
-        val rightComplicationData = result.previewComplicationsData[RIGHT_COMPLICATION_ID] as
-            LongTextComplicationData
+        val rightComplicationData =
+            result.previewComplicationsData[RIGHT_COMPLICATION_ID] as LongTextComplicationData
         assertThat(
-            rightComplicationData.text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                rightComplicationData.text.getTextAt(
+                    ApplicationProvider.getApplicationContext<Context>().resources,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo("Right")
+            .isEqualTo("Right")
 
         EditorService.globalEditorService.unregisterObserver(observerId)
     }
@@ -1659,10 +1694,11 @@
     @Suppress("NewApi") // result.watchFaceId
     @Test
     public fun editorStatePreviewComplicationData_onlyContainsEnabledComplications() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(complicationsStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(complicationsStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -1676,10 +1712,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
 
         assertThat(result.previewComplicationsData.size).isEqualTo(1)
         assertThat(result.previewComplicationsData[RIGHT_COMPLICATION_ID]).isNotNull()
@@ -1689,11 +1725,12 @@
     @SuppressLint("NewApi") // result.watchFaceId
     @Test
     public fun emptyInstanceId() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            watchFaceId = WatchFaceId("")
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                watchFaceId = WatchFaceId("")
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -1706,10 +1743,10 @@
             }
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
 
         // We need to return the same ID we were sent (or lack there of).
         assertThat(result.watchFaceId.id).isEmpty()
@@ -1720,11 +1757,12 @@
     @SuppressLint("NewApi") // result.watchFaceId
     @Test
     public fun invalidOldStyleInstanceId() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            watchFaceId = WatchFaceId("instance-1")
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                watchFaceId = WatchFaceId("instance-1")
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -1737,10 +1775,10 @@
             }
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
 
         // We need to return the same ID we were sent.
         assertThat(result.watchFaceId.id).isEqualTo("instance-1")
@@ -1760,10 +1798,10 @@
             }
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
         assertThat(result.previewComplicationsData).isEmpty()
 
         EditorService.globalEditorService.unregisterObserver(observerId)
@@ -1772,18 +1810,17 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun commit_headless() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
-            watchComponentName = headlessWatchFaceComponentName
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
+                watchComponentName = headlessWatchFaceComponentName
+            )
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
         scenario.onActivity { activity ->
-            runBlocking {
-                activity.deferredDone.await()
-            }
+            runBlocking { activity.deferredDone.await() }
             assertThat(editorDelegate.userStyle[colorStyleSetting]!!.id.value)
                 .isEqualTo(redStyleOption.id.value)
             assertThat(editorDelegate.userStyle[watchHandStyleSetting]!!.id.value)
@@ -1807,10 +1844,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
         assertThat(result.userStyle.userStyleMap[colorStyleSetting.id.value])
             .isEqualTo(blueStyleOption.id.value)
         assertThat(result.userStyle.userStyleMap[watchHandStyleSetting.id.value])
@@ -1825,22 +1862,19 @@
     @Suppress("Deprecation") // userStyleSettings
     @Test
     public fun commitWithPreviewImage() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
-            watchComponentName = headlessWatchFaceComponentName,
-            previewScreenshotParams = PreviewScreenshotParams(
-                RenderParameters.DEFAULT_INTERACTIVE,
-                Instant.EPOCH
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                headlessDeviceConfig = DeviceConfig(false, false, 0, 0),
+                watchComponentName = headlessWatchFaceComponentName,
+                previewScreenshotParams =
+                    PreviewScreenshotParams(RenderParameters.DEFAULT_INTERACTIVE, Instant.EPOCH)
             )
-        )
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
         scenario.onActivity { activity ->
-            runBlocking {
-                activity.deferredDone.await()
-            }
+            runBlocking { activity.deferredDone.await() }
             // Select [blueStyleOption] and [gothicStyleOption].
             val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
@@ -1851,10 +1885,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
 
         // previewImage is only supported from API 27 onwards.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
@@ -1870,14 +1904,13 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun doNotCommit() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            previewScreenshotParams = PreviewScreenshotParams(
-                RenderParameters.DEFAULT_INTERACTIVE,
-                Instant.EPOCH
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                previewScreenshotParams =
+                    PreviewScreenshotParams(RenderParameters.DEFAULT_INTERACTIVE, Instant.EPOCH)
             )
-        )
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
         scenario.onActivity { activity ->
@@ -1899,10 +1932,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
         assertThat(result.userStyle.userStyleMap[colorStyleSetting.id.value])
             .isEqualTo(blueStyleOption.id.value)
         assertThat(result.userStyle.userStyleMap[watchHandStyleSetting.id.value])
@@ -1923,11 +1956,12 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun commitChanges_preRFlow() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            emptyList(),
-            preRFlow = true
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                emptyList(),
+                preRFlow = true
+            )
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
         scenario.onActivity { activity ->
@@ -1947,10 +1981,10 @@
             activity.finish()
         }
 
-        val result = editorObserver.awaitEditorStateChange(
-            TIMEOUT_MILLIS,
-            TimeUnit.MILLISECONDS
-        ).asApiEditorState()
+        val result =
+            editorObserver
+                .awaitEditorStateChange(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                .asApiEditorState()
         assertThat(result.userStyle.userStyleMap[colorStyleSetting.id.value])
             .isEqualTo(blueStyleOption.id.value)
         assertThat(result.userStyle.userStyleMap[watchHandStyleSetting.id.value])
@@ -1970,17 +2004,19 @@
     @Test
     public fun watchFaceEditorContract_createIntent() {
         val testComponentName = ComponentName("test.package", "test.class")
-        val intent = WatchFaceEditorContract().createIntent(
-            ApplicationProvider.getApplicationContext<Context>(),
-            EditorRequest(
-                testComponentName,
-                testEditorPackageName,
-                null,
-                testInstanceId,
-                null,
-                null
-            )
-        )
+        val intent =
+            WatchFaceEditorContract()
+                .createIntent(
+                    ApplicationProvider.getApplicationContext<Context>(),
+                    EditorRequest(
+                        testComponentName,
+                        testEditorPackageName,
+                        null,
+                        testInstanceId,
+                        null,
+                        null
+                    )
+                )
         assertThat(intent.getPackage()).isEqualTo(testEditorPackageName)
 
         val editorRequest = EditorRequest.createFromIntent(intent)
@@ -1996,12 +2032,13 @@
         val complicationDataSourceInfoRetrieverProvider =
             TestComplicationDataSourceInfoRetrieverProvider(getProviderInfosLatch)
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication),
-            complicationDataSourceInfoRetrieverProvider =
-                complicationDataSourceInfoRetrieverProvider
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication),
+                complicationDataSourceInfoRetrieverProvider =
+                    complicationDataSourceInfoRetrieverProvider
+            )
 
         scenario.onActivity { activity ->
             activity.immediateCoroutineScope.launch {
@@ -2024,10 +2061,11 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun forceCloseEditorSession() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
@@ -2059,10 +2097,11 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun observedDeathForceClosesEditorSession() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         val editorObserver = Mockito.mock(IEditorObserver::class.java)
         val mockBinder = Mockito.mock(IBinder::class.java)
@@ -2102,24 +2141,28 @@
         val testComponentName = ComponentName("test.package", "test.class")
         OnWatchFaceEditingTestActivity.complicationDataSourceInfoRetrieverProvider =
             TestComplicationDataSourceInfoRetrieverProvider()
-        val session: ActivityScenario<OnWatchFaceEditingTestActivity> = ActivityScenario.launch(
-            WatchFaceEditorContract().createIntent(
-                ApplicationProvider.getApplicationContext<Context>(),
-                EditorRequest(
-                    testComponentName,
-                    testEditorPackageName,
-                    null,
-                    WatchFaceId("instanceId"),
-                    null,
-                    null
-                )
-            ).apply {
-                component = ComponentName(
-                    ApplicationProvider.getApplicationContext<Context>(),
-                    OnWatchFaceEditingTestActivity::class.java
-                )
-            }
-        )
+        val session: ActivityScenario<OnWatchFaceEditingTestActivity> =
+            ActivityScenario.launch(
+                WatchFaceEditorContract()
+                    .createIntent(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        EditorRequest(
+                            testComponentName,
+                            testEditorPackageName,
+                            null,
+                            WatchFaceId("instanceId"),
+                            null,
+                            null
+                        )
+                    )
+                    .apply {
+                        component =
+                            ComponentName(
+                                ApplicationProvider.getApplicationContext<Context>(),
+                                OnWatchFaceEditingTestActivity::class.java
+                            )
+                    }
+            )
 
         session.onActivity {
             // This shouldn't throw an exception.
@@ -2130,61 +2173,68 @@
     @Test
     public fun cancelDuring_updatePreviewData() {
         ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
-        TestComplicationHelperActivity.resultIntent = CompletableDeferred(
-            Intent().apply {
-                putExtra(
-                    ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
-                    ComplicationDataSourceInfo(
-                        "TestDataSource3App",
-                        "TestDataSource3",
-                        Icon.createWithBitmap(
-                            Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-                        ),
-                        ComplicationType.LONG_TEXT,
-                        dataSource3
-                    ).toWireComplicationProviderInfo()
-                )
-            }
-        )
+        TestComplicationHelperActivity.resultIntent =
+            CompletableDeferred(
+                Intent().apply {
+                    putExtra(
+                        ComplicationDataSourceChooserIntent.EXTRA_PROVIDER_INFO,
+                        ComplicationDataSourceInfo(
+                                "TestDataSource3App",
+                                "TestDataSource3",
+                                Icon.createWithBitmap(
+                                    Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+                                ),
+                                ComplicationType.LONG_TEXT,
+                                dataSource3
+                            )
+                            .toWireComplicationProviderInfo()
+                    )
+                }
+            )
 
         lateinit var baseEditorSession: BaseEditorSession
         lateinit var complicationDataSourceInfoRetriever: ComplicationDataSourceInfoRetriever
         var requestPreviewComplicationDataCount = 0
-        val scenario = createOnWatchFaceEditingTestActivity(
-            emptyList(),
-            listOf(leftComplication, rightComplication),
-            complicationDataSourceInfoRetrieverProvider = object :
-                TestComplicationDataSourceInfoRetrieverProvider() {
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                emptyList(),
+                listOf(leftComplication, rightComplication),
+                complicationDataSourceInfoRetrieverProvider =
+                    object : TestComplicationDataSourceInfoRetrieverProvider() {
 
-                override fun getComplicationDataSourceInfoRetriever():
-                    ComplicationDataSourceInfoRetriever {
-                        complicationDataSourceInfoRetriever =
-                            super.getComplicationDataSourceInfoRetriever()
-                        return complicationDataSourceInfoRetriever
-                    }
+                        override fun getComplicationDataSourceInfoRetriever():
+                            ComplicationDataSourceInfoRetriever {
+                            complicationDataSourceInfoRetriever =
+                                super.getComplicationDataSourceInfoRetriever()
+                            return complicationDataSourceInfoRetriever
+                        }
 
-                override fun requestPreviewComplicationData(
-                    dataSourceComponent: ComponentName,
-                    complicationType: Int,
-                    previewComplicationDataCallback: IPreviewComplicationDataCallback
-                ): Boolean {
-                    // Force close the third time this is invoked in response to
-                    // openComplicationDataSourceChooser and a result being selected. The previous two
-                    // invocations where done to prime the map for getComplicationsPreviewData().
-                    if (++requestPreviewComplicationDataCount == 3) {
-                        baseEditorSession.forceClose()
-                    } else {
-                        previewComplicationDataCallback.updateComplicationData(
-                            ShortTextComplicationData.Builder(
-                                PlainComplicationText.Builder("TestData").build(),
-                                ComplicationText.EMPTY
-                            ).build().asWireComplicationData()
-                        )
+                        override fun requestPreviewComplicationData(
+                            dataSourceComponent: ComponentName,
+                            complicationType: Int,
+                            previewComplicationDataCallback: IPreviewComplicationDataCallback
+                        ): Boolean {
+                            // Force close the third time this is invoked in response to
+                            // openComplicationDataSourceChooser and a result being selected. The
+                            // previous two
+                            // invocations where done to prime the map for
+                            // getComplicationsPreviewData().
+                            if (++requestPreviewComplicationDataCount == 3) {
+                                baseEditorSession.forceClose()
+                            } else {
+                                previewComplicationDataCallback.updateComplicationData(
+                                    ShortTextComplicationData.Builder(
+                                            PlainComplicationText.Builder("TestData").build(),
+                                            ComplicationText.EMPTY
+                                        )
+                                        .build()
+                                        .asWireComplicationData()
+                                )
+                            }
+                            return true
+                        }
                     }
-                    return true
-                }
-            }
-        )
+            )
 
         scenario.onActivity { activity ->
             baseEditorSession = activity.editorSession as BaseEditorSession
@@ -2212,10 +2262,11 @@
 
     @Test
     public fun getComplicationsPreviewData() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         scenario.onActivity { activity ->
             runBlocking {
@@ -2226,31 +2277,34 @@
                 val leftComplicationData =
                     previewData[LEFT_COMPLICATION_ID] as ShortTextComplicationData
                 assertThat(
-                    leftComplicationData.text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        leftComplicationData.text.getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            Instant.EPOCH
+                        )
                     )
-                ).isEqualTo("Left")
+                    .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,
-                        Instant.EPOCH
+                        rightComplicationData.text.getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            Instant.EPOCH
+                        )
                     )
-                ).isEqualTo("Right")
+                    .isEqualTo("Right")
             }
         }
     }
 
     public fun getComplicationsPreviewData_withEmptyBackgroundComplication() {
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, backgroundComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, backgroundComplication)
+            )
 
         scenario.onActivity { activity ->
             runBlocking {
@@ -2261,11 +2315,12 @@
                 val leftComplicationData =
                     previewData[LEFT_COMPLICATION_ID] as ShortTextComplicationData
                 assertThat(
-                    leftComplicationData.text.getTextAt(
-                        ApplicationProvider.getApplicationContext<Context>().resources,
-                        Instant.EPOCH
+                        leftComplicationData.text.getTextAt(
+                            ApplicationProvider.getApplicationContext<Context>().resources,
+                            Instant.EPOCH
+                        )
                     )
-                ).isEqualTo("Left")
+                    .isEqualTo("Left")
 
                 // TestComplicationDataSourceInfoRetrieverProvider isn't configured with a data
                 // source for the background complication which means it behaves as if it was an
@@ -2285,32 +2340,35 @@
         OnWatchFaceEditingTestActivity.complicationDataSourceInfoRetrieverProvider =
             TestComplicationDataSourceInfoRetrieverProvider()
 
-        val scenario: ActivityScenario<OnWatchFaceEditingTestActivity> = ActivityScenario.launch(
-            WatchFaceEditorContract().createIntent(
-                ApplicationProvider.getApplicationContext<Context>(),
-                EditorRequest(
-                    testComponentName,
-                    testEditorPackageName,
-                    null,
-                    watchFaceId,
-                    null,
-                    null
-                )
-            ).apply {
-                component = ComponentName(
-                    ApplicationProvider.getApplicationContext<Context>(),
-                    OnWatchFaceEditingTestActivity::class.java
-                )
-            }
-        )
+        val scenario: ActivityScenario<OnWatchFaceEditingTestActivity> =
+            ActivityScenario.launch(
+                WatchFaceEditorContract()
+                    .createIntent(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        EditorRequest(
+                            testComponentName,
+                            testEditorPackageName,
+                            null,
+                            watchFaceId,
+                            null,
+                            null
+                        )
+                    )
+                    .apply {
+                        component =
+                            ComponentName(
+                                ApplicationProvider.getApplicationContext<Context>(),
+                                OnWatchFaceEditingTestActivity::class.java
+                            )
+                    }
+            )
 
         scenario.onActivity { activity ->
             val mockWatchFaceHostApi = mock(WatchFaceHostApi::class.java)
             val handler = Handler(Looper.myLooper()!!)
             `when`(mockWatchFaceHostApi.getUiThreadHandler()).thenReturn(handler)
-            `when`(mockWatchFaceHostApi.getContext()).thenReturn(
-                ApplicationProvider.getApplicationContext<Context>()
-            )
+            `when`(mockWatchFaceHostApi.getContext())
+                .thenReturn(ApplicationProvider.getApplicationContext<Context>())
             val watchState = MutableWatchState().asWatchState()
             val currentUserStyleRepository =
                 CurrentUserStyleRepository(UserStyleSchema(emptyList()))
@@ -2326,12 +2384,14 @@
                 WatchFace(
                     WatchFaceType.DIGITAL,
                     @Suppress("deprecation")
-                    object : Renderer.CanvasRenderer(
-                        mockSurfaceHolder,
-                        currentUserStyleRepository,
-                        watchState, CanvasType.SOFTWARE,
-                        16
-                    ) {
+                    object :
+                        Renderer.CanvasRenderer(
+                            mockSurfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            CanvasType.SOFTWARE,
+                            16
+                        ) {
                         override fun render(
                             canvas: Canvas,
                             bounds: Rect,
@@ -2342,8 +2402,7 @@
                             canvas: Canvas,
                             bounds: Rect,
                             zonedDateTime: ZonedDateTime
-                        ) {
-                        }
+                        ) {}
                     }
                 ),
                 mockWatchFaceHostApi,
@@ -2362,11 +2421,12 @@
             )
 
             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}"
-            )
+            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}"
+                )
         }
     }
 
@@ -2376,21 +2436,22 @@
         val mockPackageManager = Mockito.mock(PackageManager::class.java)
 
         `when`(
-            mockPackageManager.getServiceInfo(
-                ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
-                PackageManager.GET_META_DATA
+                mockPackageManager.getServiceInfo(
+                    ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
+                    PackageManager.GET_META_DATA
+                )
             )
-        ).thenReturn(
-            ServiceInfo().apply {
-                metaData = Bundle().apply {
-                    putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 4)
+            .thenReturn(
+                ServiceInfo().apply {
+                    metaData =
+                        Bundle().apply { putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 4) }
                 }
-            }
-        )
+            )
 
         assertThat(
-            EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
-        ).isTrue()
+                EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
+            )
+            .isTrue()
     }
 
     @Test
@@ -2399,21 +2460,22 @@
         val mockPackageManager = Mockito.mock(PackageManager::class.java)
 
         `when`(
-            mockPackageManager.getServiceInfo(
-                ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
-                PackageManager.GET_META_DATA
+                mockPackageManager.getServiceInfo(
+                    ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
+                    PackageManager.GET_META_DATA
+                )
             )
-        ).thenReturn(
-            ServiceInfo().apply {
-                metaData = Bundle().apply {
-                    putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 3)
+            .thenReturn(
+                ServiceInfo().apply {
+                    metaData =
+                        Bundle().apply { putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 3) }
                 }
-            }
-        )
+            )
 
         assertThat(
-            EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
-        ).isFalse()
+                EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
+            )
+            .isFalse()
     }
 
     @Test
@@ -2421,19 +2483,21 @@
         val redOption = ListOption(Option.Id("red"), "Red", "Red", icon = null)
         val greenOption = ListOption(Option.Id("green"), "Green", "Green", icon = null)
         val colorStyleList = listOf(redOption, greenOption)
-        val watchColorSetting = UserStyleSetting.ListUserStyleSetting(
-            UserStyleSetting.Id("color_id"),
-            "Color",
-            "Watch face color", /* icon = */
-            null,
-            colorStyleList,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
+        val watchColorSetting =
+            UserStyleSetting.ListUserStyleSetting(
+                UserStyleSetting.Id("color_id"),
+                "Color",
+                "Watch face color",
+                /* icon = */ null,
+                colorStyleList,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         scenario.onActivity { activity ->
             try {
@@ -2454,19 +2518,21 @@
         val redOption = ListOption(Option.Id("red"), "Red", "Red", icon = null)
         val greenOption = ListOption(Option.Id("green"), "Green", "Green", icon = null)
         val colorStyleList = listOf(redOption, greenOption)
-        val watchColorSetting = UserStyleSetting.ListUserStyleSetting(
-            UserStyleSetting.Id("color_id"),
-            "Color",
-            "Watch face color", /* icon = */
-            null,
-            colorStyleList,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
+        val watchColorSetting =
+            UserStyleSetting.ListUserStyleSetting(
+                UserStyleSetting.Id("color_id"),
+                "Color",
+                "Watch face color",
+                /* icon = */ null,
+                colorStyleList,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
 
-        val scenario = createOnWatchFaceEditingTestActivity(
-            listOf(colorStyleSetting, watchHandStyleSetting),
-            listOf(leftComplication, rightComplication)
-        )
+        val scenario =
+            createOnWatchFaceEditingTestActivity(
+                listOf(colorStyleSetting, watchHandStyleSetting),
+                listOf(leftComplication, rightComplication)
+            )
 
         scenario.onActivity { activity ->
             try {
@@ -2489,15 +2555,16 @@
 internal fun assertEquals(
     expected: ComplicationDataSourceInfo?,
     actual: ComplicationDataSourceInfo?
-) = 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)
+) =
+    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/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index bd12e2f..e7d4961 100644
--- a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -38,15 +38,8 @@
 import androidx.lifecycle.DefaultLifecycleObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.lifecycleScope
-import androidx.wear.watchface.complications.ComplicationDataSourceInfo
-import androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever
-import androidx.wear.watchface.complications.data.ComplicationData
-import androidx.wear.watchface.complications.data.EmptyComplicationData
-import androidx.wear.watchface.complications.toApiComplicationDataSourceInfo
-import androidx.wear.watchface.utility.AsyncTraceEvent
-import androidx.wear.watchface.utility.TraceEvent
-import androidx.wear.watchface.utility.launchWithTracing
 import androidx.wear.watchface.ComplicationHelperActivity
+import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.WatchFace
@@ -56,15 +49,26 @@
 import androidx.wear.watchface.client.EditorState
 import androidx.wear.watchface.client.HeadlessWatchFaceClient
 import androidx.wear.watchface.client.WatchFaceId
-import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
-import androidx.wear.watchface.ComplicationSlotBoundsType
+import androidx.wear.watchface.complications.ComplicationDataSourceInfo
+import androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever
+import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationExperimental
+import androidx.wear.watchface.complications.data.EmptyComplicationData
+import androidx.wear.watchface.complications.toApiComplicationDataSourceInfo
+import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.editor.data.EditorStateWireFormat
 import androidx.wear.watchface.sanitizeWatchFaceId
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.utility.AsyncTraceEvent
+import androidx.wear.watchface.utility.TraceEvent
+import androidx.wear.watchface.utility.launchWithTracing
+import java.lang.reflect.Proxy
+import java.time.Duration
+import java.time.Instant
+import kotlin.coroutines.resume
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
@@ -80,10 +84,6 @@
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withTimeout
-import java.lang.reflect.Proxy
-import java.time.Duration
-import java.time.Instant
-import kotlin.coroutines.resume
 
 private const val TAG = "EditorSession"
 
@@ -95,11 +95,11 @@
  * registered via [EditorServiceClient.addListener].
  *
  * For EditorSessions backed by a headless instance (see [createHeadlessEditorSession] and
- * [EditorRequest.headlessDeviceConfig]), style changes are not applied to the interactive
- * instance and it's up to the system to apply them. For EditorSessions backed by an interactive
- * instance style changes are applied immediately. Its possible the system might fail to persist
- * the style changes (e.g. to data base write failure or a crash) and if this happens it's the
- * responsibility of the system to revert the style change.
+ * [EditorRequest.headlessDeviceConfig]), style changes are not applied to the interactive instance
+ * and it's up to the system to apply them. For EditorSessions backed by an interactive instance
+ * style changes are applied immediately. Its possible the system might fail to persist the style
+ * changes (e.g. to data base write failure or a crash) and if this happens it's the responsibility
+ * of the system to revert the style change.
  */
 public interface EditorSession : AutoCloseable {
     /** The [ComponentName] of the watch face being edited. */
@@ -115,8 +115,8 @@
      * The current [UserStyle]. Assigning to this will cause the style to update. However, styling
      * changes to the watch face will be reverted upon exit.
      *
-     * If accessed from java, consider using
-     * [androidx.lifecycle.FlowLiveDataConversions.asLiveData] to observe changes.
+     * If accessed from java, consider using [androidx.lifecycle.FlowLiveDataConversions.asLiveData]
+     * to observe changes.
      */
     public val userStyle: MutableStateFlow<UserStyle>
 
@@ -130,8 +130,8 @@
      * A [Flow] of a Map of complication slot ids to [ComplicationSlotState] for each complication
      * slot.
      *
-     * If accessed from java, consider using
-     * [androidx.lifecycle.FlowLiveDataConversions.asLiveData] to observe changes.
+     * If accessed from java, consider using [androidx.lifecycle.FlowLiveDataConversions.asLiveData]
+     * to observe changes.
      */
     public val complicationSlotsState: StateFlow<Map<Int, ComplicationSlotState>>
 
@@ -164,16 +164,16 @@
      * Note if a slot is configured to be empty then the map will contain an instance of
      * [EmptyComplicationData] for that slot. Disabled complicationSlots are included in the map.
      *
-     * If accessed from java, consider using
-     * [androidx.lifecycle.FlowLiveDataConversions.asLiveData] to observe changes.
+     * If accessed from java, consider using [androidx.lifecycle.FlowLiveDataConversions.asLiveData]
+     * to observe changes.
      */
     public val complicationsPreviewData: StateFlow<Map<Int, ComplicationData>>
 
     /**
      * Returns a flow of maps of [androidx.wear.watchface.ComplicationSlot] ids to
-     * [ComplicationDataSourceInfo] that represent the information available about the data
-     * source for each complication. This data is fetched asynchronously and the map will initially
-     * be empty. For watch faces without complications this will always be empty.
+     * [ComplicationDataSourceInfo] that represent the information available about the data source
+     * for each complication. This data is fetched asynchronously and the map will initially be
+     * empty. For watch faces without complications this will always be empty.
      *
      * Note new data may be pushed as result of running [openComplicationDataSourceChooser].
      *
@@ -184,13 +184,12 @@
     public val complicationsDataSourceInfo: StateFlow<Map<Int, ComplicationDataSourceInfo?>>
 
     /** The ID of the background complication or `null` if there isn't one. */
-    @get:SuppressWarnings("AutoBoxing")
-    public val backgroundComplicationSlotId: Int?
+    @get:SuppressWarnings("AutoBoxing") public val backgroundComplicationSlotId: Int?
 
     /**
      * Returns the ID of the complication at the given coordinates or `null` if there isn't one.
-     * Only [androidx.wear.watchface.ComplicationSlot]s with
-     * [ComplicationSlotBoundsType.ROUND_RECT] are supported by this function.
+     * Only [androidx.wear.watchface.ComplicationSlot]s with [ComplicationSlotBoundsType.ROUND_RECT]
+     * are supported by this function.
      */
     @SuppressWarnings("AutoBoxing")
     @UiThread
@@ -202,7 +201,7 @@
      * @param renderParameters The [RenderParameters] to render with. Must be [DrawMode.INTERACTIVE]
      * @param instant The [Instant] to render with
      * @param slotIdToComplicationData The [ComplicationData] for each
-     * [androidx.wear.watchface.ComplicationSlot] to render with
+     *   [androidx.wear.watchface.ComplicationSlot] to render with
      */
     @UiThread
     public fun renderWatchFaceToBitmap(
@@ -215,26 +214,25 @@
      * Opens the complication data source chooser and returns the chosen complication data source
      * for the specified [androidx.wear.watchface.ComplicationSlot].
      *
-     * The result returns `null` if the operation was cancelled and otherwise returned an
-     * instance of [ChosenComplicationDataSource] that contains information about the chosen
-     * data source.
+     * The result returns `null` if the operation was cancelled and otherwise returned an instance
+     * of [ChosenComplicationDataSource] that contains information about the chosen data source.
      *
      * @param complicationSlotId The id of the [androidx.wear.watchface.ComplicationSlot] to select
-     * a complication data source for.
+     *   a complication data source for.
      * @throws IllegalStateException if a previous invocation of openComplicationDataSourceChooser
-     * is still running when openComplicationDataSourceChooser is called.
+     *   is still running when openComplicationDataSourceChooser is called.
      */
     @UiThread
-    public suspend fun openComplicationDataSourceChooser(complicationSlotId: Int):
-        ChosenComplicationDataSource?
+    public suspend fun openComplicationDataSourceChooser(
+        complicationSlotId: Int
+    ): ChosenComplicationDataSource?
 
     public companion object {
         /**
          * If passed [renderWatchFaceToBitmap] this will signal that the watch face's default
          * preview time should be used.
          */
-        @JvmField
-        val DEFAULT_PREVIEW_INSTANT: Instant = Instant.ofEpochMilli(-1L)
+        @JvmField val DEFAULT_PREVIEW_INSTANT: Instant = Instant.ofEpochMilli(-1L)
 
         /**
          * Constructs an [EditorSession] for an on watch face editor. This registers an activity
@@ -244,9 +242,9 @@
          *
          * @param activity The [ComponentActivity] associated with the [EditorSession].
          * @return Deferred<EditorSession?> which is resolved with either the [EditorSession] or
-         * `null` if it can't be constructed.
-         * @throws [TimeoutCancellationException] if it takes longer than
-         * [EDITING_SESSION_TIMEOUT] to create a watch face editor.
+         *   `null` if it can't be constructed.
+         * @throws [TimeoutCancellationException] if it takes longer than [EDITING_SESSION_TIMEOUT]
+         *   to create a watch face editor.
          */
         @JvmStatic
         @UiThread
@@ -268,14 +266,15 @@
                     }
                 )
             }
-            editorSession = createOnWatchEditorSessionImpl(
-                activity,
-                activity.intent,
-                object : ComplicationDataSourceInfoRetrieverProvider {
-                    override fun getComplicationDataSourceInfoRetriever() =
-                        ComplicationDataSourceInfoRetriever(activity)
-                }
-            )
+            editorSession =
+                createOnWatchEditorSessionImpl(
+                    activity,
+                    activity.intent,
+                    object : ComplicationDataSourceInfoRetrieverProvider {
+                        override fun getComplicationDataSourceInfoRetriever() =
+                            ComplicationDataSourceInfoRetriever(activity)
+                    }
+                )
             return editorSession!!
         }
 
@@ -286,65 +285,66 @@
             activity: ComponentActivity,
             editIntent: Intent,
             complicationDataSourceInfoRetrieverProvider: ComplicationDataSourceInfoRetrieverProvider
-        ): EditorSession = TraceEvent(
-            "EditorSession.createOnWatchEditorSessionAsyncImpl"
-        ).use {
-            try {
-                val editorRequest = editIntent.getParcelableExtra<ComponentName>(
-                    Constants.EXTRA_WATCH_FACE_COMPONENT
-                )?.let {
-                    EditorRequest(it, "", null)
-                } ?: EditorRequest.createFromIntent(editIntent)
-                Log.d(
-                    TAG,
-                    "createOnWatchEditorSession ${editorRequest.watchFaceComponentName} " +
-                        "${editorRequest.watchFaceId}"
-                )
-                // We need to respect the lifecycle and register the ActivityResultListener now.
-                val session = OnWatchFaceEditorSessionImpl(
-                    activity,
-                    editorRequest.watchFaceComponentName,
-                    editorRequest.watchFaceId,
-                    editorRequest.initialUserStyle,
-                    complicationDataSourceInfoRetrieverProvider,
-                    activity.lifecycleScope,
-                    editorRequest.previewScreenshotParams
-                )
-                // But full initialization has to be deferred because
-                // [WatchFace.getOrCreateEditorDelegate] is async.
-                // Resolve only after init has been completed.
-                withContext(activity.lifecycleScope.coroutineContext) {
-                    withTimeout(EDITING_SESSION_TIMEOUT.toMillis()) {
-                        session.setEditorDelegate(
-                            // Either create a delegate for a new headless client or await an
-                            // interactive one.
-                            if (editorRequest.headlessDeviceConfig != null) {
-                                WatchFace.createHeadlessSessionDelegate(
-                                    editorRequest.watchFaceComponentName,
-                                    HeadlessWatchFaceInstanceParams(
-                                        editorRequest.watchFaceComponentName,
-                                        editorRequest.headlessDeviceConfig.asWireDeviceConfig(),
-                                        activity.resources.displayMetrics.widthPixels,
-                                        activity.resources.displayMetrics.heightPixels,
-                                        editorRequest.watchFaceId.id
-                                    ),
-                                    activity
-                                )
-                            } else {
-                                WatchFace.getOrCreateEditorDelegate(
-                                    editorRequest.watchFaceComponentName
-                                ).await()
-                            }
+        ): EditorSession =
+            TraceEvent("EditorSession.createOnWatchEditorSessionAsyncImpl").use {
+                try {
+                    val editorRequest =
+                        editIntent
+                            .getParcelableExtra<ComponentName>(Constants.EXTRA_WATCH_FACE_COMPONENT)
+                            ?.let { EditorRequest(it, "", null) }
+                            ?: EditorRequest.createFromIntent(editIntent)
+                    Log.d(
+                        TAG,
+                        "createOnWatchEditorSession ${editorRequest.watchFaceComponentName} " +
+                            "${editorRequest.watchFaceId}"
+                    )
+                    // We need to respect the lifecycle and register the ActivityResultListener now.
+                    val session =
+                        OnWatchFaceEditorSessionImpl(
+                            activity,
+                            editorRequest.watchFaceComponentName,
+                            editorRequest.watchFaceId,
+                            editorRequest.initialUserStyle,
+                            complicationDataSourceInfoRetrieverProvider,
+                            activity.lifecycleScope,
+                            editorRequest.previewScreenshotParams
                         )
-                        // Resolve only after init has been completed.
-                        session
+                    // But full initialization has to be deferred because
+                    // [WatchFace.getOrCreateEditorDelegate] is async.
+                    // Resolve only after init has been completed.
+                    withContext(activity.lifecycleScope.coroutineContext) {
+                        withTimeout(EDITING_SESSION_TIMEOUT.toMillis()) {
+                            session.setEditorDelegate(
+                                // Either create a delegate for a new headless client or await an
+                                // interactive one.
+                                if (editorRequest.headlessDeviceConfig != null) {
+                                    WatchFace.createHeadlessSessionDelegate(
+                                        editorRequest.watchFaceComponentName,
+                                        HeadlessWatchFaceInstanceParams(
+                                            editorRequest.watchFaceComponentName,
+                                            editorRequest.headlessDeviceConfig.asWireDeviceConfig(),
+                                            activity.resources.displayMetrics.widthPixels,
+                                            activity.resources.displayMetrics.heightPixels,
+                                            editorRequest.watchFaceId.id
+                                        ),
+                                        activity
+                                    )
+                                } else {
+                                    WatchFace.getOrCreateEditorDelegate(
+                                            editorRequest.watchFaceComponentName
+                                        )
+                                        .await()
+                                }
+                            )
+                            // Resolve only after init has been completed.
+                            session
+                        }
                     }
+                } catch (e: Exception) {
+                    Log.e(TAG, "createOnWatchEditorSessionImpl failed", e)
+                    throw e
                 }
-            } catch (e: Exception) {
-                Log.e(TAG, "createOnWatchEditorSessionImpl failed", e)
-                throw e
             }
-        }
 
         /**
          * Constructs an [EditorSession] for a remote watch face editor.
@@ -361,33 +361,33 @@
             activity: ComponentActivity,
             editIntent: Intent,
             headlessWatchFaceClient: HeadlessWatchFaceClient
-        ): EditorSession = TraceEvent("EditorSession.createHeadlessEditorSession").use {
-            EditorRequest.createFromIntent(editIntent).let {
-                Log.d(
-                    TAG,
-                    "createHeadlessEditorSession ${it.watchFaceComponentName} ${it.watchFaceId}"
-                )
-                HeadlessEditorSession(
-                    activity,
-                    headlessWatchFaceClient,
-                    it.watchFaceComponentName,
-                    it.watchFaceId,
-                    it.initialUserStyle!!,
-                    object : ComplicationDataSourceInfoRetrieverProvider {
-                        override fun getComplicationDataSourceInfoRetriever() =
-                            ComplicationDataSourceInfoRetriever(activity)
-                    },
-                    CoroutineScope(
-                        Handler(Looper.getMainLooper()).asCoroutineDispatcher().immediate
-                    ),
-                    it.previewScreenshotParams
-                )
+        ): EditorSession =
+            TraceEvent("EditorSession.createHeadlessEditorSession").use {
+                EditorRequest.createFromIntent(editIntent).let {
+                    Log.d(
+                        TAG,
+                        "createHeadlessEditorSession ${it.watchFaceComponentName} ${it.watchFaceId}"
+                    )
+                    HeadlessEditorSession(
+                        activity,
+                        headlessWatchFaceClient,
+                        it.watchFaceComponentName,
+                        it.watchFaceId,
+                        it.initialUserStyle!!,
+                        object : ComplicationDataSourceInfoRetrieverProvider {
+                            override fun getComplicationDataSourceInfoRetriever() =
+                                ComplicationDataSourceInfoRetriever(activity)
+                        },
+                        CoroutineScope(
+                            Handler(Looper.getMainLooper()).asCoroutineDispatcher().immediate
+                        ),
+                        it.previewScreenshotParams
+                    )
+                }
             }
-        }
 
         /** Timeout allowed for waiting for creating the watch face editing session. */
-        @JvmField
-        public val EDITING_SESSION_TIMEOUT: Duration = Duration.ofSeconds(4)
+        @JvmField public val EDITING_SESSION_TIMEOUT: Duration = Duration.ofSeconds(4)
     }
 }
 
@@ -398,7 +398,7 @@
  *
  * @param complicationSlotId The ID of the complication slot that was configured.
  * @param complicationDataSourceInfo The complication data source that was chosen for this slot, or
- * `null` if the empty complication source was was chosen.
+ *   `null` if the empty complication source was was chosen.
  * @param extras Any additional extras returned by the complication data source chooser.
  */
 public class ChosenComplicationDataSource(
@@ -415,14 +415,13 @@
     fun getComplicationDataSourceInfoRetriever(): ComplicationDataSourceInfoRetriever
 }
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public abstract class BaseEditorSession internal constructor(
+public abstract class BaseEditorSession
+internal constructor(
     private var activity: ComponentActivity?,
     private var complicationDataSourceInfoRetrieverProvider:
-    ComplicationDataSourceInfoRetrieverProvider?,
+        ComplicationDataSourceInfoRetrieverProvider?,
     public val coroutineScope: CoroutineScope,
     private val previewScreenshotParams: PreviewScreenshotParams?,
     internal val watchFaceIdInternal: WatchFaceId
@@ -431,15 +430,15 @@
     protected var forceClosed: Boolean = false
 
     private val editorSessionTraceEvent = AsyncTraceEvent("EditorSession")
-    private val closeCallback = object : EditorService.CloseCallback() {
-        override fun onClose() {
-            // onClose could be called on any thread but forceClose needs to be called from the UI
-            // thread.
-            coroutineScope.launch {
-                forceClose()
+    private val closeCallback =
+        object : EditorService.CloseCallback() {
+            override fun onClose() {
+                // onClose could be called on any thread but forceClose needs to be called from the
+                // UI
+                // thread.
+                coroutineScope.launch { forceClose() }
             }
         }
-    }
 
     override val watchFaceId = WatchFaceId(sanitizeWatchFaceId(watchFaceIdInternal.id))
 
@@ -468,7 +467,8 @@
 
     /** Pending result for ComplicationDataSourceChooserRequest. */
     internal var pendingComplicationDataSourceChooserResult:
-        CompletableDeferred<ComplicationDataSourceChooserResult?>? = null
+        CompletableDeferred<ComplicationDataSourceChooserResult?>? =
+        null
 
     private var chooseComplicationDataSource:
         ActivityResultLauncher<ComplicationDataSourceChooserRequest>? =
@@ -495,127 +495,133 @@
         complicationDataSourceChooserResult: ComplicationDataSourceChooserResult?
     ) {
         synchronized(this) {
-            val deferredResult = pendingComplicationDataSourceChooserResult
-            if (deferredResult == null) {
-                Log.w(
-                    TAG,
-                    "Ignoring onComplicationDataSourceChooserResult due to null " +
-                        "pendingComplicationDataSourceChooserResult"
-                )
-                return
+                val deferredResult = pendingComplicationDataSourceChooserResult
+                if (deferredResult == null) {
+                    Log.w(
+                        TAG,
+                        "Ignoring onComplicationDataSourceChooserResult due to null " +
+                            "pendingComplicationDataSourceChooserResult"
+                    )
+                    return
+                }
+                Log.d(TAG, "onComplicationDataSourceChooserResult")
+                pendingComplicationDataSourceChooserResult = null
+                deferredResult
             }
-            Log.d(TAG, "onComplicationDataSourceChooserResult")
-            pendingComplicationDataSourceChooserResult = null
-            deferredResult
-        }.complete(complicationDataSourceChooserResult)
+            .complete(complicationDataSourceChooserResult)
     }
 
     override suspend fun openComplicationDataSourceChooser(
         complicationSlotId: Int
-    ): ChosenComplicationDataSource? = TraceEvent(
-        "BaseEditorSession.openComplicationDataSourceChooser $complicationSlotId"
-    ).use {
-        Log.d(TAG, "openComplicationDataSourceChooser")
-        requireNotClosed()
-        require(
-            !complicationSlotsState.value[complicationSlotId]!!
-                .fixedComplicationDataSource
-        ) {
-            "Can't configure fixed complication ID $complicationSlotId"
-        }
-
-        val deferredResult = CompletableDeferred<ComplicationDataSourceChooserResult?>()
-
-        synchronized(this) {
-            // The ComplicationDataSourceChooser is modal so it doesn't make sense to allow
-            // concurrent invocations so bail out if there's a pending result.
-            if (pendingComplicationDataSourceChooserResult != null) {
-                throw IllegalStateException(
-                    "Concurrent openComplicationDataSourceChooser invocation is not supported"
-                )
+    ): ChosenComplicationDataSource? =
+        TraceEvent("BaseEditorSession.openComplicationDataSourceChooser $complicationSlotId").use {
+            Log.d(TAG, "openComplicationDataSourceChooser")
+            requireNotClosed()
+            require(
+                !complicationSlotsState.value[complicationSlotId]!!.fixedComplicationDataSource
+            ) {
+                "Can't configure fixed complication ID $complicationSlotId"
             }
-            pendingComplicationDataSourceChooserResult = deferredResult
 
-            chooseComplicationDataSource!!.launch(
-                ComplicationDataSourceChooserRequest(
-                    this,
-                    complicationSlotId,
-                    watchFaceIdInternal.id,
-                    showComplicationDeniedDialogIntent,
-                    showComplicationRationaleDialogIntent
-                )
-            )
-        }
+            val deferredResult = CompletableDeferred<ComplicationDataSourceChooserResult?>()
 
-        val complicationDataSourceChooserResult = try {
-            deferredResult.await()
-        } finally {
             synchronized(this) {
-                pendingComplicationDataSourceChooserResult = null
+                // The ComplicationDataSourceChooser is modal so it doesn't make sense to allow
+                // concurrent invocations so bail out if there's a pending result.
+                if (pendingComplicationDataSourceChooserResult != null) {
+                    throw IllegalStateException(
+                        "Concurrent openComplicationDataSourceChooser invocation is not supported"
+                    )
+                }
+                pendingComplicationDataSourceChooserResult = deferredResult
+
+                chooseComplicationDataSource!!.launch(
+                    ComplicationDataSourceChooserRequest(
+                        this,
+                        complicationSlotId,
+                        watchFaceIdInternal.id,
+                        showComplicationDeniedDialogIntent,
+                        showComplicationRationaleDialogIntent
+                    )
+                )
+            }
+
+            val complicationDataSourceChooserResult =
+                try {
+                    deferredResult.await()
+                } finally {
+                    synchronized(this) { pendingComplicationDataSourceChooserResult = null }
+                }
+
+            // If deferredResult was null then the user canceled so return null.
+            if (complicationDataSourceChooserResult == null) {
+                return null
+            }
+
+            val complicationDataSourceInfoRetriever =
+                complicationDataSourceInfoRetrieverProvider!!
+                    .getComplicationDataSourceInfoRetriever()
+
+            try {
+                deferredComplicationPreviewDataAvailable.await()
+
+                // Emit an updated complicationsDataSourceInfoMap.
+                complicationsDataSourceInfo.value =
+                    HashMap(complicationsDataSourceInfo.value).apply {
+                        this[complicationSlotId] =
+                            complicationDataSourceChooserResult.dataSourceInfo
+                    }
+
+                val previewData =
+                    getPreviewData(
+                        complicationDataSourceInfoRetriever,
+                        complicationDataSourceChooserResult.dataSourceInfo
+                    )
+
+                // Emit an updated complicationPreviewDataMap.
+                complicationsPreviewData.value =
+                    HashMap(complicationsPreviewData.value).apply {
+                        this[complicationSlotId] = previewData ?: EmptyComplicationData()
+                    }
+
+                return ChosenComplicationDataSource(
+                    complicationSlotId,
+                    complicationDataSourceChooserResult.dataSourceInfo,
+                    complicationDataSourceChooserResult.extras,
+                )
+            } finally {
+                // This gets called after the above coroutine has finished.
+                complicationDataSourceInfoRetriever.close()
+
+                // Changing a complication data source could result in the type and therefore the
+                // bounds
+                // changing. This needs to be done after updating the preview data in case that
+                // affects
+                // the ComplicationType and hence the bounds of the complication.
+                maybeUpdateComplicationSlotsState()
             }
         }
 
-        // If deferredResult was null then the user canceled so return null.
-        if (complicationDataSourceChooserResult == null) {
-            return null
-        }
-
-        val complicationDataSourceInfoRetriever =
-            complicationDataSourceInfoRetrieverProvider!!.getComplicationDataSourceInfoRetriever()
-
-        try {
-            deferredComplicationPreviewDataAvailable.await()
-
-            // Emit an updated complicationsDataSourceInfoMap.
-            complicationsDataSourceInfo.value =
-                HashMap(complicationsDataSourceInfo.value).apply {
-                    this[complicationSlotId] = complicationDataSourceChooserResult.dataSourceInfo
-                }
-
-            val previewData = getPreviewData(
-                complicationDataSourceInfoRetriever,
-                complicationDataSourceChooserResult.dataSourceInfo
-            )
-
-            // Emit an updated complicationPreviewDataMap.
-            complicationsPreviewData.value =
-                HashMap(complicationsPreviewData.value).apply {
-                    this[complicationSlotId] = previewData ?: EmptyComplicationData()
-                }
-
-            return ChosenComplicationDataSource(
-                complicationSlotId,
-                complicationDataSourceChooserResult.dataSourceInfo,
-                complicationDataSourceChooserResult.extras,
-            )
-        } finally {
-            // This gets called after the above coroutine has finished.
-            complicationDataSourceInfoRetriever.close()
-
-            // Changing a complication data source could result in the type and therefore the bounds
-            // changing. This needs to be done after updating the preview data in case that affects
-            // the ComplicationType and hence the bounds of the complication.
-            maybeUpdateComplicationSlotsState()
-        }
-    }
-
     override val backgroundComplicationSlotId: Int? by lazy {
         requireNotClosed()
-        complicationSlotsState.value.entries.firstOrNull {
-            it.value.boundsType == ComplicationSlotBoundsType.BACKGROUND
-        }?.key
+        complicationSlotsState.value.entries
+            .firstOrNull { it.value.boundsType == ComplicationSlotBoundsType.BACKGROUND }
+            ?.key
     }
 
     override fun getComplicationSlotIdAt(@Px x: Int, @Px y: Int): Int? {
         requireNotClosed()
-        return complicationSlotsState.value.entries.firstOrNull {
-            it.value.isEnabled && when (it.value.boundsType) {
-                ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
-                ComplicationSlotBoundsType.BACKGROUND -> false
-                ComplicationSlotBoundsType.EDGE -> false
-                else -> false
+        return complicationSlotsState.value.entries
+            .firstOrNull {
+                it.value.isEnabled &&
+                    when (it.value.boundsType) {
+                        ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
+                        ComplicationSlotBoundsType.BACKGROUND -> false
+                        ComplicationSlotBoundsType.EDGE -> false
+                        else -> false
+                    }
             }
-        }?.key
+            ?.key
     }
 
     /**
@@ -631,38 +637,37 @@
     internal suspend fun getPreviewData(
         complicationDataSourceInfoRetriever: ComplicationDataSourceInfoRetriever,
         dataSourceInfo: ComplicationDataSourceInfo?
-    ): ComplicationData? = TraceEvent("BaseEditorSession.getPreviewData").use {
-        if (dataSourceInfo == null) {
-            return null
-        }
-        // Fetch preview ComplicationData if possible.
-        if (dataSourceInfo.componentName == null) {
-            return dataSourceInfo.fallbackPreviewData
-        }
-        try {
-            val previewData =
-                complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
-                    dataSourceInfo.componentName!!,
-                    dataSourceInfo.type
-                )
-            // If the data source sends us ComplicationData of the wrong type then use fallback
-            // data.
-            if (previewData == null || previewData.type != dataSourceInfo.type) {
+    ): ComplicationData? =
+        TraceEvent("BaseEditorSession.getPreviewData").use {
+            if (dataSourceInfo == null) {
+                return null
+            }
+            // Fetch preview ComplicationData if possible.
+            if (dataSourceInfo.componentName == null) {
                 return dataSourceInfo.fallbackPreviewData
             }
-            return previewData
-        } catch (e: Exception) {
-            // Something went wrong, so use fallback preview data.
-            return dataSourceInfo.fallbackPreviewData
+            try {
+                val previewData =
+                    complicationDataSourceInfoRetriever.retrievePreviewComplicationData(
+                        dataSourceInfo.componentName!!,
+                        dataSourceInfo.type
+                    )
+                // If the data source sends us ComplicationData of the wrong type then use fallback
+                // data.
+                if (previewData == null || previewData.type != dataSourceInfo.type) {
+                    return dataSourceInfo.fallbackPreviewData
+                }
+                return previewData
+            } catch (e: Exception) {
+                // Something went wrong, so use fallback preview data.
+                return dataSourceInfo.fallbackPreviewData
+            }
         }
-    }
 
     protected fun fetchComplicationsData(fetchCoroutineScope: CoroutineScope): Job {
         val complicationDataSourceInfoRetriever =
             complicationDataSourceInfoRetrieverProvider!!.getComplicationDataSourceInfoRetriever()
-        return fetchCoroutineScope.launchWithTracing(
-            "BaseEditorSession.fetchComplicationsData"
-        ) {
+        return fetchCoroutineScope.launchWithTracing("BaseEditorSession.fetchComplicationsData") {
             try {
                 // Unlikely but WCS could conceivably crash during this call. We could retry but
                 // it's not obvious if that'd succeed or if WCS session state is recoverable,
@@ -676,18 +681,20 @@
                     extractComplicationsDataSourceInfoMap(dataSourceInfoArray) ?: emptyMap()
 
                 // Parallel fetch preview ComplicationData.
-                complicationsPreviewData.value = dataSourceInfoArray?.associateBy(
-                    { it.slotId },
-                    {
-                        async {
-                            getPreviewData(complicationDataSourceInfoRetriever, it.info)
-                        }
-                    }
-                    // Coerce to a Map<Int, ComplicationData> omitting null values.
-                    // If mapNotNullValues existed we would use it here.
-                )?.mapValues {
-                    it.value.await() ?: EmptyComplicationData()
-                } ?: emptyMap()
+                complicationsPreviewData.value =
+                    dataSourceInfoArray
+                        ?.associateBy(
+                            { it.slotId },
+                            {
+                                async {
+                                    getPreviewData(complicationDataSourceInfoRetriever, it.info)
+                                }
+                            }
+                            // Coerce to a Map<Int, ComplicationData> omitting null values.
+                            // If mapNotNullValues existed we would use it here.
+                        )
+                        ?.mapValues { it.value.await() ?: EmptyComplicationData() }
+                        ?: emptyMap()
                 deferredComplicationPreviewDataAvailable.complete(Unit)
             } catch (e: Exception) {
                 Log.w(TAG, "fetchComplicationsData failed", e)
@@ -714,8 +721,10 @@
                 withTimeout(CLOSE_BROADCAST_TIMEOUT_MILLIS) {
                     deferredComplicationPreviewDataAvailable.await()
                     val previewImage =
-                        if (commitChangesOnClose && previewScreenshotParams != null &&
-                            Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
+                        if (
+                            commitChangesOnClose &&
+                                previewScreenshotParams != null &&
+                                Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
                         ) {
                             SharedMemoryImage.ashmemWriteImageBundle(
                                 renderWatchFaceToBitmap(
@@ -774,13 +783,10 @@
     }
 
     protected fun requireNotClosed() {
-        require(!closed or forceClosed) {
-            "EditorSession method called after close()"
-        }
+        require(!closed or forceClosed) { "EditorSession method called after close()" }
     }
 
-    @UiThread
-    protected abstract fun releaseResources()
+    @UiThread protected abstract fun releaseResources()
 
     protected open val showComplicationDeniedDialogIntent: Intent? = null
 
@@ -790,9 +796,9 @@
 /**
  * @param activity The editor's [ComponentActivity].
  * @param watchFaceIdInternal The original ID sent to us in the [WatchFaceEditorContract]. We need
- * this because the system expects [EditorState.watchFaceId] to match.
+ *   this because the system expects [EditorState.watchFaceId] to match.
  * @param complicationDataSourceInfoRetrieverProvider Used to obtain
- * [ComplicationDataSourceInfoRetriever]
+ *   [ComplicationDataSourceInfoRetriever]
  * @param coroutineScope The main thread [CoroutineScope]
  * @param previewScreenshotParams Optional [PreviewScreenshotParams]
  */
@@ -804,13 +810,14 @@
     complicationDataSourceInfoRetrieverProvider: ComplicationDataSourceInfoRetrieverProvider,
     coroutineScope: CoroutineScope,
     previewScreenshotParams: PreviewScreenshotParams?
-) : BaseEditorSession(
-    activity,
-    complicationDataSourceInfoRetrieverProvider,
-    coroutineScope,
-    previewScreenshotParams,
-    watchFaceIdInternal
-) {
+) :
+    BaseEditorSession(
+        activity,
+        complicationDataSourceInfoRetrieverProvider,
+        coroutineScope,
+        previewScreenshotParams,
+        watchFaceIdInternal
+    ) {
     private lateinit var editorDelegate: WatchFace.EditorDelegate
 
     private companion object {
@@ -822,9 +829,7 @@
         editorDelegate.userStyleSchema
     }
 
-    override val previewReferenceInstant: Instant by lazy {
-        editorDelegate.previewReferenceInstant
-    }
+    override val previewReferenceInstant: Instant by lazy { editorDelegate.previewReferenceInstant }
 
     override val watchFaceId = WatchFaceId(sanitizeWatchFaceId(watchFaceIdInternal.id))
 
@@ -835,9 +840,10 @@
             // Get the ComplicationType from the preview data if available. This is important
             // because the type and therefore bounds may change based on the selected complication
             // data source.
-            val type = complicationsPreviewData.value.let { previewDataMap ->
-                previewDataMap[it.key]?.type ?: it.value.complicationData.value.type
-            }
+            val type =
+                complicationsPreviewData.value.let { previewDataMap ->
+                    previewDataMap[it.key]?.type ?: it.value.complicationData.value.type
+                }
             ComplicationSlotState(
                 it.value.computeBounds(editorDelegate.screenBounds, type, applyMargins = false),
                 it.value.boundsType,
@@ -861,32 +867,33 @@
     // exceptions thrown within a coroutine are lost and the MutableStateFlow interface includes
     // internal unstable methods so we can't use a static proxy...
     @Suppress("BanUncheckedReflection", "UNCHECKED_CAST")
-    override val userStyle = Proxy.newProxyInstance(
-        MutableStateFlow::class.java.classLoader,
-        arrayOf<Class<*>>(MutableStateFlow::class.java)
-    ) { _, method, args ->
-        if (args == null) {
-            method?.invoke(wrappedUserStyle)
-        } else {
-            val result = method?.invoke(wrappedUserStyle, *args)
-            when (method?.name) {
-                "setValue" -> validateAndUpdateUserStyle(args[0] as UserStyle)
-                "compareAndSet" -> {
-                    if (result is Boolean && result == true) {
-                        validateAndUpdateUserStyle(args[1] as UserStyle)
+    override val userStyle =
+        Proxy.newProxyInstance(
+            MutableStateFlow::class.java.classLoader,
+            arrayOf<Class<*>>(MutableStateFlow::class.java)
+        ) { _, method, args ->
+            if (args == null) {
+                method?.invoke(wrappedUserStyle)
+            } else {
+                val result = method?.invoke(wrappedUserStyle, *args)
+                when (method?.name) {
+                    "setValue" -> validateAndUpdateUserStyle(args[0] as UserStyle)
+                    "compareAndSet" -> {
+                        if (result is Boolean && result == true) {
+                            validateAndUpdateUserStyle(args[1] as UserStyle)
+                        }
+                    }
+                    else -> {
+                        Log.e(
+                            TAG,
+                            "userStyle proxy encountered unexpected method name '${method.name}'" +
+                                " please check your proguard rules."
+                        )
                     }
                 }
-                else -> {
-                    Log.e(
-                        TAG,
-                        "userStyle proxy encountered unexpected method name '${method.name}'" +
-                            " please check your proguard rules."
-                    )
-                }
+                result
             }
-            result
-        }
-    } as MutableStateFlow<UserStyle>
+        } as MutableStateFlow<UserStyle>
 
     @Suppress("Deprecation") // userStyleSettings
     internal fun validateAndUpdateUserStyle(userStyle: UserStyle) {
@@ -970,9 +977,8 @@
                 UserStyle(initialEditorUserStyle, editorDelegate.userStyleSchema)
         }
 
-        backgroundCoroutineScope = CoroutineScope(
-            editorDelegate.backgroundThreadHandler.asCoroutineDispatcher().immediate
-        )
+        backgroundCoroutineScope =
+            CoroutineScope(editorDelegate.backgroundThreadHandler.asCoroutineDispatcher().immediate)
 
         fetchComplicationsDataJob = fetchComplicationsData(backgroundCoroutineScope)
 
@@ -1002,13 +1008,14 @@
     complicationDataSourceInfoRetrieverProvider: ComplicationDataSourceInfoRetrieverProvider,
     coroutineScope: CoroutineScope,
     previewScreenshotParams: PreviewScreenshotParams?
-) : BaseEditorSession(
-    activity,
-    complicationDataSourceInfoRetrieverProvider,
-    coroutineScope,
-    previewScreenshotParams,
-    watchFaceIdInternal
-) {
+) :
+    BaseEditorSession(
+        activity,
+        complicationDataSourceInfoRetrieverProvider,
+        coroutineScope,
+        previewScreenshotParams,
+        watchFaceIdInternal
+    ) {
     override val userStyleSchema = headlessWatchFaceClient.userStyleSchema
 
     override val userStyle = MutableStateFlow(UserStyle(initialUserStyle, userStyleSchema))
@@ -1079,8 +1086,10 @@
  * An [ActivityResultContract] for invoking the complication data source chooser. If the user
  * cancels the data source chooser than the result will be `null`.
  */
-internal class ComplicationDataSourceChooserContract : ActivityResultContract<
-    ComplicationDataSourceChooserRequest, ComplicationDataSourceChooserResult?>() {
+internal class ComplicationDataSourceChooserContract :
+    ActivityResultContract<
+        ComplicationDataSourceChooserRequest, ComplicationDataSourceChooserResult?
+    >() {
 
     internal companion object {
         const val EXTRA_PROVIDER_INFO = "android.support.wearable.complications.EXTRA_PROVIDER_INFO"
@@ -1098,40 +1107,48 @@
         input: ComplicationDataSourceChooserRequest
     ): Intent {
         val complicationSlotsState = input.editorSession.complicationSlotsState.value
-        val intent = ComplicationHelperActivity.createComplicationDataSourceChooserHelperIntent(
-            context,
-            input.editorSession.watchFaceComponentName,
-            input.complicationSlotId,
-            complicationSlotsState[input.complicationSlotId]!!.supportedTypes,
-            input.instanceId,
-            input.showComplicationDeniedDialogIntent,
-            input.showComplicationRationaleDialogIntent,
-        )
+        val intent =
+            ComplicationHelperActivity.createComplicationDataSourceChooserHelperIntent(
+                context,
+                input.editorSession.watchFaceComponentName,
+                input.complicationSlotId,
+                complicationSlotsState[input.complicationSlotId]!!.supportedTypes,
+                input.instanceId,
+                input.showComplicationDeniedDialogIntent,
+                input.showComplicationRationaleDialogIntent,
+            )
         val complicationState = complicationSlotsState[input.complicationSlotId]!!
         intent.replaceExtras(
             Bundle(complicationState.complicationConfigExtras).apply { putAll(intent.extras!!) }
         )
         if (useTestComplicationHelperActivity) {
-            intent.component = ComponentName(
-                "androidx.wear.watchface.editor.test",
-                "androidx.wear.watchface.editor.TestComplicationHelperActivity"
-            )
+            intent.component =
+                ComponentName(
+                    "androidx.wear.watchface.editor.test",
+                    "androidx.wear.watchface.editor.TestComplicationHelperActivity"
+                )
         }
         return intent
     }
 
     @Suppress("DEPRECATION")
-    override fun parseResult(resultCode: Int, intent: Intent?) = intent?.let {
-        val extras = intent.extras?.let { extras ->
-            Bundle(extras).apply { remove(EXTRA_PROVIDER_INFO) }
-        } ?: Bundle.EMPTY
-        ComplicationDataSourceChooserResult(
-            it.getParcelableExtra<android.support.wearable.complications.ComplicationProviderInfo>(
-                EXTRA_PROVIDER_INFO
-            )?.toApiComplicationDataSourceInfo(),
-            extras
-        )
-    }
+    override fun parseResult(resultCode: Int, intent: Intent?) =
+        intent?.let {
+            val extras =
+                intent.extras?.let { extras ->
+                    Bundle(extras).apply { remove(EXTRA_PROVIDER_INFO) }
+                }
+                    ?: Bundle.EMPTY
+            ComplicationDataSourceChooserResult(
+                it.getParcelableExtra<
+                        android.support.wearable.complications.ComplicationProviderInfo
+                    >(
+                        EXTRA_PROVIDER_INFO
+                    )
+                    ?.toApiComplicationDataSourceInfo(),
+                extras
+            )
+        }
 }
 
 /**
@@ -1140,11 +1157,6 @@
  */
 internal fun extractComplicationsDataSourceInfoMap(
     resultArray: Array<ComplicationDataSourceInfoRetriever.Result>?
-): Map<Int, ComplicationDataSourceInfo?>? =
-    resultArray?.associateBy(
-        { it.slotId },
-        { it.info }
-    )
+): Map<Int, ComplicationDataSourceInfo?>? = resultArray?.associateBy({ it.slotId }, { it.info })
 
-@Suppress("DEPRECATION")
-internal fun Bundle.asString() = keySet().map { "$it: ${get(it)}" }
+@Suppress("DEPRECATION") internal fun Bundle.asString() = keySet().map { "$it: ${get(it)}" }
diff --git a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
index 88edba6..8d78fa6 100644
--- a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
+++ b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.watchface.editor
 
-import androidx.wear.watchface.data.DeviceConfig as WireDeviceConfig
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.content.ComponentName
@@ -34,11 +33,12 @@
 import androidx.wear.watchface.client.WatchFaceControlClient
 import androidx.wear.watchface.client.WatchFaceId
 import androidx.wear.watchface.client.asApiDeviceConfig
+import androidx.wear.watchface.data.DeviceConfig as WireDeviceConfig
 import androidx.wear.watchface.data.RenderParametersWireFormat
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleData
-import kotlinx.coroutines.TimeoutCancellationException
 import java.time.Instant
+import kotlinx.coroutines.TimeoutCancellationException
 
 internal const val INSTANCE_ID_KEY: String = "INSTANCE_ID_KEY"
 internal const val COMPONENT_NAME_KEY: String = "COMPONENT_NAME_KEY"
@@ -84,24 +84,25 @@
  * @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].
  * @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.
- * @param headlessDeviceConfig If `non-null` then this is the [DeviceConfig] to use when creating
- * a headless instance to back the [EditorSession]. If `null` then the current interactive instance
- * will be used. If there isn't one then the [EditorSession] won't launch until it's been created.
- * Note [supportsWatchFaceHeadlessEditing] can be used to determine if this feature is supported.
- * If it's not supported this parameter will be ignored.
- * @param previewScreenshotParams If `non-null` then [EditorSession] upon
- * closing will render a screenshot with [PreviewScreenshotParams] using the existing interactive
- * or headless instance which will be sent in [EditorState] to any registered clients.
+ *   Android R and beyond, it's `null` on Android P and earlier. Note each distinct [ComponentName]
+ *   can have multiple instances.
+ * @param headlessDeviceConfig If `non-null` then this is the [DeviceConfig] to use when creating a
+ *   headless instance to back the [EditorSession]. If `null` then the current interactive instance
+ *   will be used. If there isn't one then the [EditorSession] won't launch until it's been created.
+ *   Note [supportsWatchFaceHeadlessEditing] can be used to determine if this feature is supported.
+ *   If it's not supported this parameter will be ignored.
+ * @param previewScreenshotParams If `non-null` then [EditorSession] upon closing will render a
+ *   screenshot with [PreviewScreenshotParams] using the existing interactive or headless instance
+ *   which will be sent in [EditorState] to any registered clients.
  */
-public class EditorRequest @RequiresApi(Build.VERSION_CODES.R) constructor(
+public class EditorRequest
+@RequiresApi(Build.VERSION_CODES.R)
+constructor(
     public val watchFaceComponentName: ComponentName,
     public val editorPackageName: String,
     public val initialUserStyle: UserStyleData?,
-
     @get:RequiresApi(Build.VERSION_CODES.R)
     @RequiresApi(Build.VERSION_CODES.R)
     public val watchFaceId: WatchFaceId,
@@ -114,8 +115,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].
-     * [EditorSession].
+     *   required for a headless [EditorSession]. [EditorSession].
      */
     @SuppressLint("NewApi")
     public constructor(
@@ -135,39 +135,45 @@
         /**
          * Returns an [EditorRequest] saved to a [Intent] by [WatchFaceEditorContract.createIntent]
          * if there is one or `null` otherwise. Intended for use by the watch face editor activity.
+         *
          * @throws [TimeoutCancellationException] in case of en error.
          */
         @Suppress("DEPRECATION")
         @SuppressLint("NewApi")
         @JvmStatic
         @Throws(TimeoutCancellationException::class)
-        public fun createFromIntent(intent: Intent): EditorRequest = EditorRequest(
-            watchFaceComponentName = intent.getParcelableExtra<ComponentName>(COMPONENT_NAME_KEY)!!,
-            editorPackageName = intent.getPackage() ?: "",
-            initialUserStyle = intent.getStringArrayExtra(USER_STYLE_KEY)?.let {
-                UserStyleData(
-                    HashMap<String, ByteArray>().apply {
-                        for (i in it.indices) {
-                            val userStyleValue =
-                                intent.getByteArrayExtra(USER_STYLE_VALUES + i)!!
-                            put(it[i], userStyleValue)
+        public fun createFromIntent(intent: Intent): EditorRequest =
+            EditorRequest(
+                watchFaceComponentName =
+                    intent.getParcelableExtra<ComponentName>(COMPONENT_NAME_KEY)!!,
+                editorPackageName = intent.getPackage() ?: "",
+                initialUserStyle =
+                    intent.getStringArrayExtra(USER_STYLE_KEY)?.let {
+                        UserStyleData(
+                            HashMap<String, ByteArray>().apply {
+                                for (i in it.indices) {
+                                    val userStyleValue =
+                                        intent.getByteArrayExtra(USER_STYLE_VALUES + i)!!
+                                    put(it[i], userStyleValue)
+                                }
+                            }
+                        )
+                    },
+                watchFaceId = WatchFaceId(intent.getStringExtra(INSTANCE_ID_KEY) ?: ""),
+                headlessDeviceConfig =
+                    intent
+                        .getParcelableExtra<WireDeviceConfig>(HEADLESS_DEVICE_CONFIG_KEY)
+                        ?.asApiDeviceConfig(),
+                previewScreenshotParams =
+                    intent
+                        .getParcelableExtra<RenderParametersWireFormat>(RENDER_PARAMETERS_KEY)
+                        ?.let {
+                            PreviewScreenshotParams(
+                                RenderParameters(it),
+                                Instant.ofEpochMilli(intent.getLongExtra(RENDER_TIME_MILLIS_KEY, 0))
+                            )
                         }
-                    }
-                )
-            },
-            watchFaceId = WatchFaceId(intent.getStringExtra(INSTANCE_ID_KEY) ?: ""),
-            headlessDeviceConfig = intent.getParcelableExtra<WireDeviceConfig>(
-                HEADLESS_DEVICE_CONFIG_KEY
-            )?.asApiDeviceConfig(),
-            previewScreenshotParams = intent.getParcelableExtra<RenderParametersWireFormat>(
-                RENDER_PARAMETERS_KEY
-            )?.let {
-                PreviewScreenshotParams(
-                    RenderParameters(it),
-                    Instant.ofEpochMilli(intent.getLongExtra(RENDER_TIME_MILLIS_KEY, 0))
-                )
-            }
-        )
+            )
 
         internal const val ANDROIDX_WATCHFACE_API_VERSION = "androidx.wear.watchface.api_version"
         internal const val WATCHFACE_CONTROL_SERVICE =
@@ -179,7 +185,7 @@
          *
          * @param packageManager The [PackageManager].
          * @param watchfacePackageName The package name of the watchface, see
-         * [ComponentName.getPackageName].
+         *   [ComponentName.getPackageName].
          * @throws [PackageManager.NameNotFoundException] if watchfacePackageName is not recognized.
          * @hide
          */
@@ -191,10 +197,14 @@
             packageManager: PackageManager,
             watchfacePackageName: String
         ): Boolean {
-            val metaData = packageManager.getServiceInfo(
-                ComponentName(watchfacePackageName, WATCHFACE_CONTROL_SERVICE),
-                PackageManager.GET_META_DATA
-            ).metaData ?: return false
+            val metaData =
+                packageManager
+                    .getServiceInfo(
+                        ComponentName(watchfacePackageName, WATCHFACE_CONTROL_SERVICE),
+                        PackageManager.GET_META_DATA
+                    )
+                    .metaData
+                    ?: return false
             return metaData.getInt(ANDROIDX_WATCHFACE_API_VERSION) >= 4
         }
     }
@@ -214,10 +224,7 @@
             "androidx.wear.watchface.editor.action.WATCH_FACE_EDITOR"
     }
 
-    override fun createIntent(
-        context: Context,
-        input: EditorRequest
-    ): Intent {
+    override fun createIntent(context: Context, input: EditorRequest): Intent {
         return Intent(ACTION_WATCH_FACE_EDITOR).apply {
             setPackage(input.editorPackageName)
             putExtra(COMPONENT_NAME_KEY, input.watchFaceComponentName)
diff --git a/wear/watchface/watchface-guava/api/current.ignore b/wear/watchface/watchface-guava/api/current.ignore
new file mode 100644
index 0000000..f4eee41
--- /dev/null
+++ b/wear/watchface/watchface-guava/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.ListenableGlesRendererKt:
+    Removed class androidx.wear.watchface.ListenableGlesRendererKt
diff --git a/wear/watchface/watchface-guava/api/current.txt b/wear/watchface/watchface-guava/api/current.txt
index 98993bd..dad2406 100644
--- a/wear/watchface/watchface-guava/api/current.txt
+++ b/wear/watchface/watchface-guava/api/current.txt
@@ -43,9 +43,6 @@
     method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
   }
 
-  public final class ListenableGlesRendererKt {
-  }
-
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>);
diff --git a/wear/watchface/watchface-guava/api/public_plus_experimental_current.txt b/wear/watchface/watchface-guava/api/public_plus_experimental_current.txt
index 98993bd..dad2406 100644
--- a/wear/watchface/watchface-guava/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-guava/api/public_plus_experimental_current.txt
@@ -43,9 +43,6 @@
     method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
   }
 
-  public final class ListenableGlesRendererKt {
-  }
-
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>);
diff --git a/wear/watchface/watchface-guava/api/restricted_current.ignore b/wear/watchface/watchface-guava/api/restricted_current.ignore
new file mode 100644
index 0000000..f4eee41
--- /dev/null
+++ b/wear/watchface/watchface-guava/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.ListenableGlesRendererKt:
+    Removed class androidx.wear.watchface.ListenableGlesRendererKt
diff --git a/wear/watchface/watchface-guava/api/restricted_current.txt b/wear/watchface/watchface-guava/api/restricted_current.txt
index 98993bd..dad2406 100644
--- a/wear/watchface/watchface-guava/api/restricted_current.txt
+++ b/wear/watchface/watchface-guava/api/restricted_current.txt
@@ -43,9 +43,6 @@
     method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
   }
 
-  public final class ListenableGlesRendererKt {
-  }
-
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace>);
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
index a7e832d..c831044 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRenderer2Test.kt
@@ -30,17 +30,16 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import kotlinx.coroutines.async
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.time.ZoneId
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
 
 public class TestSharedAssets : Renderer.SharedAssets {
-    override fun onDestroy() {
-    }
+    override fun onDestroy() {}
 }
 
 internal class TestAsyncCanvasRenderWithSharedAssetsTestWatchFaceService(
@@ -69,107 +68,106 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        object : ListenableCanvasRenderer2<TestSharedAssets>(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun initFuture(): ListenableFuture<Unit> {
-                initFutureLatch.countDown()
-                return initFuture
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            object :
+                ListenableCanvasRenderer2<TestSharedAssets>(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun initFuture(): ListenableFuture<Unit> {
+                    initFutureLatch.countDown()
+                    return initFuture
+                }
 
-            override fun createSharedAssetsFuture(): ListenableFuture<TestSharedAssets> {
-                sharedAssetsFutureLatch.countDown()
-                return sharedAssetsFuture
-            }
+                override fun createSharedAssetsFuture(): ListenableFuture<TestSharedAssets> {
+                    sharedAssetsFutureLatch.countDown()
+                    return sharedAssetsFuture
+                }
 
-            override fun render(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime,
-                sharedAssets: TestSharedAssets
-            ) {
-                // Actually rendering something isn't required.
-                synchronized(lock) {
-                    hasRendered = true
-                    sharedAssetsPassedToRenderer = sharedAssets
+                override fun render(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime,
+                    sharedAssets: TestSharedAssets
+                ) {
+                    // Actually rendering something isn't required.
+                    synchronized(lock) {
+                        hasRendered = true
+                        sharedAssetsPassedToRenderer = sharedAssets
+                    }
+                }
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime,
+                    sharedAssets: TestSharedAssets
+                ) {
+                    // NOP
                 }
             }
+        )
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime,
-                sharedAssets: TestSharedAssets
-            ) {
-                // NOP
-            }
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = 123456789L
+
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
         }
-    )
-
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = 123456789L
-
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
 }
 
 @MediumTest
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 @RunWith(AndroidJUnit4::class)
-public class AsyncListenableCanvasRenderer2Test :
-    WatchFaceControlClientServiceTest() {
+public class AsyncListenableCanvasRenderer2Test : WatchFaceControlClientServiceTest() {
     @Test
     public fun asyncTest() {
         val testSharedAssets = TestSharedAssets()
         val initFuture = SettableFuture.create<Unit>()
         val sharedAssetsFuture = SettableFuture.create<TestSharedAssets>()
-        val watchFaceService = TestAsyncCanvasRenderWithSharedAssetsTestWatchFaceService(
-            context,
-            surfaceHolder,
-            initFuture,
-            sharedAssetsFuture
-        )
-
-        val deferredClient = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                null,
-                emptyMap()
+        val watchFaceService =
+            TestAsyncCanvasRenderWithSharedAssetsTestWatchFaceService(
+                context,
+                surfaceHolder,
+                initFuture,
+                sharedAssetsFuture
             )
-        }
 
-        handler.post {
-            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        }
+        val deferredClient =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    null,
+                    emptyMap()
+                )
+            }
+
+        handler.post { watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper }
 
         val client = awaitWithTimeout(deferredClient)
 
         try {
             assertThat(
-                watchFaceService.sharedAssetsFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.sharedAssetsFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             sharedAssetsFuture.set(testSharedAssets)
 
             assertThat(
-                watchFaceService.initFutureLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
-            ).isTrue()
+                    watchFaceService.initFutureLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                )
+                .isTrue()
 
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
index 1f371f0..66ce0b7 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableCanvasRendererTest.kt
@@ -30,13 +30,13 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import kotlinx.coroutines.async
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.time.ZoneId
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
 
 internal class TestAsyncCanvasRenderInitWatchFaceService(
     testContext: Context,
@@ -59,43 +59,44 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("Deprecation")
-        object : ListenableCanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun initFuture(): ListenableFuture<Unit> {
-                initFutureLatch.countDown()
-                return initFuture
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("Deprecation")
+            object :
+                ListenableCanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun initFuture(): ListenableFuture<Unit> {
+                    initFutureLatch.countDown()
+                    return initFuture
+                }
 
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                // Actually rendering something isn't required.
-                synchronized(lock) {
-                    hasRendered = true
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    // Actually rendering something isn't required.
+                    synchronized(lock) { hasRendered = true }
+                }
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    // NOP
                 }
             }
+        )
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                // NOP
-            }
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = 123456789L
+
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
         }
-    )
-
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = 123456789L
-
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
 }
 
 @MediumTest
@@ -109,32 +110,27 @@
         val watchFaceService =
             TestAsyncCanvasRenderInitWatchFaceService(context, surfaceHolder, initFuture)
 
-        val deferredClient = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                null,
-                emptyMap()
-            )
-        }
+        val deferredClient =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    null,
+                    emptyMap()
+                )
+            }
 
-        handler.post {
-            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        }
+        handler.post { watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper }
 
         val client = awaitWithTimeout(deferredClient)
 
         try {
             assertThat(
-                watchFaceService.initFutureLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
-            ).isTrue()
+                    watchFaceService.initFutureLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                )
+                .isTrue()
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
             }
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
index 68b7879..b7edca4 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRenderer2Test.kt
@@ -28,12 +28,12 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import kotlinx.coroutines.async
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
 
 internal class TestAsyncGlesRenderWithSharedAssetsTestWatchFaceService(
     testContext: Context,
@@ -61,49 +61,51 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        object : ListenableGlesRenderer2<TestSharedAssets>(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            16
-        ) {
-            override fun onUiThreadGlSurfaceCreatedFuture(
-                width: Int,
-                height: Int
-            ): ListenableFuture<Unit> {
-                onUiThreadGlSurfaceCreatedFutureLatch.countDown()
-                return onUiThreadGlSurfaceCreatedFuture
-            }
-
-            override fun createSharedAssetsFuture(): ListenableFuture<TestSharedAssets> {
-                sharedAssetsFutureLatch.countDown()
-                return sharedAssetsFuture
-            }
-
-            override fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
-                onBackgroundThreadGlContextFutureLatch.countDown()
-                return onBackgroundThreadGlContextFuture
-            }
-
-            override fun render(zonedDateTime: ZonedDateTime, sharedAssets: TestSharedAssets) {
-                // GLES rendering is complicated and not strictly necessary for our test.
-                synchronized(lock) {
-                    hasRendered = true
-                    sharedAssetsPassedToRenderer = sharedAssets
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            object :
+                ListenableGlesRenderer2<TestSharedAssets>(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    16
+                ) {
+                override fun onUiThreadGlSurfaceCreatedFuture(
+                    width: Int,
+                    height: Int
+                ): ListenableFuture<Unit> {
+                    onUiThreadGlSurfaceCreatedFutureLatch.countDown()
+                    return onUiThreadGlSurfaceCreatedFuture
                 }
-                renderLatch.countDown()
-            }
 
-            override fun renderHighlightLayer(
-                zonedDateTime: ZonedDateTime,
-                sharedAssets: TestSharedAssets
-            ) {
-                // NOP
+                override fun createSharedAssetsFuture(): ListenableFuture<TestSharedAssets> {
+                    sharedAssetsFutureLatch.countDown()
+                    return sharedAssetsFuture
+                }
+
+                override fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
+                    onBackgroundThreadGlContextFutureLatch.countDown()
+                    return onBackgroundThreadGlContextFuture
+                }
+
+                override fun render(zonedDateTime: ZonedDateTime, sharedAssets: TestSharedAssets) {
+                    // GLES rendering is complicated and not strictly necessary for our test.
+                    synchronized(lock) {
+                        hasRendered = true
+                        sharedAssetsPassedToRenderer = sharedAssets
+                    }
+                    renderLatch.countDown()
+                }
+
+                override fun renderHighlightLayer(
+                    zonedDateTime: ZonedDateTime,
+                    sharedAssets: TestSharedAssets
+                ) {
+                    // NOP
+                }
             }
-        }
-    )
+        )
 }
 
 @MediumTest
@@ -117,72 +119,66 @@
         val onUiThreadGlSurfaceCreatedFuture = SettableFuture.create<Unit>()
         val onBackgroundThreadGlContextFuture = SettableFuture.create<Unit>()
         val sharedAssetsFuture = SettableFuture.create<TestSharedAssets>()
-        val watchFaceService = TestAsyncGlesRenderWithSharedAssetsTestWatchFaceService(
-            context,
-            glSurfaceHolder,
-            onUiThreadGlSurfaceCreatedFuture,
-            onBackgroundThreadGlContextFuture,
-            sharedAssetsFuture
-        )
-
-        val deferredClient = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                null,
-                emptyMap()
+        val watchFaceService =
+            TestAsyncGlesRenderWithSharedAssetsTestWatchFaceService(
+                context,
+                glSurfaceHolder,
+                onUiThreadGlSurfaceCreatedFuture,
+                onBackgroundThreadGlContextFuture,
+                sharedAssetsFuture
             )
-        }
 
-        handler.post {
-            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        }
+        val deferredClient =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    null,
+                    emptyMap()
+                )
+            }
+
+        handler.post { watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper }
 
         val client = awaitWithTimeout(deferredClient)
         try {
             assertThat(
-                watchFaceService.sharedAssetsFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.sharedAssetsFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             sharedAssetsFuture.set(testSharedAssets)
 
             assertThat(
-                watchFaceService.onBackgroundThreadGlContextFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.onBackgroundThreadGlContextFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
             }
             onBackgroundThreadGlContextFuture.set(Unit)
 
             assertThat(
-                watchFaceService.onUiThreadGlSurfaceCreatedFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.onUiThreadGlSurfaceCreatedFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
             }
             onUiThreadGlSurfaceCreatedFuture.set(Unit)
 
-            assertThat(
-                watchFaceService.renderLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
-                )
-            ).isTrue()
+            assertThat(watchFaceService.renderLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS))
+                .isTrue()
 
             assertThat(watchFaceService.sharedAssetsPassedToRenderer).isEqualTo(testSharedAssets)
         } finally {
@@ -194,4 +190,4 @@
             client.close()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
index 429b07c..21de436 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableGlesRendererTest.kt
@@ -28,12 +28,12 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import kotlinx.coroutines.async
-import org.junit.Test
-import org.junit.runner.RunWith
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
 
 internal class TestAsyncGlesRenderInitWatchFaceService(
     testContext: Context,
@@ -58,41 +58,36 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("Deprecation")
-        object : ListenableGlesRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            16
-        ) {
-            override fun onUiThreadGlSurfaceCreatedFuture(
-                width: Int,
-                height: Int
-            ): ListenableFuture<Unit> {
-                onUiThreadGlSurfaceCreatedFutureLatch.countDown()
-                return onUiThreadGlSurfaceCreatedFuture
-            }
-
-            override fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
-                onBackgroundThreadGlContextFutureLatch.countDown()
-                return onBackgroundThreadGlContextFuture
-            }
-
-            override fun render(zonedDateTime: ZonedDateTime) {
-                // GLES rendering is complicated and not strictly necessary for our test.
-                synchronized(lock) {
-                    hasRendered = true
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("Deprecation")
+            object :
+                ListenableGlesRenderer(surfaceHolder, currentUserStyleRepository, watchState, 16) {
+                override fun onUiThreadGlSurfaceCreatedFuture(
+                    width: Int,
+                    height: Int
+                ): ListenableFuture<Unit> {
+                    onUiThreadGlSurfaceCreatedFutureLatch.countDown()
+                    return onUiThreadGlSurfaceCreatedFuture
                 }
-                renderLatch.countDown()
-            }
 
-            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
-                // NOP
+                override fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
+                    onBackgroundThreadGlContextFutureLatch.countDown()
+                    return onBackgroundThreadGlContextFuture
+                }
+
+                override fun render(zonedDateTime: ZonedDateTime) {
+                    // GLES rendering is complicated and not strictly necessary for our test.
+                    synchronized(lock) { hasRendered = true }
+                    renderLatch.countDown()
+                }
+
+                override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
+                    // NOP
+                }
             }
-        }
-    )
+        )
 }
 
 @MediumTest
@@ -104,63 +99,56 @@
     public fun asyncTest() {
         val onUiThreadGlSurfaceCreatedFuture = SettableFuture.create<Unit>()
         val onBackgroundThreadGlContextFuture = SettableFuture.create<Unit>()
-        val watchFaceService = TestAsyncGlesRenderInitWatchFaceService(
-            context,
-            glSurfaceHolder,
-            onUiThreadGlSurfaceCreatedFuture,
-            onBackgroundThreadGlContextFuture
-        )
-
-        val deferredClient = handlerCoroutineScope.async {
-            @Suppress("deprecation")
-            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
-                "testId",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                null,
-                emptyMap()
+        val watchFaceService =
+            TestAsyncGlesRenderInitWatchFaceService(
+                context,
+                glSurfaceHolder,
+                onUiThreadGlSurfaceCreatedFuture,
+                onBackgroundThreadGlContextFuture
             )
-        }
 
-        handler.post {
-            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        }
+        val deferredClient =
+            handlerCoroutineScope.async {
+                @Suppress("deprecation")
+                watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                    "testId",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    null,
+                    emptyMap()
+                )
+            }
+
+        handler.post { watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper }
 
         val client = awaitWithTimeout(deferredClient)
         try {
             assertThat(
-                watchFaceService.onBackgroundThreadGlContextFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.onBackgroundThreadGlContextFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
             }
             onBackgroundThreadGlContextFuture.set(Unit)
 
             assertThat(
-                watchFaceService.onUiThreadGlSurfaceCreatedFutureLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
+                    watchFaceService.onUiThreadGlSurfaceCreatedFutureLatch.await(
+                        TIMEOUT_MILLIS,
+                        TimeUnit.MILLISECONDS
+                    )
                 )
-            ).isTrue()
+                .isTrue()
             synchronized(watchFaceService.lock) {
                 assertThat(watchFaceService.hasRendered).isFalse()
             }
             onUiThreadGlSurfaceCreatedFuture.set(Unit)
 
-            assertThat(
-                watchFaceService.renderLatch.await(
-                    TIMEOUT_MILLIS,
-                    TimeUnit.MILLISECONDS
-                )
-            ).isTrue()
+            assertThat(watchFaceService.renderLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS))
+                .isTrue()
         } finally {
             // Make sure we don't deadlock in case of a timeout which aborts the test mid way
             // leaving these futures incomplete.
@@ -169,4 +157,4 @@
             client.close()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableWatchFaceServiceTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableWatchFaceServiceTest.kt
index 56c39d2..c4a385b 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableWatchFaceServiceTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableWatchFaceServiceTest.kt
@@ -26,14 +26,14 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito
 import java.time.Instant
 import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito
 
 private val REFERENCE_PREVIEW_TIME = Instant.ofEpochMilli(123456L)
 
@@ -42,20 +42,20 @@
     surfaceHolder: SurfaceHolder,
     watchState: WatchState,
     currentUserStyleRepository: CurrentUserStyleRepository
-) : Renderer.CanvasRenderer(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    CanvasType.SOFTWARE,
-    16
-) {
+) :
+    Renderer.CanvasRenderer(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        CanvasType.SOFTWARE,
+        16
+    ) {
     override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
     override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 }
 
-private class TestAsyncListenableWatchFaceService :
-    ListenableWatchFaceService() {
+private class TestAsyncListenableWatchFaceService : ListenableWatchFaceService() {
     override fun createWatchFaceFuture(
         surfaceHolder: SurfaceHolder,
         watchState: WatchState,
@@ -67,9 +67,10 @@
         getUiThreadHandler().post {
             future.set(
                 WatchFace(
-                    WatchFaceType.DIGITAL,
-                    FakeRenderer(surfaceHolder, watchState, currentUserStyleRepository)
-                ).apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
+                        WatchFaceType.DIGITAL,
+                        FakeRenderer(surfaceHolder, watchState, currentUserStyleRepository)
+                    )
+                    .apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
             )
         }
         return future
@@ -80,12 +81,13 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = createWatchFaceFuture(
-        surfaceHolder,
-        watchState,
-        complicationSlotsManager,
-        currentUserStyleRepository
-    )
+    ) =
+        createWatchFaceFuture(
+            surfaceHolder,
+            watchState,
+            complicationSlotsManager,
+            currentUserStyleRepository
+        )
 }
 
 /**
@@ -102,32 +104,25 @@
         val mockSurfaceHolder = Mockito.mock(SurfaceHolder::class.java)
         Mockito.`when`(mockSurfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 100, 100))
 
-        val currentUserStyleRepository =
-            CurrentUserStyleRepository(UserStyleSchema(emptyList()))
+        val currentUserStyleRepository = CurrentUserStyleRepository(UserStyleSchema(emptyList()))
         val complicationSlotsManager =
             ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
-        val future = service.createWatchFaceFutureForTest(
-            mockSurfaceHolder,
-            MutableWatchState().asWatchState(),
-            complicationSlotsManager,
-            currentUserStyleRepository
-        )
+        val future =
+            service.createWatchFaceFutureForTest(
+                mockSurfaceHolder,
+                MutableWatchState().asWatchState(),
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
 
         val latch = CountDownLatch(1)
-        future.addListener(
-            {
-                latch.countDown()
-            },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ latch.countDown() }, { runnable -> runnable.run() })
 
         Assert.assertTrue(latch.await(TIME_OUT_MILLIS, TimeUnit.MILLISECONDS))
 
         val watchFace = future.get()
 
         // Simple check that [watchFace] looks sensible.
-        assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(
-            REFERENCE_PREVIEW_TIME
-        )
+        assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(REFERENCE_PREVIEW_TIME)
     }
 }
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableXmlWatchfaceServiceTest.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableXmlWatchfaceServiceTest.kt
index ee97782..6ed9fff 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableXmlWatchfaceServiceTest.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/AsyncListenableXmlWatchfaceServiceTest.kt
@@ -29,20 +29,19 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
+import java.time.Instant
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
 import org.junit.Assert.assertTrue
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito
-import java.time.Instant
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
 
 val TIME_OUT_MILLIS = 500L
 private val REFERENCE_PREVIEW_TIME = Instant.ofEpochMilli(123456L)
 
-private class TestAsyncXmlListenableWatchFaceService(
-    testContext: Context
-) : ListenableWatchFaceService() {
+private class TestAsyncXmlListenableWatchFaceService(testContext: Context) :
+    ListenableWatchFaceService() {
 
     init {
         attachBaseContext(testContext)
@@ -52,16 +51,16 @@
 
     override fun getComplicationSlotInflationFactory(
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = object : ComplicationSlotInflationFactory() {
-            override fun getCanvasComplicationFactory(
-                slotId: Int
-            ) = CanvasComplicationFactory { watchState, invalidateCallback ->
-                CanvasComplicationDrawable(
-                    ComplicationDrawable(),
-                    watchState,
-                    invalidateCallback
-                )
-            }
+    ) =
+        object : ComplicationSlotInflationFactory() {
+            override fun getCanvasComplicationFactory(slotId: Int) =
+                CanvasComplicationFactory { watchState, invalidateCallback ->
+                    CanvasComplicationDrawable(
+                        ComplicationDrawable(),
+                        watchState,
+                        invalidateCallback
+                    )
+                }
         }
 
     fun createUserStyleSchemaForTest() = createUserStyleSchema()
@@ -75,12 +74,13 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = createWatchFaceFuture(
-        surfaceHolder,
-        watchState,
-        complicationSlotsManager,
-        currentUserStyleRepository
-    )
+    ) =
+        createWatchFaceFuture(
+            surfaceHolder,
+            watchState,
+            complicationSlotsManager,
+            currentUserStyleRepository
+        )
 
     override fun createWatchFaceFuture(
         surfaceHolder: SurfaceHolder,
@@ -93,9 +93,10 @@
         getUiThreadHandler().post {
             future.set(
                 WatchFace(
-                    WatchFaceType.DIGITAL,
-                    FakeRenderer(surfaceHolder, watchState, currentUserStyleRepository)
-                ).apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
+                        WatchFaceType.DIGITAL,
+                        FakeRenderer(surfaceHolder, watchState, currentUserStyleRepository)
+                    )
+                    .apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
             )
         }
         return future
@@ -108,9 +109,10 @@
 
     @Test
     public fun asyncTest() {
-        val service = TestAsyncXmlListenableWatchFaceService(
-            ApplicationProvider.getApplicationContext<Context>()
-        )
+        val service =
+            TestAsyncXmlListenableWatchFaceService(
+                ApplicationProvider.getApplicationContext<Context>()
+            )
         val mockSurfaceHolder = Mockito.mock(SurfaceHolder::class.java)
         Mockito.`when`(mockSurfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 100, 100))
 
@@ -120,32 +122,26 @@
         val complicationSlotsManager =
             service.createComplicationSlotsManagerForTest(currentUserStyleRepository)
 
-        val future = service.createWatchFaceFutureForTest(
-            mockSurfaceHolder,
-            MutableWatchState().asWatchState(),
-            complicationSlotsManager,
-            currentUserStyleRepository
-        )
+        val future =
+            service.createWatchFaceFutureForTest(
+                mockSurfaceHolder,
+                MutableWatchState().asWatchState(),
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
 
         val latch = CountDownLatch(1)
-        future.addListener(
-            {
-                latch.countDown()
-            },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ latch.countDown() }, { runnable -> runnable.run() })
 
         assertTrue(latch.await(TIME_OUT_MILLIS, TimeUnit.MILLISECONDS))
 
         val watchFace = future.get()
 
         // Simple check that [watchFace] looks sensible.
-        assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(
-            REFERENCE_PREVIEW_TIME)
+        assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(REFERENCE_PREVIEW_TIME)
 
-        assertThat(currentUserStyleRepository.schema.toString()).isEqualTo(
-            "[{TimeStyle : minimal, seconds}]"
-        )
+        assertThat(currentUserStyleRepository.schema.toString())
+            .isEqualTo("[{TimeStyle : minimal, seconds}]")
 
         assertThat(complicationSlotsManager.complicationSlots.size).isEqualTo(2)
     }
diff --git a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/WatchFaceControlTestService.kt b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/WatchFaceControlTestService.kt
index 7c0031a..9ebc13c 100644
--- a/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/WatchFaceControlTestService.kt
+++ b/wear/watchface/watchface-guava/src/androidTest/java/androidx/wear/watchface/WatchFaceControlTestService.kt
@@ -33,17 +33,17 @@
 import androidx.wear.watchface.client.WatchFaceControlClient
 import androidx.wear.watchface.control.IWatchFaceInstanceServiceStub
 import androidx.wear.watchface.control.WatchFaceControlService
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.junit.Before
 import org.mockito.Mockito
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.TimeoutException
-import kotlinx.coroutines.MainScope
 
 internal const val TIMEOUT_MILLIS = 1000L
 
@@ -63,10 +63,8 @@
     private val realService =
         object : WatchFaceControlService() {
             override fun createServiceStub(): IWatchFaceInstanceServiceStub =
-                object : IWatchFaceInstanceServiceStub(
-                    this@WatchFaceControlTestService,
-                    MainScope()
-                ) {
+                object :
+                    IWatchFaceInstanceServiceStub(this@WatchFaceControlTestService, MainScope()) {
                     override fun getApiVersion(): Int = apiVersionOverride ?: super.getApiVersion()
                 }
 
@@ -111,20 +109,14 @@
         val canvas = Canvas(bitmap)
         Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
 
-        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then {
-            renderLatch.countDown()
-        }
+        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then { renderLatch.countDown() }
 
         surfaceTexture.setDefaultBufferSize(10, 10)
         Mockito.`when`(glSurfaceHolder.surface).thenReturn(glSurface)
-        Mockito.`when`(glSurfaceHolder.surfaceFrame)
-            .thenReturn(Rect(0, 0, 10, 10))
+        Mockito.`when`(glSurfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 10, 10))
     }
 
-    fun <X> awaitWithTimeout(
-        thing: Deferred<X>,
-        timeoutMillis: Long = TIMEOUT_MILLIS
-    ): X {
+    fun <X> awaitWithTimeout(thing: Deferred<X>, timeoutMillis: Long = TIMEOUT_MILLIS): X {
         var value: X? = null
         val latch = CountDownLatch(1)
         handlerCoroutineScope.launch {
@@ -136,4 +128,4 @@
         }
         return value!!
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
index 62278bc..dc503c9 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
@@ -24,8 +24,8 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
-import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
+import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
  * [ListenableFuture]-based compatibility wrapper around [Renderer.CanvasRenderer]'s suspending
@@ -33,97 +33,88 @@
  */
 @Deprecated(message = "Use ListenableCanvasRenderer2 instead")
 @Suppress("Deprecation")
-public abstract class ListenableCanvasRenderer @JvmOverloads constructor(
+public abstract class ListenableCanvasRenderer
+@JvmOverloads
+constructor(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
     @CanvasType private val canvasType: Int,
-    @IntRange(from = 0, to = 60000)
-    interactiveDrawModeUpdateDelayMillis: Long,
+    @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
     clearWithBackgroundTintBeforeRenderingHighlightLayer: Boolean = false
-) : Renderer.CanvasRenderer(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    canvasType,
-    interactiveDrawModeUpdateDelayMillis,
-    clearWithBackgroundTintBeforeRenderingHighlightLayer
-) {
+) :
+    Renderer.CanvasRenderer(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        canvasType,
+        interactiveDrawModeUpdateDelayMillis,
+        clearWithBackgroundTintBeforeRenderingHighlightLayer
+    ) {
     /**
-     * Perform UiThread specific initialization.  Will be called once during initialization
-     * before any subsequent calls to [render].  Note cancellation of the returned future is not
-     * supported.
+     * Perform UiThread specific initialization. Will be called once during initialization before
+     * any subsequent calls to [render]. Note cancellation of the returned future is not supported.
      *
      * @return A ListenableFuture<Unit> which is resolved when UiThread has completed. Rendering
-     * will be blocked until this has resolved.
+     *   will be blocked until this has resolved.
      */
     @UiThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
     public open fun initFuture(): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     override suspend fun init(): Unit = suspendCancellableCoroutine {
         val future = initFuture()
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
 }
 
 /**
- * [ListenableFuture]-based compatibility wrapper around
- * [Renderer.CanvasRenderer2]'s suspending methods.
+ * [ListenableFuture]-based compatibility wrapper around [Renderer.CanvasRenderer2]'s suspending
+ * methods.
  */
-public abstract class ListenableCanvasRenderer2<SharedAssetsT> @JvmOverloads constructor(
+public abstract class ListenableCanvasRenderer2<SharedAssetsT>
+@JvmOverloads
+constructor(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
     @CanvasType private val canvasType: Int,
-    @IntRange(from = 0, to = 60000)
-    interactiveDrawModeUpdateDelayMillis: Long,
+    @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
     clearWithBackgroundTintBeforeRenderingHighlightLayer: Boolean = false
-) : Renderer.CanvasRenderer2<SharedAssetsT>(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    canvasType,
-    interactiveDrawModeUpdateDelayMillis,
-    clearWithBackgroundTintBeforeRenderingHighlightLayer
-) where SharedAssetsT : SharedAssets {
+) :
+    Renderer.CanvasRenderer2<SharedAssetsT>(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        canvasType,
+        interactiveDrawModeUpdateDelayMillis,
+        clearWithBackgroundTintBeforeRenderingHighlightLayer
+    ) where SharedAssetsT : SharedAssets {
     /**
-     * Perform UiThread specific initialization.  Will be called once during initialization
-     * before any subsequent calls to [render].  Note cancellation of the returned future is not
-     * supported.
+     * Perform UiThread specific initialization. Will be called once during initialization before
+     * any subsequent calls to [render]. Note cancellation of the returned future is not supported.
      *
      * @return A ListenableFuture<Unit> which is resolved when UiThread has completed. Rendering
-     * will be blocked until this has resolved.
+     *   will be blocked until this has resolved.
      */
     @UiThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
     public open fun initFuture(): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     final override suspend fun init(): Unit = suspendCancellableCoroutine {
         val future = initFuture()
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
 
     /**
-     * Implement to allow your Renderers to share data with SharedAssets.
-     * When editing multiple [WatchFaceService], instances and hence Renderers can exist
-     * concurrently (e.g. a headless instance and an interactive instance). Using
-     * [SharedAssets] allows memory to be saved by sharing immutable data (e.g. Bitmaps,
-     * shaders, etc...) between them.
+     * Implement to allow your Renderers to share data with SharedAssets. When editing multiple
+     * [WatchFaceService], instances and hence Renderers can exist concurrently (e.g. a headless
+     * instance and an interactive instance). Using [SharedAssets] allows memory to be saved by
+     * sharing immutable data (e.g. Bitmaps, shaders, etc...) between them.
      *
      * To take advantage of SharedAssets, override this method. The constructed SharedAssets are
      * passed into the [render] as an argument (NB you'll have to cast this to your type).
@@ -135,7 +126,7 @@
      * used on the main thread and subsequently destroyed there.
      *
      * @return A [ListenableFuture] for the [SharedAssetsT] that will be passed into [render] and
-     * [renderHighlightLayer]
+     *   [renderHighlightLayer]
      */
     @WorkerThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
@@ -143,9 +134,6 @@
 
     final override suspend fun createSharedAssets(): SharedAssetsT = suspendCancellableCoroutine {
         val future = createSharedAssetsFuture()
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
index e080ede..2c28802 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
@@ -26,24 +26,25 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import com.google.common.util.concurrent.ListenableFuture
 import com.google.common.util.concurrent.SettableFuture
+import kotlin.coroutines.resume
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.sync.Mutex
-import kotlin.coroutines.resume
 
-internal val EGL_CONFIG_ATTRIB_LIST = intArrayOf(
-    EGL14.EGL_RENDERABLE_TYPE,
-    EGL14.EGL_OPENGL_ES2_BIT,
-    EGL14.EGL_RED_SIZE,
-    8,
-    EGL14.EGL_GREEN_SIZE,
-    8,
-    EGL14.EGL_BLUE_SIZE,
-    8,
-    EGL14.EGL_ALPHA_SIZE,
-    8,
-    EGL14.EGL_NONE
-)
+internal val EGL_CONFIG_ATTRIB_LIST =
+    intArrayOf(
+        EGL14.EGL_RENDERABLE_TYPE,
+        EGL14.EGL_OPENGL_ES2_BIT,
+        EGL14.EGL_RED_SIZE,
+        8,
+        EGL14.EGL_GREEN_SIZE,
+        8,
+        EGL14.EGL_BLUE_SIZE,
+        8,
+        EGL14.EGL_ALPHA_SIZE,
+        8,
+        EGL14.EGL_NONE
+    )
 
 internal val EGL_SURFACE_ATTRIB_LIST = intArrayOf(EGL14.EGL_NONE)
 
@@ -54,119 +55,105 @@
 @Deprecated(message = "Use ListenableGlesRenderer2 instead")
 @Suppress("Deprecation")
 public abstract class ListenableGlesRenderer
-@Throws(GlesException::class) @JvmOverloads constructor(
+@Throws(GlesException::class)
+@JvmOverloads
+constructor(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
-    @IntRange(from = 0, to = 60000)
-    interactiveDrawModeUpdateDelayMillis: Long,
+    @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
     eglConfigAttribList: IntArray = EGL_CONFIG_ATTRIB_LIST,
     eglSurfaceAttribList: IntArray = EGL_SURFACE_ATTRIB_LIST
-) : Renderer.GlesRenderer(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    interactiveDrawModeUpdateDelayMillis,
-    eglConfigAttribList,
-    eglSurfaceAttribList
-) {
+) :
+    Renderer.GlesRenderer(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        interactiveDrawModeUpdateDelayMillis,
+        eglConfigAttribList,
+        eglSurfaceAttribList
+    ) {
     /**
      * Inside of a [Mutex] this function sets the GL context associated with the
-     * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one,
-     * executes [runnable] and finally unsets the GL context.
+     * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one, executes
+     * [runnable] and finally unsets the GL context.
      *
-     * Access to the GL context this way is necessary because GL contexts are not shared
-     * between renderers and there can be multiple watch face instances existing concurrently
-     * (e.g. headless and interactive, potentially from different watch faces if an APK
-     * contains more than one [WatchFaceService]).
+     * Access to the GL context this way is necessary because GL contexts are not shared between
+     * renderers and there can be multiple watch face instances existing concurrently (e.g. headless
+     * and interactive, potentially from different watch faces if an APK contains more than one
+     * [WatchFaceService]).
      *
-     * NB this function is called by the library before running
-     * [runBackgroundThreadGlCommands] so there's no need to use this directly in client
-     * code unless you need to make GL calls outside of those methods.
+     * NB this function is called by the library before running [runBackgroundThreadGlCommands] so
+     * there's no need to use this directly in client code unless you need to make GL calls outside
+     * of those methods.
      *
      * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
      */
     @WorkerThread
     public fun runBackgroundThreadGlCommands(runnable: Runnable) {
-        runBlocking {
-            runBackgroundThreadGlCommands {
-                runnable.run()
-            }
-        }
+        runBlocking { runBackgroundThreadGlCommands { runnable.run() } }
     }
 
     /**
-     * Inside of a [Mutex] this function sets the UiThread GL context as the current
-     * one, executes [runnable] and finally unsets the GL context.
+     * Inside of a [Mutex] this function sets the UiThread GL context as the current one, executes
+     * [runnable] and finally unsets the GL context.
      *
-     * Access to the GL context this way is necessary because GL contexts are not shared
-     * between renderers and there can be multiple watch face instances existing concurrently
-     * (e.g. headless and interactive, potentially from different watch faces if an APK
-     * contains more than one [WatchFaceService]).
+     * Access to the GL context this way is necessary because GL contexts are not shared between
+     * renderers and there can be multiple watch face instances existing concurrently (e.g. headless
+     * and interactive, potentially from different watch faces if an APK contains more than one
+     * [WatchFaceService]).
      *
      * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
      */
     @UiThread
     public fun runUiThreadGlCommands(runnable: Runnable) {
-        runBlocking {
-            runUiThreadGlCommands {
-                runnable.run()
-            }
-        }
+        runBlocking { runUiThreadGlCommands { runnable.run() } }
     }
 
     /**
-     * Called once a background thread when a new GL context is created on the background
-     * thread, before any subsequent calls to [render]. Note this function is called inside a
-     * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
-     * GL context. Note cancellation of the returned future is not supported.
+     * Called once a background thread when a new GL context is created on the background thread,
+     * before any subsequent calls to [render]. Note this function is called inside a lambda passed
+     * to [runBackgroundThreadGlCommands] which has synchronized access to the GL context. Note
+     * cancellation of the returned future is not supported.
      *
-     * @return A ListenableFuture<Unit> which is resolved when background thread work has
-     * completed. Rendering will be blocked until this has resolved.
+     * @return A ListenableFuture<Unit> which is resolved when background thread work has completed.
+     *   Rendering will be blocked until this has resolved.
      */
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
     protected open fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     override suspend fun onBackgroundThreadGlContextCreated(): Unit = suspendCancellableCoroutine {
         val future = onBackgroundThreadGlContextCreatedFuture()
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
 
     /**
-     * Called when a new GL surface is created on the UiThread, before any subsequent calls
-     * to [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
-     * is called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which
-     * has synchronized access to the GL context.  Note cancellation of the returned future is not
+     * Called when a new GL surface is created on the UiThread, before any subsequent calls to
+     * [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function is
+     * called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which has
+     * synchronized access to the GL context. Note cancellation of the returned future is not
      * supported.
      *
      * @param width width of surface in pixels
      * @param height height of surface in pixels
      * @return A ListenableFuture<Unit> which is resolved when UI thread work has completed.
-     * Rendering will be blocked until this has resolved.
+     *   Rendering will be blocked until this has resolved.
      */
     @UiThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
-    protected open fun
-        onUiThreadGlSurfaceCreatedFuture(@Px width: Int, @Px height: Int): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+    protected open fun onUiThreadGlSurfaceCreatedFuture(
+        @Px width: Int,
+        @Px height: Int
+    ): ListenableFuture<Unit> {
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     override suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int): Unit =
         suspendCancellableCoroutine {
             val future = onUiThreadGlSurfaceCreatedFuture(width, height)
-            future.addListener(
-                { it.resume(future.get()) },
-                { runnable -> runnable.run() }
-            )
+            future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
         }
 }
 
@@ -175,141 +162,126 @@
  * methods.
  */
 public abstract class ListenableGlesRenderer2<SharedAssetsT>
-@Throws(GlesException::class) @JvmOverloads constructor(
+@Throws(GlesException::class)
+@JvmOverloads
+constructor(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
-    @IntRange(from = 0, to = 60000)
-    interactiveDrawModeUpdateDelayMillis: Long,
+    @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
     eglConfigAttribList: IntArray = EGL_CONFIG_ATTRIB_LIST,
     eglSurfaceAttribList: IntArray = EGL_SURFACE_ATTRIB_LIST
-) : Renderer.GlesRenderer2<SharedAssetsT>(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    interactiveDrawModeUpdateDelayMillis,
-    eglConfigAttribList,
-    eglSurfaceAttribList
-) where SharedAssetsT : SharedAssets {
+) :
+    Renderer.GlesRenderer2<SharedAssetsT>(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        interactiveDrawModeUpdateDelayMillis,
+        eglConfigAttribList,
+        eglSurfaceAttribList
+    ) where SharedAssetsT : SharedAssets {
     /**
      * Inside of a [Mutex] this function sets the GL context associated with the
-     * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one,
-     * executes [runnable] and finally unsets the GL context.
+     * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one, executes
+     * [runnable] and finally unsets the GL context.
      *
-     * Access to the GL context this way is necessary because GL contexts are not shared
-     * between renderers and there can be multiple watch face instances existing concurrently
-     * (e.g. headless and interactive, potentially from different watch faces if an APK
-     * contains more than one [WatchFaceService]).
+     * Access to the GL context this way is necessary because GL contexts are not shared between
+     * renderers and there can be multiple watch face instances existing concurrently (e.g. headless
+     * and interactive, potentially from different watch faces if an APK contains more than one
+     * [WatchFaceService]).
      *
-     * NB this function is called by the library before running
-     * [runBackgroundThreadGlCommands] so there's no need to use this directly in client
-     * code unless you need to make GL calls outside of those methods.
+     * NB this function is called by the library before running [runBackgroundThreadGlCommands] so
+     * there's no need to use this directly in client code unless you need to make GL calls outside
+     * of those methods.
      *
      * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
      */
     @WorkerThread
     public fun runBackgroundThreadGlCommands(runnable: Runnable) {
-        runBlocking {
-            runBackgroundThreadGlCommands {
-                runnable.run()
-            }
-        }
+        runBlocking { runBackgroundThreadGlCommands { runnable.run() } }
     }
 
     /**
-     * Inside of a [Mutex] this function sets the UiThread GL context as the current
-     * one, executes [runnable] and finally unsets the GL context.
+     * Inside of a [Mutex] this function sets the UiThread GL context as the current one, executes
+     * [runnable] and finally unsets the GL context.
      *
-     * Access to the GL context this way is necessary because GL contexts are not shared
-     * between renderers and there can be multiple watch face instances existing concurrently
-     * (e.g. headless and interactive, potentially from different watch faces if an APK
-     * contains more than one [WatchFaceService]).
+     * Access to the GL context this way is necessary because GL contexts are not shared between
+     * renderers and there can be multiple watch face instances existing concurrently (e.g. headless
+     * and interactive, potentially from different watch faces if an APK contains more than one
+     * [WatchFaceService]).
      *
      * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
      */
     @UiThread
     public fun runUiThreadGlCommands(runnable: Runnable) {
-        runBlocking {
-            runUiThreadGlCommands {
-                runnable.run()
-            }
-        }
+        runBlocking { runUiThreadGlCommands { runnable.run() } }
     }
 
     /**
-     * Called once a background thread when a new GL context is created on the background
-     * thread, before any subsequent calls to [render]. Note this function is called inside a
-     * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
-     * GL context. Note cancellation of the returned future is not supported.
+     * Called once a background thread when a new GL context is created on the background thread,
+     * before any subsequent calls to [render]. Note this function is called inside a lambda passed
+     * to [runBackgroundThreadGlCommands] which has synchronized access to the GL context. Note
+     * cancellation of the returned future is not supported.
      *
-     * @return A ListenableFuture<Unit> which is resolved when background thread work has
-     * completed. Rendering will be blocked until this has resolved.
+     * @return A ListenableFuture<Unit> which is resolved when background thread work has completed.
+     *   Rendering will be blocked until this has resolved.
      */
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
     protected open fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     final override suspend fun onBackgroundThreadGlContextCreated(): Unit =
         suspendCancellableCoroutine {
             val future = onBackgroundThreadGlContextCreatedFuture()
-            future.addListener(
-                { it.resume(future.get()) },
-                { runnable -> runnable.run() }
-            )
+            future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
         }
 
     /**
-     * Called when a new GL surface is created on the UiThread, before any subsequent calls
-     * to [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
-     * is called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which
-     * has synchronized access to the GL context.  Note cancellation of the returned future is not
+     * Called when a new GL surface is created on the UiThread, before any subsequent calls to
+     * [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function is
+     * called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which has
+     * synchronized access to the GL context. Note cancellation of the returned future is not
      * supported.
      *
      * @param width width of surface in pixels
      * @param height height of surface in pixels
      * @return A ListenableFuture<Unit> which is resolved when UI thread work has completed.
-     * Rendering will be blocked until this has resolved.
+     *   Rendering will be blocked until this has resolved.
      */
     @UiThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
-    protected open fun
-        onUiThreadGlSurfaceCreatedFuture(@Px width: Int, @Px height: Int): ListenableFuture<Unit> {
-        return SettableFuture.create<Unit>().apply {
-            set(Unit)
-        }
+    protected open fun onUiThreadGlSurfaceCreatedFuture(
+        @Px width: Int,
+        @Px height: Int
+    ): ListenableFuture<Unit> {
+        return SettableFuture.create<Unit>().apply { set(Unit) }
     }
 
     final override suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int): Unit =
         suspendCancellableCoroutine {
             val future = onUiThreadGlSurfaceCreatedFuture(width, height)
-            future.addListener(
-                { it.resume(future.get()) },
-                { runnable -> runnable.run() }
-            )
+            future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
         }
 
     /**
-     * When editing multiple [WatchFaceService] instances and hence Renderers can exist
-     * concurrently (e.g. a headless instance and an interactive instance) and using
-     * [SharedAssets] allows memory to be saved by sharing immutable data (e.g. Bitmaps,
-     * shaders, etc...) between them.
+     * When editing multiple [WatchFaceService] instances and hence Renderers can exist concurrently
+     * (e.g. a headless instance and an interactive instance) and using [SharedAssets] allows memory
+     * to be saved by sharing immutable data (e.g. Bitmaps, shaders, etc...) between them.
      *
      * To take advantage of SharedAssets, override this method. The constructed SharedAssets are
-     * passed into the [render] as an argument (NB you'll have to cast this to your type).
-     * It is safe to make GLES calls within this method.
+     * passed into the [render] as an argument (NB you'll have to cast this to your type). It is
+     * safe to make GLES calls within this method.
      *
      * When all instances using SharedAssets have been closed, [SharedAssets.onDestroy] will be
      * called.
      *
      * Note that while SharedAssets are constructed on a background thread, they'll typically be
-     * used on the main thread and subsequently destroyed there. The watch face library
-     * constructs shared GLES contexts to allow resource sharing between threads.
+     * used on the main thread and subsequently destroyed there. The watch face library constructs
+     * shared GLES contexts to allow resource sharing between threads.
      *
      * @return A [ListenableFuture] for the [SharedAssetsT] that will be passed into [render] and
-     * [renderHighlightLayer]
+     *   [renderHighlightLayer]
      */
     @WorkerThread
     @Suppress("AsyncSuffixFuture") // This is the guava wrapper for a suspend function
@@ -317,9 +289,6 @@
 
     final override suspend fun createSharedAssets(): SharedAssetsT = suspendCancellableCoroutine {
         val future = createSharedAssetsFuture()
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
index 04c6615..a1e25de 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
@@ -21,8 +21,8 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
 import com.google.common.util.concurrent.ListenableFuture
-import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
+import kotlinx.coroutines.suspendCancellableCoroutine
 
 /**
  * [ListenableFuture]-based compatibility wrapper around [WatchFaceService]'s suspending
@@ -44,11 +44,11 @@
      * @param surfaceHolder The [SurfaceHolder] to pass to the [Renderer]'s constructor.
      * @param watchState The [WatchState] for the watch face.
      * @param complicationSlotsManager The [ComplicationSlotsManager] returned by
-     * [createComplicationSlotsManager].
+     *   [createComplicationSlotsManager].
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
-     * [UserStyleSchema] returned by [createUserStyleSchema].
+     *   [UserStyleSchema] returned by [createUserStyleSchema].
      * @return A [ListenableFuture] for a [WatchFace] whose [Renderer] uses the provided
-     * [surfaceHolder].
+     *   [surfaceHolder].
      */
     protected abstract fun createWatchFaceFuture(
         surfaceHolder: SurfaceHolder,
@@ -63,15 +63,13 @@
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace = suspendCancellableCoroutine {
-        val future = createWatchFaceFuture(
-            surfaceHolder,
-            watchState,
-            complicationSlotsManager,
-            currentUserStyleRepository
-        )
-        future.addListener(
-            { it.resume(future.get()) },
-            { runnable -> runnable.run() }
-        )
+        val future =
+            createWatchFaceFuture(
+                surfaceHolder,
+                watchState,
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
+        future.addListener({ it.resume(future.get()) }, { runnable -> runnable.run() })
     }
 }
diff --git a/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/GlesRenderer.java b/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/GlesRenderer.java
index 90a3abc..7f70e72 100644
--- a/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/GlesRenderer.java
+++ b/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/GlesRenderer.java
@@ -33,15 +33,14 @@
             @NotNull SurfaceHolder surfaceHolder,
             @NotNull WatchState watchState,
             @NotNull CurrentUserStyleRepository currentUserStyleRepository,
-            long interactiveTickInterval) throws GlesException {
+            long interactiveTickInterval)
+            throws GlesException {
         super(surfaceHolder, currentUserStyleRepository, watchState, interactiveTickInterval);
     }
 
     @Override
-    public void render(@NonNull ZonedDateTime zonedDateTime) {
-    }
+    public void render(@NonNull ZonedDateTime zonedDateTime) {}
 
     @Override
-    public void renderHighlightLayer(@NonNull ZonedDateTime zonedDateTime) {
-    }
+    public void renderHighlightLayer(@NonNull ZonedDateTime zonedDateTime) {}
 }
diff --git a/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt b/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
index 0bf1242..4d3ac61 100644
--- a/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
+++ b/wear/watchface/watchface-guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
@@ -24,6 +24,8 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.Futures
 import com.google.common.util.concurrent.ListenableFuture
+import java.time.Instant
+import java.time.ZonedDateTime
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -32,8 +34,6 @@
 import org.mockito.Mockito.`when`
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.internal.bytecode.InstrumentationConfiguration
-import java.time.Instant
-import java.time.ZonedDateTime
 
 private val REFERENCE_PREVIEW_TIME = Instant.ofEpochMilli(123456L)
 
@@ -46,28 +46,30 @@
     ): ListenableFuture<WatchFace> {
         return Futures.immediateFuture(
             WatchFace(
-                WatchFaceType.DIGITAL,
-                @Suppress("deprecation")
-                object : Renderer.CanvasRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.SOFTWARE,
-                    16
-                ) {
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {}
+                    WatchFaceType.DIGITAL,
+                    @Suppress("deprecation")
+                    object :
+                        Renderer.CanvasRenderer(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            CanvasType.SOFTWARE,
+                            16
+                        ) {
+                        override fun render(
+                            canvas: Canvas,
+                            bounds: Rect,
+                            zonedDateTime: ZonedDateTime
+                        ) {}
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {}
-                }
-            ).apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
+                        override fun renderHighlightLayer(
+                            canvas: Canvas,
+                            bounds: Rect,
+                            zonedDateTime: ZonedDateTime
+                        ) {}
+                    }
+                )
+                .apply { setOverridePreviewReferenceInstant(REFERENCE_PREVIEW_TIME) }
         )
     }
 
@@ -76,12 +78,13 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ): WatchFace = createWatchFace(
-        surfaceHolder,
-        watchState,
-        complicationSlotsManager,
-        currentUserStyleRepository
-    )
+    ): WatchFace =
+        createWatchFace(
+            surfaceHolder,
+            watchState,
+            complicationSlotsManager,
+            currentUserStyleRepository
+        )
 }
 
 @RunWith(ListenableWatchFaceServiceTestRunner::class)
@@ -98,30 +101,26 @@
                 ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
 
             // Make sure the ListenableFuture<> to kotlin coroutine bridge works.
-            val watchFace = service.createWatchFaceForTest(
-                mockSurfaceHolder,
-                MutableWatchState().asWatchState(),
-                complicationsSlotManager,
-                currentUserStyleRepository
-            )
+            val watchFace =
+                service.createWatchFaceForTest(
+                    mockSurfaceHolder,
+                    MutableWatchState().asWatchState(),
+                    complicationsSlotManager,
+                    currentUserStyleRepository
+                )
 
             // Simple check that [watchFace] looks sensible.
-            assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(
-                REFERENCE_PREVIEW_TIME
-            )
+            assertThat(watchFace.overridePreviewReferenceInstant).isEqualTo(REFERENCE_PREVIEW_TIME)
         }
     }
 }
 
 // Without this we get test failures with an error:
 // "failed to access class kotlin.jvm.internal.DefaultConstructorMarker".
-public class ListenableWatchFaceServiceTestRunner(
-    testClass: Class<*>
-) : RobolectricTestRunner(testClass) {
+public class ListenableWatchFaceServiceTestRunner(testClass: Class<*>) :
+    RobolectricTestRunner(testClass) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration =
-        InstrumentationConfiguration.Builder(
-            super.createClassLoaderConfig(method)
-        )
+        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
             .doNotInstrumentPackage("androidx.wear.watchface")
             .build()
 }
diff --git a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
index f46584f..18132ad 100644
--- a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
+++ b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
@@ -45,8 +45,7 @@
     private ImageView mComplicationPreview;
     private ComplicationDrawable mComplicationPreviewDrawable;
 
-    @Nullable
-    private ListenableEditorSession mEditorSession;
+    @Nullable private ListenableEditorSession mEditorSession;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -75,61 +74,62 @@
     private void listenForEditorSession() {
         ListenableFuture<ListenableEditorSession> editorSessionFuture =
                 ListenableEditorSession.listenableCreateOnWatchEditorSession(this);
-        editorSessionFuture.addListener(() -> {
-            ListenableEditorSession editorSession;
-            try {
-                editorSession = editorSessionFuture.get();
-            } catch (ExecutionException | InterruptedException e) {
-                e.printStackTrace();
-                return;
-            }
-            if (editorSession == null) {
-                return;
-            }
-            mEditorSession = editorSession;
-            observeComplications();
-        }, ContextCompat.getMainExecutor(this));
+        editorSessionFuture.addListener(
+                () -> {
+                    ListenableEditorSession editorSession;
+                    try {
+                        editorSession = editorSessionFuture.get();
+                    } catch (ExecutionException | InterruptedException e) {
+                        e.printStackTrace();
+                        return;
+                    }
+                    if (editorSession == null) {
+                        return;
+                    }
+                    mEditorSession = editorSession;
+                    observeComplications();
+                },
+                ContextCompat.getMainExecutor(this));
     }
 
     private void observeComplications() {
-        FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsDataSourceInfo()).observe(
-                this,
-                complicationDataSourceInfoMap -> {
-                    if (!complicationDataSourceInfoMap.isEmpty()) {
-                        ComplicationDataSourceInfo info =
-                                complicationDataSourceInfoMap.get(
-                                        WatchFaceService.getComplicationId(getResources())
-                                );
-                        if (info == null) {
-                            mComplicationProviderName.setText(
-                                    getString(R.string.complication_none));
-                        } else {
-                            mComplicationProviderName.setText(info.getName());
-                        }
-                    }
-                }
-        );
+        FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsDataSourceInfo())
+                .observe(
+                        this,
+                        complicationDataSourceInfoMap -> {
+                            if (!complicationDataSourceInfoMap.isEmpty()) {
+                                ComplicationDataSourceInfo info =
+                                        complicationDataSourceInfoMap.get(
+                                                WatchFaceService.getComplicationId(getResources()));
+                                if (info == null) {
+                                    mComplicationProviderName.setText(
+                                            getString(R.string.complication_none));
+                                } else {
+                                    mComplicationProviderName.setText(info.getName());
+                                }
+                            }
+                        });
 
-        FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsPreviewData()).observe(
-                this,
-                complicationsPreviewData -> {
-                    if (complicationsPreviewData.isEmpty()) {
-                        mComplicationPreview.setImageResource(R.drawable.preview_loading);
-                    } else {
-                        ComplicationData preview =
-                                complicationsPreviewData.get(
-                                        WatchFaceService.getComplicationId(getResources())
-                                );
-                        if (preview != null) {
-                            mComplicationPreview.setImageDrawable(mComplicationPreviewDrawable);
-                            mComplicationPreviewDrawable.setComplicationData(preview, true);
-                        } else {
-                            mComplicationPreview.setImageResource(R.drawable.preview_unavailable);
-                        }
-                    }
-                }
-
-        );
+        FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsPreviewData())
+                .observe(
+                        this,
+                        complicationsPreviewData -> {
+                            if (complicationsPreviewData.isEmpty()) {
+                                mComplicationPreview.setImageResource(R.drawable.preview_loading);
+                            } else {
+                                ComplicationData preview =
+                                        complicationsPreviewData.get(
+                                                WatchFaceService.getComplicationId(getResources()));
+                                if (preview != null) {
+                                    mComplicationPreview.setImageDrawable(
+                                            mComplicationPreviewDrawable);
+                                    mComplicationPreviewDrawable.setComplicationData(preview, true);
+                                } else {
+                                    mComplicationPreview.setImageResource(
+                                            R.drawable.preview_unavailable);
+                                }
+                            }
+                        });
     }
 
     private void changeComplication() {
@@ -139,8 +139,11 @@
         }
         mEditorSession
                 .listenableOpenComplicationDataSourceChooser(
-                        WatchFaceService.getComplicationId(getResources())
-                ).addListener(() -> { /* Empty on purpose. */ },
+                        WatchFaceService.getComplicationId(getResources()))
+                .addListener(
+                        () -> {
+                            /* Empty on purpose. */
+                        },
                         ContextCompat.getMainExecutor(this));
     }
 }
diff --git a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceRenderer.java b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceRenderer.java
index b0a2ccf..68c796c 100644
--- a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceRenderer.java
+++ b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceRenderer.java
@@ -58,8 +58,7 @@
     private final Paint mPaint;
     private final Paint mHighlightPaint;
     private final Paint mHighlightFocusPaint;
-    @Px
-    private final float mHighlightExtraRadius;
+    @Px private final float mHighlightExtraRadius;
     private final char[] mTime = new char[5];
     private Bitmap mHighlightBitmap;
 
@@ -69,7 +68,8 @@
             @NonNull CurrentUserStyleRepository userStyleRepository,
             @NonNull WatchState watchState,
             @NonNull ComplicationSlotsManager complicationSlotsManager) {
-        super(surfaceHolder,
+        super(
+                surfaceHolder,
                 userStyleRepository,
                 watchState,
                 CanvasType.HARDWARE,
@@ -89,8 +89,8 @@
     }
 
     @Override
-    public void render(@NonNull Canvas canvas, @NonNull Rect rect,
-            @NonNull ZonedDateTime zonedDateTime) {
+    public void render(
+            @NonNull Canvas canvas, @NonNull Rect rect, @NonNull ZonedDateTime zonedDateTime) {
         mPaint.setColor(Color.BLACK);
         canvas.drawRect(rect, mPaint);
 
@@ -134,8 +134,8 @@
     @Override
     public void renderHighlightLayer(
             @NonNull Canvas canvas, @NonNull Rect rect, @NonNull ZonedDateTime zonedDateTime) {
-        renderHighlightLayer(canvas, rect, zonedDateTime,
-                getRenderParameters().getHighlightLayer());
+        renderHighlightLayer(
+                canvas, rect, zonedDateTime, getRenderParameters().getHighlightLayer());
     }
 
     private void renderHighlightLayer(
diff --git a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
index 11a71fe..091a976 100644
--- a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
+++ b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
@@ -46,9 +46,7 @@
 public class WatchFaceService extends ListenableWatchFaceService {
     public static final RectF COMPLICATION_BOUNDS = new RectF(.3f, 0.7f, .7f, .9f);
 
-    /**
-     * Returns complication id that was specified in XML.
-     */
+    /** Returns complication id that was specified in XML. */
     public static int getComplicationId(@NonNull Resources resources) {
         return resources.getInteger(R.integer.complication_slot_id);
     }
@@ -72,8 +70,7 @@
                         .setComplicationDeniedDialogIntent(
                                 new Intent(this, ComplicationDeniedActivity.class))
                         .setComplicationRationaleDialogIntent(
-                                new Intent(this, ComplicationRationalActivity.class))
-        );
+                                new Intent(this, ComplicationRationalActivity.class)));
     }
 
     @NotNull
@@ -87,9 +84,7 @@
             public CanvasComplicationFactory getCanvasComplicationFactory(int slotId) {
                 return (watchState, invalidateCallback) ->
                         new CanvasComplicationDrawable(
-                                new ComplicationDrawable(context),
-                                watchState,
-                                invalidateCallback);
+                                new ComplicationDrawable(context), watchState, invalidateCallback);
             }
         };
     }
diff --git a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/ConfigActivity.java b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/ConfigActivity.java
index fc4c23a..5c017bd 100644
--- a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/ConfigActivity.java
+++ b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/ConfigActivity.java
@@ -20,8 +20,6 @@
 import static androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption;
 
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
 import android.util.Log;
 import android.widget.TextView;
 
@@ -37,7 +35,6 @@
 
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
 
 /** Configuration activity for the watch face. */
 public class ConfigActivity extends ComponentActivity {
@@ -48,8 +45,7 @@
     private TextView mStyleValue;
     private final UserStyleSetting.Id mTimeStyleId = new UserStyleSetting.Id("TimeStyle");
 
-    @Nullable
-    private ListenableEditorSession mEditorSession;
+    @Nullable private ListenableEditorSession mEditorSession;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -78,21 +74,23 @@
     private void listenForEditorSession() {
         ListenableFuture<ListenableEditorSession> editorSessionFuture =
                 ListenableEditorSession.listenableCreateOnWatchEditorSession(this);
-        editorSessionFuture.addListener(() -> {
-            ListenableEditorSession editorSession;
-            try {
-                editorSession = editorSessionFuture.get();
-            } catch (ExecutionException | InterruptedException e) {
-                e.printStackTrace();
-                return;
-            }
-            if (editorSession == null) {
-                return;
-            }
-            mEditorSession = editorSession;
-            updateInstanceId();
-            updateStyleValue();
-        }, ContextCompat.getMainExecutor(this));
+        editorSessionFuture.addListener(
+                () -> {
+                    ListenableEditorSession editorSession;
+                    try {
+                        editorSession = editorSessionFuture.get();
+                    } catch (ExecutionException | InterruptedException e) {
+                        e.printStackTrace();
+                        return;
+                    }
+                    if (editorSession == null) {
+                        return;
+                    }
+                    mEditorSession = editorSession;
+                    updateInstanceId();
+                    updateStyleValue();
+                },
+                ContextCompat.getMainExecutor(this));
     }
 
     private void changeStyle() {
@@ -104,9 +102,8 @@
         MutableUserStyle userStyle = mEditorSession.getUserStyle().getValue().toMutableUserStyle();
         ListOption currentOption = (ListOption) userStyle.get(mTimeStyleId);
         ListUserStyleSetting listUserStyleSetting =
-                (ListUserStyleSetting) mEditorSession.getUserStyleSchema()
-                        .getRootUserStyleSettings()
-                        .get(0);
+                (ListUserStyleSetting)
+                        mEditorSession.getUserStyleSchema().getRootUserStyleSettings().get(0);
 
         // Choose the first option in the list of options that isn't currentOption. We only expect
         // two options here, so this will flip flop between them.
@@ -131,8 +128,7 @@
         if (mEditorSession == null) {
             return;
         }
-        ListOption option =
-                (ListOption) mEditorSession.getUserStyle().getValue().get(mTimeStyleId);
+        ListOption option = (ListOption) mEditorSession.getUserStyle().getValue().get(mTimeStyleId);
         mStyleValue.setText(option.getDisplayName());
     }
 }
diff --git a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceRenderer.java b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceRenderer.java
index 42488a8..6b3406a 100644
--- a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceRenderer.java
+++ b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceRenderer.java
@@ -42,6 +42,8 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import kotlin.Unit;
+
 import org.jetbrains.annotations.NotNull;
 
 import java.time.ZonedDateTime;
@@ -49,8 +51,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
-import kotlin.Unit;
-
 /**
  * Minimal rendered for the watch face, using canvas to render hours, minutes, and a blinking
  * separator.
@@ -75,7 +75,11 @@
             @NotNull CurrentUserStyleRepository currentUserStyleRepository,
             @NotNull WatchState watchState,
             @NotNull Resources resources) {
-        super(surfaceHolder, currentUserStyleRepository, watchState, CanvasType.HARDWARE,
+        super(
+                surfaceHolder,
+                currentUserStyleRepository,
+                watchState,
+                CanvasType.HARDWARE,
                 UPDATE_DELAY_MILLIS);
         mInstanceIdRenderer = new InstanceIdRenderer(watchState);
         mMinimalRenderer = new MinimalRenderer(watchState, mInstanceIdRenderer);
@@ -99,14 +103,14 @@
     }
 
     @Override
-    public void render(@NotNull Canvas canvas, @NotNull Rect rect,
-            @NotNull ZonedDateTime zonedDateTime) {
+    public void render(
+            @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime) {
         mTimeRenderer.render(canvas, rect, zonedDateTime, getRenderParameters());
     }
 
     @Override
-    public void renderHighlightLayer(@NonNull Canvas canvas, @NonNull Rect bounds,
-            @NonNull ZonedDateTime zonedDateTime) {
+    public void renderHighlightLayer(
+            @NonNull Canvas canvas, @NonNull Rect bounds, @NonNull ZonedDateTime zonedDateTime) {
         RenderParameters.HighlightLayer highlightLayer = getRenderParameters().getHighlightLayer();
         canvas.drawColor(highlightLayer.getBackgroundTint());
         mHighlightPaint.setColor(highlightLayer.getHighlightTint());
@@ -126,7 +130,9 @@
 
     private interface TimeRenderer {
         void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters);
     }
 
@@ -145,8 +151,9 @@
             mInstanceIdPaint.setTextAlign(Align.CENTER);
             mInstanceIdPaint.setTextSize(20f);
             mInstanceIdPaint.setColor(Color.WHITE);
-            mInstanceId = new AtomicReference<>(
-                    Objects.toString(watchState.getWatchFaceInstanceId().getValue()));
+            mInstanceId =
+                    new AtomicReference<>(
+                            Objects.toString(watchState.getWatchFaceInstanceId().getValue()));
         }
 
         @UiThread
@@ -156,8 +163,11 @@
         }
 
         @Override
-        public void render(@NonNull Canvas canvas, @NonNull Rect rect,
-                @NonNull ZonedDateTime zonedDateTime, RenderParameters renderParameters) {
+        public void render(
+                @NonNull Canvas canvas,
+                @NonNull Rect rect,
+                @NonNull ZonedDateTime zonedDateTime,
+                RenderParameters renderParameters) {
             canvas.save();
             canvas.scale(0.9f, 0.9f);
             canvas.translate(0.144f * rect.width() / 2, 0.1f * rect.height() / 2);
@@ -185,7 +195,9 @@
 
         @Override
         public void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters) {
             mPaint.setColor(Color.BLACK);
             canvas.drawRect(rect, mPaint);
@@ -201,7 +213,8 @@
             mTimeText[2] = second % 2 == 0 ? ':' : ' ';
             mTimeText[3] = DIGITS[minute / 10];
             mTimeText[4] = DIGITS[minute % 10];
-            canvas.drawText(mTimeText,
+            canvas.drawText(
+                    mTimeText,
                     0,
                     5,
                     rect.centerX(),
@@ -213,26 +226,19 @@
     }
 
     private static class SecondsRenderer implements TimeRenderer {
-        @Px
-        public static final float SECONDS_TEXT_HEIGHT = 256f;
-        @Px
-        public static final float TIME_TEXT_ACTIVE_HEIGHT = 64f;
-        @Px
-        public static final float TIME_TEXT_AMBIENT_HEIGHT = 96f;
-        @Px
-        private static final int TEXT_PADDING = 12;
+        @Px public static final float SECONDS_TEXT_HEIGHT = 256f;
+        @Px public static final float TIME_TEXT_ACTIVE_HEIGHT = 64f;
+        @Px public static final float TIME_TEXT_AMBIENT_HEIGHT = 96f;
+        @Px private static final int TEXT_PADDING = 12;
 
         private final WatchState mWatchState;
         private final InstanceIdRenderer mInstanceIdRenderer;
         private final Paint mPaint;
-        private final char[] mTimeText = new char[]{'1', '0', ':', '0', '9'};
-        private final char[] mSecondsText = new char[]{'3', '0'};
-        @Px
-        private final int mTimeActiveOffset;
-        @Px
-        private final int mTimeAmbientOffset;
-        @Px
-        private final int mSecondsActiveOffset;
+        private final char[] mTimeText = new char[] {'1', '0', ':', '0', '9'};
+        private final char[] mSecondsText = new char[] {'3', '0'};
+        @Px private final int mTimeActiveOffset;
+        @Px private final int mTimeAmbientOffset;
+        @Px private final int mSecondsActiveOffset;
 
         private SecondsRenderer(WatchState watchState, InstanceIdRenderer instanceIdRenderer) {
             mWatchState = watchState;
@@ -263,7 +269,9 @@
 
         @Override
         public void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters) {
             boolean isActive = renderParameters.getDrawMode() != DrawMode.AMBIENT;
             int hour = zonedDateTime.getHour();
@@ -287,7 +295,8 @@
             mTimeText[4] = DIGITS[minute % 10];
             mPaint.setTextSize(isActive ? TIME_TEXT_ACTIVE_HEIGHT : TIME_TEXT_AMBIENT_HEIGHT);
             @Px int timeOffset = isActive ? mTimeActiveOffset : mTimeAmbientOffset;
-            canvas.drawText(mTimeText,
+            canvas.drawText(
+                    mTimeText,
                     0,
                     mTimeText.length,
                     rect.centerX(),
@@ -297,7 +306,8 @@
             if (isActive) {
                 mSecondsText[0] = DIGITS[second / 10];
                 mSecondsText[1] = DIGITS[second % 10];
-                canvas.drawText(mSecondsText,
+                canvas.drawText(
+                        mSecondsText,
                         0,
                         mSecondsText.length,
                         rect.centerX(),
diff --git a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceService.java b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceService.java
index 6dd1761..c52bde5 100644
--- a/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceService.java
+++ b/wear/watchface/watchface-samples-minimal-instances/src/main/java/androidx/wear/watchface/samples/minimal/instances/WatchFaceService.java
@@ -38,7 +38,8 @@
     @NotNull
     @Override
     protected ListenableFuture<WatchFace> createWatchFaceFuture(
-            @NotNull SurfaceHolder surfaceHolder, @NotNull WatchState watchState,
+            @NotNull SurfaceHolder surfaceHolder,
+            @NotNull WatchState watchState,
             @NonNull ComplicationSlotsManager complicationSlotsManager,
             @NonNull CurrentUserStyleRepository currentUserStyleRepository) {
         Renderer renderer =
diff --git a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
index ec29ff6..bc7d75b2 100644
--- a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
+++ b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
@@ -42,8 +42,7 @@
     private TextView mStyleValue;
     private final UserStyleSetting.Id mTimeStyleId = new UserStyleSetting.Id("TimeStyle");
 
-    @Nullable
-    private ListenableEditorSession mEditorSession;
+    @Nullable private ListenableEditorSession mEditorSession;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -71,20 +70,22 @@
     private void listenForEditorSession() {
         ListenableFuture<ListenableEditorSession> editorSessionFuture =
                 ListenableEditorSession.listenableCreateOnWatchEditorSession(this);
-        editorSessionFuture.addListener(() -> {
-            ListenableEditorSession editorSession;
-            try {
-                editorSession = editorSessionFuture.get();
-            } catch (ExecutionException | InterruptedException e) {
-                e.printStackTrace();
-                return;
-            }
-            if (editorSession == null) {
-                return;
-            }
-            mEditorSession = editorSession;
-            updateStyleValue();
-        }, ContextCompat.getMainExecutor(this));
+        editorSessionFuture.addListener(
+                () -> {
+                    ListenableEditorSession editorSession;
+                    try {
+                        editorSession = editorSessionFuture.get();
+                    } catch (ExecutionException | InterruptedException e) {
+                        e.printStackTrace();
+                        return;
+                    }
+                    if (editorSession == null) {
+                        return;
+                    }
+                    mEditorSession = editorSession;
+                    updateStyleValue();
+                },
+                ContextCompat.getMainExecutor(this));
     }
 
     private void changeStyle() {
@@ -96,9 +97,8 @@
         MutableUserStyle userStyle = mEditorSession.getUserStyle().getValue().toMutableUserStyle();
         ListOption currentOption = (ListOption) userStyle.get(mTimeStyleId);
         ListUserStyleSetting listUserStyleSetting =
-                (ListUserStyleSetting) mEditorSession.getUserStyleSchema()
-                        .getRootUserStyleSettings()
-                        .get(0);
+                (ListUserStyleSetting)
+                        mEditorSession.getUserStyleSchema().getRootUserStyleSettings().get(0);
 
         // Choose the first option in the list of options that isn't currentOption. We only expect
         // two options here, so this will flip flop between them.
@@ -116,8 +116,7 @@
         if (mEditorSession == null) {
             return;
         }
-        ListOption option =
-                (ListOption) mEditorSession.getUserStyle().getValue().get(mTimeStyleId);
+        ListOption option = (ListOption) mEditorSession.getUserStyle().getValue().get(mTimeStyleId);
         mStyleValue.setText(option.getDisplayName());
     }
 }
diff --git a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceRenderer.java b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceRenderer.java
index e15cdbf..9ee42df 100644
--- a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceRenderer.java
+++ b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceRenderer.java
@@ -40,13 +40,13 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import kotlin.Unit;
+
 import org.jetbrains.annotations.NotNull;
 
 import java.time.ZonedDateTime;
 import java.util.concurrent.TimeUnit;
 
-import kotlin.Unit;
-
 /**
  * Minimal rendered for the watch face, using canvas to render hours, minutes, and a blinking
  * separator.
@@ -70,7 +70,11 @@
             @NotNull CurrentUserStyleRepository currentUserStyleRepository,
             @NotNull WatchState watchState,
             @NotNull Resources resources) {
-        super(surfaceHolder, currentUserStyleRepository, watchState, CanvasType.HARDWARE,
+        super(
+                surfaceHolder,
+                currentUserStyleRepository,
+                watchState,
+                CanvasType.HARDWARE,
                 UPDATE_DELAY_MILLIS);
         mMinimalRenderer = new MinimalRenderer(watchState);
         mSecondsRenderer = new SecondsRenderer(watchState);
@@ -92,14 +96,14 @@
     }
 
     @Override
-    public void render(@NotNull Canvas canvas, @NotNull Rect rect,
-            @NotNull ZonedDateTime zonedDateTime) {
+    public void render(
+            @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime) {
         mTimeRenderer.render(canvas, rect, zonedDateTime, getRenderParameters());
     }
 
     @Override
-    public void renderHighlightLayer(@NonNull Canvas canvas, @NonNull Rect bounds,
-            @NonNull ZonedDateTime zonedDateTime) {
+    public void renderHighlightLayer(
+            @NonNull Canvas canvas, @NonNull Rect bounds, @NonNull ZonedDateTime zonedDateTime) {
         RenderParameters.HighlightLayer highlightLayer = getRenderParameters().getHighlightLayer();
         canvas.drawColor(highlightLayer.getBackgroundTint());
         mHighlightPaint.setColor(highlightLayer.getHighlightTint());
@@ -119,7 +123,9 @@
 
     private interface TimeRenderer {
         void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters);
     }
 
@@ -137,7 +143,9 @@
 
         @Override
         public void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters) {
             mPaint.setColor(Color.BLACK);
             canvas.drawRect(rect, mPaint);
@@ -153,7 +161,8 @@
             mTimeText[2] = second % 2 == 0 ? ':' : ' ';
             mTimeText[3] = DIGITS[minute / 10];
             mTimeText[4] = DIGITS[minute % 10];
-            canvas.drawText(mTimeText,
+            canvas.drawText(
+                    mTimeText,
                     0,
                     5,
                     rect.centerX(),
@@ -163,25 +172,18 @@
     }
 
     private static class SecondsRenderer implements TimeRenderer {
-        @Px
-        public static final float SECONDS_TEXT_HEIGHT = 256f;
-        @Px
-        public static final float TIME_TEXT_ACTIVE_HEIGHT = 64f;
-        @Px
-        public static final float TIME_TEXT_AMBIENT_HEIGHT = 96f;
-        @Px
-        private static final int TEXT_PADDING = 12;
+        @Px public static final float SECONDS_TEXT_HEIGHT = 256f;
+        @Px public static final float TIME_TEXT_ACTIVE_HEIGHT = 64f;
+        @Px public static final float TIME_TEXT_AMBIENT_HEIGHT = 96f;
+        @Px private static final int TEXT_PADDING = 12;
 
         private final WatchState mWatchState;
         private final Paint mPaint;
-        private final char[] mTimeText = new char[]{'1', '0', ':', '0', '9'};
-        private final char[] mSecondsText = new char[]{'3', '0'};
-        @Px
-        private final int mTimeActiveOffset;
-        @Px
-        private final int mTimeAmbientOffset;
-        @Px
-        private final int mSecondsActiveOffset;
+        private final char[] mTimeText = new char[] {'1', '0', ':', '0', '9'};
+        private final char[] mSecondsText = new char[] {'3', '0'};
+        @Px private final int mTimeActiveOffset;
+        @Px private final int mTimeAmbientOffset;
+        @Px private final int mSecondsActiveOffset;
 
         private SecondsRenderer(WatchState watchState) {
             mWatchState = watchState;
@@ -211,7 +213,9 @@
 
         @Override
         public void render(
-                @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime,
+                @NotNull Canvas canvas,
+                @NotNull Rect rect,
+                @NotNull ZonedDateTime zonedDateTime,
                 RenderParameters renderParameters) {
             boolean isActive = renderParameters.getDrawMode() != DrawMode.AMBIENT;
             int hour = zonedDateTime.getHour();
@@ -235,7 +239,8 @@
             mTimeText[4] = DIGITS[minute % 10];
             mPaint.setTextSize(isActive ? TIME_TEXT_ACTIVE_HEIGHT : TIME_TEXT_AMBIENT_HEIGHT);
             @Px int timeOffset = isActive ? mTimeActiveOffset : mTimeAmbientOffset;
-            canvas.drawText(mTimeText,
+            canvas.drawText(
+                    mTimeText,
                     0,
                     mTimeText.length,
                     rect.centerX(),
@@ -245,7 +250,8 @@
             if (isActive) {
                 mSecondsText[0] = DIGITS[second / 10];
                 mSecondsText[1] = DIGITS[second % 10];
-                canvas.drawText(mSecondsText,
+                canvas.drawText(
+                        mSecondsText,
                         0,
                         mSecondsText.length,
                         rect.centerX(),
diff --git a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceService.java b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceService.java
index d36f01f..b1389cf 100644
--- a/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceService.java
+++ b/wear/watchface/watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/WatchFaceService.java
@@ -38,7 +38,8 @@
     @NotNull
     @Override
     protected ListenableFuture<WatchFace> createWatchFaceFuture(
-            @NotNull SurfaceHolder surfaceHolder, @NotNull WatchState watchState,
+            @NotNull SurfaceHolder surfaceHolder,
+            @NotNull WatchState watchState,
             @NonNull ComplicationSlotsManager complicationSlotsManager,
             @NonNull CurrentUserStyleRepository currentUserStyleRepository) {
         Renderer renderer =
diff --git a/wear/watchface/watchface-style/api/current.ignore b/wear/watchface/watchface-style/api/current.ignore
new file mode 100644
index 0000000..ac33402
--- /dev/null
+++ b/wear/watchface/watchface-style/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.style.UserStyleSettingKt:
+    Removed class androidx.wear.watchface.style.UserStyleSettingKt
diff --git a/wear/watchface/watchface-style/api/current.txt b/wear/watchface/watchface-style/api/current.txt
index 34ce054..53940f3 100644
--- a/wear/watchface/watchface-style/api/current.txt
+++ b/wear/watchface/watchface-style/api/current.txt
@@ -183,6 +183,21 @@
     property public final byte[] customValue;
   }
 
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class UserStyleSetting.CustomValueUserStyleSetting2 extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(byte[] customValue);
+    method public byte[] getCustomValue();
+    property public final byte[] customValue;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion Companion;
+    field public static final int MAX_SIZE = 125000; // 0x1e848
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion {
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
@@ -281,9 +296,6 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
-  public final class UserStyleSettingKt {
-  }
-
   public enum WatchFaceLayer {
     method public static androidx.wear.watchface.style.WatchFaceLayer valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.wear.watchface.style.WatchFaceLayer[] values();
diff --git a/wear/watchface/watchface-style/api/public_plus_experimental_current.txt b/wear/watchface/watchface-style/api/public_plus_experimental_current.txt
index 34ce054..53940f3 100644
--- a/wear/watchface/watchface-style/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-style/api/public_plus_experimental_current.txt
@@ -183,6 +183,21 @@
     property public final byte[] customValue;
   }
 
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class UserStyleSetting.CustomValueUserStyleSetting2 extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(byte[] customValue);
+    method public byte[] getCustomValue();
+    property public final byte[] customValue;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion Companion;
+    field public static final int MAX_SIZE = 125000; // 0x1e848
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion {
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
@@ -281,9 +296,6 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
-  public final class UserStyleSettingKt {
-  }
-
   public enum WatchFaceLayer {
     method public static androidx.wear.watchface.style.WatchFaceLayer valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.wear.watchface.style.WatchFaceLayer[] values();
diff --git a/wear/watchface/watchface-style/api/restricted_current.ignore b/wear/watchface/watchface-style/api/restricted_current.ignore
index 1c52092..76438c7 100644
--- a/wear/watchface/watchface-style/api/restricted_current.ignore
+++ b/wear/watchface/watchface-style/api/restricted_current.ignore
@@ -1,4 +1,8 @@
 // Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.style.UserStyleSettingKt:
+    Removed class androidx.wear.watchface.style.UserStyleSettingKt
+
+
 RemovedMethod: androidx.wear.watchface.style.UserStyle#toWireFormat():
     Removed method androidx.wear.watchface.style.UserStyle.toWireFormat()
 RemovedMethod: androidx.wear.watchface.style.UserStyleData#UserStyleData(androidx.wear.watchface.style.data.UserStyleWireFormat):
@@ -43,9 +47,3 @@
     Removed method androidx.wear.watchface.style.UserStyleSetting.Option.toWireFormat()
 RemovedMethod: androidx.wear.watchface.style.UserStyleSetting.Option.Companion#createFromWireFormat(androidx.wear.watchface.style.data.OptionWireFormat):
     Removed method androidx.wear.watchface.style.UserStyleSetting.Option.Companion.createFromWireFormat(androidx.wear.watchface.style.data.OptionWireFormat)
-RemovedMethod: androidx.wear.watchface.style.UserStyleSettingKt#getIntRefAttribute(android.content.res.Resources, android.content.res.XmlResourceParser, String):
-    Removed method androidx.wear.watchface.style.UserStyleSettingKt.getIntRefAttribute(android.content.res.Resources,android.content.res.XmlResourceParser,String)
-RemovedMethod: androidx.wear.watchface.style.UserStyleSettingKt#getStringRefAttribute(android.content.res.Resources, android.content.res.XmlResourceParser, String):
-    Removed method androidx.wear.watchface.style.UserStyleSettingKt.getStringRefAttribute(android.content.res.Resources,android.content.res.XmlResourceParser,String)
-RemovedMethod: androidx.wear.watchface.style.UserStyleSettingKt#moveToStart(org.xmlpull.v1.XmlPullParser, String):
-    Removed method androidx.wear.watchface.style.UserStyleSettingKt.moveToStart(org.xmlpull.v1.XmlPullParser,String)
diff --git a/wear/watchface/watchface-style/api/restricted_current.txt b/wear/watchface/watchface-style/api/restricted_current.txt
index 34ce054..53940f3 100644
--- a/wear/watchface/watchface-style/api/restricted_current.txt
+++ b/wear/watchface/watchface-style/api/restricted_current.txt
@@ -183,6 +183,21 @@
     property public final byte[] customValue;
   }
 
+  @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public static final class UserStyleSetting.CustomValueUserStyleSetting2 extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(byte[] customValue);
+    method public byte[] getCustomValue();
+    property public final byte[] customValue;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion Companion;
+    field public static final int MAX_SIZE = 125000; // 0x1e848
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.Companion {
+  }
+
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue, optional androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData? watchFaceEditorData);
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
@@ -281,9 +296,6 @@
     property public final android.graphics.drawable.Icon? icon;
   }
 
-  public final class UserStyleSettingKt {
-  }
-
   public enum WatchFaceLayer {
     method public static androidx.wear.watchface.style.WatchFaceLayer valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.wear.watchface.style.WatchFaceLayer[] values();
diff --git a/wear/watchface/watchface-style/old-api-test-service/src/main/java/androidx/wear/watchface/style/test/StyleEchoService.kt b/wear/watchface/watchface-style/old-api-test-service/src/main/java/androidx/wear/watchface/style/test/StyleEchoService.kt
index a38577b..a2f51cc 100644
--- a/wear/watchface/watchface-style/old-api-test-service/src/main/java/androidx/wear/watchface/style/test/StyleEchoService.kt
+++ b/wear/watchface/watchface-style/old-api-test-service/src/main/java/androidx/wear/watchface/style/test/StyleEchoService.kt
@@ -20,8 +20,8 @@
 import android.content.Intent
 import android.os.IBinder
 import android.util.Log
-import androidx.wear.watchface.style.data.UserStyleSchemaWireFormat
 import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.style.data.UserStyleSchemaWireFormat
 
 public class StyleEchoService : Service() {
     override fun onBind(intent: Intent?): IBinder = IStyleEchoServiceStub()
@@ -39,4 +39,4 @@
     companion object {
         const val TAG = "IStyleEchoServiceStub"
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/IconWireSizeAndDimensionsTest.kt b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/IconWireSizeAndDimensionsTest.kt
index 73aff62..52f34d67 100644
--- a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/IconWireSizeAndDimensionsTest.kt
+++ b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/IconWireSizeAndDimensionsTest.kt
@@ -59,14 +59,15 @@
 
     @Test
     public fun estimateWireSizeInBytesAndValidateIconDimensions_BooleanUserStyleSetting_IconOK() {
-        val setting = UserStyleSetting.BooleanUserStyleSetting(
-            UserStyleSetting.Id("ID1"),
-            "displayName",
-            "description",
-            testIcon,
-            listOf(WatchFaceLayer.BASE),
-            false
-        )
+        val setting =
+            UserStyleSetting.BooleanUserStyleSetting(
+                UserStyleSetting.Id("ID1"),
+                "displayName",
+                "description",
+                testIcon,
+                listOf(WatchFaceLayer.BASE),
+                false
+            )
 
         val estimate = setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -78,77 +79,84 @@
 
     @Test
     public fun estimateWireSizeInBytesAndValidateIconDimensions_BooleanUserStyleSetting_IconBad() {
-        val setting = UserStyleSetting.BooleanUserStyleSetting(
-            UserStyleSetting.Id("ID1"),
-            "displayName",
-            "description",
-            testIcon,
-            listOf(WatchFaceLayer.BASE),
-            false
-        )
+        val setting =
+            UserStyleSetting.BooleanUserStyleSetting(
+                UserStyleSetting.Id("ID1"),
+                "displayName",
+                "description",
+                testIcon,
+                listOf(WatchFaceLayer.BASE),
+                false
+            )
 
         try {
             setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 10, 20)
             fail("An exception should have been thrown because the icon is too big")
         } catch (e: Exception) {
-            Truth.assertThat(e.message).contains(
-                "UserStyleSetting id ID1 has a 72 x 72 icon. This is too big, the maximum size" +
-                    " is 10 x 20."
-            )
+            Truth.assertThat(e.message)
+                .contains(
+                    "UserStyleSetting id ID1 has a 72 x 72 icon. " +
+                        "This is too big, the maximum size is 10 x 20."
+                )
         }
     }
 
     @Test
     public fun estimateWireSizeInBytes_DoubleRangeUserStyleSetting() {
-        val setting = UserStyleSetting.DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
+        val setting =
+            UserStyleSetting.DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
         Truth.assertThat(
-            setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
-        ).isEqualTo(87)
+                setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
+            )
+            .isEqualTo(87)
     }
 
     @Test
     public fun estimateWireSizeInBytes_ListUserStyleSetting() {
-        val classicStyleOption = UserStyleSetting.ListUserStyleSetting.ListOption(
-            UserStyleSetting.Option.Id("classic_style"),
-            "Classic",
-            "Classic screen reader name",
-            testIcon
-        )
+        val classicStyleOption =
+            UserStyleSetting.ListUserStyleSetting.ListOption(
+                UserStyleSetting.Option.Id("classic_style"),
+                "Classic",
+                "Classic screen reader name",
+                testIcon
+            )
 
-        val modernStyleOption = UserStyleSetting.ListUserStyleSetting.ListOption(
-            UserStyleSetting.Option.Id("modern_style"),
-            "Modern",
-            "Modern screen reader name",
-            testIcon
-        )
+        val modernStyleOption =
+            UserStyleSetting.ListUserStyleSetting.ListOption(
+                UserStyleSetting.Option.Id("modern_style"),
+                "Modern",
+                "Modern screen reader name",
+                testIcon
+            )
 
-        val gothicStyleOption = UserStyleSetting.ListUserStyleSetting.ListOption(
-            UserStyleSetting.Option.Id("gothic_style"),
-            "Gothic",
-            "Gothic screen reader name",
-            testIcon
-        )
+        val gothicStyleOption =
+            UserStyleSetting.ListUserStyleSetting.ListOption(
+                UserStyleSetting.Option.Id("gothic_style"),
+                "Gothic",
+                "Gothic screen reader name",
+                testIcon
+            )
 
-        val watchHandStyleList =
-            listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
+        val watchHandStyleList = listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
 
-        val setting = UserStyleSetting.ListUserStyleSetting(
-            UserStyleSetting.Id("hand_style_setting"),
-            "Hand Style",
-            "Hand visual look", /* icon = */
-            testIcon,
-            watchHandStyleList,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
+        val setting =
+            UserStyleSetting.ListUserStyleSetting(
+                UserStyleSetting.Id("hand_style_setting"),
+                "Hand Style",
+                "Hand visual look",
+                /* icon = */ testIcon,
+                watchHandStyleList,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
 
         val estimate = setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -160,16 +168,17 @@
 
     @Test
     public fun estimateWireSizeInBytes_LongRangeUserStyleSetting() {
-        val setting = UserStyleSetting.LongRangeUserStyleSetting(
-            UserStyleSetting.Id("watch_hand_length_style_setting"),
-            "Hand length",
-            "Scale of watch hands",
-            testIcon,
-            1,
-            100,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
-            2
-        )
+        val setting =
+            UserStyleSetting.LongRangeUserStyleSetting(
+                UserStyleSetting.Id("watch_hand_length_style_setting"),
+                "Hand length",
+                "Scale of watch hands",
+                testIcon,
+                1,
+                100,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
+                2
+            )
 
         val estimate = setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -181,13 +190,15 @@
 
     @Test
     public fun estimateWireSizeInBytes_CustomValueUserStyleSetting() {
-        val setting = UserStyleSetting.CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "custom value".encodeToByteArray()
-        )
+        val setting =
+            UserStyleSetting.CustomValueUserStyleSetting(
+                listOf(WatchFaceLayer.BASE),
+                "custom value".encodeToByteArray()
+            )
         Truth.assertThat(
-            setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
-        ).isEqualTo(31)
+                setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
+            )
+            .isEqualTo(31)
     }
 
     @Test
@@ -195,62 +206,56 @@
     public fun estimateWireSizeInBytes_ComplicationSlotsUserStyleSetting() {
         val leftComplicationID = 101
         val rightComplicationID = 102
-        val setting = UserStyleSetting.ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "Complications",
-            "Number and position",
-            icon = testIcon,
-            complicationConfig = listOf(
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-                    "Both",
-                     "Both screen reader name",
-                    testIcon,
-                    listOf()
-                ),
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("NO_COMPLICATIONS"),
-                    "None",
-                    "None screen reader name",
-                    testIcon,
+        val setting =
+            UserStyleSetting.ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "Complications",
+                "Number and position",
+                icon = testIcon,
+                complicationConfig =
                     listOf(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            enabled = false
+                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                            "Both",
+                            "Both screen reader name",
+                            testIcon,
+                            listOf()
                         ),
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            rightComplicationID,
-                            enabled = false
+                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("NO_COMPLICATIONS"),
+                            "None",
+                            "None screen reader name",
+                            testIcon,
+                            listOf(
+                                UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                    .ComplicationSlotOverlay(leftComplicationID, enabled = false),
+                                UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                    .ComplicationSlotOverlay(rightComplicationID, enabled = false)
+                            )
+                        ),
+                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("LEFT_COMPLICATION"),
+                            "Left",
+                            "Left screen reader name",
+                            testIcon,
+                            listOf(
+                                UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                    .ComplicationSlotOverlay(rightComplicationID, enabled = false)
+                            )
+                        ),
+                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("RIGHT_COMPLICATION"),
+                            "Right",
+                            "Right screen reader name",
+                            testIcon,
+                            listOf(
+                                UserStyleSetting.ComplicationSlotsUserStyleSetting
+                                    .ComplicationSlotOverlay(leftComplicationID, enabled = false)
+                            )
                         )
-                    )
-                ),
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("LEFT_COMPLICATION"),
-                    "Left",
-                    "Left screen reader name",
-                    testIcon,
-                    listOf(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            rightComplicationID,
-                            enabled = false
-                        )
-                    )
-                ),
-                UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("RIGHT_COMPLICATION"),
-                    "Right",
-                    "Right screen reader name",
-                    testIcon,
-                    listOf(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            enabled = false
-                        )
-                    )
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         val estimate = setting.estimateWireSizeInBytesAndValidateIconDimensions(context, 100, 100)
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@@ -259,4 +264,4 @@
             Truth.assertThat(estimate).isEqualTo(227)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/OldClientAidlCompatTest.kt b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/OldClientAidlCompatTest.kt
index 5cf9133..cf6838f 100644
--- a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/OldClientAidlCompatTest.kt
+++ b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/OldClientAidlCompatTest.kt
@@ -25,12 +25,12 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import androidx.test.rule.ServiceTestRule
-import androidx.wear.watchface.style.test.IStyleEchoService
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.Option
+import androidx.wear.watchface.style.test.IStyleEchoService
 import androidx.wear.watchface.style.test.R
 import com.google.common.truth.Truth.assertThat
 import kotlin.coroutines.resume
@@ -45,162 +45,164 @@
 
 @LargeTest
 class OldClientAidlCompatTest {
-    @get:Rule
-    val serviceRule = ServiceTestRule()
+    @get:Rule val serviceRule = ServiceTestRule()
 
     companion object {
         private val CONTEXT: Context = ApplicationProvider.getApplicationContext()
 
-        private val COLOR_STYLE_SETTING = ListUserStyleSetting(
-            UserStyleSetting.Id("COLOR_STYLE_SETTING"),
-            CONTEXT.resources,
-            R.string.colors_style_setting,
-            R.string.colors_style_setting_description,
-            icon = null,
-            options = listOf(
-                ListUserStyleSetting.ListOption(
-                    Option.Id("RED_STYLE"),
-                    CONTEXT.resources,
-                    R.string.colors_style_red,
-                    R.string.colors_style_red_screen_reader,
-                    Icon.createWithResource(CONTEXT, R.drawable.red_style)
-                ),
-                ListUserStyleSetting.ListOption(
-                    Option.Id("GREEN_STYLE"),
-                    CONTEXT.resources,
-                    R.string.colors_style_green,
-                    R.string.colors_style_green_screen_reader,
-                    Icon.createWithResource(CONTEXT, R.drawable.green_style)
-                ),
-                ListUserStyleSetting.ListOption(
-                    Option.Id("BLUE_STYLE"),
-                    CONTEXT.resources,
-                    R.string.colors_style_blue,
-                    R.string.colors_style_blue_screen_reader,
-                    Icon.createWithResource(CONTEXT, R.drawable.blue_style)
+        private val COLOR_STYLE_SETTING =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("COLOR_STYLE_SETTING"),
+                CONTEXT.resources,
+                R.string.colors_style_setting,
+                R.string.colors_style_setting_description,
+                icon = null,
+                options =
+                    listOf(
+                        ListUserStyleSetting.ListOption(
+                            Option.Id("RED_STYLE"),
+                            CONTEXT.resources,
+                            R.string.colors_style_red,
+                            R.string.colors_style_red_screen_reader,
+                            Icon.createWithResource(CONTEXT, R.drawable.red_style)
+                        ),
+                        ListUserStyleSetting.ListOption(
+                            Option.Id("GREEN_STYLE"),
+                            CONTEXT.resources,
+                            R.string.colors_style_green,
+                            R.string.colors_style_green_screen_reader,
+                            Icon.createWithResource(CONTEXT, R.drawable.green_style)
+                        ),
+                        ListUserStyleSetting.ListOption(
+                            Option.Id("BLUE_STYLE"),
+                            CONTEXT.resources,
+                            R.string.colors_style_blue,
+                            R.string.colors_style_blue_screen_reader,
+                            Icon.createWithResource(CONTEXT, R.drawable.blue_style)
+                        )
+                    ),
+                listOf(
+                    WatchFaceLayer.BASE,
+                    WatchFaceLayer.COMPLICATIONS,
+                    WatchFaceLayer.COMPLICATIONS_OVERLAY
                 )
-            ),
-            listOf(
-                WatchFaceLayer.BASE,
-                WatchFaceLayer.COMPLICATIONS,
-                WatchFaceLayer.COMPLICATIONS_OVERLAY
             )
-        )
 
-        private val DRAW_HOUR_PIPS_SETTING = UserStyleSetting.BooleanUserStyleSetting(
-            UserStyleSetting.Id("DRAW_HOUR_PIPS_STYLE_SETTING"),
-            CONTEXT.resources,
-            R.string.watchface_pips_setting,
-            R.string.watchface_pips_setting_description,
-            icon = null,
-            listOf(WatchFaceLayer.BASE),
-            true
-        )
+        private val DRAW_HOUR_PIPS_SETTING =
+            UserStyleSetting.BooleanUserStyleSetting(
+                UserStyleSetting.Id("DRAW_HOUR_PIPS_STYLE_SETTING"),
+                CONTEXT.resources,
+                R.string.watchface_pips_setting,
+                R.string.watchface_pips_setting_description,
+                icon = null,
+                listOf(WatchFaceLayer.BASE),
+                true
+            )
 
-        private val WATCH_HAND_LENGTH_SETTING = UserStyleSetting.DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("WATCH_HAND_LENGTH_STYLE_SETTING"),
-            CONTEXT.resources,
-            R.string.watchface_hand_length_setting,
-            R.string.watchface_hand_length_setting_description,
-            icon = null,
-            minimumValue = 0.25,
-            maximumValue = 1.0,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
-            defaultValue = 0.75
-        )
+        private val WATCH_HAND_LENGTH_SETTING =
+            UserStyleSetting.DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("WATCH_HAND_LENGTH_STYLE_SETTING"),
+                CONTEXT.resources,
+                R.string.watchface_hand_length_setting,
+                R.string.watchface_hand_length_setting_description,
+                icon = null,
+                minimumValue = 0.25,
+                maximumValue = 1.0,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
+                defaultValue = 0.75
+            )
 
         @Suppress("Deprecation")
-        private val COMPLICATIONS_STYLE_SETTING = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("COMPLICATIONS_STYLE_SETTING"),
-            CONTEXT.resources,
-            R.string.watchface_complications_setting,
-            R.string.watchface_complications_setting_description,
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsOption(
-                    Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-                    CONTEXT.resources,
-                    R.string.watchface_complications_setting_both,
-                    icon = null,
-                    // NB this list is empty because each [ComplicationSlotOverlay] is applied on
-                    // top of the initial config.
-                    listOf()
-                ),
-                ComplicationSlotsOption(
-                    Option.Id("NO_COMPLICATIONS"),
-                    CONTEXT.resources,
-                    R.string.watchface_complications_setting_none,
-                    icon = null,
+        private val COMPLICATIONS_STYLE_SETTING =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("COMPLICATIONS_STYLE_SETTING"),
+                CONTEXT.resources,
+                R.string.watchface_complications_setting,
+                R.string.watchface_complications_setting_description,
+                icon = null,
+                complicationConfig =
                     listOf(
-                        ComplicationSlotOverlay(complicationSlotId = 1, enabled = false),
-                        ComplicationSlotOverlay(complicationSlotId = 2, enabled = false)
-                    )
-                ),
-                ComplicationSlotsOption(
-                    Option.Id("LEFT_COMPLICATION"),
-                    CONTEXT.resources,
-                    R.string.watchface_complications_setting_left,
-                    icon = null,
-                    listOf(ComplicationSlotOverlay(complicationSlotId = 1, enabled = false))
-                ),
-                ComplicationSlotsOption(
-                    Option.Id("RIGHT_COMPLICATION"),
-                    CONTEXT.resources,
-                    R.string.watchface_complications_setting_right,
-                    icon = null,
-                    listOf(ComplicationSlotOverlay(complicationSlotId = 2, enabled = false))
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-
-        private val LONG_RANGE_SETTING = UserStyleSetting.LongRangeUserStyleSetting(
-            UserStyleSetting.Id("HOURS_DRAW_FREQ_STYLE_SETTING"),
-            CONTEXT.resources,
-            R.string.watchface_draw_hours_freq_setting,
-            R.string.watchface_draw_hours_freq_setting_description,
-            icon = null,
-            minimumValue = 0,
-            maximumValue = 4,
-            listOf(WatchFaceLayer.BASE),
-            defaultValue = 1
-        )
-
-        private val SCHEMA = UserStyleSchema(
-            listOf(
-                COLOR_STYLE_SETTING,
-                DRAW_HOUR_PIPS_SETTING,
-                WATCH_HAND_LENGTH_SETTING,
-                COMPLICATIONS_STYLE_SETTING,
-                LONG_RANGE_SETTING
+                        ComplicationSlotsOption(
+                            Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                            CONTEXT.resources,
+                            R.string.watchface_complications_setting_both,
+                            icon = null,
+                            // NB this list is empty because each [ComplicationSlotOverlay] is
+                            // applied on
+                            // top of the initial config.
+                            listOf()
+                        ),
+                        ComplicationSlotsOption(
+                            Option.Id("NO_COMPLICATIONS"),
+                            CONTEXT.resources,
+                            R.string.watchface_complications_setting_none,
+                            icon = null,
+                            listOf(
+                                ComplicationSlotOverlay(complicationSlotId = 1, enabled = false),
+                                ComplicationSlotOverlay(complicationSlotId = 2, enabled = false)
+                            )
+                        ),
+                        ComplicationSlotsOption(
+                            Option.Id("LEFT_COMPLICATION"),
+                            CONTEXT.resources,
+                            R.string.watchface_complications_setting_left,
+                            icon = null,
+                            listOf(ComplicationSlotOverlay(complicationSlotId = 1, enabled = false))
+                        ),
+                        ComplicationSlotsOption(
+                            Option.Id("RIGHT_COMPLICATION"),
+                            CONTEXT.resources,
+                            R.string.watchface_complications_setting_right,
+                            icon = null,
+                            listOf(ComplicationSlotOverlay(complicationSlotId = 2, enabled = false))
+                        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
             )
-        )
+
+        private val LONG_RANGE_SETTING =
+            UserStyleSetting.LongRangeUserStyleSetting(
+                UserStyleSetting.Id("HOURS_DRAW_FREQ_STYLE_SETTING"),
+                CONTEXT.resources,
+                R.string.watchface_draw_hours_freq_setting,
+                R.string.watchface_draw_hours_freq_setting_description,
+                icon = null,
+                minimumValue = 0,
+                maximumValue = 4,
+                listOf(WatchFaceLayer.BASE),
+                defaultValue = 1
+            )
+
+        private val SCHEMA =
+            UserStyleSchema(
+                listOf(
+                    COLOR_STYLE_SETTING,
+                    DRAW_HOUR_PIPS_SETTING,
+                    WATCH_HAND_LENGTH_SETTING,
+                    COMPLICATIONS_STYLE_SETTING,
+                    LONG_RANGE_SETTING
+                )
+            )
 
         private const val ACTON = "com.google.android.wearable.action.TEST"
         private const val TEXT_FIXTURE_APK = "watchface-style-old-api-test-service-release.apk"
         private const val PACKAGE_NAME = "androidx.wear.watchface.style.test.oldApiTestService"
     }
 
-    @Before
-    fun setUp() = withPackageName(PACKAGE_NAME) {
-        install(TEXT_FIXTURE_APK)
-    }
+    @Before fun setUp() = withPackageName(PACKAGE_NAME) { install(TEXT_FIXTURE_APK) }
 
-    @After
-    fun tearDown() = withPackageName(PACKAGE_NAME) {
-        uninstall()
-    }
+    @After fun tearDown() = withPackageName(PACKAGE_NAME) { uninstall() }
 
     @Test
     @Ignore // TODO(b/265425077): This test is failing on the bots, fix it.
     fun roundTripUserStyleSchema() = runBlocking {
-        val service = IStyleEchoService.Stub.asInterface(
-            bindService(Intent(ACTON).apply { setPackage(PACKAGE_NAME) })
-        )
+        val service =
+            IStyleEchoService.Stub.asInterface(
+                bindService(Intent(ACTON).apply { setPackage(PACKAGE_NAME) })
+            )
 
-        val result = UserStyleSchema(
-            service.roundTripToApiUserStyleSchemaWireFormat(SCHEMA.toWireFormat())
-        )
+        val result =
+            UserStyleSchema(service.roundTripToApiUserStyleSchemaWireFormat(SCHEMA.toWireFormat()))
 
         // We expect five root settings back. Some of the details will have been clipped which
         // is expected because not all the current features are supported by v1.1.1, the main
@@ -209,23 +211,21 @@
     }
 
     private suspend fun bindService(intent: Intent): IBinder = suspendCoroutine { continuation ->
-        val bound = CONTEXT.bindService(
-            intent,
-            object : ServiceConnection {
-                override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
-                    continuation.resume(binder)
-                }
+        val bound =
+            CONTEXT.bindService(
+                intent,
+                object : ServiceConnection {
+                    override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
+                        continuation.resume(binder)
+                    }
 
-                override fun onServiceDisconnected(p0: ComponentName?) {
-                }
-            },
-            Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT
-        )
+                    override fun onServiceDisconnected(p0: ComponentName?) {}
+                },
+                Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT
+            )
 
         if (!bound) {
-            continuation.resumeWithException(
-                IllegalStateException("No service found for $intent.")
-            )
+            continuation.resumeWithException(IllegalStateException("No service found for $intent."))
         }
     }
 }
diff --git a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/TestHelper.kt b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/TestHelper.kt
index 2f90085..adc51af 100644
--- a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/TestHelper.kt
+++ b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/TestHelper.kt
@@ -52,7 +52,8 @@
                 InstrumentationRegistry.getInstrumentation().context.cacheDir
             }
             else -> InstrumentationRegistry.getInstrumentation().context.externalCacheDir
-        } ?: throw IllegalStateException("Unable to select a directory for writing files.")
+        }
+            ?: throw IllegalStateException("Unable to select a directory for writing files.")
     }
 
     public fun uninstall() = executeCommand("pm uninstall $packageName")
@@ -63,12 +64,15 @@
 
         try {
             // First writes in a temp file the apk from the assets
-            val tmpApkFile = File(dirUsableByAppAndShell, "tmp_$apkName").also { file ->
-                file.delete()
-                file.createNewFile()
-                file.deleteOnExit()
-                file.outputStream().use { instrumentation.context.assets.open(apkName).copyTo(it) }
-            }
+            val tmpApkFile =
+                File(dirUsableByAppAndShell, "tmp_$apkName").also { file ->
+                    file.delete()
+                    file.createNewFile()
+                    file.deleteOnExit()
+                    file.outputStream().use {
+                        instrumentation.context.assets.open(apkName).copyTo(it)
+                    }
+                }
             cleanUpBlocks.add { tmpApkFile.delete() }
 
             // Then moves it to a destination that can be used to install it
@@ -82,11 +86,7 @@
 
             // Creates an install session
             val installCreateOutput = executeCommand("pm install-create -t").first().trim()
-            val sessionId = REGEX_SESSION_ID
-                .find(installCreateOutput)!!
-                .groups[1]!!
-                .value
-                .toLong()
+            val sessionId = REGEX_SESSION_ID.find(installCreateOutput)!!.groups[1]!!.value.toLong()
 
             // Adds the base apk to the install session
             val successBaseApk =
@@ -127,4 +127,4 @@
         private const val TEMP_DIR = "/data/local/tmp/"
         private val REGEX_SESSION_ID = """\[(\d+)\]""".toRegex()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSchemaInflateTest.kt b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSchemaInflateTest.kt
index e8bff3b..a1ab85d 100644
--- a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSchemaInflateTest.kt
+++ b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSchemaInflateTest.kt
@@ -27,8 +27,8 @@
 import androidx.wear.watchface.complications.data.ComplicationType
 import androidx.wear.watchface.complications.iterate
 import androidx.wear.watchface.complications.moveToStart
-import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
+import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
 import androidx.wear.watchface.style.test.R
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -56,11 +56,12 @@
         assertThat(setting0.displayName).isEqualTo("Colors")
         assertThat(setting0.description).isEqualTo("Watchface colorization")
         assertThat(setting0.defaultOptionIndex).isEqualTo(1)
-        assertThat(setting0.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        assertThat(setting0.affectedWatchFaceLayers)
+            .containsExactly(
+                WatchFaceLayer.BASE,
+                WatchFaceLayer.COMPLICATIONS,
+                WatchFaceLayer.COMPLICATIONS_OVERLAY
+            )
         assertThat(setting0.icon!!.resId).isEqualTo(R.drawable.color_style_icon)
         assertThat(setting0.watchFaceEditorData!!.icon!!.resId)
             .isEqualTo(R.drawable.color_style_icon_wf)
@@ -85,9 +86,8 @@
         assertThat(setting1.displayName).isEqualTo("thing2")
         assertThat(setting1.description).isEqualTo("description2")
         assertThat(setting1.defaultOptionIndex).isEqualTo(0)
-        assertThat(setting1.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        assertThat(setting1.affectedWatchFaceLayers)
+            .containsExactly(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         assertThat(setting1.icon).isNull()
         assertThat(setting1.watchFaceEditorData).isNull()
         assertThat(setting1.options.size).isEqualTo(2)
@@ -111,11 +111,12 @@
         assertThat(setting2.displayName).isEqualTo("A or B")
         assertThat(setting2.description).isEqualTo("Choose one")
         assertThat(setting2.defaultOptionIndex).isEqualTo(0)
-        assertThat(setting2.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        assertThat(setting2.affectedWatchFaceLayers)
+            .containsExactly(
+                WatchFaceLayer.BASE,
+                WatchFaceLayer.COMPLICATIONS,
+                WatchFaceLayer.COMPLICATIONS_OVERLAY
+            )
         assertThat(setting1.icon).isNull()
         assertThat(setting1.options.size).isEqualTo(2)
         val option20 = (setting2.options[0] as ListOption)
@@ -157,9 +158,7 @@
         assertThat(setting1.id.value).isEqualTo("ComplicationsId")
         assertThat(setting1.displayName).isEqualTo("Complications")
         assertThat(setting1.description).isEqualTo("Controls complication layout")
-        assertThat(setting1.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.COMPLICATIONS
-        )
+        assertThat(setting1.affectedWatchFaceLayers).containsExactly(WatchFaceLayer.COMPLICATIONS)
         assertThat(setting1.icon).isNull()
         assertThat(setting1.options.size).isEqualTo(4)
         val option10 = (setting1.options[0] as ComplicationSlotsOption)
@@ -170,9 +169,8 @@
         val overlays10 = option10.complicationSlotOverlays.toTypedArray()
         assertThat(overlays10.size).isEqualTo(3)
         assertThat(overlays10[0].complicationSlotId).isEqualTo(1)
-        assertThat(overlays10[0].complicationSlotId).isEqualTo(context.resources.getInteger(
-            R.integer.complication_slot_id1
-        ))
+        assertThat(overlays10[0].complicationSlotId)
+            .isEqualTo(context.resources.getInteger(R.integer.complication_slot_id1))
         assertThat(overlays10[0].enabled).isFalse()
         assertThat(overlays10[0].accessibilityTraversalIndex).isNull()
         assertThat(overlays10[0].complicationSlotBounds).isNull()
@@ -194,10 +192,11 @@
         assertThat(overlays11[0].enabled).isNull()
         assertThat(overlays11[0].accessibilityTraversalIndex).isNull()
         assertThat(
-            overlays11[0].complicationSlotBounds!!.perComplicationTypeBounds[
-                ComplicationType.LONG_TEXT
-            ]
-        ).isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
+                overlays11[0]
+                    .complicationSlotBounds!!
+                    .perComplicationTypeBounds[ComplicationType.LONG_TEXT]
+            )
+            .isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
 
         val option12 = (setting1.options[2] as ComplicationSlotsOption)
         assertThat(option12.id).isEqualTo(UserStyleSetting.Option.Id("three"))
@@ -206,15 +205,17 @@
         assertThat(option12.complicationSlotOverlays.size).isEqualTo(1)
         val overlays12 = option12.complicationSlotOverlays.toTypedArray()
         assertThat(
-            overlays12[0].complicationSlotBounds!!.perComplicationTypeBounds[
-                ComplicationType.SHORT_TEXT
-            ]
-        ).isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
+                overlays12[0]
+                    .complicationSlotBounds!!
+                    .perComplicationTypeBounds[ComplicationType.SHORT_TEXT]
+            )
+            .isEqualTo(RectF(0.2f, 0.4f, 0.3f, 0.1f))
         assertThat(
-            overlays12[0].complicationSlotBounds!!.perComplicationTypeBounds[
-                ComplicationType.LONG_TEXT
-            ]
-        ).isEqualTo(RectF(0.6f, 0.8f, 0.7f, 0.5f))
+                overlays12[0]
+                    .complicationSlotBounds!!
+                    .perComplicationTypeBounds[ComplicationType.LONG_TEXT]
+            )
+            .isEqualTo(RectF(0.6f, 0.8f, 0.7f, 0.5f))
 
         val option13 = (setting1.options[3] as ComplicationSlotsOption)
         assertThat(option13.id).isEqualTo(UserStyleSetting.Option.Id("four"))
@@ -232,10 +233,8 @@
         assertThat(setting2.defaultValue).isEqualTo(2.5)
         assertThat(setting2.minimumValue).isEqualTo(-1.5)
         assertThat(setting2.maximumValue).isEqualTo(10.5)
-        assertThat(setting2.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS
-        )
+        assertThat(setting2.affectedWatchFaceLayers)
+            .containsExactly(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS)
         assertThat(setting2.icon).isNull()
 
         val setting3 = schema.userStyleSettings[3] as UserStyleSetting.LongRangeUserStyleSetting
@@ -245,10 +244,8 @@
         assertThat(setting3.defaultValue).isEqualTo(2)
         assertThat(setting3.minimumValue).isEqualTo(-1)
         assertThat(setting3.maximumValue).isEqualTo(10)
-        assertThat(setting3.affectedWatchFaceLayers).containsExactly(
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        assertThat(setting3.affectedWatchFaceLayers)
+            .containsExactly(WatchFaceLayer.COMPLICATIONS, WatchFaceLayer.COMPLICATIONS_OVERLAY)
         assertThat(setting3.icon).isNull()
 
         parser.close()
@@ -270,30 +267,26 @@
         assertThat(schema2.userStyleSettings.size).isEqualTo(2)
 
         // List
-        val simpleListWithParent1 = schema1.userStyleSettings[0]
-            as UserStyleSetting.ListUserStyleSetting
-        val simpleListWithParent2 = schema2.userStyleSettings[0]
-            as UserStyleSetting.ListUserStyleSetting
+        val simpleListWithParent1 =
+            schema1.userStyleSettings[0] as UserStyleSetting.ListUserStyleSetting
+        val simpleListWithParent2 =
+            schema2.userStyleSettings[0] as UserStyleSetting.ListUserStyleSetting
 
         assertThat(simpleListWithParent1).isEqualTo(simpleListWithParent2)
 
         val listParser = context.resources.getXml(R.xml.list_setting_common)
         listParser.moveToStart("ListUserStyleSetting")
 
-        val simpleListSetting = UserStyleSetting.ListUserStyleSetting.inflate(
-            context.resources, listParser, emptyMap()
-        )
+        val simpleListSetting =
+            UserStyleSetting.ListUserStyleSetting.inflate(context.resources, listParser, emptyMap())
 
         assertThat(simpleListWithParent1).isEqualTo(simpleListSetting)
-        assertThat(simpleListSetting.id.value).isEqualTo(
-            context.resources.getString(R.string.list_setting_common_id)
-        )
-        assertThat(simpleListSetting.options[0].id.toString()).isEqualTo(
-            context.resources.getString(R.string.list_setting_common_option_red_id)
-        )
-        assertThat(simpleListSetting.options[1].id.toString()).isEqualTo(
-            context.resources.getString(R.string.list_setting_common_option_green_id)
-        )
+        assertThat(simpleListSetting.id.value)
+            .isEqualTo(context.resources.getString(R.string.list_setting_common_id))
+        assertThat(simpleListSetting.options[0].id.toString())
+            .isEqualTo(context.resources.getString(R.string.list_setting_common_option_red_id))
+        assertThat(simpleListSetting.options[1].id.toString())
+            .isEqualTo(context.resources.getString(R.string.list_setting_common_option_green_id))
 
         // Check override
         val listSetting1 = schema1.userStyleSettings[1] as UserStyleSetting.ListUserStyleSetting
@@ -312,25 +305,24 @@
         assertThat(listSetting1.defaultOptionIndex).isEqualTo(simpleListSetting.defaultOptionIndex)
 
         // Double
-        val simpleDoubleWithParent1 = schema1.userStyleSettings[4]
-            as UserStyleSetting.DoubleRangeUserStyleSetting
-        val simpleDoubleWithParent2 = schema2.userStyleSettings[1]
-            as UserStyleSetting.DoubleRangeUserStyleSetting
+        val simpleDoubleWithParent1 =
+            schema1.userStyleSettings[4] as UserStyleSetting.DoubleRangeUserStyleSetting
+        val simpleDoubleWithParent2 =
+            schema2.userStyleSettings[1] as UserStyleSetting.DoubleRangeUserStyleSetting
 
         assertThat(simpleDoubleWithParent1).isEqualTo(simpleDoubleWithParent2)
 
         val doubleParser = context.resources.getXml(R.xml.double_setting_common)
         doubleParser.moveToStart("DoubleRangeUserStyleSetting")
 
-        val simpleDoubleSetting = UserStyleSetting.DoubleRangeUserStyleSetting.inflate(
-            context.resources, doubleParser
-        )
+        val simpleDoubleSetting =
+            UserStyleSetting.DoubleRangeUserStyleSetting.inflate(context.resources, doubleParser)
 
         assertThat(simpleDoubleWithParent1).isEqualTo(simpleDoubleSetting)
 
         // Check override
-        val doubleSetting1 = schema1.userStyleSettings[5]
-            as UserStyleSetting.DoubleRangeUserStyleSetting
+        val doubleSetting1 =
+            schema1.userStyleSettings[5] as UserStyleSetting.DoubleRangeUserStyleSetting
 
         assertThat(doubleSetting1.id.value).isEqualTo("double_id0")
         assertThat(doubleSetting1.defaultValue).isEqualTo(0.0)
@@ -338,9 +330,8 @@
         assertThat(doubleSetting1.minimumValue).isEqualTo(-1.0)
 
         assertThat(doubleSetting1.displayName).isEqualTo(simpleDoubleSetting.displayName)
-        assertThat(doubleSetting1.affectedWatchFaceLayers).isEqualTo(
-            simpleDoubleSetting.affectedWatchFaceLayers
-        )
+        assertThat(doubleSetting1.affectedWatchFaceLayers)
+            .isEqualTo(simpleDoubleSetting.affectedWatchFaceLayers)
 
         doubleParser.close()
         listParser.close()
@@ -370,8 +361,7 @@
         }
 
         assertThat(flavors!!.flavors.size).isEqualTo(2)
-        assertThat(flavors!!.flavors[0].style.userStyleMap.keys).containsExactly(
-            context.getString(R.string.list_setting_common_id)
-        )
+        assertThat(flavors!!.flavors[0].style.userStyleMap.keys)
+            .containsExactly(context.getString(R.string.list_setting_common_id))
     }
 }
diff --git a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSettingWithStringResourcesTest.kt b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSettingWithStringResourcesTest.kt
index 4fd0c50..9a7ea94 100644
--- a/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSettingWithStringResourcesTest.kt
+++ b/wear/watchface/watchface-style/src/androidTest/java/androidx/wear/watchface/style/UserStyleSettingWithStringResourcesTest.kt
@@ -20,51 +20,54 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.wear.watchface.style.test.R
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
+import androidx.wear.watchface.style.test.R
 import com.google.common.truth.Truth
+import java.util.Locale
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.Locale
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 public class UserStyleSettingWithStringResourcesTest {
 
     private val context =
-        ApplicationProvider.getApplicationContext<Context>().createConfigurationContext(
-            ApplicationProvider.getApplicationContext<Context>().resources.configuration.apply {
-                setLocale(Locale.ENGLISH)
-            }
-        )
-
-    private val colorStyleSetting = UserStyleSetting.ListUserStyleSetting(
-        UserStyleSetting.Id("color_style_setting"),
-        context.resources,
-        R.string.colors_style_setting,
-        R.string.colors_style_setting_description,
-        icon = null,
-        options = listOf(
-            UserStyleSetting.ListUserStyleSetting.ListOption(
-                UserStyleSetting.Option.Id("red_style"),
-                context.resources,
-                R.string.red_style_name,
-                R.string.red_style_name,
-                null
-            ),
-            UserStyleSetting.ListUserStyleSetting.ListOption(
-                UserStyleSetting.Option.Id("green_style"),
-                context.resources,
-                R.string.green_style_name,
-                R.string.green_style_name,
-                null
+        ApplicationProvider.getApplicationContext<Context>()
+            .createConfigurationContext(
+                ApplicationProvider.getApplicationContext<Context>().resources.configuration.apply {
+                    setLocale(Locale.ENGLISH)
+                }
             )
-        ),
-        listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
-    )
+
+    private val colorStyleSetting =
+        UserStyleSetting.ListUserStyleSetting(
+            UserStyleSetting.Id("color_style_setting"),
+            context.resources,
+            R.string.colors_style_setting,
+            R.string.colors_style_setting_description,
+            icon = null,
+            options =
+                listOf(
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        UserStyleSetting.Option.Id("red_style"),
+                        context.resources,
+                        R.string.red_style_name,
+                        R.string.red_style_name,
+                        null
+                    ),
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        UserStyleSetting.Option.Id("green_style"),
+                        context.resources,
+                        R.string.green_style_name,
+                        R.string.green_style_name,
+                        null
+                    )
+                ),
+            listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
+        )
 
     @Test
     public fun stringResources_en() {
@@ -72,18 +75,18 @@
         Truth.assertThat(colorStyleSetting.description).isEqualTo("Watchface colorization")
 
         Truth.assertThat(
-            (
-                colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("red_style")) as
-                    UserStyleSetting.ListUserStyleSetting.ListOption
-                ).displayName
-        ).isEqualTo("Red Style")
+                (colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("red_style"))
+                        as UserStyleSetting.ListUserStyleSetting.ListOption)
+                    .displayName
+            )
+            .isEqualTo("Red Style")
 
         Truth.assertThat(
-            (
-                colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("green_style")) as
-                    UserStyleSetting.ListUserStyleSetting.ListOption
-                ).displayName
-        ).isEqualTo("Green Style")
+                (colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("green_style"))
+                        as UserStyleSetting.ListUserStyleSetting.ListOption)
+                    .displayName
+            )
+            .isEqualTo("Green Style")
     }
 
     // We do want to call updateConfiguration here to test what happens when the locale changes.
@@ -91,62 +94,62 @@
     @Test
     public fun stringResources_it() {
         context.resources.updateConfiguration(
-            context.resources.configuration.apply {
-                setLocale(Locale.ITALIAN)
-            },
+            context.resources.configuration.apply { setLocale(Locale.ITALIAN) },
             context.resources.displayMetrics
         )
         Truth.assertThat(colorStyleSetting.displayName).isEqualTo("Colori")
         Truth.assertThat(colorStyleSetting.description).isEqualTo("Colorazione del quadrante")
 
         Truth.assertThat(
-            (
-                colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("red_style")) as
-                    UserStyleSetting.ListUserStyleSetting.ListOption
-                ).displayName
-        ).isEqualTo("Stile rosso")
+                (colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("red_style"))
+                        as UserStyleSetting.ListUserStyleSetting.ListOption)
+                    .displayName
+            )
+            .isEqualTo("Stile rosso")
 
         Truth.assertThat(
-            (
-                colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("green_style")) as
-                    UserStyleSetting.ListUserStyleSetting.ListOption
-                ).displayName
-        ).isEqualTo("Stile verde")
+                (colorStyleSetting.getOptionForId(UserStyleSetting.Option.Id("green_style"))
+                        as UserStyleSetting.ListUserStyleSetting.ListOption)
+                    .displayName
+            )
+            .isEqualTo("Stile verde")
     }
 
     @Test
     public fun listOptionsWithIndices() {
-        val listUserStyleSetting = ListUserStyleSetting(
-            UserStyleSetting.Id("list"),
-            context.resources,
-            R.string.colors_style_setting,
-            R.string.colors_style_setting_description,
-            icon = null,
-            options = listOf(
-                ListOption(
-                    UserStyleSetting.Option.Id("one"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null
-                ),
-                ListOption(
-                    UserStyleSetting.Option.Id("two"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null
-                ),
-                ListOption(
-                    UserStyleSetting.Option.Id("three"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null
-                )
-            ),
-            listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
+        val listUserStyleSetting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("list"),
+                context.resources,
+                R.string.colors_style_setting,
+                R.string.colors_style_setting_description,
+                icon = null,
+                options =
+                    listOf(
+                        ListOption(
+                            UserStyleSetting.Option.Id("one"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null
+                        ),
+                        ListOption(
+                            UserStyleSetting.Option.Id("two"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null
+                        ),
+                        ListOption(
+                            UserStyleSetting.Option.Id("three"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null
+                        )
+                    ),
+                listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
 
         val option0 = listUserStyleSetting.options[0] as ListOption
         Truth.assertThat(option0.displayName).isEqualTo("1st option")
@@ -164,26 +167,27 @@
     @Test
     @Suppress("deprecation")
     public fun listUserStyleSettingWireFormatRoundTrip_noScreenReaderName() {
-        val listUserStyleSetting = ListUserStyleSetting(
-            UserStyleSetting.Id("list"),
-            context.resources,
-            R.string.colors_style_setting,
-            R.string.colors_style_setting_description,
-            icon = null,
-            options = listOf(
-                ListOption(
-                    UserStyleSetting.Option.Id("one"),
-                    context.resources,
-                    R.string.ith_option,
-                    icon = null
-                )
-            ),
-            listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
+        val listUserStyleSetting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("list"),
+                context.resources,
+                R.string.colors_style_setting,
+                R.string.colors_style_setting_description,
+                icon = null,
+                options =
+                    listOf(
+                        ListOption(
+                            UserStyleSetting.Option.Id("one"),
+                            context.resources,
+                            R.string.ith_option,
+                            icon = null
+                        )
+                    ),
+                listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
 
-        val listUserStyleSettingAfterRoundTrip = ListUserStyleSetting(
-            listUserStyleSetting.toWireFormat()
-        )
+        val listUserStyleSettingAfterRoundTrip =
+            ListUserStyleSetting(listUserStyleSetting.toWireFormat())
 
         val option0 = listUserStyleSettingAfterRoundTrip.options[0] as ListOption
         Truth.assertThat(option0.displayName).isEqualTo("1st option")
@@ -193,39 +197,41 @@
 
     @Test
     public fun complicationSlotsOptionsWithIndices() {
-        val complicationSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting1"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("one"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null,
-                    emptyList()
-                ),
-                ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("two"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null,
-                    emptyList()
-                ),
-                ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("three"),
-                    context.resources,
-                    R.string.ith_option,
-                    R.string.ith_option_screen_reader_name,
-                    icon = null,
-                    emptyList()
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+        val complicationSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting1"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(
+                        ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("one"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null,
+                            emptyList()
+                        ),
+                        ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("two"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null,
+                            emptyList()
+                        ),
+                        ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("three"),
+                            context.resources,
+                            R.string.ith_option,
+                            R.string.ith_option_screen_reader_name,
+                            icon = null,
+                            emptyList()
+                        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         val option0 = complicationSetting.options[0] as ComplicationSlotsOption
         Truth.assertThat(option0.displayName).isEqualTo("1st option")
@@ -244,45 +250,48 @@
     public fun complicationSettingsWithIndices() {
         val one = UserStyleSetting.Id("one")
         val two = UserStyleSetting.Id("two")
-        val schema = UserStyleSchema(
-            listOf(
-                ListUserStyleSetting(
-                    one,
-                    context.resources,
-                    R.string.ith_style,
-                    R.string.ith_style_screen_reader_name,
-                    icon = null,
-                    options = listOf(
-                        ListOption(
-                            UserStyleSetting.Option.Id("one"),
-                            context.resources,
-                            R.string.ith_option,
-                            R.string.ith_option_screen_reader_name,
-                            icon = null
-                        )
+        val schema =
+            UserStyleSchema(
+                listOf(
+                    ListUserStyleSetting(
+                        one,
+                        context.resources,
+                        R.string.ith_style,
+                        R.string.ith_style_screen_reader_name,
+                        icon = null,
+                        options =
+                            listOf(
+                                ListOption(
+                                    UserStyleSetting.Option.Id("one"),
+                                    context.resources,
+                                    R.string.ith_option,
+                                    R.string.ith_option_screen_reader_name,
+                                    icon = null
+                                )
+                            ),
+                        listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
                     ),
-                    listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
-                ),
-                ComplicationSlotsUserStyleSetting(
-                    two,
-                    context.resources,
-                    R.string.ith_style,
-                    R.string.ith_style_screen_reader_name,
-                    icon = null,
-                    complicationConfig = listOf(
-                        ComplicationSlotsOption(
-                            UserStyleSetting.Option.Id("one"),
-                            context.resources,
-                            R.string.ith_option,
-                            R.string.ith_option_screen_reader_name,
-                            icon = null,
-                            emptyList()
-                        )
-                    ),
-                    listOf(WatchFaceLayer.COMPLICATIONS)
+                    ComplicationSlotsUserStyleSetting(
+                        two,
+                        context.resources,
+                        R.string.ith_style,
+                        R.string.ith_style_screen_reader_name,
+                        icon = null,
+                        complicationConfig =
+                            listOf(
+                                ComplicationSlotsOption(
+                                    UserStyleSetting.Option.Id("one"),
+                                    context.resources,
+                                    R.string.ith_option,
+                                    R.string.ith_option_screen_reader_name,
+                                    icon = null,
+                                    emptyList()
+                                )
+                            ),
+                        listOf(WatchFaceLayer.COMPLICATIONS)
+                    )
                 )
             )
-        )
 
         Truth.assertThat(schema[one]!!.displayName).isEqualTo("1st style")
         Truth.assertThat(schema[one]!!.description).isEqualTo("1st style setting")
@@ -292,32 +301,32 @@
 
     @Test
     @Suppress("deprecation")
-    public fun
-    complicationsUserStyleSettingWireFormatRoundTrip_noScreenReaderName_filledByDisplayName() {
-        val complicationSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting1"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("one"),
-                    context.resources,
-                    displayNameResourceId = R.string.ith_option,
-                    icon = null,
-                    emptyList()
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+    public fun complicationsUserStyleSettingWireFormatRoundTrip_noScreenReaderName_filledByDisplayName() { // ktlint-disable max-line-length
+        val complicationSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting1"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(
+                        ComplicationSlotsOption(
+                            UserStyleSetting.Option.Id("one"),
+                            context.resources,
+                            displayNameResourceId = R.string.ith_option,
+                            icon = null,
+                            emptyList()
+                        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
-        val complicationSettingAfterRoundTrip = ComplicationSlotsUserStyleSetting(
-            complicationSetting.toWireFormat()
-        )
+        val complicationSettingAfterRoundTrip =
+            ComplicationSlotsUserStyleSetting(complicationSetting.toWireFormat())
 
         val option0 = complicationSettingAfterRoundTrip.options[0] as ComplicationSlotsOption
         Truth.assertThat(option0.displayName).isEqualTo("1st option")
         // We expect screenReaderName to be back filled by the displayName.
         Truth.assertThat(option0.screenReaderName).isEqualTo("1st option")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
index cf9a673..bc6d176 100644
--- a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
+++ b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
@@ -43,27 +43,26 @@
  * An immutable representation of user style choices that maps each [UserStyleSetting] to
  * [UserStyleSetting.Option].
  *
- * This is intended for use by the WatchFace and entries are the same as the ones specified in
- * the [UserStyleSchema]. This means you can't serialize a UserStyle directly, instead you need
- * to use a [UserStyleData] (see [toUserStyleData]).
+ * This is intended for use by the WatchFace and entries are the same as the ones specified in the
+ * [UserStyleSchema]. This means you can't serialize a UserStyle directly, instead you need to use a
+ * [UserStyleData] (see [toUserStyleData]).
  *
  * To modify the user style, you should call [toMutableUserStyle] and construct a new [UserStyle]
  * instance with [MutableUserStyle.toUserStyle].
  *
  * @param selectedOptions The [UserStyleSetting.Option] selected for each [UserStyleSetting]
  * @param copySelectedOptions Whether to create a copy of the provided [selectedOptions]. If
- * `false`, no mutable copy of the [selectedOptions] map should be retained outside this class.
+ *   `false`, no mutable copy of the [selectedOptions] map should be retained outside this class.
  */
-public class UserStyle private constructor(
+public class UserStyle
+private constructor(
     selectedOptions: Map<UserStyleSetting, UserStyleSetting.Option>,
     copySelectedOptions: Boolean
 ) : Map<UserStyleSetting, UserStyleSetting.Option> {
     private val selectedOptions =
         if (copySelectedOptions) HashMap(selectedOptions) else selectedOptions
 
-    /**
-     * Constructs a copy of the [UserStyle]. It is backed by the same map.
-     */
+    /** Constructs a copy of the [UserStyle]. It is backed by the same map. */
     public constructor(userStyle: UserStyle) : this(userStyle.selectedOptions, false)
 
     /**
@@ -104,13 +103,13 @@
     override val size: Int by selectedOptions::size
 
     /**
-     * Constructs a [UserStyle] from a [UserStyleData] and the [UserStyleSchema]. Unrecognized
-     * style settings will be ignored. Unlisted style settings will be initialized with that
-     * setting's default option.
+     * Constructs a [UserStyle] from a [UserStyleData] and the [UserStyleSchema]. Unrecognized style
+     * settings will be ignored. Unlisted style settings will be initialized with that setting's
+     * default option.
      *
      * @param userStyle The [UserStyle] represented as a [UserStyleData].
      * @param styleSchema The [UserStyleSchema] for this UserStyle, describes how we interpret
-     * [userStyle].
+     *   [userStyle].
      */
     @Suppress("Deprecation") // userStyleSettings
     public constructor(
@@ -171,9 +170,9 @@
         selectedOptions.firstNotNullOfOrNull { if (it.key.id == settingId) it.value else null }
 
     override fun toString(): String =
-        "UserStyle[" + selectedOptions.entries.joinToString(
-            transform = { "${it.key.id} -> ${it.value}" }
-        ) + "]"
+        "UserStyle[" +
+            selectedOptions.entries.joinToString(transform = { "${it.key.id} -> ${it.value}" }) +
+            "]"
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -236,20 +235,20 @@
     override fun isEmpty(): Boolean = selectedOptions.isEmpty()
 }
 
-/**
- * A mutable [UserStyle]. This must be converted back to a [UserStyle] by calling [toUserStyle].
- */
+/** A mutable [UserStyle]. This must be converted back to a [UserStyle] by calling [toUserStyle]. */
 public class MutableUserStyle internal constructor(userStyle: UserStyle) :
     Iterable<Map.Entry<UserStyleSetting, UserStyleSetting.Option>> {
     /** The map from the available settings and the selected option. */
-    private val selectedOptions = HashMap<UserStyleSetting, UserStyleSetting.Option>().apply {
-        for ((setting, option) in userStyle) {
-            this[setting] = option
+    private val selectedOptions =
+        HashMap<UserStyleSetting, UserStyleSetting.Option>().apply {
+            for ((setting, option) in userStyle) {
+                this[setting] = option
+            }
         }
-    }
 
     /** The number of entries in the style. */
-    val size: Int get() = selectedOptions.size
+    val size: Int
+        get() = selectedOptions.size
 
     /** Iterator over the elements of the user style. */
     override fun iterator(): Iterator<Map.Entry<UserStyleSetting, UserStyleSetting.Option>> =
@@ -271,9 +270,9 @@
      *
      * @param setting The [UserStyleSetting] we're setting the [option] for, must be in the schema.
      * @param option the [UserStyleSetting.Option] we're setting. Must be a valid option for
-     * [setting].
+     *   [setting].
      * @throws IllegalArgumentException if [setting] is not in the schema or if [option] is invalid
-     * for [setting].
+     *   for [setting].
      */
     public operator fun set(setting: UserStyleSetting, option: UserStyleSetting.Option) {
         require(selectedOptions.containsKey(setting)) { "Unknown setting $setting" }
@@ -288,12 +287,12 @@
      * Sets the [UserStyleSetting.Option] for the setting with the given [settingId] to the given
      * [option].
      *
-     * @param settingId The [UserStyleSetting.Id] of the  [UserStyleSetting] we're setting the
-     * [option] for, must be in the schema.
+     * @param settingId The [UserStyleSetting.Id] of the [UserStyleSetting] we're setting the
+     *   [option] for, must be in the schema.
      * @param option the [UserStyleSetting.Option] we're setting. Must be a valid option for
-     * [settingId].
+     *   [settingId].
      * @throws IllegalArgumentException if [settingId] is not in the schema or if [option] is
-     * invalid for [settingId].
+     *   invalid for [settingId].
      */
     public operator fun set(settingId: UserStyleSetting.Id, option: UserStyleSetting.Option) {
         val setting = getSettingForId(settingId)
@@ -308,11 +307,11 @@
      * Sets the [UserStyleSetting.Option] for [setting] to the option with the given [optionId].
      *
      * @param setting The [UserStyleSetting] we're setting the [optionId] for, must be in the
-     * schema.
+     *   schema.
      * @param optionId the [UserStyleSetting.Option.Id] for the [UserStyleSetting.Option] we're
-     * setting.
+     *   setting.
      * @throws IllegalArgumentException if [setting] is not in the schema or if [optionId] is
-     * unrecognized.
+     *   unrecognized.
      */
     public operator fun set(setting: UserStyleSetting, optionId: UserStyleSetting.Option.Id) {
         require(selectedOptions.containsKey(setting)) { "Unknown setting $setting" }
@@ -324,8 +323,9 @@
     /**
      * Sets the [UserStyleSetting.Option] for the setting with the given [settingId] to the option
      * with the given [optionId].
+     *
      * @throws IllegalArgumentException if [settingId] is not in the schema or if [optionId] is
-     * unrecognized.
+     *   unrecognized.
      */
     public operator fun set(settingId: UserStyleSetting.Id, optionId: UserStyleSetting.Option.Id) {
         val setting = getSettingForId(settingId)
@@ -360,33 +360,32 @@
     }
 
     override fun toString(): String =
-        "MutableUserStyle[" + selectedOptions.entries.joinToString(
-            transform = { "${it.key.id} -> ${it.value}" }
-        ) + "]"
+        "MutableUserStyle[" +
+            selectedOptions.entries.joinToString(transform = { "${it.key.id} -> ${it.value}" }) +
+            "]"
 }
 
 /**
  * A form of [UserStyle] which is easy to serialize. This is intended for use by the watch face
  * clients and the editor where we can't practically use [UserStyle] due to its limitations.
  */
-public class UserStyleData(
-    public val userStyleMap: Map<String, ByteArray>
-) {
+public class UserStyleData(public val userStyleMap: Map<String, ByteArray>) {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public constructor(
-        userStyle: UserStyleWireFormat
-    ) : this(userStyle.mUserStyle)
+    public constructor(userStyle: UserStyleWireFormat) : this(userStyle.mUserStyle)
 
-    override fun toString(): String = "{" + userStyleMap.entries.joinToString(
-        transform = {
-            try {
-                it.key + "=" + it.value.decodeToString()
-            } catch (e: Exception) {
-                it.key + "=" + it.value
-            }
-        }
-    ) + "}"
+    override fun toString(): String =
+        "{" +
+            userStyleMap.entries.joinToString(
+                transform = {
+                    try {
+                        it.key + "=" + it.value.decodeToString()
+                    } catch (e: Exception) {
+                        it.key + "=" + it.value
+                    }
+                }
+            ) +
+            "}"
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -423,23 +422,18 @@
  * [rootUserStyleSettings] rather than [userStyleSettings] for populating the top level UI.
  *
  * @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.CustomValueUserStyleSetting] in the list. Prior to android T ot most one
- * [UserStyleSetting.ComplicationSlotsUserStyleSetting] is allowed, however from android T it's
- * possible with hierarchical styles for there to be more than one, but at most one can be active at
- * any given time.
+ *   Empty if the watch face doesn't support user styling. Note we allow at most one
+ *   [UserStyleSetting.CustomValueUserStyleSetting] in the list. Prior to android T ot most one
+ *   [UserStyleSetting.ComplicationSlotsUserStyleSetting] is allowed, however from android T it's
+ *   possible with hierarchical styles for there to be more than one, but at most one can be active
+ *   at any given time.
  */
-public class UserStyleSchema constructor(
-    userStyleSettings: List<UserStyleSetting>
-) {
+public class UserStyleSchema constructor(userStyleSettings: List<UserStyleSetting>) {
     public val userStyleSettings = userStyleSettings
-        @Deprecated("use rootUserStyleSettings instead")
-        get
+        @Deprecated("use rootUserStyleSettings instead") get
 
     /** For use with hierarchical schemas, lists all the settings with no parent [Option]. */
-    public val rootUserStyleSettings by lazy {
-        userStyleSettings.filter { !it.hasParent }
-    }
+    public val rootUserStyleSettings by lazy { userStyleSettings.filter { !it.hasParent } }
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -451,9 +445,7 @@
             complicationScaleX: Float,
             complicationScaleY: Float
         ): UserStyleSchema {
-            require(parser.name == "UserStyleSchema") {
-                "Expected a UserStyleSchema node"
-            }
+            require(parser.name == "UserStyleSchema") { "Expected a UserStyleSchema node" }
 
             val idToSetting = HashMap<String, UserStyleSetting>()
             val userStyleSettings = ArrayList<UserStyleSetting>()
@@ -461,35 +453,35 @@
             // Parse the UserStyle declaration.
             parser.iterate {
                 when (parser.name) {
-                    "BooleanUserStyleSetting" -> userStyleSettings.add(
-                        UserStyleSetting.BooleanUserStyleSetting.inflate(resources, parser)
-                    )
-
-                    "ComplicationSlotsUserStyleSetting" -> userStyleSettings.add(
-                        UserStyleSetting.ComplicationSlotsUserStyleSetting.inflate(
-                            resources,
-                            parser,
-                            complicationScaleX,
-                            complicationScaleY
+                    "BooleanUserStyleSetting" ->
+                        userStyleSettings.add(
+                            UserStyleSetting.BooleanUserStyleSetting.inflate(resources, parser)
                         )
-                    )
-
-                    "DoubleRangeUserStyleSetting" -> userStyleSettings.add(
-                        UserStyleSetting.DoubleRangeUserStyleSetting.inflate(resources, parser)
-                    )
-
-                    "ListUserStyleSetting" -> userStyleSettings.add(
-                        UserStyleSetting.ListUserStyleSetting.inflate(
-                            resources,
-                            parser,
-                            idToSetting
+                    "ComplicationSlotsUserStyleSetting" ->
+                        userStyleSettings.add(
+                            UserStyleSetting.ComplicationSlotsUserStyleSetting.inflate(
+                                resources,
+                                parser,
+                                complicationScaleX,
+                                complicationScaleY
+                            )
                         )
-                    )
-
-                    "LongRangeUserStyleSetting" -> userStyleSettings.add(
-                        UserStyleSetting.LongRangeUserStyleSetting.inflate(resources, parser)
-                    )
-
+                    "DoubleRangeUserStyleSetting" ->
+                        userStyleSettings.add(
+                            UserStyleSetting.DoubleRangeUserStyleSetting.inflate(resources, parser)
+                        )
+                    "ListUserStyleSetting" ->
+                        userStyleSettings.add(
+                            UserStyleSetting.ListUserStyleSetting.inflate(
+                                resources,
+                                parser,
+                                idToSetting
+                            )
+                        )
+                    "LongRangeUserStyleSetting" ->
+                        userStyleSettings.add(
+                            UserStyleSetting.LongRangeUserStyleSetting.inflate(resources, parser)
+                        )
                     else -> throw IllegalNodeException(parser)
                 }
                 idToSetting[userStyleSettings.last().id.value] = userStyleSettings.last()
@@ -499,9 +491,7 @@
         }
 
         internal fun UserStyleSchemaWireFormat.toApiFormat(): List<UserStyleSetting> {
-            val userStyleSettings = mSchema.map {
-                UserStyleSetting.createFromWireFormat(it)
-            }
+            val userStyleSettings = mSchema.map { UserStyleSetting.createFromWireFormat(it) }
             val wireUserStyleSettingsIterator = mSchema.iterator()
             for (setting in userStyleSettings) {
                 val wireUserStyleSetting = wireUserStyleSettingsIterator.next()
@@ -541,9 +531,10 @@
             when (setting) {
                 is UserStyleSetting.ComplicationSlotsUserStyleSetting ->
                     complicationSlotsUserStyleSettingCount++
-
                 is UserStyleSetting.CustomValueUserStyleSetting ->
                     customValueUserStyleSettingCount++
+                is UserStyleSetting.CustomValueUserStyleSetting2 ->
+                    customValueUserStyleSettingCount++
                 else -> {
                     // Nothing
                 }
@@ -563,7 +554,7 @@
             validateComplicationSettings(rootUserStyleSettings, null)
         } else {
             require(complicationSlotsUserStyleSettingCount <= 1) {
-               "Prior to Android T, at most only one ComplicationSlotsUserStyleSetting is allowed"
+                "Prior to Android T, at most only one ComplicationSlotsUserStyleSetting is allowed"
             }
         }
 
@@ -618,11 +609,7 @@
                 val optionChildIndices = ArrayList<Int>()
                 for (option in userStyleSetting.options) {
                     for (child in option.childSettings) {
-                        optionChildIndices.add(
-                            userStyleSettings.indexOfFirst {
-                                it == child
-                            }
-                        )
+                        optionChildIndices.add(userStyleSettings.indexOfFirst { it == child })
                     }
                     optionChildIndices.add(-1)
                 }
@@ -634,13 +621,14 @@
     /** @hide */
     @Suppress("Deprecation") // userStyleSettings
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun getDefaultUserStyle() = UserStyle(
-        HashMap<UserStyleSetting, UserStyleSetting.Option>().apply {
-            for (setting in userStyleSettings) {
-                this[setting] = setting.defaultOption
+    public fun getDefaultUserStyle() =
+        UserStyle(
+            HashMap<UserStyleSetting, UserStyleSetting.Option>().apply {
+                for (setting in userStyleSettings) {
+                    this[setting] = setting.defaultOption
+                }
             }
-        }
-    )
+        )
 
     @Suppress("Deprecation") // userStyleSettings
     override fun toString(): String = "[" + userStyleSettings.joinToString() + "]"
@@ -705,9 +693,9 @@
      * the active portion of the UserStyleSchema it returns `null`.
      *
      * @param userStyle The [UserStyle] for which the function will search for the selected
-     * [ComplicationSlotsOption], if any.
+     *   [ComplicationSlotsOption], if any.
      * @return The selected [ComplicationSlotsOption] based on the [userStyle] if any, or `null`
-     * otherwise.
+     *   otherwise.
      */
     public fun findComplicationSlotsOptionForUserStyle(
         userStyle: UserStyle
@@ -722,7 +710,7 @@
  * [MutableStateFlow]<[UserStyle]>.
  *
  * @param schema The [UserStyleSchema] for this CurrentUserStyleRepository which describes the
- * available style categories.
+ *   available style categories.
  */
 public class CurrentUserStyleRepository(public val schema: UserStyleSchema) {
     // Mutable backing field for [userStyle].
@@ -736,6 +724,7 @@
 
     /**
      * The UserStyle options must be from the supplied [UserStyleSchema].
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -755,7 +744,8 @@
             }
             require(setting::class.java == value.getUserStyleSettingClass()) {
                 "The option class (${value::class.java.canonicalName}) in $key must " +
-                    "match the setting class " + setting::class.java.canonicalName
+                    "match the setting class " +
+                    setting::class.java.canonicalName
             }
         }
     }
diff --git a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleFlavors.kt b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleFlavors.kt
index 13d2457..9b0998b 100644
--- a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleFlavors.kt
+++ b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleFlavors.kt
@@ -34,20 +34,18 @@
  * Represents user specified preset of watch face.
  *
  * @param id An arbitrary string that uniquely identifies a flavor within the set of flavors
- * supported by the watch face.
+ *   supported by the watch face.
  * @param style Style info of the flavor represented by [UserStyleData].
  * @param complications Specifies complication data source policy represented by
- * [DefaultComplicationDataSourcePolicy] for each [ComplicationSlot.id] presented in map. For
- * absent complication slots default policies are used.
+ *   [DefaultComplicationDataSourcePolicy] for each [ComplicationSlot.id] presented in map. For
+ *   absent complication slots default policies are used.
  */
 public class UserStyleFlavor(
     public val id: String,
     public val style: UserStyleData,
     public val complications: Map<Int, DefaultComplicationDataSourcePolicy>
 ) {
-    /**
-     * Constructs UserStyleFlavor based on [UserStyle] specified.
-     */
+    /** Constructs UserStyleFlavor based on [UserStyle] specified. */
     constructor(
         id: String,
         style: UserStyle,
@@ -57,12 +55,13 @@
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    constructor(wireFormat: UserStyleFlavorWireFormat) : this(
+    constructor(
+        wireFormat: UserStyleFlavorWireFormat
+    ) : this(
         wireFormat.mId,
         UserStyleData(wireFormat.mStyle),
         wireFormat.mComplications.mapValues { DefaultComplicationDataSourcePolicy(it.value) }
-    ) {
-    }
+    ) {}
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
@@ -74,8 +73,7 @@
             complications.mapValues { it.value.toWireFormat() }
         )
 
-    override fun toString(): String =
-        "UserStyleFlavor[$id: $style, $complications]"
+    override fun toString(): String = "UserStyleFlavor[$id: $style, $complications]"
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -106,9 +104,7 @@
             parser: XmlResourceParser,
             schema: UserStyleSchema
         ): UserStyleFlavor {
-            require(parser.name == "UserStyleFlavor") {
-                "Expected a UserStyleFlavor node"
-            }
+            require(parser.name == "UserStyleFlavor") { "Expected a UserStyleFlavor node" }
 
             val flavorId = getStringRefAttribute(resources, parser, "id")
             require(flavorId != null) { "UserStyleFlavor must have an id" }
@@ -121,9 +117,7 @@
                         val id = getStringRefAttribute(resources, parser, "id")
                         require(id != null) { "StyleOption must have an id" }
 
-                        require(parser.hasValue("value")) {
-                            "value is required for BooleanOption"
-                        }
+                        require(parser.hasValue("value")) { "value is required for BooleanOption" }
                         val value = getStringRefAttribute(resources, parser, "value")
 
                         val setting = schema[UserStyleSetting.Id(id)]
@@ -131,40 +125,41 @@
                         when (setting) {
                             is UserStyleSetting.BooleanUserStyleSetting -> {
                                 userStyle[setting] =
-                                    UserStyleSetting.BooleanUserStyleSetting
-                                        .BooleanOption.from(value!!.toBoolean())
+                                    UserStyleSetting.BooleanUserStyleSetting.BooleanOption.from(
+                                        value!!.toBoolean()
+                                    )
                             }
                             is UserStyleSetting.DoubleRangeUserStyleSetting -> {
                                 userStyle[setting] =
-                                    UserStyleSetting.DoubleRangeUserStyleSetting
-                                        .DoubleRangeOption(value!!.toDouble())
+                                    UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(
+                                        value!!.toDouble()
+                                    )
                             }
                             is UserStyleSetting.LongRangeUserStyleSetting -> {
                                 userStyle[setting] =
-                                    UserStyleSetting.LongRangeUserStyleSetting
-                                        .LongRangeOption(value!!.toLong())
+                                    UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(
+                                        value!!.toLong()
+                                    )
                             }
                             else -> {
-                                userStyle[setting] = setting.getOptionForId(
-                                    UserStyleSetting.Option.Id(value!!)
-                                )
+                                userStyle[setting] =
+                                    setting.getOptionForId(UserStyleSetting.Option.Id(value!!))
                             }
                         }
                     }
                     "ComplicationPolicy" -> {
                         val id = getIntRefAttribute(resources, parser, "slotId")
-                        require(id != null) {
-                            "slotId is required for ComplicationPolicy"
-                        }
+                        require(id != null) { "slotId is required for ComplicationPolicy" }
 
-                        val policy = DefaultComplicationDataSourcePolicy.inflate(
-                            resources,
-                            parser,
-                            "ComplicationPolicy")
+                        val policy =
+                            DefaultComplicationDataSourcePolicy.inflate(
+                                resources,
+                                parser,
+                                "ComplicationPolicy"
+                            )
 
                         complications[id] = policy
                     }
-
                     else -> throw IllegalNodeException(parser)
                 }
             }
@@ -172,7 +167,8 @@
             return UserStyleFlavor(
                 flavorId,
                 userStyle.toUserStyle().toUserStyleData(),
-                complications.toMap())
+                complications.toMap()
+            )
         }
     }
 }
@@ -183,24 +179,20 @@
  * @param flavors List of flavors.
  */
 public class UserStyleFlavors(public val flavors: List<UserStyleFlavor>) {
-    /**
-     * Constructs empty flavors collection.
-     */
+    /** Constructs empty flavors collection. */
     constructor() : this(emptyList()) {}
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    constructor(wireFormat: UserStyleFlavorsWireFormat) : this(
-        wireFormat.mFlavors.map { UserStyleFlavor(it) }
-    ) {
-    }
+    constructor(
+        wireFormat: UserStyleFlavorsWireFormat
+    ) : this(wireFormat.mFlavors.map { UserStyleFlavor(it) }) {}
 
     /** @hide */
     @Suppress("ShowingMemberInHiddenClass")
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    fun toWireFormat() =
-        UserStyleFlavorsWireFormat(flavors.map { it.toWireFormat() })
+    fun toWireFormat() = UserStyleFlavorsWireFormat(flavors.map { it.toWireFormat() })
 
     override fun toString(): String = "$flavors"
 
@@ -228,17 +220,13 @@
             parser: XmlResourceParser,
             schema: UserStyleSchema
         ): UserStyleFlavors {
-            require(parser.name == "UserStyleFlavors") {
-                "Expected a UserStyleFlavors node"
-            }
+            require(parser.name == "UserStyleFlavors") { "Expected a UserStyleFlavors node" }
 
             val flavors = ArrayList<UserStyleFlavor>()
             parser.iterate {
                 when (parser.name) {
-                    "UserStyleFlavor" -> flavors.add(
-                        UserStyleFlavor.inflate(resources, parser, schema)
-                    )
-
+                    "UserStyleFlavor" ->
+                        flavors.add(UserStyleFlavor.inflate(resources, parser, schema))
                     else -> throw IllegalNodeException(parser)
                 }
             }
diff --git a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
index 097a0b2e..7e8ee37 100644
--- a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
+++ b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
@@ -49,7 +49,9 @@
 import androidx.wear.watchface.style.data.ComplicationOverlayWireFormat
 import androidx.wear.watchface.style.data.ComplicationsOptionWireFormat
 import androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat
+import androidx.wear.watchface.style.data.CustomValueOption2WireFormat
 import androidx.wear.watchface.style.data.CustomValueOptionWireFormat
+import androidx.wear.watchface.style.data.CustomValueUserStyleSetting2WireFormat
 import androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.DoubleRangeOptionWireFormat
 import androidx.wear.watchface.style.data.DoubleRangeUserStyleSettingWireFormat
@@ -129,21 +131,23 @@
  * [UserStyleSchema.findComplicationSlotsOptionForUserStyle].
  *
  * @property 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 [UserStyleSetting.Id.MAX_LENGTH].
+ *   companion (typically via bluetooth) so size is a consideration and short ids are encouraged.
+ *   There is a maximum length see [UserStyleSetting.Id.MAX_LENGTH].
  * @property icon [Icon] for use in the companion editor style selection UI.
  * @property watchFaceEditorData Optional data for an on watch face editor, this will not be sent to
- * the companion and its contents may be used in preference to other fields by an on watch face
- * editor.
+ *   the companion and its contents may be used in preference to other fields by an on watch face
+ *   editor.
  * @property 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).
  * @property defaultOptionIndex The default option index, used if nothing has been selected within
- * the [options] list.
+ *   the [options] list.
  * @property affectedWatchFaceLayers Used by the style configuration UI. Describes which rendering
- * layers this style affects.
+ *   layers this style affects.
  */
-public sealed class UserStyleSetting private constructor(
+public sealed class UserStyleSetting
+private constructor(
     public val id: Id,
     private val displayNameInternal: DisplayText,
     private val descriptionInternal: DisplayText,
@@ -191,17 +195,15 @@
      * Optional data for an on watch face editor (not the companion editor).
      *
      * @property icon The icon to use on the watch face editor in preference to
-     * [UserStyleSetting.icon], [ListUserStyleSetting.ListOption.icon] and
-     * [ComplicationSlotsOption.icon]. This Icon should be smaller than the one used by the
-     * companion due to the watches smaller screen size.
+     *   [UserStyleSetting.icon], [ListUserStyleSetting.ListOption.icon] and
+     *   [ComplicationSlotsOption.icon]. This Icon should be smaller than the one used by the
+     *   companion due to the watches smaller screen size.
      */
     public class WatchFaceEditorData(public val icon: Icon?) {
         @Suppress("DEPRECATION")
         internal constructor(wireFormat: Bundle) : this(wireFormat.getParcelable(ICON_KEY))
 
-        internal fun toWireFormat() = Bundle().apply {
-            icon?.let { putParcelable(ICON_KEY, it) }
-        }
+        internal fun toWireFormat() = Bundle().apply { icon?.let { putParcelable(ICON_KEY, it) } }
 
         internal fun write(dos: DataOutputStream) {
             icon?.write(dos)
@@ -212,10 +214,7 @@
 
             @SuppressLint("ResourceType")
             fun inflate(resources: Resources, parser: XmlResourceParser): WatchFaceEditorData {
-                val icon = createIcon(
-                    resources,
-                    parser
-                )
+                val icon = createIcon(resources, parser)
                 return WatchFaceEditorData(icon)
             }
         }
@@ -239,10 +238,11 @@
     /**
      * Estimates the wire size of the UserStyleSetting in bytes. This does not account for the
      * overhead of the serialization method. Where possible the exact wire size for any referenced
-     * [Icon]s is used but this isn't possible in all cases and as a fallback width x height x 4
-     * is used.
+     * [Icon]s is used but this isn't possible in all cases and as a fallback width x height x 4 is
+     * used.
      *
      * Note this method can be slow.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -251,12 +251,15 @@
         @Px maxWidth: Int,
         @Px maxHeight: Int
     ): Int {
-        var sizeEstimate = id.value.length + displayName.length + description.length +
-            4 /** [defaultOptionIndex] */ + affectedWatchFaceLayers.size * 4
+        var sizeEstimate =
+            id.value.length +
+                displayName.length +
+                description.length +
+                4 +
+                /** [defaultOptionIndex] */
+                affectedWatchFaceLayers.size * 4
         icon?.getWireSizeAndDimensions(context)?.let { wireSizeAndDimensions ->
-            wireSizeAndDimensions.wireSizeBytes?.let {
-                sizeEstimate += it
-            }
+            wireSizeAndDimensions.wireSizeBytes?.let { sizeEstimate += it }
             require(
                 wireSizeAndDimensions.width <= maxWidth && wireSizeAndDimensions.height <= maxHeight
             ) {
@@ -266,11 +269,12 @@
             }
         }
         for (option in options) {
-            sizeEstimate += option.estimateWireSizeInBytesAndValidateIconDimensions(
-                context,
-                maxWidth,
-                maxHeight
-            )
+            sizeEstimate +=
+                option.estimateWireSizeInBytesAndValidateIconDimensions(
+                    context,
+                    maxWidth,
+                    maxHeight
+                )
         }
         return sizeEstimate
     }
@@ -309,40 +313,38 @@
     }
 
     public companion object {
+        @Suppress("NewApi") // CustomValueUserStyleSetting2
         internal fun createFromWireFormat(
             wireFormat: UserStyleSettingWireFormat
-        ): UserStyleSetting = when (wireFormat) {
-            is BooleanUserStyleSettingWireFormat -> BooleanUserStyleSetting(wireFormat)
-
-            is ComplicationsUserStyleSettingWireFormat ->
-                ComplicationSlotsUserStyleSetting(wireFormat)
-
-            is CustomValueUserStyleSettingWireFormat -> CustomValueUserStyleSetting(wireFormat)
-
-            is DoubleRangeUserStyleSettingWireFormat -> DoubleRangeUserStyleSetting(wireFormat)
-
-            is ListUserStyleSettingWireFormat -> ListUserStyleSetting(wireFormat)
-
-            is LongRangeUserStyleSettingWireFormat -> LongRangeUserStyleSetting(wireFormat)
-
-            else -> throw IllegalArgumentException(
-                "Unknown UserStyleSettingWireFormat " + wireFormat::javaClass.name
-            )
-        }
-
-        internal fun affectsWatchFaceLayersFlagsToSet(
-            affectsWatchFaceLayers: Int
-        ) = HashSet<WatchFaceLayer>().apply {
-            if ((affectsWatchFaceLayers and 0x1) != 0) {
-                add(WatchFaceLayer.BASE)
+        ): UserStyleSetting =
+            when (wireFormat) {
+                is BooleanUserStyleSettingWireFormat -> BooleanUserStyleSetting(wireFormat)
+                is ComplicationsUserStyleSettingWireFormat ->
+                    ComplicationSlotsUserStyleSetting(wireFormat)
+                is CustomValueUserStyleSettingWireFormat -> CustomValueUserStyleSetting(wireFormat)
+                is CustomValueUserStyleSetting2WireFormat ->
+                    CustomValueUserStyleSetting2(wireFormat)
+                is DoubleRangeUserStyleSettingWireFormat -> DoubleRangeUserStyleSetting(wireFormat)
+                is ListUserStyleSettingWireFormat -> ListUserStyleSetting(wireFormat)
+                is LongRangeUserStyleSettingWireFormat -> LongRangeUserStyleSetting(wireFormat)
+                else ->
+                    throw IllegalArgumentException(
+                        "Unknown UserStyleSettingWireFormat " + wireFormat::javaClass.name
+                    )
             }
-            if ((affectsWatchFaceLayers and 0x2) != 0) {
-                add(WatchFaceLayer.COMPLICATIONS)
+
+        internal fun affectsWatchFaceLayersFlagsToSet(affectsWatchFaceLayers: Int) =
+            HashSet<WatchFaceLayer>().apply {
+                if ((affectsWatchFaceLayers and 0x1) != 0) {
+                    add(WatchFaceLayer.BASE)
+                }
+                if ((affectsWatchFaceLayers and 0x2) != 0) {
+                    add(WatchFaceLayer.COMPLICATIONS)
+                }
+                if ((affectsWatchFaceLayers and 0x4) != 0) {
+                    add(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+                }
             }
-            if ((affectsWatchFaceLayers and 0x4) != 0) {
-                add(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-            }
-        }
 
         internal fun createDisplayText(
             resources: Resources,
@@ -360,16 +362,14 @@
                 }
             } else if (parser.hasValue(attributeId) || defaultValue == null) {
                 DisplayText.CharSequenceDisplayText(
-                    parser.getAttributeValue(NAMESPACE_APP, attributeId) ?: "")
+                    parser.getAttributeValue(NAMESPACE_APP, attributeId) ?: ""
+                )
             } else {
                 defaultValue
             }
         }
 
-        internal fun createIcon(
-            resources: Resources,
-            parser: XmlResourceParser
-        ): Icon? {
+        internal fun createIcon(resources: Resources, parser: XmlResourceParser): Icon? {
             val iconId = parser.getAttributeResourceValue(NAMESPACE_ANDROID, "icon", -1)
             return if (iconId != -1) {
                 Icon.createWithResource(resources.getResourcePackageName(iconId), iconId)
@@ -378,9 +378,7 @@
             }
         }
 
-        /**
-         * Creates appropriate UserStyleSetting base on parent="@xml/..." resource reference.
-         */
+        /** Creates appropriate UserStyleSetting base on parent="@xml/..." resource reference. */
         internal fun <T> createParent(
             resources: Resources,
             parser: XmlResourceParser,
@@ -418,37 +416,30 @@
             parent: UserStyleSetting?,
             inflateDefault: Boolean,
             optionInflater:
-                Pair<String, ((resources: Resources, parser: XmlResourceParser) -> Option)>? = null
+                Pair<String, ((resources: Resources, parser: XmlResourceParser) -> Option)>? =
+                null
         ): Params {
             val settingType = "UserStyleSetting"
-            val id = getStringRefAttribute(resources, parser, "id") ?: parent?.id?.value
-                ?: throw IllegalArgumentException("$settingType must have id")
-            val displayName = createDisplayText(
-                resources,
-                parser,
-                "displayName",
-                parent?.displayNameInternal
-            )
-            val description = createDisplayText(
-                resources,
-                parser,
-                "description",
-                parent?.descriptionInternal
-            )
-            val icon = createIcon(
-                resources,
-                parser
-            ) ?: parent?.icon
+            val id =
+                getStringRefAttribute(resources, parser, "id")
+                    ?: parent?.id?.value
+                        ?: throw IllegalArgumentException("$settingType must have id")
+            val displayName =
+                createDisplayText(resources, parser, "displayName", parent?.displayNameInternal)
+            val description =
+                createDisplayText(resources, parser, "description", parent?.descriptionInternal)
+            val icon = createIcon(resources, parser) ?: parent?.icon
 
-            val defaultOptionIndex = if (inflateDefault) {
-                getAttributeChecked(
-                    parser,
-                    "defaultOptionIndex",
-                    String::toInt,
-                    parent?.defaultOptionIndex ?: 0,
-                    settingType
-                )
-            } else null
+            val defaultOptionIndex =
+                if (inflateDefault) {
+                    getAttributeChecked(
+                        parser,
+                        "defaultOptionIndex",
+                        String::toInt,
+                        parent?.defaultOptionIndex ?: 0,
+                        settingType
+                    )
+                } else null
 
             val affectsWatchFaceLayers =
                 getAttributeChecked(
@@ -464,8 +455,7 @@
             parser.iterate {
                 if (parser.name == "OnWatchEditorData") {
                     if (watchFaceEditorData == null) {
-                        watchFaceEditorData =
-                            WatchFaceEditorData.inflate(resources, parser)
+                        watchFaceEditorData = WatchFaceEditorData.inflate(resources, parser)
                     } else {
                         throw IllegalNodeException(parser)
                     }
@@ -496,7 +486,9 @@
             getOptionForId(Option.Id(id))
         }
 
-    private constructor(wireFormat: UserStyleSettingWireFormat) : this(
+    private constructor(
+        wireFormat: UserStyleSettingWireFormat
+    ) : this(
         Id(wireFormat.mId),
         DisplayText.CharSequenceDisplayText(wireFormat.mDisplayName),
         DisplayText.CharSequenceDisplayText(wireFormat.mDescription),
@@ -551,23 +543,24 @@
         return id.hashCode()
     }
 
-    override fun toString(): String = "{${id.value} : " +
-        options.joinToString(transform = { it.toString() }) + "}"
+    override fun toString(): String =
+        "{${id.value} : " + options.joinToString(transform = { it.toString() }) + "}"
 
     /**
      * Represents a choice within a style setting which can either be an option from the list or a
      * an arbitrary value depending on the nature of the style setting.
      *
      * @property id Machine readable [Id] for the style setting. Identifier for the option (or the
-     * option itself for [CustomValueUserStyleSetting.CustomValueOption]), must be unique within
-     * the UserStyleSetting. Short ids are encouraged.
+     *   option itself for [CustomValueUserStyleSetting.CustomValueOption]), must be unique within
+     *   the UserStyleSetting. Short ids are encouraged.
      * @property childSettings The list of child [UserStyleSetting]s, if any, forming a hierarchy of
-     * [UserStyleSetting]s. These must be in [UserStyleSchema.userStyleSettings]. Child
-     * [UserStyleSetting]s are deemed to be active if the [Option] is selected by the [UserStyle].
-     * This is particularly important is there are multiple [ComplicationSlotsUserStyleSetting]s,
-     * only one of which is allowed to be active at any time.
+     *   [UserStyleSetting]s. These must be in [UserStyleSchema.userStyleSettings]. Child
+     *   [UserStyleSetting]s are deemed to be active if the [Option] is selected by the [UserStyle].
+     *   This is particularly important is there are multiple [ComplicationSlotsUserStyleSetting]s,
+     *   only one of which is allowed to be active at any time.
      */
-    public abstract class Option internal constructor(
+    public abstract class Option
+    internal constructor(
         public val id: Id,
         public val childSettings: Collection<UserStyleSetting>
     ) {
@@ -577,10 +570,18 @@
          */
         constructor(id: Id) : this(id, emptyList())
 
+        /** Returns the maximum allowed size for IDs for this Option in bytes. */
+        internal open fun getMaxIdSizeBytes(): Int = Id.MAX_LENGTH
+
         init {
             for (child in childSettings) {
                 child.hasParent = true
             }
+
+            require(id.value.size <= getMaxIdSizeBytes()) {
+                "Option.Id.value.size (${id.value.size}) must be less than MAX_LENGTH " +
+                    getMaxIdSizeBytes()
+            }
         }
 
         /**
@@ -617,17 +618,19 @@
             public constructor(value: String) : this(value.encodeToByteArray())
 
             public companion object {
-                /** Maximum length of the [value] field. */
+                /**
+                 * Maximum length of the [value] field to ensure acceptable companion editing
+                 * latency. Please note the [UserStyleSchema] and the [UserStyleSetting] are sent
+                 * over bluetooth to the companion phone when editing, and that bandwidth is limited
+                 * (2mbps is common). Best practice is to keep these Ids short, ideally under 10
+                 * bytes.
+                 *
+                 * Note the [UserStyle] has a maximum size ([UserStyle.MAXIMUM_SIZE_BYTES]) and that
+                 * Option Ids are a significant contributor to the overall size of a UserStyle.
+                 */
                 public const val MAX_LENGTH: Int = 1024
             }
 
-            init {
-                require(value.size <= MAX_LENGTH) {
-                    "Option.Id.value.size (${value.size}) must be less than MAX_LENGTH " +
-                        "($MAX_LENGTH)"
-                }
-            }
-
             override fun equals(other: Any?): Boolean {
                 if (this === other) return true
                 if (javaClass != other?.javaClass) return false
@@ -649,33 +652,28 @@
 
         public companion object {
             /** @hide */
+            @Suppress("NewApi")
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-            public fun createFromWireFormat(
-                wireFormat: OptionWireFormat
-            ): Option =
+            public fun createFromWireFormat(wireFormat: OptionWireFormat): Option =
                 when (wireFormat) {
                     is BooleanOptionWireFormat ->
                         BooleanUserStyleSetting.BooleanOption.fromWireFormat(wireFormat)
-
                     is ComplicationsOptionWireFormat ->
                         ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(wireFormat)
-
                     is CustomValueOptionWireFormat ->
                         CustomValueUserStyleSetting.CustomValueOption(wireFormat)
-
+                    is CustomValueOption2WireFormat ->
+                        CustomValueUserStyleSetting2.CustomValueOption(wireFormat)
                     is DoubleRangeOptionWireFormat ->
                         DoubleRangeUserStyleSetting.DoubleRangeOption(wireFormat)
-
-                    is ListOptionWireFormat ->
-                        ListUserStyleSetting.ListOption(wireFormat)
-
+                    is ListOptionWireFormat -> ListUserStyleSetting.ListOption(wireFormat)
                     is LongRangeOptionWireFormat ->
                         LongRangeUserStyleSetting.LongRangeOption(wireFormat)
-
-                    else -> throw IllegalArgumentException(
-                        "Unknown UserStyleSettingWireFormat.OptionWireFormat " +
-                            wireFormat::javaClass.name
-                    )
+                    else ->
+                        throw IllegalArgumentException(
+                            "Unknown UserStyleSettingWireFormat.OptionWireFormat " +
+                                wireFormat::javaClass.name
+                        )
                 }
         }
 
@@ -715,9 +713,9 @@
      *
      * @param optionId The [Option.Id] of the option
      * @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.
+     *   [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: Option.Id): Option =
         options.find { it.id.value.contentEquals(optionId.value) } ?: options[defaultOptionIndex]
@@ -730,21 +728,21 @@
          *
          * @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 companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this BooleanUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             displayName: CharSequence,
             description: CharSequence,
@@ -772,19 +770,19 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param resources The [Resources] from which [displayNameResourceId] and
-         * [descriptionResourceId] are loaded.
-         * @param displayNameResourceId String resource id for a human readable name for the element,
-         * used in the userStyle selection UI.
+         *   [descriptionResourceId] are loaded.
+         * @param displayNameResourceId String resource id for a human readable name for the
+         *   element, used in the userStyle selection UI.
          * @param descriptionResourceId String resource id for a human readable description string
-         * displayed under the displayName.
+         *   displayed under the displayName.
          * @param icon [Icon] for use in the companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this BooleanUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          */
         @JvmOverloads
         public constructor(
@@ -810,7 +808,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -856,21 +854,16 @@
             @SuppressLint("ResourceType")
             fun inflate(resources: Resources, parser: XmlResourceParser): BooleanUserStyleSetting {
                 val settingType = "BooleanUserStyleSetting"
-                val parent =
-                    createParent(resources, parser, settingType, ::inflate)
-                val defaultValue = getAttributeChecked(
-                    parser,
-                    "defaultBoolean",
-                    String::toBoolean,
-                    parent?.getDefaultValue(),
-                    settingType
-                )
-                val params = createBaseWithParent(
-                    resources,
-                    parser,
-                    parent,
-                    inflateDefault = false
-                )
+                val parent = createParent(resources, parser, settingType, ::inflate)
+                val defaultValue =
+                    getAttributeChecked(
+                        parser,
+                        "defaultBoolean",
+                        String::toBoolean,
+                        parent?.getDefaultValue(),
+                        settingType
+                    )
+                val params = createBaseWithParent(resources, parser, parent, inflateDefault = false)
                 return BooleanUserStyleSetting(
                     params.id,
                     params.displayName,
@@ -885,18 +878,14 @@
 
         /**
          * Represents a true or false option in the [BooleanUserStyleSetting].
+         *
          * @param value The boolean value this instance represents.
          */
-        public class BooleanOption private constructor(
-            public val value: Boolean
-        ) : Option(
-            Id(ByteArray(1).apply { this[0] = if (value) 1 else 0 }),
-            emptyList()
-        ) {
+        public class BooleanOption private constructor(public val value: Boolean) :
+            Option(Id(ByteArray(1).apply { this[0] = if (value) 1 else 0 }), emptyList()) {
             /** @hide */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-            override fun toWireFormat(): BooleanOptionWireFormat =
-                BooleanOptionWireFormat(id.value)
+            override fun toWireFormat(): BooleanOptionWireFormat = BooleanOptionWireFormat(id.value)
 
             internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 BooleanUserStyleSetting::class.java
@@ -909,11 +898,9 @@
             }
 
             public companion object {
-                @JvmField
-                public val TRUE = BooleanOption(true)
+                @JvmField public val TRUE = BooleanOption(true)
 
-                @JvmField
-                public val FALSE = BooleanOption(false)
+                @JvmField public val FALSE = BooleanOption(false)
 
                 @JvmStatic
                 public fun from(value: Boolean): BooleanOption {
@@ -921,9 +908,7 @@
                 }
 
                 @JvmStatic
-                internal fun fromWireFormat(
-                    wireFormat: BooleanOptionWireFormat
-                ): BooleanOption {
+                internal fun fromWireFormat(wireFormat: BooleanOptionWireFormat): BooleanOption {
                     return from(wireFormat.mId[0] == 1.toByte())
                 }
             }
@@ -939,11 +924,11 @@
      *
      * The ComplicationsManager listens for style changes with this setting and when a
      * [ComplicationSlotsOption] is selected the overrides are automatically applied. Note its
-     * suggested that the default [ComplicationSlotOverlay] (the first entry in the list) does
-     * not apply any overrides.
+     * suggested that the default [ComplicationSlotOverlay] (the first entry in the list) does not
+     * apply any overrides.
      *
      * From android T multiple [ComplicationSlotsUserStyleSetting] are allowed in a style hierarchy
-     * as long as at  most one is active for any permutation of [UserStyle]. Prior to android T only
+     * as long as at most one is active for any permutation of [UserStyle]. Prior to android T only
      * a single ComplicationSlotsUserStyleSetting was allowed.
      *
      * Not to be confused with complication data source selection.
@@ -978,25 +963,25 @@
          * initial config (as specified in it's constructor) when the setting is selected.
          *
          * @param complicationSlotId The id of the [androidx.wear.watchface.ComplicationSlot] to
-         * configure.
+         *   configure.
          * @param enabled If non null, whether the complication should be enabled for this
-         * configuration. If null then no changes are made.
+         *   configuration. If null then no changes are made.
          * @param complicationSlotBounds If non null, the [ComplicationSlotBounds] 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.
+         *   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.
          * @param nameResourceId If non null, the string resource identifier for name of the
-         * complication slot, for this configuration. These strings should be short (perhaps 10
-         * characters max) E.g. complication slots named 'left' and 'right' might be shown by the
-         * editor in a list from which the user selects a complication slot for editing.
-         * @param screenReaderNameResourceId If non null, the string resource identifier for
-         * the screen reader name of the complication slot, for this configuration. While similar to
-         * [nameResourceId] this string can be longer and should be more descriptive. E.g. saying
-         * 'left complication' rather than just 'left'.
+         *   complication slot, for this configuration. These strings should be short (perhaps 10
+         *   characters max) E.g. complication slots named 'left' and 'right' might be shown by the
+         *   editor in a list from which the user selects a complication slot for editing.
+         * @param screenReaderNameResourceId If non null, the string resource identifier for the
+         *   screen reader name of the complication slot, for this configuration. While similar to
+         *   [nameResourceId] this string can be longer and should be more descriptive. E.g. saying
+         *   'left complication' rather than just 'left'.
          */
-
-        public class ComplicationSlotOverlay constructor(
+        public class ComplicationSlotOverlay
+        constructor(
             public val complicationSlotId: Int,
             @Suppress("AutoBoxing")
             @get:Suppress("AutoBoxing")
@@ -1020,20 +1005,20 @@
 
             /**
              * @deprecated This constructor is deprecated in favour of the one that specifies
-             * optional parameters nameResourceId and screenReaderNameResourceId
-             * [ComplicationSlotOverlay(Int, Boolean?, ComplicationSlotBounds?, Int?, Int?, Int?]
+             *   optional parameters nameResourceId and screenReaderNameResourceId
+             *   [ComplicationSlotOverlay(Int, Boolean?, ComplicationSlotBounds?, Int?, Int?, Int?]
              */
             @Deprecated(
-                message = "This constructor is deprecated in favour of the one that specifies " +
-                    "optional parameters nameResourceId and screenReaderNameResourceId",
-                level = DeprecationLevel.WARNING)
+                message =
+                    "This constructor is deprecated in favour of the one that specifies " +
+                        "optional parameters nameResourceId and screenReaderNameResourceId",
+                level = DeprecationLevel.WARNING
+            )
             public constructor(
                 complicationSlotId: Int,
-                @Suppress("AutoBoxing")
-                enabled: Boolean? = null,
+                @Suppress("AutoBoxing") enabled: Boolean? = null,
                 complicationSlotBounds: ComplicationSlotBounds? = null,
-                @SuppressWarnings("AutoBoxing")
-                accessibilityTraversalIndex: Int? = null
+                @SuppressWarnings("AutoBoxing") accessibilityTraversalIndex: Int? = null
             ) : this(
                 complicationSlotId,
                 enabled,
@@ -1054,12 +1039,10 @@
             /**
              * Constructs a [ComplicationSlotOverlay].Builder.
              *
-             * @param complicationSlotId The id of the [androidx.wear.watchface.ComplicationSlot]
-             * to configure.
+             * @param complicationSlotId The id of the [androidx.wear.watchface.ComplicationSlot] to
+             *   configure.
              */
-            public class Builder(
-                private val complicationSlotId: Int
-            ) {
+            public class Builder(private val complicationSlotId: Int) {
                 private var enabled: Boolean? = null
                 private var complicationSlotBounds: ComplicationSlotBounds? = null
                 private var accessibilityTraversalIndex: Int? = null
@@ -1068,26 +1051,23 @@
 
                 /** Overrides the complication's enabled flag. */
                 @Suppress("MissingGetterMatchingBuilder")
-                public fun setEnabled(enabled: Boolean): Builder = apply {
-                    this.enabled = enabled
-                }
+                public fun setEnabled(enabled: Boolean): Builder = apply { this.enabled = enabled }
 
                 /** Overrides the complication's per [ComplicationSlotBounds]. */
                 public fun setComplicationSlotBounds(
                     complicationSlotBounds: ComplicationSlotBounds
-                ): Builder = apply {
-                    this.complicationSlotBounds = complicationSlotBounds
-                }
+                ): Builder = apply { this.complicationSlotBounds = complicationSlotBounds }
 
                 /**
                  * Overrides the [androidx.wear.watchface.ComplicationSlot]'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).
+                 * complications by their initial accessibilityTraversalIndex (usually the same as
+                 * their id).
                  */
-                public fun setAccessibilityTraversalIndex(accessibilityTraversalIndex: Int):
-                    Builder = apply {
+                public fun setAccessibilityTraversalIndex(
+                    accessibilityTraversalIndex: Int
+                ): Builder = apply {
                     this.accessibilityTraversalIndex = accessibilityTraversalIndex
                 }
 
@@ -1105,10 +1085,10 @@
                  * slot, for use by a screen reader. This resource should be a short sentence. E.g.
                  * "Left complication" for the left complication.
                  */
-                public fun setScreenReaderNameResourceId(screenReaderNameResourceId: Int):
-                    Builder = apply {
-                    this.screenReaderNameResourceId = screenReaderNameResourceId
-                }
+                public fun setScreenReaderNameResourceId(screenReaderNameResourceId: Int): Builder =
+                    apply {
+                        this.screenReaderNameResourceId = screenReaderNameResourceId
+                    }
 
                 public fun build(): ComplicationSlotOverlay =
                     ComplicationSlotOverlay(
@@ -1132,20 +1112,18 @@
                     ComplicationOverlayWireFormat.ENABLED_UNKNOWN -> null
                     ComplicationOverlayWireFormat.ENABLED_YES -> true
                     ComplicationOverlayWireFormat.ENABLED_NO -> false
-                    else -> throw InvalidParameterException(
-                        "Unrecognised wireFormat.mEnabled " + wireFormat.mEnabled
-                    )
+                    else ->
+                        throw InvalidParameterException(
+                            "Unrecognised wireFormat.mEnabled " + wireFormat.mEnabled
+                        )
                 },
                 wireFormat.mPerComplicationTypeBounds?.let { perComplicationTypeBounds ->
                     ComplicationSlotBounds.createFromPartialMap(
-                        perComplicationTypeBounds.mapKeys {
-                            ComplicationType.fromWireType(it.key)
-                        },
+                        perComplicationTypeBounds.mapKeys { ComplicationType.fromWireType(it.key) },
                         perComplicationTypeMargins?.let { margins ->
-                            margins.mapKeys {
-                                ComplicationType.fromWireType(it.key)
-                            }
-                        } ?: emptyMap()
+                            margins.mapKeys { ComplicationType.fromWireType(it.key) }
+                        }
+                            ?: emptyMap()
                     )
                 },
                 wireFormat.accessibilityTraversalIndex,
@@ -1217,19 +1195,14 @@
                     complicationScaleX: Float,
                     complicationScaleY: Float
                 ): ComplicationSlotOverlay {
-                    val complicationSlotId = getIntRefAttribute(
-                        resources, parser, "complicationSlotId"
-                    )
+                    val complicationSlotId =
+                        getIntRefAttribute(resources, parser, "complicationSlotId")
                     require(complicationSlotId != null) {
                         "ComplicationSlotOverlay missing complicationSlotId"
                     }
                     val enabled =
                         if (parser.hasValue("enabled")) {
-                            parser.getAttributeBooleanValue(
-                                NAMESPACE_APP,
-                                "enabled",
-                                true
-                            )
+                            parser.getAttributeBooleanValue(NAMESPACE_APP, "enabled", true)
                         } else {
                             null
                         }
@@ -1245,30 +1218,23 @@
                         }
                     val nameResourceId =
                         if (parser.hasValue("name")) {
-                            parser.getAttributeResourceValue(
-                                NAMESPACE_APP,
-                                "name",
-                                0
-                            )
+                            parser.getAttributeResourceValue(NAMESPACE_APP, "name", 0)
                         } else {
                             null
                         }
                     val screenReaderNameResourceId =
                         if (parser.hasValue("screenReaderName")) {
-                            parser.getAttributeResourceValue(
-                                NAMESPACE_APP,
-                                "screenReaderName",
-                                0
-                            )
+                            parser.getAttributeResourceValue(NAMESPACE_APP, "screenReaderName", 0)
                         } else {
                             null
                         }
-                    val bounds = ComplicationSlotBounds.inflate(
-                        resources,
-                        parser,
-                        complicationScaleX,
-                        complicationScaleY
-                    )
+                    val bounds =
+                        ComplicationSlotBounds.inflate(
+                            resources,
+                            parser,
+                            complicationScaleX,
+                            complicationScaleY
+                        )
 
                     return ComplicationSlotOverlay(
                         complicationSlotId,
@@ -1287,24 +1253,23 @@
          *
          * @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 companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param complicationConfig The configuration for affected complications.
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects, must include
-         * [WatchFaceLayer.COMPLICATIONS].
+         *   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].
          * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
-         * sent to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          * @hide
          */
         @JvmOverloads
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public constructor (
+        public constructor(
             id: Id,
             displayName: CharSequence,
             description: CharSequence,
@@ -1331,25 +1296,24 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param resources The [Resources] from which [displayNameResourceId] and
-         * [descriptionResourceId] are loaded.
-         * @param displayNameResourceId String resource id for a human readable name for the element,
-         * used in the userStyle selection UI.
+         *   [descriptionResourceId] are loaded.
+         * @param displayNameResourceId String resource id for a human readable name for the
+         *   element, used in the userStyle selection UI.
          * @param descriptionResourceId String resource id for a human readable description string
-         * displayed under the displayName.
+         *   displayed under the displayName.
          * @param icon [Icon] for use in the companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param complicationConfig The configuration for affected complications.
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects, must include
-         * [WatchFaceLayer.COMPLICATIONS].
+         *   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].
          * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
-         * sent to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          */
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             resources: Resources,
             @StringRes displayNameResourceId: Int,
@@ -1370,7 +1334,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -1397,9 +1361,7 @@
                 val optionsIterator = options.iterator()
                 for (bundle in optionsOnWatchFaceEditorIcons) {
                     val option = optionsIterator.next() as ComplicationSlotsOption
-                    bundle?.let {
-                        option.watchFaceEditorData = WatchFaceEditorData(it)
-                    }
+                    bundle?.let { option.watchFaceEditorData = WatchFaceEditorData(it) }
                 }
             }
             wireFormat.mPerOptionScreenReaderNames?.let { perOptionScreenReaderNames ->
@@ -1437,12 +1399,13 @@
 
         internal companion object {
             private fun <T> bindScale(
-                function: (
-                    resources: Resources,
-                    parser: XmlResourceParser,
-                    complicationScaleX: Float,
-                    complicationScaleY: Float
-                ) -> T,
+                function:
+                    ( // ktlint-disable parameter-list-wrapping
+                        resources: Resources,
+                        parser: XmlResourceParser,
+                        complicationScaleX: Float,
+                        complicationScaleY: Float
+                    ) -> T,
                 complicationScaleX: Float,
                 complicationScaleY: Float
             ): (resources: Resources, parser: XmlResourceParser) -> T {
@@ -1459,22 +1422,25 @@
                 complicationScaleX: Float,
                 complicationScaleY: Float
             ): ComplicationSlotsUserStyleSetting {
-                val params = createBaseWithParent(
-                    resources,
-                    parser,
-                    createParent(
+                val params =
+                    createBaseWithParent(
                         resources,
                         parser,
-                        "ComplicationSlotsUserStyleSetting",
-                        bindScale(::inflate, complicationScaleX, complicationScaleY)
-                    ),
-                    inflateDefault = true,
-                    optionInflater = "ComplicationSlotsOption" to bindScale(
-                        ComplicationSlotsOption::inflate,
-                        complicationScaleX,
-                        complicationScaleY
+                        createParent(
+                            resources,
+                            parser,
+                            "ComplicationSlotsUserStyleSetting",
+                            bindScale(::inflate, complicationScaleX, complicationScaleY)
+                        ),
+                        inflateDefault = true,
+                        optionInflater =
+                            "ComplicationSlotsOption" to
+                                bindScale(
+                                    ComplicationSlotsOption::inflate,
+                                    complicationScaleX,
+                                    complicationScaleY
+                                )
                     )
-                )
                 return ComplicationSlotsUserStyleSetting(
                     params.id,
                     params.displayName,
@@ -1524,9 +1490,8 @@
             public val icon: Icon?
 
             /**
-             * Optional data for an on watch face editor, this will not be sent to the companion
-             * and its contents may be used in preference to other fields by an on watch face
-             * editor.
+             * Optional data for an on watch face editor, this will not be sent to the companion and
+             * its contents may be used in preference to other fields by an on watch face editor.
              */
             public var watchFaceEditorData: WatchFaceEditorData?
                 internal set
@@ -1536,17 +1501,17 @@
              *
              * @param id [Id] for the element, must be unique.
              * @param displayName Localized human readable name for the element, used in the
-             * userStyle selection UI. This should be short, ideally < 20 characters.
-             * @param screenReaderName Localized human readable name for the element, used by
-             * screen readers. This should be more descriptive than [displayName].
+             *   userStyle selection UI. This should be short, ideally < 20 characters.
+             * @param screenReaderName Localized human readable name for the element, used by screen
+             *   readers. This should be more descriptive than [displayName].
              * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   companion over bluetooth and should be small (ideally a few kb in size).
              * @param complicationSlotOverlays Overlays to be applied when this
-             * ComplicationSlotsOption is selected. If this is empty then the net result is the
-             * initial complication configuration.
+             *   ComplicationSlotsOption is selected. If this is empty then the net result is the
+             *   initial complication configuration.
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              * @hide
              */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -1561,8 +1526,7 @@
             ) : super(id, emptyList()) {
                 this.complicationSlotOverlays = complicationSlotOverlays
                 displayNameInternal = DisplayText.CharSequenceDisplayText(displayName)
-                screenReaderNameInternal =
-                    DisplayText.CharSequenceDisplayText(screenReaderName)
+                screenReaderNameInternal = DisplayText.CharSequenceDisplayText(screenReaderName)
                 this.icon = icon
                 this.watchFaceEditorData = watchFaceEditorData
             }
@@ -1574,18 +1538,18 @@
              * @param id [Id] for the element, must be unique.
              * @param resources The [Resources] from which [displayNameResourceId] is load.
              * @param displayNameResourceId String resource id for a human readable name for the
-             * element, used in the userStyle selection UI. This should be short, ideally < 20
-             * characters. Note if the resource string contains `%1$s` that will get replaced with
-             * the 1-based ordinal (1st, 2nd, 3rd etc...) of the ComplicationSlotsOption in the list
-             * of ComplicationSlotsOptions.
+             *   element, used in the userStyle selection UI. This should be short, ideally < 20
+             *   characters. Note if the resource string contains `%1$s` that will get replaced with
+             *   the 1-based ordinal (1st, 2nd, 3rd etc...) of the ComplicationSlotsOption in the
+             *   list of ComplicationSlotsOptions.
              * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   companion over bluetooth and should be small (ideally a few kb in size).
              * @param complicationSlotOverlays Overlays to be applied when this
-             * ComplicationSlotsOption is selected. If this is empty then the net result is the
-             * initial complication configuration.
+             *   ComplicationSlotsOption is selected. If this is empty then the net result is the
+             *   initial complication configuration.
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              */
             @Deprecated("Use a constructor that sets the screenReaderNameResourceId")
             @JvmOverloads
@@ -1612,24 +1576,24 @@
              * @param id [Id] for the element, must be unique.
              * @param resources The [Resources] from which [displayNameResourceId] is load.
              * @param displayNameResourceId String resource id for a human readable name for the
-             * element, used in the userStyle selection UI. This should be short, ideally < 20
-             * characters.  Note if the resource string contains `%1$s` that will get replaced with
-             * the 1-based ordinal (1st, 2nd, 3rd etc...) of the ComplicationSlotsOption in the list
-             * of ComplicationSlotsOptions.
+             *   element, used in the userStyle selection UI. This should be short, ideally < 20
+             *   characters. Note if the resource string contains `%1$s` that will get replaced with
+             *   the 1-based ordinal (1st, 2nd, 3rd etc...) of the ComplicationSlotsOption in the
+             *   list of ComplicationSlotsOptions.
              * @param screenReaderNameResourceId String resource id for a human readable name for
-             * the element, used by screen readers. This should be more descriptive than
-             * [displayNameResourceId]. Note if the resource string contains `%1$s` that will get
-             * replaced with the 1-based ordinal (1st, 2nd, 3rd etc...) of the
-             * ComplicationSlotsOption in the list of ComplicationSlotsOptions. Note prior to
-             * android T this is ignored by companion editors.
+             *   the element, used by screen readers. This should be more descriptive than
+             *   [displayNameResourceId]. Note if the resource string contains `%1$s` that will get
+             *   replaced with the 1-based ordinal (1st, 2nd, 3rd etc...) of the
+             *   ComplicationSlotsOption in the list of ComplicationSlotsOptions. Note prior to
+             *   android T this is ignored by companion editors.
              * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   companion over bluetooth and should be small (ideally a few kb in size).
              * @param complicationSlotOverlays Overlays to be applied when this
-             * ComplicationSlotsOption is selected. If this is empty then the net result is the
-             * initial complication configuration.
+             *   ComplicationSlotsOption is selected. If this is empty then the net result is the
+             *   initial complication configuration.
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              */
             @JvmOverloads
             public constructor(
@@ -1672,10 +1636,12 @@
                     wireFormat.mComplicationOverlays.mapIndexed { index, value ->
                         ComplicationSlotOverlay(
                             value,
-                            wireFormat.mComplicationOverlaysMargins?.get(index)
+                            wireFormat.mComplicationOverlaysMargins
+                                ?.get(index)
                                 ?.mPerComplicationTypeMargins,
                             wireFormat.mComplicationNameResourceIds?.get(index)?.asResourceId(),
-                            wireFormat.mComplicationScreenReaderNameResourceIds?.get(index)
+                            wireFormat.mComplicationScreenReaderNameResourceIds
+                                ?.get(index)
                                 ?.asResourceId()
                         )
                     }
@@ -1694,16 +1660,12 @@
                 @Px maxHeight: Int
             ): Int {
                 var sizeEstimate = id.value.size + displayName.length
-                screenReaderName?.let {
-                    sizeEstimate + it.length
-                }
+                screenReaderName?.let { sizeEstimate + it.length }
                 for (overlay in complicationSlotOverlays) {
                     sizeEstimate += overlay.estimateWireSizeInBytes()
                 }
                 icon?.getWireSizeAndDimensions(context)?.let { wireSizeAndDimensions ->
-                    wireSizeAndDimensions.wireSizeBytes?.let {
-                        sizeEstimate += it
-                    }
+                    wireSizeAndDimensions.wireSizeBytes?.let { sizeEstimate += it }
                     require(
                         wireSizeAndDimensions.width <= maxWidth &&
                             wireSizeAndDimensions.height <= maxHeight
@@ -1718,8 +1680,7 @@
 
             /** @hide */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-            override fun toWireFormat():
-                ComplicationsOptionWireFormat =
+            override fun toWireFormat(): ComplicationsOptionWireFormat =
                 ComplicationsOptionWireFormat(
                     id.value,
                     displayName,
@@ -1727,10 +1688,10 @@
                     complicationSlotOverlays.map { it.toWireFormat() }.toTypedArray(),
                     complicationSlotOverlays.map { overlay ->
                         PerComplicationTypeMargins(
-                            overlay.complicationSlotBounds
-                                ?.perComplicationTypeMargins?.mapKeys {
-                                    it.key.toWireComplicationType()
-                                } ?: emptyMap()
+                            overlay.complicationSlotBounds?.perComplicationTypeMargins?.mapKeys {
+                                it.key.toWireComplicationType()
+                            }
+                                ?: emptyMap()
                         )
                     },
                     complicationSlotOverlays.map { it.nameResourceId ?: 0 },
@@ -1758,37 +1719,36 @@
                 ): ComplicationSlotsOption {
                     val id = getStringRefAttribute(resources, parser, "id")
                     require(id != null) { "ComplicationSlotsOption must have an id" }
-                    val displayName = createDisplayText(
-                        resources,
-                        parser,
-                        "displayName",
-                        indexedResourceNamesSupported = true
-                    )
-                    val screenReaderName = createDisplayText(
-                        resources,
-                        parser,
-                        "nameForScreenReaders",
-                        defaultValue = displayName,
-                        indexedResourceNamesSupported = true
-                    )
-                    val icon = createIcon(
-                        resources,
-                        parser
-                    )
+                    val displayName =
+                        createDisplayText(
+                            resources,
+                            parser,
+                            "displayName",
+                            indexedResourceNamesSupported = true
+                        )
+                    val screenReaderName =
+                        createDisplayText(
+                            resources,
+                            parser,
+                            "nameForScreenReaders",
+                            defaultValue = displayName,
+                            indexedResourceNamesSupported = true
+                        )
+                    val icon = createIcon(resources, parser)
 
                     var watchFaceEditorData: WatchFaceEditorData? = null
                     val complicationSlotOverlays = ArrayList<ComplicationSlotOverlay>()
                     parser.iterate {
                         when (parser.name) {
-                            "ComplicationSlotOverlay" -> complicationSlotOverlays.add(
-                                ComplicationSlotOverlay.inflate(
-                                    resources,
-                                    parser,
-                                    complicationScaleX,
-                                    complicationScaleY
+                            "ComplicationSlotOverlay" ->
+                                complicationSlotOverlays.add(
+                                    ComplicationSlotOverlay.inflate(
+                                        resources,
+                                        parser,
+                                        complicationScaleX,
+                                        complicationScaleY
+                                    )
                                 )
-                            )
-
                             "OnWatchEditorData" -> {
                                 if (watchFaceEditorData == null) {
                                     watchFaceEditorData =
@@ -1797,7 +1757,6 @@
                                     throw IllegalNodeException(parser)
                                 }
                             }
-
                             else -> throw IllegalNodeException(parser)
                         }
                     }
@@ -1848,23 +1807,32 @@
                 parser: XmlResourceParser
             ): DoubleRangeUserStyleSetting {
                 val settingType = "DoubleRangeUserStyleSetting"
-                val parent =
-                    createParent(resources, parser, settingType, ::inflate)
-                val maxDouble = getAttributeChecked(
-                    parser, "maxDouble", String::toDouble, parent?.maximumValue, settingType
-                )
-                val minDouble = getAttributeChecked(
-                    parser, "minDouble", String::toDouble, parent?.minimumValue, settingType
-                )
-                val defaultDouble = getAttributeChecked(
-                    parser, "defaultDouble", String::toDouble, parent?.defaultValue, settingType
-                )
-                val params = createBaseWithParent(
-                    resources,
-                    parser,
-                    parent,
-                    inflateDefault = false
-                )
+                val parent = createParent(resources, parser, settingType, ::inflate)
+                val maxDouble =
+                    getAttributeChecked(
+                        parser,
+                        "maxDouble",
+                        String::toDouble,
+                        parent?.maximumValue,
+                        settingType
+                    )
+                val minDouble =
+                    getAttributeChecked(
+                        parser,
+                        "minDouble",
+                        String::toDouble,
+                        parent?.minimumValue,
+                        settingType
+                    )
+                val defaultDouble =
+                    getAttributeChecked(
+                        parser,
+                        "defaultDouble",
+                        String::toDouble,
+                        parent?.defaultValue,
+                        settingType
+                    )
+                val params = createBaseWithParent(resources, parser, parent, inflateDefault = false)
                 return DoubleRangeUserStyleSetting(
                     params.id,
                     params.displayName,
@@ -1884,23 +1852,23 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param displayName Localized human readable name for the element, used in the user style
-         * selection UI.
+         *   selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this DoubleRangeUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             displayName: CharSequence,
             description: CharSequence,
@@ -1926,30 +1894,29 @@
         )
 
         /**
-         * Constructs a DoubleRangeUserStyleSetting where
-         * [DoubleRangeUserStyleSetting.displayName] and
-         * [DoubleRangeUserStyleSetting.description] are specified as resources.
+         * Constructs a DoubleRangeUserStyleSetting where [DoubleRangeUserStyleSetting.displayName]
+         * and [DoubleRangeUserStyleSetting.description] are specified as resources.
          *
          * @param id [Id] for the element, must be unique.
          * @param resources The [Resources] from which [displayNameResourceId] and
-         * [descriptionResourceId] are loaded.
-         * @param displayNameResourceId String resource id for a human readable name for the element,
-         * used in the userStyle selection UI.
+         *   [descriptionResourceId] are loaded.
+         * @param displayNameResourceId String resource id for a human readable name for the
+         *   element, used in the userStyle selection UI.
          * @param descriptionResourceId String resource id for a human readable description string
-         * displayed under the displayName.
+         *   displayed under the displayName.
          * @param icon [Icon] for use in the companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this DoubleRangeUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          */
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             resources: Resources,
             @StringRes displayNameResourceId: Int,
@@ -1975,7 +1942,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2014,7 +1981,7 @@
                 defaultOptionIndex,
                 affectedWatchFaceLayers.map { it.ordinal },
                 watchFaceEditorData?.toWireFormat(),
-                /* optionsOnWatchFaceEditorIcons = */null
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
 
         /** Represents an option as a [Double] in the range [minimumValue .. maximumValue]. */
@@ -2027,7 +1994,9 @@
              *
              * @param value The value of this DoubleRangeOption
              */
-            public constructor(value: Double) : super(
+            public constructor(
+                value: Double
+            ) : super(
                 Id(ByteArray(8).apply { ByteBuffer.wrap(this).putDouble(value) }),
                 emptyList()
             ) {
@@ -2070,9 +2039,8 @@
 
         /** We support all values in the range [min ... max] not just min & max. */
         override fun getOptionForId(optionId: Option.Id): Option =
-            options.find { it.id.value.contentEquals(optionId.value) } ?: checkedOptionForId(
-                optionId.value
-            )
+            options.find { it.id.value.contentEquals(optionId.value) }
+                ?: checkedOptionForId(optionId.value)
 
         private fun checkedOptionForId(optionId: ByteArray): DoubleRangeOption {
             return try {
@@ -2096,17 +2064,17 @@
          *
          * @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 companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param options List of all options for this ListUserStyleSetting.
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultOption The default option, used when data isn't persisted.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          * @hide
          */
         @JvmOverloads
@@ -2137,23 +2105,23 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param resources The [Resources] from which [displayNameResourceId] and
-         * [descriptionResourceId] are loaded.
-         * @param displayNameResourceId String resource id for a human readable name for the element,
-         * used in the userStyle selection UI.
+         *   [descriptionResourceId] are loaded.
+         * @param displayNameResourceId String resource id for a human readable name for the
+         *   element, used in the userStyle selection UI.
          * @param descriptionResourceId String resource id for a human readable description string
-         * displayed under the displayName.
+         *   displayed under the displayName.
          * @param icon [Icon] for use in the companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param options List of all options for this ListUserStyleSetting.
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultOption The default option, used when data isn't persisted.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          */
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             resources: Resources,
             @StringRes displayNameResourceId: Int,
@@ -2174,7 +2142,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2199,9 +2167,7 @@
                 val optionsIterator = options.iterator()
                 for (bundle in optionsOnWatchFaceEditorIcons) {
                     val option = optionsIterator.next() as ListOption
-                    bundle?.let {
-                        option.watchFaceEditorData = WatchFaceEditorData(it)
-                    }
+                    bundle?.let { option.watchFaceEditorData = WatchFaceEditorData(it) }
                 }
             }
             wireFormat.mPerOptionScreenReaderNames?.let { perOptionScreenReaderNames ->
@@ -2237,11 +2203,12 @@
 
         internal companion object {
             private fun <T> bindIdToSetting(
-                function: (
-                    resources: Resources,
-                    parser: XmlResourceParser,
-                    idToSetting: Map<String, UserStyleSetting>
-                ) -> T,
+                function:
+                    ( // ktlint-disable parameter-list-wrapping
+                        resources: Resources,
+                        parser: XmlResourceParser,
+                        idToSetting: Map<String, UserStyleSetting>
+                    ) -> T,
                 idToSetting: Map<String, UserStyleSetting>
             ): (resources: Resources, parser: XmlResourceParser) -> T {
                 return { resources: Resources, parser: XmlResourceParser ->
@@ -2256,18 +2223,19 @@
                 parser: XmlResourceParser,
                 idToSetting: Map<String, UserStyleSetting>
             ): ListUserStyleSetting {
-                val params = createBaseWithParent(
-                    resources,
-                    parser,
-                    createParent(
+                val params =
+                    createBaseWithParent(
                         resources,
                         parser,
-                        "ListUserStyleSetting",
-                        bindIdToSetting(::inflate, idToSetting)
-                    ),
-                    inflateDefault = true,
-                    "ListOption" to bindIdToSetting(ListOption::inflate, idToSetting)
-                )
+                        createParent(
+                            resources,
+                            parser,
+                            "ListUserStyleSetting",
+                            bindIdToSetting(::inflate, idToSetting)
+                        ),
+                        inflateDefault = true,
+                        "ListOption" to bindIdToSetting(ListOption::inflate, idToSetting)
+                    )
                 return ListUserStyleSetting(
                     params.id,
                     params.displayName,
@@ -2303,7 +2271,7 @@
 
             /**
              * Optional localized human readable name for the setting, used by screen readers. This
-             * should be more descriptive than [displayName].  Note prior to android T this is
+             * should be more descriptive than [displayName]. Note prior to android T this is
              * ignored by companion editors.
              */
             public val screenReaderName: CharSequence?
@@ -2313,9 +2281,8 @@
             public val icon: Icon?
 
             /**
-             * Optional data for an on watch face editor, this will not be sent to the companion
-             * and its contents may be used in preference to other fields by an on watch face
-             * editor.
+             * Optional data for an on watch face editor, this will not be sent to the companion and
+             * its contents may be used in preference to other fields by an on watch face editor.
              */
             public var watchFaceEditorData: WatchFaceEditorData?
                 internal set
@@ -2324,18 +2291,19 @@
              * Constructs a ListOption.
              *
              * @param id The [Id] of this ListOption, must be unique within the
-             * [ListUserStyleSetting].
-             ** @param displayName Localized human readable name for the element, used in the
-             * userStyle selection UI. This should be short, ideally < 20 characters.
-             * @param screenReaderName Localized human readable name for the element, used by
-             * screen readers. This should be more descriptive than [displayName].
+             *   [ListUserStyleSetting].
+             * * @param displayName Localized human readable name for the element, used in the
+             *   userStyle selection UI. This should be short, ideally < 20 characters.
+             *
+             * @param screenReaderName Localized human readable name for the element, used by screen
+             *   readers. This should be more descriptive than [displayName].
              * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   companion over bluetooth and should be small (ideally a few kb in size).
              * @param childSettings The list of child [UserStyleSetting]s, which may be empty. Any
-             * child settings must be listed in [UserStyleSchema.userStyleSettings].
-             * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
-             * sent to the companion and its contents may be used in preference to other fields by
-             * an on watch face editor.
+             *   child settings must be listed in [UserStyleSchema.userStyleSettings].
+             * @param watchFaceEditorData Optional data for an on watch face editor, this will not
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              * @hide
              */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -2348,8 +2316,7 @@
                 watchFaceEditorData: WatchFaceEditorData? = null
             ) : super(id, childSettings) {
                 displayNameInternal = DisplayText.CharSequenceDisplayText(displayName)
-                screenReaderNameInternal =
-                    DisplayText.CharSequenceDisplayText(screenReaderName)
+                screenReaderNameInternal = DisplayText.CharSequenceDisplayText(screenReaderName)
                 this.icon = icon
                 this.watchFaceEditorData = watchFaceEditorData
             }
@@ -2358,18 +2325,18 @@
              * Constructs a ListOption.
              *
              * @param id The [Id] of this ListOption, must be unique within the
-             * [ListUserStyleSetting].
+             *   [ListUserStyleSetting].
              * @param resources The [Resources] used to load [displayNameResourceId].
              * @param displayNameResourceId String resource id for a human readable name for the
-             * element, used in the userStyle selection UI. This should be short, ideally < 20
-             * characters. Note if the resource string contains `%1$s` that will get replaced with
-             * the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the list of
-             * ListOptions.
+             *   element, used in the userStyle selection UI. This should be short, ideally < 20
+             *   characters. Note if the resource string contains `%1$s` that will get replaced with
+             *   the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the list of
+             *   ListOptions.
              * @param icon [Icon] for use in the companion style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size)
+             *   companion over bluetooth and should be small (ideally a few kb in size)
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              */
             @JvmOverloads
             @Deprecated("Use a constructor that sets the screenReaderNameResourceId")
@@ -2391,18 +2358,18 @@
              * Constructs a ListOption.
              *
              * @param id The [Id] of this ListOption, must be unique within the
-             * [ListUserStyleSetting].
+             *   [ListUserStyleSetting].
              * @param resources The [Resources] used to load [displayNameResourceId].
              * @param displayNameResourceId String resource id for a human readable name for the
-             * element, used in the userStyle selection UI. This should be short, ideally < 20
-             * characters.
-             * @param icon [Icon] for use in the style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   element, used in the userStyle selection UI. This should be short, ideally < 20
+             *   characters.
+             * @param icon [Icon] for use in the style selection UI. This gets sent to the companion
+             *   over bluetooth and should be small (ideally a few kb in size).
              * @param childSettings The list of child [UserStyleSetting]s, which may be empty. Any
-             * child settings must be listed in [UserStyleSchema.userStyleSettings].
+             *   child settings must be listed in [UserStyleSchema.userStyleSettings].
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              */
             @Deprecated("Use a constructor that sets the screenReaderNameResourceId")
             constructor(
@@ -2424,25 +2391,25 @@
              * Constructs a ListOption.
              *
              * @param id The [Id] of this ListOption, must be unique within the
-             * [ListUserStyleSetting].
+             *   [ListUserStyleSetting].
              * @param resources The [Resources] used to load [displayNameResourceId].
              * @param displayNameResourceId String resource id for a human readable name for the
-             * element, used in the userStyle selection UI. This should be short, ideally < 20
-             * characters. Note if the resource string contains `%1$s` that will get replaced with
-             * the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the list of
-             * ListOptions.
+             *   element, used in the userStyle selection UI. This should be short, ideally < 20
+             *   characters. Note if the resource string contains `%1$s` that will get replaced with
+             *   the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the list of
+             *   ListOptions.
              * @param screenReaderNameResourceId String resource id for a human readable name for
-             * the element, used by screen readers. This should be more descriptive than
-             * [displayNameResourceId]. Note if the resource string contains `%1$s` that will get
-             * replaced with the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the
-             * list of ListOptions. Note prior to android T this is ignored by companion editors.
-             * @param icon [Icon] for use in the style selection UI. This gets sent to the
-             * companion over bluetooth and should be small (ideally a few kb in size).
+             *   the element, used by screen readers. This should be more descriptive than
+             *   [displayNameResourceId]. Note if the resource string contains `%1$s` that will get
+             *   replaced with the 1-based ordinal (1st, 2nd, 3rd etc...) of the ListOption in the
+             *   list of ListOptions. Note prior to android T this is ignored by companion editors.
+             * @param icon [Icon] for use in the style selection UI. This gets sent to the companion
+             *   over bluetooth and should be small (ideally a few kb in size).
              * @param childSettings The list of child [UserStyleSetting]s, which may be empty. Any
-             * child settings must be listed in [UserStyleSchema.userStyleSettings].
+             *   child settings must be listed in [UserStyleSchema.userStyleSettings].
              * @param watchFaceEditorData Optional data for an on watch face editor, this will not
-             * be sent to the companion and its contents may be used in preference to other fields
-             * by an on watch face editor.
+             *   be sent to the companion and its contents may be used in preference to other fields
+             *   by an on watch face editor.
              */
             @JvmOverloads
             constructor(
@@ -2494,13 +2461,9 @@
                 @Px maxHeight: Int
             ): Int {
                 var sizeEstimate = id.value.size + displayName.length
-                screenReaderName?.let {
-                    sizeEstimate + it.length
-                }
+                screenReaderName?.let { sizeEstimate + it.length }
                 icon?.getWireSizeAndDimensions(context)?.let { wireSizeAndDimensions ->
-                    wireSizeAndDimensions.wireSizeBytes?.let {
-                        sizeEstimate += it
-                    }
+                    wireSizeAndDimensions.wireSizeBytes?.let { sizeEstimate += it }
                     require(
                         wireSizeAndDimensions.width <= maxWidth &&
                             wireSizeAndDimensions.height <= maxHeight
@@ -2516,11 +2479,7 @@
             /** @hide */
             @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
             override fun toWireFormat(): ListOptionWireFormat =
-                ListOptionWireFormat(
-                    id.value,
-                    displayName,
-                    icon
-                )
+                ListOptionWireFormat(id.value, displayName, icon)
 
             override fun write(dos: DataOutputStream) {
                 dos.write(id.value)
@@ -2539,23 +2498,22 @@
                 ): ListOption {
                     val id = getStringRefAttribute(resources, parser, "id")
                     require(id != null) { "ListOption must have an id" }
-                    val displayName = createDisplayText(
-                        resources,
-                        parser,
-                        "displayName",
-                        indexedResourceNamesSupported = true
-                    )
-                    val screenReaderName = createDisplayText(
-                        resources,
-                        parser,
-                        "nameForScreenReaders",
-                        defaultValue = displayName,
-                        indexedResourceNamesSupported = true
-                    )
-                    val icon = createIcon(
-                        resources,
-                        parser
-                    )
+                    val displayName =
+                        createDisplayText(
+                            resources,
+                            parser,
+                            "displayName",
+                            indexedResourceNamesSupported = true
+                        )
+                    val screenReaderName =
+                        createDisplayText(
+                            resources,
+                            parser,
+                            "nameForScreenReaders",
+                            defaultValue = displayName,
+                            indexedResourceNamesSupported = true
+                        )
+                    val icon = createIcon(resources, parser)
 
                     var watchFaceEditorData: WatchFaceEditorData? = null
                     val childSettings = ArrayList<UserStyleSetting>()
@@ -2563,9 +2521,7 @@
                         when (parser.name) {
                             "ChildSetting" -> {
                                 val childId = getStringRefAttribute(resources, parser, "id")
-                                require(childId != null) {
-                                    "ChildSetting must have an id"
-                                }
+                                require(childId != null) { "ChildSetting must have an id" }
                                 val setting = idToSetting[childId]
                                 require(setting != null) {
                                     "Unknown ChildSetting id $childId, note only backward " +
@@ -2573,7 +2529,6 @@
                                 }
                                 childSettings.add(setting)
                             }
-
                             "OnWatchEditorData" -> {
                                 if (watchFaceEditorData == null) {
                                     watchFaceEditorData =
@@ -2582,7 +2537,6 @@
                                     throw IllegalNodeException(parser)
                                 }
                             }
-
                             else -> throw IllegalNodeException(parser)
                         }
                     }
@@ -2623,10 +2577,7 @@
                         LongRangeOption(maximumValue)
                     )
                 } else {
-                    listOf(
-                        LongRangeOption(minimumValue),
-                        LongRangeOption(maximumValue)
-                    )
+                    listOf(LongRangeOption(minimumValue), LongRangeOption(maximumValue))
                 }
             }
 
@@ -2636,23 +2587,32 @@
                 parser: XmlResourceParser
             ): LongRangeUserStyleSetting {
                 val settingType = "LongRangeUserStyleSetting"
-                val parent =
-                    createParent(resources, parser, settingType, ::inflate)
-                val maxInteger = getAttributeChecked(
-                    parser, "maxLong", String::toLong, parent?.maximumValue, settingType
-                )
-                val minInteger = getAttributeChecked(
-                    parser, "minLong", String::toLong, parent?.minimumValue, settingType
-                )
-                val defaultInteger = getAttributeChecked(
-                    parser, "defaultLong", String::toLong, parent?.defaultValue, settingType
-                )
-                val params = createBaseWithParent(
-                    resources,
-                    parser,
-                    parent,
-                    inflateDefault = false
-                )
+                val parent = createParent(resources, parser, settingType, ::inflate)
+                val maxInteger =
+                    getAttributeChecked(
+                        parser,
+                        "maxLong",
+                        String::toLong,
+                        parent?.maximumValue,
+                        settingType
+                    )
+                val minInteger =
+                    getAttributeChecked(
+                        parser,
+                        "minLong",
+                        String::toLong,
+                        parent?.minimumValue,
+                        settingType
+                    )
+                val defaultInteger =
+                    getAttributeChecked(
+                        parser,
+                        "defaultLong",
+                        String::toLong,
+                        parent?.defaultValue,
+                        settingType
+                    )
+                val params = createBaseWithParent(resources, parser, parent, inflateDefault = false)
                 return LongRangeUserStyleSetting(
                     params.id,
                     params.displayName,
@@ -2672,23 +2632,23 @@
          *
          * @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 companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this LongRangeUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             displayName: CharSequence,
             description: CharSequence,
@@ -2719,24 +2679,24 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param resources The [Resources] from which [displayNameResourceId] and
-         * [descriptionResourceId] are loaded.
-         * @param displayNameResourceId String resource id for a human readable name for the element,
-         * used in the userStyle selection UI.
+         *   [descriptionResourceId] are loaded.
+         * @param displayNameResourceId String resource id for a human readable name for the
+         *   element, used in the userStyle selection UI.
          * @param descriptionResourceId String resource id for a human readable description string
-         * displayed under the displayName.
+         *   displayed under the displayName.
          * @param icon [Icon] for use in the companion userStyle selection UI. This gets sent to the
-         * companion over bluetooth and should be small (ideally a few kb in size).
+         *   companion over bluetooth and should be small (ideally a few kb in size).
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value for this LongRangeUserStyleSetting.
-         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be sent
-         * to the companion and its contents may be used in preference to other fields by an on
-         * watch face editor.
+         * @param watchFaceEditorData Optional data for an on watch face editor, this will not be
+         *   sent to the companion and its contents may be used in preference to other fields by an
+         *   on watch face editor.
          */
         @JvmOverloads
-        public constructor (
+        public constructor(
             id: Id,
             resources: Resources,
             @StringRes displayNameResourceId: Int,
@@ -2762,7 +2722,7 @@
             affectsWatchFaceLayers
         )
 
-        internal constructor (
+        internal constructor(
             id: Id,
             displayName: DisplayText,
             description: DisplayText,
@@ -2801,12 +2761,10 @@
                 defaultOptionIndex,
                 affectedWatchFaceLayers.map { it.ordinal },
                 watchFaceEditorData?.toWireFormat(),
-                /* optionsOnWatchFaceEditorIcons = */null
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
 
-        /**
-         * Represents an option a [Long] in the range [minimumValue .. maximumValue].
-         */
+        /** Represents an option a [Long] in the range [minimumValue .. maximumValue]. */
         public class LongRangeOption : Option {
             /* The value for this option. Must be within the range [minimumValue..maximumValue]. */
             public val value: Long
@@ -2816,7 +2774,9 @@
              *
              * @param value The value of this LongRangeOption
              */
-            public constructor(value: Long) : super(
+            public constructor(
+                value: Long
+            ) : super(
                 Id(ByteArray(8).apply { ByteBuffer.wrap(this).putLong(value) }),
                 emptyList()
             ) {
@@ -2857,13 +2817,10 @@
         public val defaultValue: Long
             get() = (options[defaultOptionIndex] as LongRangeOption).value
 
-        /**
-         * We support all values in the range [min ... max] not just min & max.
-         */
+        /** We support all values in the range [min ... max] not just min & max. */
         override fun getOptionForId(optionId: Option.Id): Option =
-            options.find { it.id.value.contentEquals(optionId.value) } ?: checkedOptionForId(
-                optionId.value
-            )
+            options.find { it.id.value.contentEquals(optionId.value) }
+                ?: checkedOptionForId(optionId.value)
 
         private fun checkedOptionForId(optionId: ByteArray): LongRangeOption {
             return try {
@@ -2882,7 +2839,11 @@
     /**
      * 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. Only a single
-     * [ComplicationSlotsUserStyleSetting] is permitted in the [UserStyleSchema].
+     * [ComplicationSlotsUserStyleSetting] or [CustomValueUserStyleSetting2] is permitted in the
+     * [UserStyleSchema].
+     *
+     * The [CustomValueOption] can store at most [Option.Id.MAX_LENGTH] bytes. If you need more
+     * storage, consider using [CustomValueUserStyleSetting2].
      */
     public class CustomValueUserStyleSetting : UserStyleSetting {
         internal companion object {
@@ -2893,10 +2854,10 @@
          * Constructs a CustomValueUserStyleSetting.
          *
          * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
-         * face rendering layers this style affects.
+         *   face rendering layers this style affects.
          * @param defaultValue The default value [ByteArray].
          */
-        public constructor (
+        public constructor(
             affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultValue: ByteArray
         ) : super(
@@ -2923,7 +2884,7 @@
                 getWireFormatOptionsList(),
                 affectedWatchFaceLayers.map { it.ordinal },
                 watchFaceEditorData?.toWireFormat(),
-                /* optionsOnWatchFaceEditorIcons = */null
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
 
         /**
@@ -2931,15 +2892,18 @@
          * as the [CustomValueOption.id].
          */
         public class CustomValueOption : Option {
-            /* The [ByteArray] value for this option which is the same as the [id]. */
+            /**
+             * The [ByteArray] value for this option which is the same as the [id]. Note the maximum
+             * size in bytes is [Option.Id.MAX_LENGTH].
+             */
             public val customValue: ByteArray
                 get() = id.value
 
             /**
              * Constructs a CustomValueOption.
              *
-             * @param customValue The [ByteArray] [id] and value of this CustomValueOption. This
-             * may not exceed [Id.MAX_LENGTH].
+             * @param customValue The [ByteArray] [id] and value of this CustomValueOption. This may
+             *   not exceed [Option.Id.MAX_LENGTH].
              */
             public constructor(customValue: ByteArray) : super(Id(customValue), emptyList())
 
@@ -2961,9 +2925,113 @@
         }
 
         override fun getOptionForId(optionId: Option.Id): Option =
-            options.find { it.id.value.contentEquals(optionId.value) } ?: CustomValueOption(
-                optionId.value
+            options.find { it.id.value.contentEquals(optionId.value) }
+                ?: CustomValueOption(optionId.value)
+    }
+
+    /**
+     * An application specific style setting which supports a larger maximum size than
+     * [CustomValueUserStyleSetting]. This style is ignored by the system editor. This is expected
+     * to be used in conjunction with an on watch face editor. Only a single
+     * [ComplicationSlotsUserStyleSetting] or [CustomValueUserStyleSetting2] is permitted in the
+     * [UserStyleSchema].
+     *
+     * The [CustomValueOption] can store at most [Option.Id.MAX_LENGTH] bytes.
+     */
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    public class CustomValueUserStyleSetting2 : UserStyleSetting {
+        internal companion object {
+            internal const val CUSTOM_VALUE_USER_STYLE_SETTING_ID = "CustomValue"
+        }
+
+        /**
+         * Constructs a CustomValueUserStyleSetting2.
+         *
+         * @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(
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
+            defaultValue: ByteArray
+        ) : super(
+            Id(CUSTOM_VALUE_USER_STYLE_SETTING_ID),
+            DisplayText.CharSequenceDisplayText(""),
+            DisplayText.CharSequenceDisplayText(""),
+            null,
+            null,
+            listOf(CustomValueOption(defaultValue)),
+            0,
+            affectsWatchFaceLayers
+        )
+
+        internal constructor(wireFormat: CustomValueUserStyleSetting2WireFormat) : super(wireFormat)
+
+        /** @hide */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        override fun toWireFormat(): CustomValueUserStyleSetting2WireFormat =
+            CustomValueUserStyleSetting2WireFormat(
+                id.value,
+                displayName,
+                description,
+                icon,
+                getWireFormatOptionsList(),
+                affectedWatchFaceLayers.map { it.ordinal },
+                watchFaceEditorData?.toWireFormat(),
+                /* optionsOnWatchFaceEditorIcons = */ null
             )
+
+        /**
+         * An application specific custom value. NB the [CustomValueOption.customValue] is the same
+         * as the [CustomValueOption.id].
+         */
+        public class CustomValueOption : Option {
+            /**
+             * The [ByteArray] value for this option which is the same as the [id]. Note the maximum
+             * size in bytes is [MAX_SIZE].
+             */
+            public val customValue: ByteArray
+                get() = id.value
+
+            /**
+             * Constructs a CustomValueOption.
+             *
+             * @param customValue The [ByteArray] [id] and value of this CustomValueOption. This may
+             *   not exceed [Option.Id.MAX_LENGTH].
+             */
+            public constructor(customValue: ByteArray) : super(Id(customValue), emptyList())
+
+            internal constructor(
+                wireFormat: CustomValueOption2WireFormat
+            ) : super(Id(wireFormat.mId), emptyList())
+
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+                CustomValueUserStyleSetting2::class.java
+
+            /** @hide */
+            @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+            override fun toWireFormat(): CustomValueOption2WireFormat =
+                CustomValueOption2WireFormat(id.value)
+
+            override fun write(dos: DataOutputStream) {
+                dos.write(id.value)
+            }
+
+            public companion object {
+                /**
+                 * The maximum size of [customValue] in bytes. This is based on the following
+                 * assumptions: 2mbps bluetooth bandwidth and a 50 millisecond transfer time (above
+                 * 50ms delays become quite noticeable).
+                 */
+                public const val MAX_SIZE: Int = 125000
+            }
+
+            override fun getMaxIdSizeBytes(): Int = CustomValueOption.MAX_SIZE
+        }
+
+        override fun getOptionForId(optionId: Option.Id): Option =
+            options.find { it.id.value.contentEquals(optionId.value) }
+                ?: CustomValueOption(optionId.value)
     }
 }
 
@@ -2973,17 +3041,11 @@
 ) {
     val uniqueIds = HashSet<UserStyleSetting.Option.Id>()
     for (option in options) {
-        require(uniqueIds.add(option.id)) {
-            "duplicated option id: ${option.id} in $setting"
-        }
+        require(uniqueIds.add(option.id)) { "duplicated option id: ${option.id} in $setting" }
     }
 }
 
-internal class WireSizeAndDimensions(
-    val wireSizeBytes: Int?,
-    val width: Int,
-    val height: Int
-)
+internal class WireSizeAndDimensions(val wireSizeBytes: Int?, val width: Int, val height: Int)
 
 @RequiresApi(Build.VERSION_CODES.P)
 internal class IconHelper {
@@ -2997,7 +3059,6 @@
                         context.resources
                     )
                 }
-
                 Icon.TYPE_URI -> {
                     if (icon.uri.scheme == ContentResolver.SCHEME_CONTENT) {
                         context.contentResolver.openInputStream(icon.uri)?.let {
@@ -3005,7 +3066,6 @@
                         }
                     }
                 }
-
                 Icon.TYPE_URI_ADAPTIVE_BITMAP -> {
                     if (icon.uri.scheme == ContentResolver.SCHEME_CONTENT) {
                         context.contentResolver.openInputStream(icon.uri)?.let {
@@ -3024,9 +3084,7 @@
                     dos.writeInt(icon.resId)
                     dos.writeUTF(icon.resPackage)
                 }
-
                 Icon.TYPE_URI -> dos.writeUTF(icon.uri.toString())
-
                 Icon.TYPE_URI_ADAPTIVE_BITMAP -> dos.writeUTF(icon.uri.toString())
             }
 
@@ -3065,13 +3123,7 @@
     try {
         val wireSize = stream.available()
         val options = BitmapFactory.Options().apply { inJustDecodeBounds = true }
-        BitmapFactory.decodeResourceStream(
-            resources,
-            TypedValue(),
-            stream,
-            null,
-            options
-        )
+        BitmapFactory.decodeResourceStream(resources, TypedValue(), stream, null, options)
         return WireSizeAndDimensions(wireSize, options.outWidth, options.outHeight)
     } finally {
         stream.close()
@@ -3079,8 +3131,8 @@
 }
 
 /**
- * Gets the attribute specified by name. If there is no such attribute, applies defaultValue.
- * Throws exception if calculated result is null.
+ * Gets the attribute specified by name. If there is no such attribute, applies defaultValue. Throws
+ * exception if calculated result is null.
  */
 private fun <T> getAttributeChecked(
     parser: XmlResourceParser,
@@ -3092,18 +3144,13 @@
     return if (parser.hasValue(name)) {
         converter(parser.getAttributeValue(NAMESPACE_APP, name)!!)
     } else {
-        defaultValue ?: throw IllegalArgumentException(
-            "$name is required for $settingType")
+        defaultValue ?: throw IllegalArgumentException("$name is required for $settingType")
     }
 }
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun getStringRefAttribute(
-    resources: Resources,
-    parser: XmlResourceParser,
-    name: String
-): String? {
+fun getStringRefAttribute(resources: Resources, parser: XmlResourceParser, name: String): String? {
     return if (parser.hasValue(name)) {
         val resId = parser.getAttributeResourceValue(NAMESPACE_APP, name, 0)
         if (resId == 0) {
@@ -3116,11 +3163,7 @@
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun getIntRefAttribute(
-    resources: Resources,
-    parser: XmlResourceParser,
-    name: String
-): Int? {
+fun getIntRefAttribute(resources: Resources, parser: XmlResourceParser, name: String): Int? {
     return if (parser.hasValue(name)) {
         val resId = parser.getAttributeResourceValue(NAMESPACE_APP, name, 0)
         if (resId == 0) {
@@ -3139,9 +3182,7 @@
         type = next()
     } while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG)
 
-    require(name == expectedNode) {
-        "Expected a $expectedNode node but is $name"
-    }
+    require(name == expectedNode) { "Expected a $expectedNode node but is $name" }
 }
 
 /** Converts 0 to null. Since 0 is never a valid resource id. */
diff --git a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt
index 9ec2c17..7d55855 100644
--- a/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt
+++ b/wear/watchface/watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt
@@ -29,7 +29,6 @@
 
     public companion object {
         /** A [Set] of all [WatchFaceLayer]s. */
-        @JvmField
-        public val ALL_WATCH_FACE_LAYERS: Set<WatchFaceLayer> = values().toSet()
+        @JvmField public val ALL_WATCH_FACE_LAYERS: Set<WatchFaceLayer> = values().toSet()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
index cdd035f..3029d3e 100644
--- a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
+++ b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
@@ -21,8 +21,8 @@
 import androidx.annotation.RequiresApi
 import androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
-import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
+import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
@@ -30,77 +30,54 @@
 import androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.Option
 import com.google.common.truth.Truth.assertThat
-import org.junit.Assert.fail
 import org.junit.Assert.assertThrows
+import org.junit.Assert.fail
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
 
-private val redStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("red_style"),
-    "Red",
-    "Red",
-    icon = null
-)
+private val redStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("red_style"), "Red", "Red", icon = null)
 
-private val greenStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("green_style"),
-    "Green",
-    "Green",
-    icon = null
-)
+private val greenStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("green_style"), "Green", "Green", icon = null)
 
-private val blueStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("blue_style"),
-    "Blue",
-    "Blue",
-    icon = null
-)
+private val blueStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("blue_style"), "Blue", "Blue", icon = null)
 
 private val colorStyleList = listOf(redStyleOption, greenStyleOption, blueStyleOption)
 
-private val colorStyleSetting = ListUserStyleSetting(
-    UserStyleSetting.Id("color_style_setting"),
-    "Colors",
-    "Watchface colorization", /* icon = */
-    null,
-    colorStyleList,
-    listOf(WatchFaceLayer.BASE)
-)
+private val colorStyleSetting =
+    ListUserStyleSetting(
+        UserStyleSetting.Id("color_style_setting"),
+        "Colors",
+        "Watchface colorization",
+        /* icon = */ null,
+        colorStyleList,
+        listOf(WatchFaceLayer.BASE)
+    )
 
-private val classicStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("classic_style"),
-    "Classic",
-    "Classic",
-    icon = null
-)
+private val classicStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("classic_style"), "Classic", "Classic", icon = null)
 
-private val modernStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("modern_style"),
-    "Modern",
-    "Modern",
-    icon = null
-)
+private val modernStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("modern_style"), "Modern", "Modern", icon = null)
 
-private val gothicStyleOption = ListUserStyleSetting.ListOption(
-    Option.Id("gothic_style"),
-    "Gothic",
-    "Gothic",
-    icon = null
-)
+private val gothicStyleOption =
+    ListUserStyleSetting.ListOption(Option.Id("gothic_style"), "Gothic", "Gothic", icon = null)
 
-private val watchHandStyleList =
-    listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
+private val watchHandStyleList = listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
 
-private val watchHandStyleSetting = ListUserStyleSetting(
-    UserStyleSetting.Id("hand_style_setting"),
-    "Hand Style",
-    "Hand visual look", /* icon = */
-    null,
-    watchHandStyleList,
-    listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-)
+private val watchHandStyleSetting =
+    ListUserStyleSetting(
+        UserStyleSetting.Id("hand_style_setting"),
+        "Hand Style",
+        "Hand visual look",
+        /* icon = */ null,
+        watchHandStyleList,
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+    )
 private val watchHandLengthStyleSetting =
     DoubleRangeUserStyleSetting(
         UserStyleSetting.Id("watch_hand_length_style_setting"),
@@ -112,39 +89,43 @@
         listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
         0.75
     )
-private val booleanSetting = BooleanUserStyleSetting(
-    UserStyleSetting.Id("setting"),
-    "setting",
-    "setting description",
-    null,
-    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-    true
-)
-private val booleanSettingCopy = BooleanUserStyleSetting(
-    UserStyleSetting.Id("setting"),
-    "setting",
-    "setting description",
-    null,
-    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-    true
-)
-private val booleanSettingModifiedInfo = BooleanUserStyleSetting(
-    UserStyleSetting.Id("setting"),
-    "setting modified",
-    "setting description modified",
-    null,
-    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-    false
-)
+private val booleanSetting =
+    BooleanUserStyleSetting(
+        UserStyleSetting.Id("setting"),
+        "setting",
+        "setting description",
+        null,
+        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        true
+    )
+private val booleanSettingCopy =
+    BooleanUserStyleSetting(
+        UserStyleSetting.Id("setting"),
+        "setting",
+        "setting description",
+        null,
+        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        true
+    )
+private val booleanSettingModifiedInfo =
+    BooleanUserStyleSetting(
+        UserStyleSetting.Id("setting"),
+        "setting modified",
+        "setting description modified",
+        null,
+        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        false
+    )
 
-private val booleanSettingModifiedId = BooleanUserStyleSetting(
-    UserStyleSetting.Id("setting_modified"),
-    "setting",
-    "setting description",
-    null,
-    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-    true
-)
+private val booleanSettingModifiedId =
+    BooleanUserStyleSetting(
+        UserStyleSetting.Id("setting_modified"),
+        "setting",
+        "setting description",
+        null,
+        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+        true
+    )
 
 private val optionTrue = BooleanUserStyleSetting.BooleanOption.TRUE
 private val optionFalse = BooleanUserStyleSetting.BooleanOption.FALSE
@@ -162,12 +143,13 @@
 
     @Test
     fun assigning_userStyle() {
-        val newStyle = UserStyle(
-            hashMapOf(
-                colorStyleSetting to greenStyleOption,
-                watchHandStyleSetting to gothicStyleOption
+        val newStyle =
+            UserStyle(
+                hashMapOf(
+                    colorStyleSetting to greenStyleOption,
+                    watchHandStyleSetting to gothicStyleOption
+                )
             )
-        )
 
         userStyleRepository.updateUserStyle(newStyle)
 
@@ -179,29 +161,32 @@
 
     @Test
     fun assign_userStyle_with_distinctButMatchingRefs() {
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            colorStyleList,
-            listOf(WatchFaceLayer.BASE)
-        )
-        val watchHandStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("hand_style_setting"),
-            "Hand Style",
-            "Hand visual look", /* icon = */
-            null,
-            watchHandStyleList,
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
-
-        val newStyle = UserStyle(
-            hashMapOf(
-                colorStyleSetting2 to greenStyleOption,
-                watchHandStyleSetting2 to gothicStyleOption
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                colorStyleList,
+                listOf(WatchFaceLayer.BASE)
             )
-        )
+        val watchHandStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("hand_style_setting"),
+                "Hand Style",
+                "Hand visual look",
+                /* icon = */ null,
+                watchHandStyleList,
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
+
+        val newStyle =
+            UserStyle(
+                hashMapOf(
+                    colorStyleSetting2 to greenStyleOption,
+                    watchHandStyleSetting2 to gothicStyleOption
+                )
+            )
 
         userStyleRepository.updateUserStyle(newStyle)
 
@@ -214,84 +199,78 @@
     @Test
     fun defaultValues() {
         val watchHandLengthOption =
-            userStyleRepository.userStyle.value[watchHandLengthStyleSetting]!! as
-                DoubleRangeUserStyleSetting.DoubleRangeOption
+            userStyleRepository.userStyle.value[watchHandLengthStyleSetting]!!
+                as DoubleRangeUserStyleSetting.DoubleRangeOption
         assertThat(watchHandLengthOption.value).isEqualTo(0.75)
     }
 
     @Test
     fun userStyle_mapConstructor() {
-        val userStyle = UserStyle(
-            UserStyleData(
-                mapOf(
-                    "color_style_setting" to "blue_style".encodeToByteArray(),
-                    "hand_style_setting" to "gothic_style".encodeToByteArray()
-                )
-            ),
-            userStyleRepository.schema
-        )
+        val userStyle =
+            UserStyle(
+                UserStyleData(
+                    mapOf(
+                        "color_style_setting" to "blue_style".encodeToByteArray(),
+                        "hand_style_setting" to "gothic_style".encodeToByteArray()
+                    )
+                ),
+                userStyleRepository.schema
+            )
 
-        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString())
-            .isEqualTo("blue_style")
+        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString()).isEqualTo("blue_style")
         assertThat(userStyle[watchHandStyleSetting]!!.id.value.decodeToString())
             .isEqualTo("gothic_style")
     }
 
     @Test
     fun userStyle_mapConstructor_badColorStyle() {
-        val userStyle = UserStyle(
-            UserStyleData(
-                mapOf(
-                    "color_style_setting" to "I DO NOT EXIST".encodeToByteArray(),
-                    "hand_style_setting" to "gothic_style".encodeToByteArray()
-                )
-            ),
-            userStyleRepository.schema
-        )
+        val userStyle =
+            UserStyle(
+                UserStyleData(
+                    mapOf(
+                        "color_style_setting" to "I DO NOT EXIST".encodeToByteArray(),
+                        "hand_style_setting" to "gothic_style".encodeToByteArray()
+                    )
+                ),
+                userStyleRepository.schema
+            )
 
-        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString())
-            .isEqualTo("red_style")
+        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString()).isEqualTo("red_style")
         assertThat(userStyle[watchHandStyleSetting]!!.id.value.decodeToString())
             .isEqualTo("gothic_style")
     }
 
     @Test
     fun userStyle_mapConstructor_missingColorStyle() {
-        val userStyle = UserStyle(
-            UserStyleData(
-                mapOf("hand_style_setting" to "gothic_style".encodeToByteArray())
-            ),
-            userStyleRepository.schema
-        )
+        val userStyle =
+            UserStyle(
+                UserStyleData(mapOf("hand_style_setting" to "gothic_style".encodeToByteArray())),
+                userStyleRepository.schema
+            )
 
-        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString())
-            .isEqualTo("red_style")
+        assertThat(userStyle[colorStyleSetting]!!.id.value.decodeToString()).isEqualTo("red_style")
         assertThat(userStyle[watchHandStyleSetting]!!.id.value.decodeToString())
             .isEqualTo("gothic_style")
     }
 
     @Test
     fun userStyle_mapConstructor_customValueUserStyleSetting() {
-        val customStyleSetting = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
+        val customStyleSetting =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
 
-        val userStyleRepository = CurrentUserStyleRepository(
-            UserStyleSchema(
-                listOf(customStyleSetting)
+        val userStyleRepository =
+            CurrentUserStyleRepository(UserStyleSchema(listOf(customStyleSetting)))
+
+        val userStyle =
+            UserStyle(
+                UserStyleData(
+                    mapOf(
+                        CustomValueUserStyleSetting.CUSTOM_VALUE_USER_STYLE_SETTING_ID to
+                            "TEST 123".encodeToByteArray()
+                    )
+                ),
+                userStyleRepository.schema
             )
-        )
-
-        val userStyle = UserStyle(
-            UserStyleData(
-                mapOf(
-                    CustomValueUserStyleSetting.CUSTOM_VALUE_USER_STYLE_SETTING_ID
-                        to "TEST 123".encodeToByteArray()
-                )
-            ),
-            userStyleRepository.schema
-        )
 
         val customValue = userStyle[customStyleSetting]!! as CustomValueOption
         assertThat(customValue.customValue.decodeToString()).isEqualTo("TEST 123")
@@ -299,19 +278,13 @@
 
     @Test
     fun userStyle_multiple_CustomValueUserStyleSetting_notAllowed() {
-        val customStyleSetting1 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
-        val customStyleSetting2 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
+        val customStyleSetting1 =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
+        val customStyleSetting2 =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
 
         try {
-            UserStyleSchema(
-                listOf(customStyleSetting1, customStyleSetting2)
-            )
+            UserStyleSchema(listOf(customStyleSetting1, customStyleSetting2))
             fail(
                 "Constructing a UserStyleSchema with more than one " +
                     "CustomValueUserStyleSetting should fail"
@@ -323,19 +296,13 @@
 
     @Test
     fun userStyle_multiple_CustomValueUserStyleSettings_notAllowed() {
-        val customStyleSetting1 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
-        val customStyleSetting2 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
+        val customStyleSetting1 =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
+        val customStyleSetting2 =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
 
         try {
-            UserStyleSchema(
-                listOf(customStyleSetting1, customStyleSetting2)
-            )
+            UserStyleSchema(listOf(customStyleSetting1, customStyleSetting2))
             fail(
                 "Constructing a UserStyleSchema with more than one CustomValueUserStyleSetting " +
                     "should fail"
@@ -347,12 +314,13 @@
 
     @Test
     fun userStyle_get() {
-        val userStyle = UserStyle(
-            hashMapOf(
-                colorStyleSetting to greenStyleOption,
-                watchHandStyleSetting to gothicStyleOption
+        val userStyle =
+            UserStyle(
+                hashMapOf(
+                    colorStyleSetting to greenStyleOption,
+                    watchHandStyleSetting to gothicStyleOption
+                )
             )
-        )
 
         assertThat(userStyle[colorStyleSetting]).isEqualTo(greenStyleOption)
         assertThat(userStyle[watchHandStyleSetting]).isEqualTo(gothicStyleOption)
@@ -360,12 +328,13 @@
 
     @Test
     fun userStyle_getById() {
-        val userStyle = UserStyle(
-            hashMapOf(
-                colorStyleSetting to greenStyleOption,
-                watchHandStyleSetting to gothicStyleOption
+        val userStyle =
+            UserStyle(
+                hashMapOf(
+                    colorStyleSetting to greenStyleOption,
+                    watchHandStyleSetting to gothicStyleOption
+                )
             )
-        )
 
         assertThat(userStyle[colorStyleSetting.id]).isEqualTo(greenStyleOption)
         assertThat(userStyle[watchHandStyleSetting.id]).isEqualTo(gothicStyleOption)
@@ -373,50 +342,36 @@
 
     @Test
     fun userStyle_getAndSetDifferentOptionInstances() {
-        val option0 = ListUserStyleSetting.ListOption(
-            Option.Id("0"),
-            "option 0",
-            "option 0",
-            icon = null
-        )
-        val option1 = ListUserStyleSetting.ListOption(
-            Option.Id("1"),
-            "option 1",
-            "option 1",
-            icon = null
-        )
-        val option0Copy = ListUserStyleSetting.ListOption(
-            Option.Id("0"),
-            "option #0",
-            "option #0",
-            icon = null
-        )
-        val option1Copy = ListUserStyleSetting.ListOption(
-            Option.Id("1"),
-            "option #1",
-            "option #1",
-            icon = null
-        )
-        val setting = ListUserStyleSetting(
-            UserStyleSetting.Id("setting"),
-            "setting",
-            "setting description",
-            icon = null,
-            listOf(option0, option1),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
+        val option0 =
+            ListUserStyleSetting.ListOption(Option.Id("0"), "option 0", "option 0", icon = null)
+        val option1 =
+            ListUserStyleSetting.ListOption(Option.Id("1"), "option 1", "option 1", icon = null)
+        val option0Copy =
+            ListUserStyleSetting.ListOption(Option.Id("0"), "option #0", "option #0", icon = null)
+        val option1Copy =
+            ListUserStyleSetting.ListOption(Option.Id("1"), "option #1", "option #1", icon = null)
+        val setting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("setting"),
+                "setting",
+                "setting description",
+                icon = null,
+                listOf(option0, option1),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
 
         val userStyle = UserStyle(mapOf(setting to option0))
         assertThat(userStyle[setting]).isEqualTo(option0)
         assertThat(userStyle[setting]).isEqualTo(option0Copy)
 
-        userStyle.toMutableUserStyle().apply {
-            this[setting] = option1
-        }.let { newUserStyle ->
-            assertThat(userStyle[setting]).isEqualTo(option0)
-            assertThat(newUserStyle[setting]).isEqualTo(option1)
-            assertThat(newUserStyle[setting]).isEqualTo(option1Copy)
-        }
+        userStyle
+            .toMutableUserStyle()
+            .apply { this[setting] = option1 }
+            .let { newUserStyle ->
+                assertThat(userStyle[setting]).isEqualTo(option0)
+                assertThat(newUserStyle[setting]).isEqualTo(option1)
+                assertThat(newUserStyle[setting]).isEqualTo(option1Copy)
+            }
     }
 
     @Test
@@ -433,40 +388,44 @@
         val userStyle = UserStyle(mapOf(booleanSetting to optionTrue))
         assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
 
-        userStyle.toMutableUserStyle().apply {
-            this[booleanSetting] = optionFalse
-        }.toUserStyle().let { newUserStyle: UserStyle ->
-            assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
-            assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
-        }
+        userStyle
+            .toMutableUserStyle()
+            .apply { this[booleanSetting] = optionFalse }
+            .toUserStyle()
+            .let { newUserStyle: UserStyle ->
+                assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
+                assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
+            }
 
-        userStyle.toMutableUserStyle().apply {
-            this[booleanSettingCopy] = optionFalse
-        }.toUserStyle().let { newUserStyle: UserStyle ->
-            assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
-            assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
-        }
+        userStyle
+            .toMutableUserStyle()
+            .apply { this[booleanSettingCopy] = optionFalse }
+            .toUserStyle()
+            .let { newUserStyle: UserStyle ->
+                assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
+                assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
+            }
 
-        userStyle.toMutableUserStyle().apply {
-            this[booleanSettingModifiedInfo] = optionFalse
-        }.toUserStyle().let { newUserStyle: UserStyle ->
-            assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
-            assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
-            assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
-        }
+        userStyle
+            .toMutableUserStyle()
+            .apply { this[booleanSettingModifiedInfo] = optionFalse }
+            .toUserStyle()
+            .let { newUserStyle: UserStyle ->
+                assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
+                assertThat(newUserStyle[booleanSetting]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingCopy]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedInfo]).isEqualTo(optionFalse)
+                assertThat(newUserStyle[booleanSettingModifiedId]).isEqualTo(null)
+            }
 
         assertThrows(IllegalArgumentException::class.java) {
-            userStyle.toMutableUserStyle().apply {
-                this[booleanSettingModifiedId] = optionFalse
-            }
+            userStyle.toMutableUserStyle().apply { this[booleanSettingModifiedId] = optionFalse }
         }
     }
 
@@ -511,9 +470,7 @@
         }
 
         CurrentUserStyleRepository(userStyleSchema).let { currentUserStyleRepository ->
-            assertThrows(
-                java.lang.IllegalArgumentException::class.java
-            ) {
+            assertThrows(java.lang.IllegalArgumentException::class.java) {
                 currentUserStyleRepository.updateUserStyle(
                     UserStyle(mapOf(booleanSettingModifiedId to optionFalse))
                 )
@@ -523,9 +480,7 @@
 
     @Test
     fun userStyle_modifyUnderlyingMap() {
-        val map = HashMap<UserStyleSetting, Option>().apply {
-            this[booleanSetting] = optionTrue
-        }
+        val map = HashMap<UserStyleSetting, Option>().apply { this[booleanSetting] = optionTrue }
         val userStyle = UserStyle(map)
 
         assertThat(userStyle[booleanSetting]).isEqualTo(optionTrue)
@@ -558,10 +513,7 @@
     @Test
     fun userStyle_merge_overridesUnknownSetting() {
         val userStyle = UserStyle(mapOf(booleanSetting to optionTrue))
-        UserStyle.merge(
-            userStyle,
-            UserStyle(mapOf(colorStyleSetting to blueStyleOption))
-        ).let {
+        UserStyle.merge(userStyle, UserStyle(mapOf(colorStyleSetting to blueStyleOption))).let {
             // Style has not changed.
             assertThat(it).isNull()
         }
@@ -585,68 +537,57 @@
 
     @Test
     fun setAndGetCustomStyleSetting() {
-        val customStyleSetting = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
+        val customStyleSetting =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
 
-        val userStyleRepository = CurrentUserStyleRepository(
-            UserStyleSchema(
-                listOf(customStyleSetting)
-            )
-        )
+        val userStyleRepository =
+            CurrentUserStyleRepository(UserStyleSchema(listOf(customStyleSetting)))
 
         userStyleRepository.updateUserStyle(
-            UserStyle(
-                mapOf(
-                    customStyleSetting to CustomValueOption("test".encodeToByteArray())
-                )
-            )
+            UserStyle(mapOf(customStyleSetting to CustomValueOption("test".encodeToByteArray())))
         )
 
         assertThat(
-            (userStyleRepository.userStyle.value[customStyleSetting]!! as CustomValueOption)
-                .customValue.decodeToString()
-        ).isEqualTo("test")
+                (userStyleRepository.userStyle.value[customStyleSetting]!! as CustomValueOption)
+                    .customValue
+                    .decodeToString()
+            )
+            .isEqualTo("test")
     }
 
     @Test
     fun userStyleData_equals() {
-        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray()))).isEqualTo(
-            UserStyleData(mapOf("A" to "a".encodeToByteArray()))
-        )
+        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
+            .isEqualTo(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
 
         assertThat(
-            UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
-        ).isEqualTo(
-            UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
-        )
+                UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
+            )
+            .isEqualTo(
+                UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
+            )
 
-        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray()))).isNotEqualTo(
-            UserStyleData(mapOf("A" to "b".encodeToByteArray()))
-        )
+        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
+            .isNotEqualTo(UserStyleData(mapOf("A" to "b".encodeToByteArray())))
 
-        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray()))).isNotEqualTo(
-            UserStyleData(mapOf("B" to "a".encodeToByteArray()))
-        )
+        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
+            .isNotEqualTo(UserStyleData(mapOf("B" to "a".encodeToByteArray())))
 
-        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray()))).isNotEqualTo(
-            UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
-        )
+        assertThat(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
+            .isNotEqualTo(
+                UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
+            )
 
         assertThat(
-            UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
-        ).isNotEqualTo(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
+                UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
+            )
+            .isNotEqualTo(UserStyleData(mapOf("A" to "a".encodeToByteArray())))
     }
 
     @Test
     fun userStyleData_toString() {
-        val userStyleData = UserStyleData(
-            mapOf(
-                "A" to "a".encodeToByteArray(),
-                "B" to "b".encodeToByteArray()
-            )
-        )
+        val userStyleData =
+            UserStyleData(mapOf("A" to "a".encodeToByteArray(), "B" to "b".encodeToByteArray()))
 
         assertThat(userStyleData.toString()).contains("A=a")
         assertThat(userStyleData.toString()).contains("B=b")
@@ -657,51 +598,59 @@
         assertThat(optionTrue.toString()).isEqualTo("true")
         assertThat(optionFalse.toString()).isEqualTo("false")
         assertThat(gothicStyleOption.toString()).isEqualTo("gothic_style")
-        assertThat(DoubleRangeUserStyleSetting.DoubleRangeOption(12.3).toString())
-            .isEqualTo("12.3")
-        assertThat(LongRangeUserStyleSetting.LongRangeOption(123).toString())
-            .isEqualTo("123")
+        assertThat(DoubleRangeUserStyleSetting.DoubleRangeOption(12.3).toString()).isEqualTo("12.3")
+        assertThat(LongRangeUserStyleSetting.LongRangeOption(123).toString()).isEqualTo("123")
         assertThat(CustomValueOption("test".encodeToByteArray()).toString()).isEqualTo("test")
     }
 
     @Test
     fun userStyleEquality() {
-        val userStyleA = UserStyle(
-            mapOf(
-                colorStyleSetting to blueStyleOption,
-                watchHandStyleSetting to modernStyleOption,
-                watchHandLengthStyleSetting to DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+        val userStyleA =
+            UserStyle(
+                mapOf(
+                    colorStyleSetting to blueStyleOption,
+                    watchHandStyleSetting to modernStyleOption,
+                    watchHandLengthStyleSetting to
+                        DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+                )
             )
-        )
-        val userStyleA2 = UserStyle(
-            mapOf(
-                colorStyleSetting to blueStyleOption,
-                watchHandStyleSetting to modernStyleOption,
-                watchHandLengthStyleSetting to DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+        val userStyleA2 =
+            UserStyle(
+                mapOf(
+                    colorStyleSetting to blueStyleOption,
+                    watchHandStyleSetting to modernStyleOption,
+                    watchHandLengthStyleSetting to
+                        DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+                )
             )
-        )
 
-        val userStyleB = UserStyle(
-            mapOf(
-                colorStyleSetting to blueStyleOption,
-                watchHandStyleSetting to modernStyleOption,
-                watchHandLengthStyleSetting to DoubleRangeUserStyleSetting.DoubleRangeOption(0.75)
+        val userStyleB =
+            UserStyle(
+                mapOf(
+                    colorStyleSetting to blueStyleOption,
+                    watchHandStyleSetting to modernStyleOption,
+                    watchHandLengthStyleSetting to
+                        DoubleRangeUserStyleSetting.DoubleRangeOption(0.75)
+                )
             )
-        )
-        val userStyleC = UserStyle(
-            mapOf(
-                colorStyleSetting to blueStyleOption,
-                watchHandStyleSetting to gothicStyleOption,
-                watchHandLengthStyleSetting to DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+        val userStyleC =
+            UserStyle(
+                mapOf(
+                    colorStyleSetting to blueStyleOption,
+                    watchHandStyleSetting to gothicStyleOption,
+                    watchHandLengthStyleSetting to
+                        DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+                )
             )
-        )
-        val userStyleD = UserStyle(
-            mapOf(
-                colorStyleSetting to redStyleOption,
-                watchHandStyleSetting to modernStyleOption,
-                watchHandLengthStyleSetting to DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+        val userStyleD =
+            UserStyle(
+                mapOf(
+                    colorStyleSetting to redStyleOption,
+                    watchHandStyleSetting to modernStyleOption,
+                    watchHandLengthStyleSetting to
+                        DoubleRangeUserStyleSetting.DoubleRangeOption(0.2)
+                )
             )
-        )
 
         assertThat(userStyleA).isEqualTo(userStyleA2)
         assertThat(userStyleA).isNotEqualTo(userStyleB)
@@ -719,49 +668,54 @@
         val twentyFourHourClockOption =
             ListUserStyleSetting.ListOption(Option.Id("24_style"), "24", "24", icon = null)
 
-        val digitalClockStyleSetting = ListUserStyleSetting(
-            UserStyleSetting.Id("digital_clock_style"),
-            "Clock style",
-            "Clock style setting",
-            null,
-            listOf(twelveHourClockOption, twentyFourHourClockOption),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val digitalWatchFaceType = ListUserStyleSetting.ListOption(
-            Option.Id("digital"),
-           "Digital",
-            "Digital",
-            icon = null,
-            childSettings = listOf(digitalClockStyleSetting, colorStyleSetting)
-        )
-
-        val analogWatchFaceType = ListUserStyleSetting.ListOption(
-            Option.Id("analog"),
-            "Analog",
-            "Analog",
-            icon = null,
-            childSettings = listOf(watchHandLengthStyleSetting, watchHandStyleSetting)
-        )
-
-        val watchFaceType = ListUserStyleSetting(
-            UserStyleSetting.Id("clock_type"),
-            "Watch face type",
-            "Analog or digital",
-            icon = null,
-            options = listOf(digitalWatchFaceType, analogWatchFaceType),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val schema = UserStyleSchema(
-            listOf(
-                watchFaceType,
-                digitalClockStyleSetting,
-                colorStyleSetting,
-                watchHandLengthStyleSetting,
-                watchHandStyleSetting
+        val digitalClockStyleSetting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("digital_clock_style"),
+                "Clock style",
+                "Clock style setting",
+                null,
+                listOf(twelveHourClockOption, twentyFourHourClockOption),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
             )
-        )
+
+        val digitalWatchFaceType =
+            ListUserStyleSetting.ListOption(
+                Option.Id("digital"),
+                "Digital",
+                "Digital",
+                icon = null,
+                childSettings = listOf(digitalClockStyleSetting, colorStyleSetting)
+            )
+
+        val analogWatchFaceType =
+            ListUserStyleSetting.ListOption(
+                Option.Id("analog"),
+                "Analog",
+                "Analog",
+                icon = null,
+                childSettings = listOf(watchHandLengthStyleSetting, watchHandStyleSetting)
+            )
+
+        val watchFaceType =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("clock_type"),
+                "Watch face type",
+                "Analog or digital",
+                icon = null,
+                options = listOf(digitalWatchFaceType, analogWatchFaceType),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
+
+        val schema =
+            UserStyleSchema(
+                listOf(
+                    watchFaceType,
+                    digitalClockStyleSetting,
+                    colorStyleSetting,
+                    watchHandLengthStyleSetting,
+                    watchHandStyleSetting
+                )
+            )
 
         assertThat(schema.rootUserStyleSettings).containsExactly(watchFaceType)
 
@@ -774,43 +728,48 @@
 
     @Test
     fun invalid_multiple_ComplicationSlotsUserStyleSettings_same_level() {
-        val leftAndRightComplications = ComplicationSlotsOption(
-            Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-            displayName = "Both",
-            screenReaderName = "Both complications",
-            icon = null,
-            emptyList()
-        )
-        val complicationSetting1 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting1"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftAndRightComplications),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-        val complicationSetting2 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting2"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftAndRightComplications),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-        val optionA1 = ListUserStyleSetting.ListOption(
-            Option.Id("a1_style"),
-            displayName = "A1",
-            screenReaderName = "A1 style",
-            icon = null,
-            childSettings = listOf(complicationSetting1, complicationSetting2)
-        )
-        val optionA2 = ListUserStyleSetting.ListOption(
-            Option.Id("a2_style"),
-            displayName = "A2",
-            screenReaderName = "A2 style",
-            icon = null,
-            childSettings = listOf(complicationSetting2)
-        )
+        val leftAndRightComplications =
+            ComplicationSlotsOption(
+                Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                displayName = "Both",
+                screenReaderName = "Both complications",
+                icon = null,
+                emptyList()
+            )
+        val complicationSetting1 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting1"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftAndRightComplications),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+        val complicationSetting2 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting2"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftAndRightComplications),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+        val optionA1 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a1_style"),
+                displayName = "A1",
+                screenReaderName = "A1 style",
+                icon = null,
+                childSettings = listOf(complicationSetting1, complicationSetting2)
+            )
+        val optionA2 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a2_style"),
+                displayName = "A2",
+                screenReaderName = "A2 style",
+                icon = null,
+                childSettings = listOf(complicationSetting2)
+            )
 
         assertThrows(IllegalArgumentException::class.java) {
             UserStyleSchema(
@@ -832,42 +791,47 @@
 
     @Test
     fun invalid_multiple_ComplicationSlotsUserStyleSettings_different_levels() {
-        val leftAndRightComplications = ComplicationSlotsOption(
-            Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-            displayName = "Both",
-            screenReaderName = "Both complications",
-            icon = null,
-            emptyList()
-        )
-        val complicationSetting1 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting1"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftAndRightComplications),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-        val complicationSetting2 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting2"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftAndRightComplications),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-        val optionA1 = ListUserStyleSetting.ListOption(
-            Option.Id("a1_style"),
-            displayName = "A1",
-            screenReaderName = "A1 style",
-            icon = null,
-            childSettings = listOf(complicationSetting1)
-        )
-        val optionA2 = ListUserStyleSetting.ListOption(
-            Option.Id("a2_style"),
-            displayName = "A2",
-            screenReaderName = "A2 style",
-            icon = null
-        )
+        val leftAndRightComplications =
+            ComplicationSlotsOption(
+                Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                displayName = "Both",
+                screenReaderName = "Both complications",
+                icon = null,
+                emptyList()
+            )
+        val complicationSetting1 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting1"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftAndRightComplications),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+        val complicationSetting2 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting2"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftAndRightComplications),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+        val optionA1 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a1_style"),
+                displayName = "A1",
+                screenReaderName = "A1 style",
+                icon = null,
+                childSettings = listOf(complicationSetting1)
+            )
+        val optionA2 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a2_style"),
+                displayName = "A2",
+                screenReaderName = "A2 style",
+                icon = null
+            )
 
         assertThrows(IllegalArgumentException::class.java) {
             UserStyleSchema(
@@ -904,177 +868,198 @@
 
         val leftComplicationID = 101
         val rightComplicationID = 102
-        val leftAndRightComplications = ComplicationSlotsOption(
-            Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-            displayName = "Both",
-            screenReaderName = "Both complications",
-            icon = null,
-            emptyList()
-        )
-        val noComplications = ComplicationSlotsOption(
-            Option.Id("NO_COMPLICATIONS"),
-            displayName = "None",
-            screenReaderName = "No complications",
-            icon = null,
-            listOf(
-                ComplicationSlotOverlay(leftComplicationID, enabled = false),
-                ComplicationSlotOverlay(rightComplicationID, enabled = false)
+        val leftAndRightComplications =
+            ComplicationSlotsOption(
+                Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                displayName = "Both",
+                screenReaderName = "Both complications",
+                icon = null,
+                emptyList()
             )
-        )
-        val complicationSetting1 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftAndRightComplications, noComplications),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-
-        val leftComplication = ComplicationSlotsOption(
-            Option.Id("LEFT_COMPLICATION"),
-            displayName = "Left",
-            screenReaderName = "Left complication",
-            icon = null,
-            listOf(ComplicationSlotOverlay(rightComplicationID, enabled = false))
-        )
-        val rightComplication = ComplicationSlotsOption(
-            Option.Id("RIGHT_COMPLICATION"),
-            displayName = "Right",
-            screenReaderName = "Right complication",
-            icon = null,
-            listOf(ComplicationSlotOverlay(leftComplicationID, enabled = false))
-        )
-        val complicationSetting2 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting2"),
-            displayName = "Complications",
-            description = "Number and position",
-            icon = null,
-            complicationConfig = listOf(leftComplication, rightComplication),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-
-        val normal = ComplicationSlotsOption(
-            Option.Id("Normal"),
-            displayName = "Normal",
-            screenReaderName = "Normal",
-            icon = null,
-            emptyList()
-        )
-        val traversal = ComplicationSlotsOption(
-            Option.Id("Traversal"),
-            displayName = "Traversal",
-            screenReaderName = "Traversal",
-            icon = null,
-            listOf(
-                ComplicationSlotOverlay(leftComplicationID, accessibilityTraversalIndex = 3),
-                ComplicationSlotOverlay(rightComplicationID, accessibilityTraversalIndex = 2)
+        val noComplications =
+            ComplicationSlotsOption(
+                Option.Id("NO_COMPLICATIONS"),
+                displayName = "None",
+                screenReaderName = "No complications",
+                icon = null,
+                listOf(
+                    ComplicationSlotOverlay(leftComplicationID, enabled = false),
+                    ComplicationSlotOverlay(rightComplicationID, enabled = false)
+                )
             )
-        )
-        val complicationSetting3 = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting3"),
-            displayName = "Traversal Order",
-            description = "Traversal Order",
-            icon = null,
-            complicationConfig = listOf(normal, traversal),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
-
-        val optionA1 = ListUserStyleSetting.ListOption(
-            Option.Id("a1_style"),
-            displayName = "A1",
-            screenReaderName = "A1 style",
-            icon = null,
-            childSettings = listOf(complicationSetting1)
-        )
-        val optionA2 = ListUserStyleSetting.ListOption(
-            Option.Id("a2_style"),
-            displayName = "A2",
-            screenReaderName = "A2 style",
-            icon = null,
-            childSettings = listOf(complicationSetting2)
-        )
-        val optionA3 = ListUserStyleSetting.ListOption(
-            Option.Id("a3_style"),
-            "A3",
-            screenReaderName = "A3 style",
-            icon = null
-        )
-
-        val a123Choice = ListUserStyleSetting(
-            UserStyleSetting.Id("a123"),
-            displayName = "A123",
-            description = "A123",
-            icon = null,
-            listOf(optionA1, optionA2, optionA3),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val optionB1 = ListUserStyleSetting.ListOption(
-            Option.Id("b1_style"),
-            displayName = "B1",
-            screenReaderName = "B1 style",
-            icon = null,
-            childSettings = listOf(complicationSetting3)
-        )
-        val optionB2 = ListUserStyleSetting.ListOption(
-            Option.Id("b2_style"),
-            "B2",
-            screenReaderName = "B2 style",
-            icon = null
-        )
-
-        val b12Choice = ListUserStyleSetting(
-            UserStyleSetting.Id("b12"),
-            displayName = "B12",
-            "B12",
-            icon = null,
-            listOf(optionB1, optionB2),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val rootOptionA = ListUserStyleSetting.ListOption(
-            Option.Id("a_style"),
-            displayName = "A",
-            screenReaderName = "A style",
-            icon = null,
-            childSettings = listOf(a123Choice)
-        )
-        val rootOptionB = ListUserStyleSetting.ListOption(
-            Option.Id("b_style"),
-            displayName = "B",
-            screenReaderName = "B style",
-            icon = null,
-            childSettings = listOf(b12Choice)
-        )
-
-        val rootABChoice = ListUserStyleSetting(
-            UserStyleSetting.Id("root_ab"),
-            displayName = "AB",
-            description = "AB",
-            icon = null,
-            listOf(rootOptionA, rootOptionB),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val schema = UserStyleSchema(
-            listOf(
-                rootABChoice,
-                a123Choice,
-                b12Choice,
-                complicationSetting1,
-                complicationSetting2,
-                complicationSetting3
+        val complicationSetting1 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftAndRightComplications, noComplications),
+                listOf(WatchFaceLayer.COMPLICATIONS)
             )
-        )
 
-        val userStyleMap = mutableMapOf(
-            rootABChoice to rootOptionA,
-            a123Choice to optionA1,
-            b12Choice to optionB1,
-            complicationSetting1 to leftAndRightComplications,
-            complicationSetting2 to rightComplication,
-            complicationSetting3 to traversal
-        )
+        val leftComplication =
+            ComplicationSlotsOption(
+                Option.Id("LEFT_COMPLICATION"),
+                displayName = "Left",
+                screenReaderName = "Left complication",
+                icon = null,
+                listOf(ComplicationSlotOverlay(rightComplicationID, enabled = false))
+            )
+        val rightComplication =
+            ComplicationSlotsOption(
+                Option.Id("RIGHT_COMPLICATION"),
+                displayName = "Right",
+                screenReaderName = "Right complication",
+                icon = null,
+                listOf(ComplicationSlotOverlay(leftComplicationID, enabled = false))
+            )
+        val complicationSetting2 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting2"),
+                displayName = "Complications",
+                description = "Number and position",
+                icon = null,
+                complicationConfig = listOf(leftComplication, rightComplication),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+
+        val normal =
+            ComplicationSlotsOption(
+                Option.Id("Normal"),
+                displayName = "Normal",
+                screenReaderName = "Normal",
+                icon = null,
+                emptyList()
+            )
+        val traversal =
+            ComplicationSlotsOption(
+                Option.Id("Traversal"),
+                displayName = "Traversal",
+                screenReaderName = "Traversal",
+                icon = null,
+                listOf(
+                    ComplicationSlotOverlay(leftComplicationID, accessibilityTraversalIndex = 3),
+                    ComplicationSlotOverlay(rightComplicationID, accessibilityTraversalIndex = 2)
+                )
+            )
+        val complicationSetting3 =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting3"),
+                displayName = "Traversal Order",
+                description = "Traversal Order",
+                icon = null,
+                complicationConfig = listOf(normal, traversal),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
+
+        val optionA1 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a1_style"),
+                displayName = "A1",
+                screenReaderName = "A1 style",
+                icon = null,
+                childSettings = listOf(complicationSetting1)
+            )
+        val optionA2 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a2_style"),
+                displayName = "A2",
+                screenReaderName = "A2 style",
+                icon = null,
+                childSettings = listOf(complicationSetting2)
+            )
+        val optionA3 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a3_style"),
+                "A3",
+                screenReaderName = "A3 style",
+                icon = null
+            )
+
+        val a123Choice =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("a123"),
+                displayName = "A123",
+                description = "A123",
+                icon = null,
+                listOf(optionA1, optionA2, optionA3),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
+
+        val optionB1 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("b1_style"),
+                displayName = "B1",
+                screenReaderName = "B1 style",
+                icon = null,
+                childSettings = listOf(complicationSetting3)
+            )
+        val optionB2 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("b2_style"),
+                "B2",
+                screenReaderName = "B2 style",
+                icon = null
+            )
+
+        val b12Choice =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("b12"),
+                displayName = "B12",
+                "B12",
+                icon = null,
+                listOf(optionB1, optionB2),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
+
+        val rootOptionA =
+            ListUserStyleSetting.ListOption(
+                Option.Id("a_style"),
+                displayName = "A",
+                screenReaderName = "A style",
+                icon = null,
+                childSettings = listOf(a123Choice)
+            )
+        val rootOptionB =
+            ListUserStyleSetting.ListOption(
+                Option.Id("b_style"),
+                displayName = "B",
+                screenReaderName = "B style",
+                icon = null,
+                childSettings = listOf(b12Choice)
+            )
+
+        val rootABChoice =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("root_ab"),
+                displayName = "AB",
+                description = "AB",
+                icon = null,
+                listOf(rootOptionA, rootOptionB),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
+
+        val schema =
+            UserStyleSchema(
+                listOf(
+                    rootABChoice,
+                    a123Choice,
+                    b12Choice,
+                    complicationSetting1,
+                    complicationSetting2,
+                    complicationSetting3
+                )
+            )
+
+        val userStyleMap =
+            mutableMapOf(
+                rootABChoice to rootOptionA,
+                a123Choice to optionA1,
+                b12Choice to optionB1,
+                complicationSetting1 to leftAndRightComplications,
+                complicationSetting2 to rightComplication,
+                complicationSetting3 to traversal
+            )
 
         // Test various userStyleMap permutations to ensure the correct ComplicationSlotsOption is
         // returned.
@@ -1086,16 +1071,14 @@
             .isEqualTo(rightComplication)
 
         userStyleMap[a123Choice] = optionA3
-        assertThat(schema.findComplicationSlotsOptionForUserStyle(UserStyle(userStyleMap)))
-            .isNull()
+        assertThat(schema.findComplicationSlotsOptionForUserStyle(UserStyle(userStyleMap))).isNull()
 
         userStyleMap[rootABChoice] = rootOptionB
         assertThat(schema.findComplicationSlotsOptionForUserStyle(UserStyle(userStyleMap)))
             .isEqualTo(traversal)
 
         userStyleMap[b12Choice] = optionB2
-        assertThat(schema.findComplicationSlotsOptionForUserStyle(UserStyle(userStyleMap)))
-            .isNull()
+        assertThat(schema.findComplicationSlotsOptionForUserStyle(UserStyle(userStyleMap))).isNull()
     }
 }
 
@@ -1152,9 +1135,10 @@
     public fun digestHashSensitiveToSettingChanges() {
         val schema1 = UserStyleSchema(listOf(colorStyleSetting))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting))
-        val schema3 = UserStyleSchema(
-            listOf(colorStyleSetting, watchHandStyleSetting, watchHandLengthStyleSetting)
-        )
+        val schema3 =
+            UserStyleSchema(
+                listOf(colorStyleSetting, watchHandStyleSetting, watchHandLengthStyleSetting)
+            )
 
         val digestHash1 = schema1.getDigestHash()
         val digestHash2 = schema2.getDigestHash()
@@ -1167,30 +1151,36 @@
 
     @Test
     public fun digestHashSensitiveToOptionChanges() {
-        val colorStyleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption, greenStyleOption,),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val colorStyleSetting3 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption, greenStyleOption, blueStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
+        val colorStyleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(
+                    redStyleOption,
+                    greenStyleOption,
+                ),
+                listOf(WatchFaceLayer.BASE)
+            )
+        val colorStyleSetting3 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption, greenStyleOption, blueStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
 
         val schema1 = UserStyleSchema(listOf(colorStyleSetting1))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting2))
@@ -1207,22 +1197,27 @@
 
     @Test
     public fun digestHashSensitiveToDisplayNameChanges() {
-        val colorStyleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors2",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption, greenStyleOption,),
-            listOf(WatchFaceLayer.BASE)
-        )
+        val colorStyleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors2",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(
+                    redStyleOption,
+                    greenStyleOption,
+                ),
+                listOf(WatchFaceLayer.BASE)
+            )
 
         val schema1 = UserStyleSchema(listOf(colorStyleSetting1))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting2))
@@ -1235,22 +1230,24 @@
 
     @Test
     public fun digestHashSensitiveToDescriptionChanges() {
-        val colorStyleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization2", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
+        val colorStyleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization2",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
 
         val schema1 = UserStyleSchema(listOf(colorStyleSetting1))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting2))
@@ -1264,22 +1261,24 @@
     @Ignore // b/238635208
     @Test
     public fun digestHashSensitiveToIconChanges() {
-        val colorStyleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            Icon.createWithContentUri("/path1"),
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            Icon.createWithContentUri("/path2"),
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE)
-        )
+        val colorStyleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ Icon.createWithContentUri("/path1"),
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ Icon.createWithContentUri("/path2"),
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE)
+            )
 
         val schema1 = UserStyleSchema(listOf(colorStyleSetting1))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting2))
@@ -1292,22 +1291,24 @@
 
     @Test
     public fun digestHashInsensitiveToLayersOrderChanges() {
-        val colorStyleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS)
-        )
-        val colorStyleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            null,
-            listOf(redStyleOption),
-            listOf(WatchFaceLayer.COMPLICATIONS, WatchFaceLayer.BASE)
-        )
+        val colorStyleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS)
+            )
+        val colorStyleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ null,
+                listOf(redStyleOption),
+                listOf(WatchFaceLayer.COMPLICATIONS, WatchFaceLayer.BASE)
+            )
 
         val schema1 = UserStyleSchema(listOf(colorStyleSetting1))
         val schema2 = UserStyleSchema(listOf(colorStyleSetting2))
diff --git a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
index fb68608..9159324 100644
--- a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
+++ b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
@@ -16,22 +16,23 @@
 
 package androidx.wear.watchface.style
 
+import android.annotation.SuppressLint
 import android.graphics.RectF
 import android.graphics.drawable.Icon
 import android.os.Build
 import android.os.Parcel
 import androidx.annotation.RequiresApi
 import androidx.wear.watchface.complications.ComplicationSlotBounds
-
 import androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting
+import androidx.wear.watchface.style.UserStyleSetting.CustomValueUserStyleSetting2
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
 import androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting
-import androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData
 import androidx.wear.watchface.style.UserStyleSetting.Option
+import androidx.wear.watchface.style.UserStyleSetting.WatchFaceEditorData
 import androidx.wear.watchface.style.data.UserStyleSchemaWireFormat
 import androidx.wear.watchface.style.data.UserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.UserStyleWireFormat
@@ -57,46 +58,51 @@
     private val wfIcon3 = Icon.createWithContentUri("wfIcon3")
     private val wfIcon4 = Icon.createWithContentUri("wfIcon4")
 
-    private val option1 = ListOption(
-        Option.Id("1"),
-        "one",
-        "one screen reader",
-        icon1,
-        watchFaceEditorData = WatchFaceEditorData(wfIcon1)
-    )
-    private val option2 = ListOption(
-        Option.Id("2"),
-        "two",
-        "two screen reader",
-        icon2,
-        watchFaceEditorData = WatchFaceEditorData(wfIcon2)
-    )
-    private val option3 = ListOption(
-        Option.Id("3"),
-        "three",
-        "three screen reader",
-        icon3,
-        watchFaceEditorData = WatchFaceEditorData(wfIcon3)
-    )
-    private val option4 = ListOption(
-        Option.Id("4"),
-        "four",
-        "four screen reader",
-        icon4,
-        watchFaceEditorData = WatchFaceEditorData(wfIcon4)
-    )
+    private val option1 =
+        ListOption(
+            Option.Id("1"),
+            "one",
+            "one screen reader",
+            icon1,
+            watchFaceEditorData = WatchFaceEditorData(wfIcon1)
+        )
+    private val option2 =
+        ListOption(
+            Option.Id("2"),
+            "two",
+            "two screen reader",
+            icon2,
+            watchFaceEditorData = WatchFaceEditorData(wfIcon2)
+        )
+    private val option3 =
+        ListOption(
+            Option.Id("3"),
+            "three",
+            "three screen reader",
+            icon3,
+            watchFaceEditorData = WatchFaceEditorData(wfIcon3)
+        )
+    private val option4 =
+        ListOption(
+            Option.Id("4"),
+            "four",
+            "four screen reader",
+            icon4,
+            watchFaceEditorData = WatchFaceEditorData(wfIcon4)
+        )
 
     @Test
     public fun parcelAndUnparcelStyleSettingAndOption() {
         val settingIcon = Icon.createWithContentUri("settingIcon")
-        val styleSetting = ListUserStyleSetting(
-            UserStyleSetting.Id("id"),
-            "displayName",
-            "description",
-            settingIcon,
-            listOf(option1, option2, option3),
-            listOf(WatchFaceLayer.BASE)
-        )
+        val styleSetting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id"),
+                "displayName",
+                "description",
+                settingIcon,
+                listOf(option1, option2, option3),
+                listOf(WatchFaceLayer.BASE)
+            )
 
         val parcel = Parcel.obtain()
         styleSetting.toWireFormat().writeToParcel(parcel, 0)
@@ -151,6 +157,7 @@
         assertThat(unmarshalled3.icon!!.uri.toString()).isEqualTo("icon3")
     }
 
+    @SuppressLint("NewApi")
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun parcelAndUnparcelUserStyleSchema() {
@@ -158,53 +165,46 @@
         val companionIcon2 = Icon.createWithContentUri("companionEditorIcon2")
         val watchEditorIcon1 = Icon.createWithContentUri("watchEditorIcon1")
         val watchEditorIcon2 = Icon.createWithContentUri("watchEditorIcon2")
-        val styleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("id1"),
-            "displayName1",
-            "description1",
-            companionIcon1,
-            listOf(option1, option2),
-            listOf(WatchFaceLayer.BASE),
-            watchFaceEditorData = WatchFaceEditorData(watchEditorIcon1)
-        )
-        val styleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            companionIcon2,
-            listOf(option3, option4),
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
-            watchFaceEditorData = WatchFaceEditorData(watchEditorIcon2)
-        )
-        val styleSetting3 = BooleanUserStyleSetting(
-            UserStyleSetting.Id("id3"),
-            "displayName3",
-            "description3",
-            null,
-            listOf(WatchFaceLayer.BASE),
-            true
-        )
-        val styleSetting4 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
-
-        val srcSchema = UserStyleSchema(
-            listOf(
-                styleSetting1,
-                styleSetting2,
-                styleSetting3,
-                styleSetting4
+        val styleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id1"),
+                "displayName1",
+                "description1",
+                companionIcon1,
+                listOf(option1, option2),
+                listOf(WatchFaceLayer.BASE),
+                watchFaceEditorData = WatchFaceEditorData(watchEditorIcon1)
             )
-        )
+        val styleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                companionIcon2,
+                listOf(option3, option4),
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
+                watchFaceEditorData = WatchFaceEditorData(watchEditorIcon2)
+            )
+        val styleSetting3 =
+            BooleanUserStyleSetting(
+                UserStyleSetting.Id("id3"),
+                "displayName3",
+                "description3",
+                null,
+                listOf(WatchFaceLayer.BASE),
+                true
+            )
+        val styleSetting4 =
+            CustomValueUserStyleSetting2(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
+        val srcSchema =
+            UserStyleSchema(listOf(styleSetting1, styleSetting2, styleSetting3, styleSetting4))
 
         val parcel = Parcel.obtain()
         srcSchema.toWireFormat().writeToParcel(parcel, 0)
 
         parcel.setDataPosition(0)
 
-        val schema =
-            UserStyleSchema(UserStyleSchemaWireFormat.CREATOR.createFromParcel(parcel))
+        val schema = UserStyleSchema(UserStyleSchemaWireFormat.CREATOR.createFromParcel(parcel))
         parcel.recycle()
 
         assertThat(schema.userStyleSettings[0] is ListUserStyleSetting).isTrue()
@@ -216,9 +216,8 @@
         assertThat(schema.userStyleSettings[0].watchFaceEditorData!!.icon!!.uri.toString())
             .isEqualTo("watchEditorIcon1")
         assertThat(schema.userStyleSettings[0].affectedWatchFaceLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[0].affectedWatchFaceLayers.first()).isEqualTo(
-            WatchFaceLayer.BASE
-        )
+        assertThat(schema.userStyleSettings[0].affectedWatchFaceLayers.first())
+            .isEqualTo(WatchFaceLayer.BASE)
         val optionArray1 =
             schema.userStyleSettings[0].options.filterIsInstance<ListOption>().toTypedArray()
         assertThat(optionArray1.size).isEqualTo(2)
@@ -240,9 +239,8 @@
         assertThat(schema.userStyleSettings[1].watchFaceEditorData!!.icon!!.uri.toString())
             .isEqualTo("watchEditorIcon2")
         assertThat(schema.userStyleSettings[1].affectedWatchFaceLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[1].affectedWatchFaceLayers.first()).isEqualTo(
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        assertThat(schema.userStyleSettings[1].affectedWatchFaceLayers.first())
+            .isEqualTo(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         val optionArray2 =
             schema.userStyleSettings[1].options.filterIsInstance<ListOption>().toTypedArray()
         assertThat(optionArray2.size).isEqualTo(2)
@@ -262,17 +260,15 @@
         assertThat(schema.userStyleSettings[2].icon).isNull()
         assertThat(schema.userStyleSettings[2].watchFaceEditorData).isNull()
         assertThat(schema.userStyleSettings[2].affectedWatchFaceLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[2].affectedWatchFaceLayers.first()).isEqualTo(
-            WatchFaceLayer.BASE
-        )
+        assertThat(schema.userStyleSettings[2].affectedWatchFaceLayers.first())
+            .isEqualTo(WatchFaceLayer.BASE)
 
-        assertThat(schema.userStyleSettings[3] is CustomValueUserStyleSetting).isTrue()
+        assertThat(schema.userStyleSettings[3] is CustomValueUserStyleSetting2).isTrue()
         assertThat(schema.userStyleSettings[3].defaultOption.id.value.decodeToString())
             .isEqualTo("default")
         assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.first()).isEqualTo(
-            WatchFaceLayer.BASE
-        )
+        assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.first())
+            .isEqualTo(WatchFaceLayer.BASE)
         assertThat(schema.userStyleSettings[3].icon).isNull()
         assertThat(schema.userStyleSettings[3].watchFaceEditorData).isNull()
     }
@@ -280,96 +276,92 @@
     @Test
     @Suppress("Deprecation") // userStyleSettings
     public fun parcelAndUnparcelHierarchicalSchema() {
-        val twelveHourClockOption =
-            ListOption(Option.Id("12_style"), "12", "12", icon = null)
+        val twelveHourClockOption = ListOption(Option.Id("12_style"), "12", "12", icon = null)
 
-        val twentyFourHourClockOption =
-            ListOption(Option.Id("24_style"), "24", "24", icon = null)
+        val twentyFourHourClockOption = ListOption(Option.Id("24_style"), "24", "24", icon = null)
 
-        val digitalClockStyleSetting = ListUserStyleSetting(
-            UserStyleSetting.Id("digital_clock_style"),
-            "Clock style",
-            "Clock style setting",
-            null,
-            listOf(twelveHourClockOption, twentyFourHourClockOption),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
+        val digitalClockStyleSetting =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("digital_clock_style"),
+                "Clock style",
+                "Clock style setting",
+                null,
+                listOf(twelveHourClockOption, twentyFourHourClockOption),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
 
-        val digitalWatchFaceType = ListOption(
-            Option.Id("digital"),
-            "Digital",
-            "Digital setting",
-            icon = null,
-            childSettings = listOf(digitalClockStyleSetting)
-        )
+        val digitalWatchFaceType =
+            ListOption(
+                Option.Id("digital"),
+                "Digital",
+                "Digital setting",
+                icon = null,
+                childSettings = listOf(digitalClockStyleSetting)
+            )
 
         val settingIcon1 = Icon.createWithContentUri("settingIcon1")
         val settingIcon2 = Icon.createWithContentUri("settingIcon2")
 
-        val styleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("id1"),
-            "displayName1",
-            "description1",
-            settingIcon1,
-            listOf(option1, option2),
-            listOf(WatchFaceLayer.BASE)
-        )
-
-        val styleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            settingIcon2,
-            listOf(option3, option4),
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
-
-        val analogWatchFaceType = ListOption(
-            Option.Id("analog"),
-            "Analog",
-            "Analog setting",
-            icon = null,
-            childSettings = listOf(styleSetting1, styleSetting2)
-        )
-
-        val watchFaceType = ListUserStyleSetting(
-            UserStyleSetting.Id("clock_type"),
-            "Watch face type",
-            "Analog or digital",
-            icon = null,
-            options = listOf(digitalWatchFaceType, analogWatchFaceType),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
-
-        val srcSchema = UserStyleSchema(
-            listOf(
-                watchFaceType,
-                digitalClockStyleSetting,
-                styleSetting1,
-                styleSetting2
+        val styleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id1"),
+                "displayName1",
+                "description1",
+                settingIcon1,
+                listOf(option1, option2),
+                listOf(WatchFaceLayer.BASE)
             )
-        )
-        assertThat(srcSchema.rootUserStyleSettings.map { it.id }).containsExactly(
-            UserStyleSetting.Id("clock_type")
-        )
+
+        val styleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                settingIcon2,
+                listOf(option3, option4),
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
+
+        val analogWatchFaceType =
+            ListOption(
+                Option.Id("analog"),
+                "Analog",
+                "Analog setting",
+                icon = null,
+                childSettings = listOf(styleSetting1, styleSetting2)
+            )
+
+        val watchFaceType =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("clock_type"),
+                "Watch face type",
+                "Analog or digital",
+                icon = null,
+                options = listOf(digitalWatchFaceType, analogWatchFaceType),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
+
+        val srcSchema =
+            UserStyleSchema(
+                listOf(watchFaceType, digitalClockStyleSetting, styleSetting1, styleSetting2)
+            )
+        assertThat(srcSchema.rootUserStyleSettings.map { it.id })
+            .containsExactly(UserStyleSetting.Id("clock_type"))
 
         val parcel = Parcel.obtain()
         srcSchema.toWireFormat().writeToParcel(parcel, 0)
 
         parcel.setDataPosition(0)
 
-        val schema =
-            UserStyleSchema(UserStyleSchemaWireFormat.CREATOR.createFromParcel(parcel))
+        val schema = UserStyleSchema(UserStyleSchemaWireFormat.CREATOR.createFromParcel(parcel))
         parcel.recycle()
 
         assertThat(schema.userStyleSettings.size).isEqualTo(4)
-        assertThat(schema.rootUserStyleSettings.map { it.id }).containsExactly(
-            UserStyleSetting.Id("clock_type")
-        )
+        assertThat(schema.rootUserStyleSettings.map { it.id })
+            .containsExactly(UserStyleSetting.Id("clock_type"))
 
         val deserializedWatchFaceType = schema.userStyleSettings[0] as ListUserStyleSetting
-        assertThat(deserializedWatchFaceType.id)
-            .isEqualTo(UserStyleSetting.Id("clock_type"))
+        assertThat(deserializedWatchFaceType.id).isEqualTo(UserStyleSetting.Id("clock_type"))
         assertThat(deserializedWatchFaceType.hasParent).isFalse()
 
         val deserializedDigitalClockStyleSetting =
@@ -378,26 +370,19 @@
             .isEqualTo(UserStyleSetting.Id("digital_clock_style"))
         assertThat(deserializedDigitalClockStyleSetting.hasParent).isTrue()
 
-        val deserializedStyleSetting1 =
-            schema.userStyleSettings[2] as ListUserStyleSetting
-        assertThat(deserializedStyleSetting1.id)
-            .isEqualTo(UserStyleSetting.Id("id1"))
+        val deserializedStyleSetting1 = schema.userStyleSettings[2] as ListUserStyleSetting
+        assertThat(deserializedStyleSetting1.id).isEqualTo(UserStyleSetting.Id("id1"))
         assertThat(deserializedStyleSetting1.hasParent).isTrue()
 
-        val deserializedStyleSetting2 =
-            schema.userStyleSettings[3] as ListUserStyleSetting
-        assertThat(deserializedStyleSetting2.id)
-            .isEqualTo(UserStyleSetting.Id("id2"))
+        val deserializedStyleSetting2 = schema.userStyleSettings[3] as ListUserStyleSetting
+        assertThat(deserializedStyleSetting2.id).isEqualTo(UserStyleSetting.Id("id2"))
         assertThat(deserializedStyleSetting2.hasParent).isTrue()
 
-        assertThat(deserializedWatchFaceType.options[0].childSettings).containsExactly(
-            deserializedDigitalClockStyleSetting
-        )
+        assertThat(deserializedWatchFaceType.options[0].childSettings)
+            .containsExactly(deserializedDigitalClockStyleSetting)
 
-        assertThat(deserializedWatchFaceType.options[1].childSettings).containsExactly(
-            deserializedStyleSetting1,
-            deserializedStyleSetting2
-        )
+        assertThat(deserializedWatchFaceType.options[1].childSettings)
+            .containsExactly(deserializedStyleSetting1, deserializedStyleSetting2)
 
         assertThat(deserializedDigitalClockStyleSetting.options[0].childSettings).isEmpty()
         assertThat(deserializedDigitalClockStyleSetting.options[1].childSettings).isEmpty()
@@ -413,29 +398,32 @@
     public fun parcelAndUnparcelUserStyle() {
         val settingIcon1 = Icon.createWithContentUri("settingIcon1")
         val settingIcon2 = Icon.createWithContentUri("settingIcon2")
-        val styleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("id1"),
-            "displayName1",
-            "description1",
-            settingIcon1,
-            listOf(option1, option2),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val styleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            settingIcon2,
-            listOf(option3, option4),
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
-        val schema = UserStyleSchema(listOf(styleSetting1, styleSetting2))
-        val userStyle = UserStyle(
-            hashMapOf(
-                styleSetting1 as UserStyleSetting to option2 as UserStyleSetting.Option,
-                styleSetting2 as UserStyleSetting to option3 as UserStyleSetting.Option
+        val styleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id1"),
+                "displayName1",
+                "description1",
+                settingIcon1,
+                listOf(option1, option2),
+                listOf(WatchFaceLayer.BASE)
             )
-        )
+        val styleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                settingIcon2,
+                listOf(option3, option4),
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
+        val schema = UserStyleSchema(listOf(styleSetting1, styleSetting2))
+        val userStyle =
+            UserStyle(
+                hashMapOf(
+                    styleSetting1 as UserStyleSetting to option2 as UserStyleSetting.Option,
+                    styleSetting2 as UserStyleSetting to option3 as UserStyleSetting.Option
+                )
+            )
 
         val parcel = Parcel.obtain()
         userStyle.toWireFormat().writeToParcel(parcel, 0)
@@ -455,102 +443,110 @@
 
     @Test
     public fun booleanUserStyleSetting_defaultValue() {
-        val booleanUserStyleSettingDefaultTrue = BooleanUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            listOf(WatchFaceLayer.BASE),
-            true
-        )
+        val booleanUserStyleSettingDefaultTrue =
+            BooleanUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                listOf(WatchFaceLayer.BASE),
+                true
+            )
         assertTrue(booleanUserStyleSettingDefaultTrue.getDefaultValue())
 
-        val booleanUserStyleSettingDefaultFalse = BooleanUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            listOf(WatchFaceLayer.BASE),
-            false
-        )
+        val booleanUserStyleSettingDefaultFalse =
+            BooleanUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                listOf(WatchFaceLayer.BASE),
+                false
+            )
         assertFalse(booleanUserStyleSettingDefaultFalse.getDefaultValue())
     }
 
     @Test
     public fun doubleRangeUserStyleSetting_defaultValue() {
-        val doubleRangeUserStyleSettingDefaultMin = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            -1.0
-        )
+        val doubleRangeUserStyleSettingDefaultMin =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                -1.0
+            )
         assertThat(doubleRangeUserStyleSettingDefaultMin.defaultValue).isEqualTo(-1.0)
 
-        val doubleRangeUserStyleSettingDefaultMid = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.5
-        )
+        val doubleRangeUserStyleSettingDefaultMid =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.5
+            )
         assertThat(doubleRangeUserStyleSettingDefaultMid.defaultValue).isEqualTo(0.5)
 
-        val doubleRangeUserStyleSettingDefaultMax = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            1.0
-        )
+        val doubleRangeUserStyleSettingDefaultMax =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                1.0
+            )
         assertThat(doubleRangeUserStyleSettingDefaultMax.defaultValue).isEqualTo(1.0)
     }
 
     @Test
     public fun longRangeUserStyleSetting_defaultValue() {
-        val longRangeUserStyleSettingDefaultMin = LongRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1,
-            10,
-            listOf(WatchFaceLayer.BASE),
-            -1,
-        )
+        val longRangeUserStyleSettingDefaultMin =
+            LongRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1,
+                10,
+                listOf(WatchFaceLayer.BASE),
+                -1,
+            )
         assertThat(longRangeUserStyleSettingDefaultMin.defaultValue).isEqualTo(-1)
 
-        val longRangeUserStyleSettingDefaultMid = LongRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1,
-            10,
-            listOf(WatchFaceLayer.BASE),
-            5
-        )
+        val longRangeUserStyleSettingDefaultMid =
+            LongRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1,
+                10,
+                listOf(WatchFaceLayer.BASE),
+                5
+            )
         assertThat(longRangeUserStyleSettingDefaultMid.defaultValue).isEqualTo(5)
 
-        val longRangeUserStyleSettingDefaultMax = LongRangeUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            null,
-            -1,
-            10,
-            listOf(WatchFaceLayer.BASE),
-            10
-        )
+        val longRangeUserStyleSettingDefaultMax =
+            LongRangeUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                null,
+                -1,
+                10,
+                listOf(WatchFaceLayer.BASE),
+                10
+            )
         assertThat(longRangeUserStyleSettingDefaultMax.defaultValue).isEqualTo(10)
     }
 
@@ -559,83 +555,86 @@
     public fun parcelAndUnparcelComplicationsUserStyleSetting() {
         val leftComplicationID = 101
         val rightComplicationID = 102
-        val src = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "Complications",
-            "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
-                    "Both",
-                    "Both complications visible",
-                    null,
-                    listOf()
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id("NO_COMPLICATIONS"),
-                    "None",
-                    "No complications visible",
-                    null,
+        val src =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "Complications",
+                "Number and position",
+                icon = null,
+                complicationConfig =
                     listOf(
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            enabled = false
+                        ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            Option.Id("LEFT_AND_RIGHT_COMPLICATIONS"),
+                            "Both",
+                            "Both complications visible",
+                            null,
+                            listOf()
                         ),
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            rightComplicationID,
-                            enabled = false
-                        )
-                    )
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id("LEFT_COMPLICATION"),
-                    "Left",
-                    "Left complication visible",
-                    null,
-                    listOf(
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            rightComplicationID,
-                            enabled = false
+                        ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            Option.Id("NO_COMPLICATIONS"),
+                            "None",
+                            "No complications visible",
+                            null,
+                            listOf(
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    leftComplicationID,
+                                    enabled = false
+                                ),
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    rightComplicationID,
+                                    enabled = false
+                                )
+                            )
                         ),
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            enabled = true,
-                            nameResourceId = NAME_RESOURCE_ID,
-                            screenReaderNameResourceId = SCREEN_READER_NAME_RESOURCE_ID
-                        )
-                    )
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id("RIGHT_COMPLICATION"),
-                    "Right",
-                    "Right complication visible",
-                    null,
-                    listOf(
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            enabled = false
-                        )
-                    )
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id("RIGHT_COMPLICATION_MOVED"),
-                    "MoveRight",
-                    "Right complication moved",
-                    null,
-                    listOf(
-                        ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
-                            leftComplicationID,
-                            complicationSlotBounds = ComplicationSlotBounds(
-                                RectF(0.1f, 0.2f, 0.3f, 0.4f),
-                                RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                        ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            Option.Id("LEFT_COMPLICATION"),
+                            "Left",
+                            "Left complication visible",
+                            null,
+                            listOf(
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    rightComplicationID,
+                                    enabled = false
+                                ),
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    leftComplicationID,
+                                    enabled = true,
+                                    nameResourceId = NAME_RESOURCE_ID,
+                                    screenReaderNameResourceId = SCREEN_READER_NAME_RESOURCE_ID
+                                )
+                            )
+                        ),
+                        ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            Option.Id("RIGHT_COMPLICATION"),
+                            "Right",
+                            "Right complication visible",
+                            null,
+                            listOf(
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    leftComplicationID,
+                                    enabled = false
+                                )
+                            )
+                        ),
+                        ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                            Option.Id("RIGHT_COMPLICATION_MOVED"),
+                            "MoveRight",
+                            "Right complication moved",
+                            null,
+                            listOf(
+                                ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
+                                    leftComplicationID,
+                                    complicationSlotBounds =
+                                        ComplicationSlotBounds(
+                                            RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                                            RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                                        )
+                                )
                             )
                         )
-                    )
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         val parcel = Parcel.obtain()
         src.toWireFormat().writeToParcel(parcel, 0)
@@ -651,8 +650,10 @@
         assertThat(unparceled is ComplicationSlotsUserStyleSetting).isTrue()
         assertThat(unparceled.id.value).isEqualTo("complications_style_setting")
 
-        val options = unparceled.options.filterIsInstance<
-            ComplicationSlotsUserStyleSetting.ComplicationSlotsOption>()
+        val options =
+            unparceled.options.filterIsInstance<
+                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
+            >()
         assertThat(options.size).isEqualTo(5)
         assertThat(options[0].id.value.decodeToString()).isEqualTo("LEFT_AND_RIGHT_COMPLICATIONS")
         assertThat(options[0].complicationSlotOverlays.size).isEqualTo(0)
@@ -688,10 +689,8 @@
         assertThat(options4Overlays[0].complicationSlotId).isEqualTo(leftComplicationID)
         assertThat(options4Overlays[0].enabled).isNull()
 
-        val expectedComplicationSlotBounds = ComplicationSlotBounds(
-            RectF(0.1f, 0.2f, 0.3f, 0.4f),
-            RectF(0.5f, 0.6f, 0.7f, 0.8f)
-        )
+        val expectedComplicationSlotBounds =
+            ComplicationSlotBounds(RectF(0.1f, 0.2f, 0.3f, 0.4f), RectF(0.5f, 0.6f, 0.7f, 0.8f))
         assertThat(options4Overlays[0].complicationSlotBounds?.perComplicationTypeBounds)
             .containsExactlyEntriesIn(expectedComplicationSlotBounds.perComplicationTypeBounds)
         assertThat(options4Overlays[0].complicationSlotBounds?.perComplicationTypeMargins)
@@ -702,47 +701,41 @@
     public fun styleSchemaToString() {
         val settingIcon1 = Icon.createWithContentUri("settingIcon1")
         val settingIcon2 = Icon.createWithContentUri("settingIcon2")
-        val styleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("id1"),
-            "displayName1",
-            "description1",
-            settingIcon1,
-            listOf(option1, option2),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val styleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            settingIcon2,
-            listOf(option3, option4),
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
-        val styleSetting3 = BooleanUserStyleSetting(
-            UserStyleSetting.Id("id3"),
-            "displayName3",
-            "description3",
-            null,
-            listOf(WatchFaceLayer.BASE),
-            true
-        )
-        val styleSetting4 = CustomValueUserStyleSetting(
-            listOf(WatchFaceLayer.BASE),
-            "default".encodeToByteArray()
-        )
-
-        val schema = UserStyleSchema(
-            listOf(
-                styleSetting1,
-                styleSetting2,
-                styleSetting3,
-                styleSetting4
+        val styleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id1"),
+                "displayName1",
+                "description1",
+                settingIcon1,
+                listOf(option1, option2),
+                listOf(WatchFaceLayer.BASE)
             )
-        )
+        val styleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                settingIcon2,
+                listOf(option3, option4),
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
+        val styleSetting3 =
+            BooleanUserStyleSetting(
+                UserStyleSetting.Id("id3"),
+                "displayName3",
+                "description3",
+                null,
+                listOf(WatchFaceLayer.BASE),
+                true
+            )
+        val styleSetting4 =
+            CustomValueUserStyleSetting(listOf(WatchFaceLayer.BASE), "default".encodeToByteArray())
 
-        assertThat(schema.toString()).isEqualTo(
-            "[{id1 : 1, 2}, {id2 : 3, 4}, {id3 : true, false}, {CustomValue : default}]"
-        )
+        val schema =
+            UserStyleSchema(listOf(styleSetting1, styleSetting2, styleSetting3, styleSetting4))
+
+        assertThat(schema.toString())
+            .isEqualTo("[{id1 : 1, 2}, {id2 : 3, 4}, {id3 : true, false}, {CustomValue : default}]")
     }
 
     @Ignore
@@ -750,28 +743,25 @@
     public fun userStyleToString() {
         val settingIcon1 = Icon.createWithContentUri("settingIcon1")
         val settingIcon2 = Icon.createWithContentUri("settingIcon2")
-        val styleSetting1 = ListUserStyleSetting(
-            UserStyleSetting.Id("id1"),
-            "displayName1",
-            "description1",
-            settingIcon1,
-            listOf(option1, option2),
-            listOf(WatchFaceLayer.BASE)
-        )
-        val styleSetting2 = ListUserStyleSetting(
-            UserStyleSetting.Id("id2"),
-            "displayName2",
-            "description2",
-            settingIcon2,
-            listOf(option3, option4),
-            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-        )
-        val style = UserStyle(
-            mapOf(
-                styleSetting1 to option2,
-                styleSetting2 to option3
+        val styleSetting1 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id1"),
+                "displayName1",
+                "description1",
+                settingIcon1,
+                listOf(option1, option2),
+                listOf(WatchFaceLayer.BASE)
             )
-        )
+        val styleSetting2 =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("id2"),
+                "displayName2",
+                "description2",
+                settingIcon2,
+                listOf(option3, option4),
+                listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+            )
+        val style = UserStyle(mapOf(styleSetting1 to option2, styleSetting2 to option3))
 
         assertThat(style.toString()).contains("id1 -> 2")
         assertThat(style.toString()).contains("id2 -> 3")
diff --git a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleTestRunner.kt b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleTestRunner.kt
index 3d018cd..b18238b 100644
--- a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleTestRunner.kt
+++ b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleTestRunner.kt
@@ -24,9 +24,7 @@
 // "failed to access class kotlin.jvm.internal.DefaultConstructorMarker".
 public class StyleTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration =
-        InstrumentationConfiguration.Builder(
-            super.createClassLoaderConfig(method)
-        )
+        InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
             .doNotInstrumentPackage("androidx.wear.watchface.style")
             .build()
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
index 0101694..5fa5892 100644
--- a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
+++ b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.wear.watchface.style
 
+import android.annotation.SuppressLint
 import android.graphics.Bitmap
 import android.graphics.RectF
 import android.graphics.drawable.Icon
@@ -24,15 +25,16 @@
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
+import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
 import androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption
 import androidx.wear.watchface.style.UserStyleSetting.Option
 import androidx.wear.watchface.style.data.ComplicationOverlayWireFormat
 import com.google.common.truth.Truth.assertThat
+import java.nio.ByteBuffer
+import kotlin.test.assertFailsWith
 import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.nio.ByteBuffer
-import kotlin.test.assertFailsWith
 
 @RunWith(StyleTestRunner::class)
 public class UserStyleSettingTest {
@@ -64,28 +66,26 @@
             )
 
         assertThat(
-            (
-                rangedUserStyleSetting.getOptionForId(
-                    Option.Id("not a number".encodeToByteArray())
-                ) as DoubleRangeOption
-                ).value
-        ).isEqualTo(defaultValue)
+                (rangedUserStyleSetting.getOptionForId(
+                        Option.Id("not a number".encodeToByteArray())
+                    ) as DoubleRangeOption)
+                    .value
+            )
+            .isEqualTo(defaultValue)
 
         assertThat(
-            (
-                rangedUserStyleSetting.getOptionForId(
-                    Option.Id("-1".encodeToByteArray())
-                ) as DoubleRangeOption
-                ).value
-        ).isEqualTo(defaultValue)
+                (rangedUserStyleSetting.getOptionForId(Option.Id("-1".encodeToByteArray()))
+                        as DoubleRangeOption)
+                    .value
+            )
+            .isEqualTo(defaultValue)
 
         assertThat(
-            (
-                rangedUserStyleSetting.getOptionForId(
-                    Option.Id("10".encodeToByteArray())
-                ) as DoubleRangeOption
-                ).value
-        ).isEqualTo(defaultValue)
+                (rangedUserStyleSetting.getOptionForId(Option.Id("10".encodeToByteArray()))
+                        as DoubleRangeOption)
+                    .value
+            )
+            .isEqualTo(defaultValue)
     }
 
     @Test
@@ -112,22 +112,25 @@
             )
 
         assertThat(
-            byteArrayToDouble(
-                rangedUserStyleSetting.getOptionForId(doubleToOptionId(0.0)).id.value
+                byteArrayToDouble(
+                    rangedUserStyleSetting.getOptionForId(doubleToOptionId(0.0)).id.value
+                )
             )
-        ).isEqualTo(0.0)
+            .isEqualTo(0.0)
 
         assertThat(
-            byteArrayToDouble(
-                rangedUserStyleSetting.getOptionForId(doubleToOptionId(0.5)).id.value
+                byteArrayToDouble(
+                    rangedUserStyleSetting.getOptionForId(doubleToOptionId(0.5)).id.value
+                )
             )
-        ).isEqualTo(0.5)
+            .isEqualTo(0.5)
 
         assertThat(
-            byteArrayToDouble(
-                rangedUserStyleSetting.getOptionForId(doubleToOptionId(1.0)).id.value
+                byteArrayToDouble(
+                    rangedUserStyleSetting.getOptionForId(doubleToOptionId(1.0)).id.value
+                )
             )
-        ).isEqualTo(1.0)
+            .isEqualTo(1.0)
     }
 
     @Test
@@ -147,11 +150,64 @@
     @Test
     public fun maximumOptionIdLength() {
         // OK.
-        Option.Id("x".repeat(Option.Id.MAX_LENGTH))
+        ListOption(
+            Option.Id("x".repeat(Option.Id.MAX_LENGTH)),
+            displayName = "test",
+            screenReaderName = "test",
+            icon = null
+        )
 
         try {
             // Not OK.
-            Option.Id("x".repeat(Option.Id.MAX_LENGTH + 1))
+            ListOption(
+                Option.Id("x".repeat(Option.Id.MAX_LENGTH + 1)),
+                displayName = "test",
+                screenReaderName = "test",
+                icon = null
+            )
+            fail("Should have thrown an exception")
+        } catch (e: Exception) {
+            // Expected
+        }
+    }
+
+    @Test
+    public fun maximumCustomValueOptionSize() {
+        // OK.
+        UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(
+            ByteArray(Option.Id.MAX_LENGTH)
+        )
+
+        try {
+            // Not OK.
+            UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(
+                ByteArray(Option.Id.MAX_LENGTH + 1)
+            )
+            fail("Should have thrown an exception")
+        } catch (e: Exception) {
+            // Expected
+        }
+    }
+
+    @SuppressLint("NewApi")
+    @Test
+    public fun maximumCustomValueOption2Size() {
+        // OK.
+        UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(
+            ByteArray(Option.Id.MAX_LENGTH + 1)
+        )
+
+        UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(
+            ByteArray(UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.MAX_SIZE)
+        )
+
+        try {
+            // Not OK.
+            UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption(
+                ByteArray(
+                    UserStyleSetting.CustomValueUserStyleSetting2.CustomValueOption.MAX_SIZE + 1
+                )
+            )
             fail("Should have thrown an exception")
         } catch (e: Exception) {
             // Expected
@@ -160,46 +216,50 @@
 
     @Test
     public fun equalsBasedOnId() {
-        val setting = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
-        val settingCopy = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
-        val settings1ModifiedInfo = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting (modified)",
-            "An example setting (modified)",
-            null,
-            0.0,
-            100.0,
-            listOf(WatchFaceLayer.BASE),
-            3.0
-        )
-        val settings1ModifiedId = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting_modified"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
+        val setting =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
+        val settingCopy =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
+        val settings1ModifiedInfo =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting (modified)",
+                "An example setting (modified)",
+                null,
+                0.0,
+                100.0,
+                listOf(WatchFaceLayer.BASE),
+                3.0
+            )
+        val settings1ModifiedId =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting_modified"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
         assertThat(setting).isEqualTo(setting)
         assertThat(setting).isEqualTo(settingCopy)
         assertThat(setting).isEqualTo(settings1ModifiedInfo)
@@ -208,46 +268,50 @@
 
     @Test
     public fun hashcodeBasedOnId() {
-        val setting = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
-        val settingCopy = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
-        val settings1ModifiedInfo = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting"),
-            "Example Ranged Setting (modified)",
-            "An example setting (modified)",
-            null,
-            0.0,
-            100.0,
-            listOf(WatchFaceLayer.BASE),
-            3.0
-        )
-        val settings1ModifiedId = DoubleRangeUserStyleSetting(
-            UserStyleSetting.Id("example_setting_modified"),
-            "Example Ranged Setting",
-            "An example setting",
-            null,
-            0.0,
-            1.0,
-            listOf(WatchFaceLayer.BASE),
-            0.1
-        )
+        val setting =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
+        val settingCopy =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
+        val settings1ModifiedInfo =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting"),
+                "Example Ranged Setting (modified)",
+                "An example setting (modified)",
+                null,
+                0.0,
+                100.0,
+                listOf(WatchFaceLayer.BASE),
+                3.0
+            )
+        val settings1ModifiedId =
+            DoubleRangeUserStyleSetting(
+                UserStyleSetting.Id("example_setting_modified"),
+                "Example Ranged Setting",
+                "An example setting",
+                null,
+                0.0,
+                1.0,
+                listOf(WatchFaceLayer.BASE),
+                0.1
+            )
         assertThat(setting.hashCode()).isEqualTo(setting.hashCode())
         assertThat(setting.hashCode()).isEqualTo(settingCopy.hashCode())
         assertThat(setting.hashCode()).isEqualTo(settings1ModifiedInfo.hashCode())
@@ -343,18 +407,18 @@
 
     @Test
     public fun partial_ComplicationBounds_in_ComplicationOverlayWireFormat() {
-        val wireFormat = ComplicationOverlayWireFormat(
-            123,
-            true,
-            mapOf(
-                ComplicationType.SHORT_TEXT.toWireComplicationType() to
-                    RectF(0.1f, 0.2f, 0.3f, 0.4f),
-
-                ComplicationType.LONG_TEXT.toWireComplicationType() to
-                    RectF(0.5f, 0.6f, 0.7f, 0.8f)
-            ),
-            null
-        )
+        val wireFormat =
+            ComplicationOverlayWireFormat(
+                123,
+                true,
+                mapOf(
+                    ComplicationType.SHORT_TEXT.toWireComplicationType() to
+                        RectF(0.1f, 0.2f, 0.3f, 0.4f),
+                    ComplicationType.LONG_TEXT.toWireComplicationType() to
+                        RectF(0.5f, 0.6f, 0.7f, 0.8f)
+                ),
+                null
+            )
 
         val overlay =
             UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(
@@ -397,13 +461,14 @@
             ComplicationSlotOverlay(1, nameResourceId = null, screenReaderNameResourceId = null)
         val rightComplicationSlot =
             ComplicationSlotOverlay(2, nameResourceId = null, screenReaderNameResourceId = null)
-        val option = UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-            Option.Id("both"),
-            "right and left complications",
-            "right and left complications",
-            icon = null,
-            listOf(rightComplicationSlot, leftComplicationSlot),
-        )
+        val option =
+            UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                Option.Id("both"),
+                "right and left complications",
+                "right and left complications",
+                icon = null,
+                listOf(rightComplicationSlot, leftComplicationSlot),
+            )
 
         val optionAfterRoundTrip =
             UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
@@ -411,9 +476,14 @@
             )
 
         assertThat(option).isEqualTo(optionAfterRoundTrip)
-        assertThat(optionAfterRoundTrip.complicationSlotOverlays).containsExactly(
-            ComplicationSlotOverlay(1, nameResourceId = null, screenReaderNameResourceId = null),
-            ComplicationSlotOverlay(2, nameResourceId = null, screenReaderNameResourceId = null)
-        )
+        assertThat(optionAfterRoundTrip.complicationSlotOverlays)
+            .containsExactly(
+                ComplicationSlotOverlay(
+                    1,
+                    nameResourceId = null,
+                    screenReaderNameResourceId = null
+                ),
+                ComplicationSlotOverlay(2, nameResourceId = null, screenReaderNameResourceId = null)
+            )
     }
 }
diff --git a/wear/watchface/watchface/api/current.ignore b/wear/watchface/watchface/api/current.ignore
new file mode 100644
index 0000000..08cfb6e
--- /dev/null
+++ b/wear/watchface/watchface/api/current.ignore
@@ -0,0 +1,11 @@
+// Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.ComplicationSlotsManagerKt:
+    Removed class androidx.wear.watchface.ComplicationSlotsManagerKt
+RemovedClass: androidx.wear.watchface.RenderBufferTextureKt:
+    Removed class androidx.wear.watchface.RenderBufferTextureKt
+RemovedClass: androidx.wear.watchface.RendererKt:
+    Removed class androidx.wear.watchface.RendererKt
+RemovedClass: androidx.wear.watchface.WatchFaceKt:
+    Removed class androidx.wear.watchface.WatchFaceKt
+RemovedClass: androidx.wear.watchface.WatchFaceServiceKt:
+    Removed class androidx.wear.watchface.WatchFaceServiceKt
diff --git a/wear/watchface/watchface/api/current.txt b/wear/watchface/watchface/api/current.txt
index c61b6eb..6b8eb15 100644
--- a/wear/watchface/watchface/api/current.txt
+++ b/wear/watchface/watchface/api/current.txt
@@ -108,9 +108,6 @@
     method public default void onComplicationSlotTapped(int complicationSlotId);
   }
 
-  public final class ComplicationSlotsManagerKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComplicationTapFilter {
     method public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y, boolean includeMargins);
     method @Deprecated public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
@@ -136,9 +133,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class RenderBufferTextureKt {
-  }
-
   public final class RenderParameters {
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
@@ -280,9 +274,6 @@
     method @UiThread public void onDestroy();
   }
 
-  public final class RendererKt {
-  }
-
   public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
     ctor public RoundRectComplicationTapFilter();
   }
@@ -350,12 +341,6 @@
     method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
   }
 
-  public final class WatchFaceColorsKt {
-  }
-
-  public final class WatchFaceKt {
-  }
-
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
     method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
@@ -374,9 +359,6 @@
   public static final class WatchFaceService.Companion {
   }
 
-  public final class WatchFaceServiceKt {
-  }
-
   public final class WatchState {
     ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless, kotlinx.coroutines.flow.StateFlow<java.lang.String> watchFaceInstanceId);
     ctor @Deprecated public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, int chinHeight, boolean isHeadless);
diff --git a/wear/watchface/watchface/api/public_plus_experimental_current.txt b/wear/watchface/watchface/api/public_plus_experimental_current.txt
index 99d275b..2e7a478 100644
--- a/wear/watchface/watchface/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface/api/public_plus_experimental_current.txt
@@ -124,9 +124,6 @@
     method public default void onComplicationSlotTapped(int complicationSlotId);
   }
 
-  public final class ComplicationSlotsManagerKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComplicationTapFilter {
     method public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y, boolean includeMargins);
     method @Deprecated public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
@@ -152,9 +149,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class RenderBufferTextureKt {
-  }
-
   public final class RenderParameters {
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
@@ -299,9 +293,6 @@
     method @UiThread public void onDestroy();
   }
 
-  public final class RendererKt {
-  }
-
   public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
     ctor public RoundRectComplicationTapFilter();
   }
@@ -379,15 +370,9 @@
     property public final android.graphics.Color tertiaryColor;
   }
 
-  public final class WatchFaceColorsKt {
-  }
-
   @kotlin.RequiresOptIn(message="This is an experimental API that may change or be removed without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface WatchFaceExperimental {
   }
 
-  public final class WatchFaceKt {
-  }
-
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
     method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
@@ -406,9 +391,6 @@
   public static final class WatchFaceService.Companion {
   }
 
-  public final class WatchFaceServiceKt {
-  }
-
   public final class WatchState {
     ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless, kotlinx.coroutines.flow.StateFlow<java.lang.String> watchFaceInstanceId);
     ctor @Deprecated public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, int chinHeight, boolean isHeadless);
diff --git a/wear/watchface/watchface/api/restricted_current.ignore b/wear/watchface/watchface/api/restricted_current.ignore
index 6cea676..6abfc87 100644
--- a/wear/watchface/watchface/api/restricted_current.ignore
+++ b/wear/watchface/watchface/api/restricted_current.ignore
@@ -1,4 +1,16 @@
 // Baseline format: 1.0
+RemovedClass: androidx.wear.watchface.ComplicationSlotsManagerKt:
+    Removed class androidx.wear.watchface.ComplicationSlotsManagerKt
+RemovedClass: androidx.wear.watchface.RenderBufferTextureKt:
+    Removed class androidx.wear.watchface.RenderBufferTextureKt
+RemovedClass: androidx.wear.watchface.RendererKt:
+    Removed class androidx.wear.watchface.RendererKt
+RemovedClass: androidx.wear.watchface.WatchFaceKt:
+    Removed class androidx.wear.watchface.WatchFaceKt
+RemovedClass: androidx.wear.watchface.WatchFaceServiceKt:
+    Removed class androidx.wear.watchface.WatchFaceServiceKt
+
+
 RemovedMethod: androidx.wear.watchface.RenderParameters#RenderParameters(androidx.wear.watchface.data.RenderParametersWireFormat):
     Removed constructor androidx.wear.watchface.RenderParameters(androidx.wear.watchface.data.RenderParametersWireFormat)
 RemovedMethod: androidx.wear.watchface.RenderParameters#toWireFormat():
diff --git a/wear/watchface/watchface/api/restricted_current.txt b/wear/watchface/watchface/api/restricted_current.txt
index c61b6eb..6b8eb15 100644
--- a/wear/watchface/watchface/api/restricted_current.txt
+++ b/wear/watchface/watchface/api/restricted_current.txt
@@ -108,9 +108,6 @@
     method public default void onComplicationSlotTapped(int complicationSlotId);
   }
 
-  public final class ComplicationSlotsManagerKt {
-  }
-
   @kotlin.jvm.JvmDefaultWithCompatibility public interface ComplicationTapFilter {
     method public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y, boolean includeMargins);
     method @Deprecated public default boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
@@ -136,9 +133,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class RenderBufferTextureKt {
-  }
-
   public final class RenderParameters {
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
     ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
@@ -280,9 +274,6 @@
     method @UiThread public void onDestroy();
   }
 
-  public final class RendererKt {
-  }
-
   public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
     ctor public RoundRectComplicationTapFilter();
   }
@@ -350,12 +341,6 @@
     method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
   }
 
-  public final class WatchFaceColorsKt {
-  }
-
-  public final class WatchFaceKt {
-  }
-
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
     method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
@@ -374,9 +359,6 @@
   public static final class WatchFaceService.Companion {
   }
 
-  public final class WatchFaceServiceKt {
-  }
-
   public final class WatchState {
     ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless, kotlinx.coroutines.flow.StateFlow<java.lang.String> watchFaceInstanceId);
     ctor @Deprecated public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, int chinHeight, boolean isHeadless);
diff --git a/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java b/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
index 3c8e640..c56ae533 100644
--- a/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
+++ b/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
@@ -52,7 +52,11 @@
             @NotNull SurfaceHolder surfaceHolder,
             @NotNull CurrentUserStyleRepository currentUserStyleRepository,
             @NotNull WatchState watchState) {
-        super(surfaceHolder, currentUserStyleRepository, watchState, CanvasType.HARDWARE,
+        super(
+                surfaceHolder,
+                currentUserStyleRepository,
+                watchState,
+                CanvasType.HARDWARE,
                 UPDATE_DELAY_MILLIS);
         mWatchState = watchState;
         mPaint = new Paint();
@@ -61,8 +65,8 @@
     }
 
     @Override
-    public void render(@NotNull Canvas canvas, @NotNull Rect rect,
-            @NotNull ZonedDateTime zonedDateTime) {
+    public void render(
+            @NotNull Canvas canvas, @NotNull Rect rect, @NotNull ZonedDateTime zonedDateTime) {
         mPaint.setColor(Color.BLACK);
         canvas.drawRect(rect, mPaint);
         mPaint.setColor(Color.WHITE);
@@ -77,7 +81,8 @@
         mTimeText[2] = second % 2 == 0 ? ':' : ' ';
         mTimeText[3] = DIGITS[minute / 10];
         mTimeText[4] = DIGITS[minute % 10];
-        canvas.drawText(mTimeText,
+        canvas.drawText(
+                mTimeText,
                 0,
                 5,
                 rect.centerX(),
@@ -86,8 +91,8 @@
     }
 
     @Override
-    public void renderHighlightLayer(@NonNull Canvas canvas, @NonNull Rect bounds,
-            @NonNull ZonedDateTime zonedDateTime) {
+    public void renderHighlightLayer(
+            @NonNull Canvas canvas, @NonNull Rect bounds, @NonNull ZonedDateTime zonedDateTime) {
         canvas.drawColor(getRenderParameters().getHighlightLayer().getBackgroundTint());
     }
 }
diff --git a/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceService.java b/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceService.java
index ba1bdac..27905a9 100644
--- a/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceService.java
+++ b/wear/watchface/watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceService.java
@@ -38,12 +38,12 @@
     @NotNull
     @Override
     protected ListenableFuture<WatchFace> createWatchFaceFuture(
-            @NotNull SurfaceHolder surfaceHolder, @NotNull WatchState watchState,
+            @NotNull SurfaceHolder surfaceHolder,
+            @NotNull WatchState watchState,
             @NonNull ComplicationSlotsManager complicationSlotsManager,
             @NonNull CurrentUserStyleRepository currentUserStyleRepository) {
         Renderer renderer =
                 new WatchFaceRenderer(surfaceHolder, currentUserStyleRepository, watchState);
-        return Futures.immediateFuture(
-                new WatchFace(WatchFaceType.DIGITAL, renderer));
+        return Futures.immediateFuture(new WatchFace(WatchFaceType.DIGITAL, renderer));
     }
 }
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
index c70d866..a2c88c1 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
@@ -85,29 +85,30 @@
             R.string.colors_style_setting,
             R.string.colors_style_setting_description,
             icon = null,
-            options = listOf(
-                ListUserStyleSetting.ListOption(
-                    Option.Id(RED_STYLE),
-                    resources,
-                    R.string.colors_style_red,
-                    R.string.colors_style_red_screen_reader,
-                    Icon.createWithResource(this, R.drawable.red_style)
+            options =
+                listOf(
+                    ListUserStyleSetting.ListOption(
+                        Option.Id(RED_STYLE),
+                        resources,
+                        R.string.colors_style_red,
+                        R.string.colors_style_red_screen_reader,
+                        Icon.createWithResource(this, R.drawable.red_style)
+                    ),
+                    ListUserStyleSetting.ListOption(
+                        Option.Id(GREEN_STYLE),
+                        resources,
+                        R.string.colors_style_green,
+                        R.string.colors_style_green_screen_reader,
+                        Icon.createWithResource(this, R.drawable.green_style)
+                    ),
+                    ListUserStyleSetting.ListOption(
+                        Option.Id(BLUE_STYLE),
+                        resources,
+                        R.string.colors_style_blue,
+                        R.string.colors_style_blue_screen_reader,
+                        Icon.createWithResource(this, R.drawable.blue_style)
+                    )
                 ),
-                ListUserStyleSetting.ListOption(
-                    Option.Id(GREEN_STYLE),
-                    resources,
-                    R.string.colors_style_green,
-                    R.string.colors_style_green_screen_reader,
-                    Icon.createWithResource(this, R.drawable.green_style)
-                ),
-                ListUserStyleSetting.ListOption(
-                    Option.Id(BLUE_STYLE),
-                    resources,
-                    R.string.colors_style_blue,
-                    R.string.colors_style_blue_screen_reader,
-                    Icon.createWithResource(this, R.drawable.blue_style)
-                )
-            ),
             listOf(
                 WatchFaceLayer.BASE,
                 WatchFaceLayer.COMPLICATIONS,
@@ -152,57 +153,59 @@
             R.string.watchface_complications_setting,
             R.string.watchface_complications_setting_description,
             icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id(LEFT_AND_RIGHT_COMPLICATIONS),
-                    resources,
-                    R.string.watchface_complications_setting_both,
-                    null,
-                    // NB this list is empty because each [ComplicationSlotOverlay] is applied on
-                    // top of the initial config.
-                    listOf()
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id(NO_COMPLICATIONS),
-                    resources,
-                    R.string.watchface_complications_setting_none,
-                    null,
-                    listOf(
-                        ComplicationSlotOverlay(
-                            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                            enabled = false
-                        ),
-                        ComplicationSlotOverlay(
-                            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                            enabled = false
+            complicationConfig =
+                listOf(
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        Option.Id(LEFT_AND_RIGHT_COMPLICATIONS),
+                        resources,
+                        R.string.watchface_complications_setting_both,
+                        null,
+                        // NB this list is empty because each [ComplicationSlotOverlay] is applied
+                        // on
+                        // top of the initial config.
+                        listOf()
+                    ),
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        Option.Id(NO_COMPLICATIONS),
+                        resources,
+                        R.string.watchface_complications_setting_none,
+                        null,
+                        listOf(
+                            ComplicationSlotOverlay(
+                                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                                enabled = false
+                            ),
+                            ComplicationSlotOverlay(
+                                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                                enabled = false
+                            )
+                        )
+                    ),
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        Option.Id(LEFT_COMPLICATION),
+                        resources,
+                        R.string.watchface_complications_setting_left,
+                        null,
+                        listOf(
+                            ComplicationSlotOverlay(
+                                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                                enabled = false
+                            )
+                        )
+                    ),
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        Option.Id(RIGHT_COMPLICATION),
+                        resources,
+                        R.string.watchface_complications_setting_right,
+                        null,
+                        listOf(
+                            ComplicationSlotOverlay(
+                                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                                enabled = false
+                            )
                         )
                     )
                 ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id(LEFT_COMPLICATION),
-                    resources,
-                    R.string.watchface_complications_setting_left,
-                    null,
-                    listOf(
-                        ComplicationSlotOverlay(
-                            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                            enabled = false
-                        )
-                    )
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    Option.Id(RIGHT_COMPLICATION),
-                    resources,
-                    R.string.watchface_complications_setting_right,
-                    null,
-                    listOf(
-                        ComplicationSlotOverlay(
-                            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                            enabled = false
-                        )
-                    )
-                )
-            ),
             listOf(WatchFaceLayer.COMPLICATIONS)
         )
     }
@@ -221,15 +224,16 @@
         )
     }
 
-    public override fun createUserStyleSchema() = UserStyleSchema(
-        listOf(
-            colorStyleSetting,
-            drawHourPipsStyleSetting,
-            watchHandLengthStyleSetting,
-            complicationsStyleSetting,
-            hoursDrawFreqStyleSetting
+    public override fun createUserStyleSchema() =
+        UserStyleSchema(
+            listOf(
+                colorStyleSetting,
+                drawHourPipsStyleSetting,
+                watchHandLengthStyleSetting,
+                complicationsStyleSetting,
+                hoursDrawFreqStyleSetting
+            )
         )
-    )
 
     private val exampleFlavor by lazy {
         UserStyleFlavor(
@@ -265,56 +269,62 @@
     public override fun createComplicationSlotsManager(
         currentUserStyleRepository: CurrentUserStyleRepository
     ): ComplicationSlotsManager {
-        val canvasComplicationFactory =
-            CanvasComplicationFactory { watchState, listener ->
-                CanvasComplicationDrawable(
-                    watchFaceStyle.getDrawable(this@ExampleCanvasAnalogWatchFaceService)!!,
-                    watchState,
-                    listener
+        val canvasComplicationFactory = CanvasComplicationFactory { watchState, listener ->
+            CanvasComplicationDrawable(
+                watchFaceStyle.getDrawable(this@ExampleCanvasAnalogWatchFaceService)!!,
+                watchState,
+                listener
+            )
+        }
+        val leftComplication =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                    canvasComplicationFactory,
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.GOAL_PROGRESS,
+                        ComplicationType.WEIGHTED_ELEMENTS,
+                        ComplicationType.LONG_TEXT,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    // try to use the configurable data source sample, then default to system data
+                    // source
+                    DefaultComplicationDataSourcePolicy(
+                        ComponentName(CONFIGURABLE_DATA_SOURCE_PKG, CONFIGURABLE_DATA_SOURCE),
+                        ComplicationType.SHORT_TEXT,
+                        SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                        ComplicationType.SHORT_TEXT
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
                 )
-            }
-        val leftComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-            canvasComplicationFactory,
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.GOAL_PROGRESS,
-                ComplicationType.WEIGHTED_ELEMENTS,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            // try to use the configurable data source sample, then default to system data source
-            DefaultComplicationDataSourcePolicy(
-                ComponentName(CONFIGURABLE_DATA_SOURCE_PKG, CONFIGURABLE_DATA_SOURCE),
-                ComplicationType.SHORT_TEXT,
-                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
-                ComplicationType.SHORT_TEXT
-            ),
-            ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-        ).setNameResourceId(R.string.left_complication_screen_name)
-            .setScreenReaderNameResourceId(R.string.left_complication_screen_reader_name).build()
+                .setNameResourceId(R.string.left_complication_screen_name)
+                .setScreenReaderNameResourceId(R.string.left_complication_screen_reader_name)
+                .build()
 
-        val rightComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-            canvasComplicationFactory,
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.GOAL_PROGRESS,
-                ComplicationType.WEIGHTED_ELEMENTS,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(
-                SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                ComplicationType.SHORT_TEXT
-            ),
-            ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
-        ).setNameResourceId(R.string.right_complication_screen_name)
-            .setScreenReaderNameResourceId(R.string.right_complication_screen_reader_name).build()
+        val rightComplication =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                    canvasComplicationFactory,
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.GOAL_PROGRESS,
+                        ComplicationType.WEIGHTED_ELEMENTS,
+                        ComplicationType.LONG_TEXT,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                        ComplicationType.SHORT_TEXT
+                    ),
+                    ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+                )
+                .setNameResourceId(R.string.right_complication_screen_name)
+                .setScreenReaderNameResourceId(R.string.right_complication_screen_reader_name)
+                .build()
 
         return ComplicationSlotsManager(
             listOf(leftComplication, rightComplication),
@@ -327,27 +337,26 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.ANALOG,
-        ExampleAnalogWatchCanvasRenderer(
-            surfaceHolder,
-            this,
-            watchFaceStyle,
-            currentUserStyleRepository,
-            watchState,
-            colorStyleSetting,
-            drawHourPipsStyleSetting,
-            watchHandLengthStyleSetting,
-            hoursDrawFreqStyleSetting,
-            complicationSlotsManager
-        )
-    )
-        .setComplicationDeniedDialogIntent(
-            Intent(this, ComplicationDeniedActivity::class.java)
-        )
-        .setComplicationRationaleDialogIntent(
-            Intent(this, ComplicationRationalActivity::class.java)
-        )
+    ) =
+        WatchFace(
+                WatchFaceType.ANALOG,
+                ExampleAnalogWatchCanvasRenderer(
+                    surfaceHolder,
+                    this,
+                    watchFaceStyle,
+                    currentUserStyleRepository,
+                    watchState,
+                    colorStyleSetting,
+                    drawHourPipsStyleSetting,
+                    watchHandLengthStyleSetting,
+                    hoursDrawFreqStyleSetting,
+                    complicationSlotsManager
+                )
+            )
+            .setComplicationDeniedDialogIntent(Intent(this, ComplicationDeniedActivity::class.java))
+            .setComplicationRationaleDialogIntent(
+                Intent(this, ComplicationRationalActivity::class.java)
+            )
 
     @OptIn(WatchFaceExperimental::class)
     @Suppress("Deprecation")
@@ -363,29 +372,31 @@
         private val watchHandLengthStyleSettingDouble: DoubleRangeUserStyleSetting,
         private val hoursDrawFreqStyleSetting: LongRangeUserStyleSetting,
         private val complicationSlotsManager: ComplicationSlotsManager
-    ) : Renderer.CanvasRenderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        CanvasType.HARDWARE,
-        FRAME_PERIOD_MS,
-        clearWithBackgroundTintBeforeRenderingHighlightLayer = true
-    ) {
-        private val clockHandPaint = Paint().apply {
-            isAntiAlias = true
-            strokeWidth = context.resources.getDimensionPixelSize(
-                R.dimen.clock_hand_stroke_width
-            ).toFloat()
-        }
+    ) :
+        Renderer.CanvasRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            CanvasType.HARDWARE,
+            FRAME_PERIOD_MS,
+            clearWithBackgroundTintBeforeRenderingHighlightLayer = true
+        ) {
+        private val clockHandPaint =
+            Paint().apply {
+                isAntiAlias = true
+                strokeWidth =
+                    context.resources
+                        .getDimensionPixelSize(R.dimen.clock_hand_stroke_width)
+                        .toFloat()
+            }
 
-        private val outerElementPaint = Paint().apply {
-            isAntiAlias = true
-        }
+        private val outerElementPaint = Paint().apply { isAntiAlias = true }
 
-        private val textPaint = Paint().apply {
-            isAntiAlias = true
-            textSize = context.resources.getDimensionPixelSize(R.dimen.hour_mark_size).toFloat()
-        }
+        private val textPaint =
+            Paint().apply {
+                isAntiAlias = true
+                textSize = context.resources.getDimensionPixelSize(R.dimen.hour_mark_size).toFloat()
+            }
 
         private lateinit var hourHandFill: Path
         private lateinit var hourHandBorder: Path
@@ -400,10 +411,11 @@
         init {
             CoroutineScope(Dispatchers.Main.immediate).launch {
                 currentUserStyleRepository.userStyle.collect { userStyle ->
-                    watchFaceColorStyle = WatchFaceColorStyle.create(
-                        context,
-                        userStyle[colorStyleSetting]!!.toString()
-                    )
+                    watchFaceColorStyle =
+                        WatchFaceColorStyle.create(
+                            context,
+                            userStyle[colorStyleSetting]!!.toString()
+                        )
 
                     // Apply the userStyle to the complicationSlots. ComplicationDrawables for each
                     // of the styles are defined in XML so we need to replace the complication's
@@ -416,25 +428,28 @@
                     drawHourPips = (userStyle[drawPipsStyleSetting]!! as BooleanOption).value
                     watchHandScale =
                         (userStyle[watchHandLengthStyleSettingDouble]!! as DoubleRangeOption)
-                            .value.toFloat()
-                    hoursDrawFreq = (userStyle[hoursDrawFreqStyleSetting]!! as LongRangeOption)
-                        .value.toInt()
+                            .value
+                            .toFloat()
+                    hoursDrawFreq =
+                        (userStyle[hoursDrawFreqStyleSetting]!! as LongRangeOption).value.toInt()
 
-                    watchfaceColors = WatchFaceColors(
-                        Color.valueOf(watchFaceColorStyle.activeStyle.primaryColor),
-                        Color.valueOf(watchFaceColorStyle.activeStyle.secondaryColor),
-                        Color.valueOf(Color.DKGRAY)
-                    )
+                    watchfaceColors =
+                        WatchFaceColors(
+                            Color.valueOf(watchFaceColorStyle.activeStyle.primaryColor),
+                            Color.valueOf(watchFaceColorStyle.activeStyle.secondaryColor),
+                            Color.valueOf(Color.DKGRAY)
+                        )
                 }
             }
         }
 
         override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-            val style = if (renderParameters.drawMode == DrawMode.AMBIENT) {
-                watchFaceColorStyle.ambientStyle
-            } else {
-                watchFaceColorStyle.activeStyle
-            }
+            val style =
+                if (renderParameters.drawMode == DrawMode.AMBIENT) {
+                    watchFaceColorStyle.ambientStyle
+                } else {
+                    watchFaceColorStyle.activeStyle
+                }
 
             canvas.drawColor(style.backgroundColor)
 
@@ -446,13 +461,14 @@
                 }
             }
 
-            if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-            ) {
+            if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS_OVERLAY)) {
                 drawClockHands(canvas, bounds, zonedDateTime, style)
             }
 
-            if (renderParameters.drawMode != DrawMode.AMBIENT &&
-                renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE) && drawHourPips
+            if (
+                renderParameters.drawMode != DrawMode.AMBIENT &&
+                    renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE) &&
+                    drawHourPips
             ) {
                 drawNumberStyleOuterElement(canvas, bounds, style)
             }
@@ -479,8 +495,9 @@
             recalculateClockHands(bounds)
             val hours = (zonedDateTime.hour % 12).toFloat()
             val minutes = zonedDateTime.minute.toFloat()
-            val seconds = zonedDateTime.second.toFloat() +
-                (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
+            val seconds =
+                zonedDateTime.second.toFloat() +
+                    (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
 
             val hourRot = (hours + minutes / 60.0f + seconds / 3600.0f) / 12.0f * 360.0f
             val minuteRot = (minutes + seconds / 60.0f) / 60.0f * 360.0f
@@ -598,7 +615,11 @@
 
             minuteHandBorder =
                 createClockHand(
-                    bounds, MINUTE_HAND_LENGTH_FRACTION, MINUTE_HAND_THICKNESS_FRACTION, rx, ry
+                    bounds,
+                    MINUTE_HAND_LENGTH_FRACTION,
+                    MINUTE_HAND_THICKNESS_FRACTION,
+                    rx,
+                    ry
                 )
 
             hourHandFill =
@@ -630,8 +651,8 @@
         }
 
         /**
-         * Returns a round rect clock hand if {@code rx} and {@code ry} equals to 0, otherwise return a
-         * rect clock hand.
+         * Returns a round rect clock hand if {@code rx} and {@code ry} equals to 0, otherwise
+         * return a rect clock hand.
          *
          * @param bounds The bounds use to determine the coordinate of the clock hand.
          * @param length Clock hand's length, in fraction of {@code bounds.width()}.
@@ -685,11 +706,7 @@
             canvas.save()
             for (i in 0 until 12) {
                 if (i % hoursDrawFreq != 0) {
-                    drawTopMiddleCircle(
-                        canvas,
-                        bounds,
-                        NUMBER_STYLE_OUTER_CIRCLE_RADIUS_FRACTION
-                    )
+                    drawTopMiddleCircle(canvas, bounds, NUMBER_STYLE_OUTER_CIRCLE_RADIUS_FRACTION)
                 }
                 canvas.rotate(360.0f / 12.0f, bounds.exactCenterX(), bounds.exactCenterY())
             }
@@ -697,23 +714,14 @@
         }
 
         /** Draws the outer circle on the top middle of the given bounds. */
-        private fun drawTopMiddleCircle(
-            canvas: Canvas,
-            bounds: Rect,
-            radiusFraction: Float
-        ) {
+        private fun drawTopMiddleCircle(canvas: Canvas, bounds: Rect, radiusFraction: Float) {
             outerElementPaint.style = Paint.Style.FILL_AND_STROKE
 
             val cx = 0.5f * bounds.width().toFloat()
             val cy =
                 bounds.width() * (GAP_BETWEEN_OUTER_CIRCLE_AND_BORDER_FRACTION + radiusFraction)
 
-            canvas.drawCircle(
-                cx,
-                cy,
-                radiusFraction * bounds.width(),
-                outerElementPaint
-            )
+            canvas.drawCircle(cx, cy, radiusFraction * bounds.width(), outerElementPaint)
         }
     }
 
@@ -749,7 +757,7 @@
         private const val RIGHT_COMPLICATION = "RIGHT_COMPLICATION"
         private const val LEFT_AND_RIGHT_COMPLICATIONS = "LEFT_AND_RIGHT_COMPLICATIONS"
 
-        /** How long each frame is displayed at expected frame rate.  */
+        /** How long each frame is displayed at expected frame rate. */
         private const val FRAME_PERIOD_MS: Long = 16L
 
         const val EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID = 101
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
index 5f497f3..64b584d 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
@@ -82,29 +82,30 @@
             R.string.colors_style_setting,
             R.string.colors_style_setting_description,
             icon = null,
-            options = listOf(
-                UserStyleSetting.ListUserStyleSetting.ListOption(
-                    Option.Id(RED_STYLE),
-                    resources,
-                    R.string.colors_style_red,
-                    R.string.colors_style_red_screen_reader,
-                    Icon.createWithResource(this, R.drawable.red_style)
+            options =
+                listOf(
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        Option.Id(RED_STYLE),
+                        resources,
+                        R.string.colors_style_red,
+                        R.string.colors_style_red_screen_reader,
+                        Icon.createWithResource(this, R.drawable.red_style)
+                    ),
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        Option.Id(GREEN_STYLE),
+                        resources,
+                        R.string.colors_style_green,
+                        R.string.colors_style_green_screen_reader,
+                        Icon.createWithResource(this, R.drawable.green_style)
+                    ),
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        Option.Id(BLUE_STYLE),
+                        resources,
+                        R.string.colors_style_blue,
+                        R.string.colors_style_blue_screen_reader,
+                        Icon.createWithResource(this, R.drawable.blue_style)
+                    )
                 ),
-                UserStyleSetting.ListUserStyleSetting.ListOption(
-                    Option.Id(GREEN_STYLE),
-                    resources,
-                    R.string.colors_style_green,
-                    R.string.colors_style_green_screen_reader,
-                    Icon.createWithResource(this, R.drawable.green_style)
-                ),
-                UserStyleSetting.ListUserStyleSetting.ListOption(
-                    Option.Id(BLUE_STYLE),
-                    resources,
-                    R.string.colors_style_blue,
-                    R.string.colors_style_blue_screen_reader,
-                    Icon.createWithResource(this, R.drawable.blue_style)
-                )
-            ),
             listOf(
                 WatchFaceLayer.BASE,
                 WatchFaceLayer.COMPLICATIONS,
@@ -113,150 +114,166 @@
         )
     }
 
-    private val canvasComplicationFactory =
-        CanvasComplicationFactory { watchState, listener ->
-            CanvasComplicationDrawable(
-                watchFaceStyle.getDrawable(this@ExampleCanvasDigitalWatchFaceService)!!,
-                watchState,
-                listener
-            )
-        }
+    private val canvasComplicationFactory = CanvasComplicationFactory { watchState, listener ->
+        CanvasComplicationDrawable(
+            watchFaceStyle.getDrawable(this@ExampleCanvasDigitalWatchFaceService)!!,
+            watchState,
+            listener
+        )
+    }
 
-    private val leftComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-        ComplicationID.LEFT.ordinal,
-        canvasComplicationFactory,
+    private val leftComplication =
+        ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                ComplicationID.LEFT.ordinal,
+                canvasComplicationFactory,
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.GOAL_PROGRESS,
+                    ComplicationType.WEIGHTED_ELEMENTS,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(
+                    SystemDataSources.DATA_SOURCE_WATCH_BATTERY,
+                    ComplicationType.SHORT_TEXT
+                ),
+                ComplicationSlotBounds(
+                    createBoundsRect(
+                        LEFT_CIRCLE_COMPLICATION_CENTER_FRACTION,
+                        CIRCLE_COMPLICATION_DIAMETER_FRACTION
+                    )
+                )
+            )
+            .setNameResourceId(R.string.left_complication_screen_name)
+            .setScreenReaderNameResourceId(R.string.left_complication_screen_reader_name)
+            .build()
+
+    private val rightComplication =
+        ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                ComplicationID.RIGHT.ordinal,
+                canvasComplicationFactory,
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.GOAL_PROGRESS,
+                    ComplicationType.WEIGHTED_ELEMENTS,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(
+                    SystemDataSources.DATA_SOURCE_DATE,
+                    ComplicationType.SHORT_TEXT
+                ),
+                ComplicationSlotBounds(
+                    createBoundsRect(
+                        RIGHT_CIRCLE_COMPLICATION_CENTER_FRACTION,
+                        CIRCLE_COMPLICATION_DIAMETER_FRACTION
+                    )
+                )
+            )
+            .setNameResourceId(R.string.right_complication_screen_name)
+            .setScreenReaderNameResourceId(R.string.right_complication_screen_reader_name)
+            .build()
+
+    private val upperAndLowerComplicationTypes =
         listOf(
+            ComplicationType.LONG_TEXT,
             ComplicationType.RANGED_VALUE,
             ComplicationType.GOAL_PROGRESS,
             ComplicationType.WEIGHTED_ELEMENTS,
             ComplicationType.SHORT_TEXT,
             ComplicationType.MONOCHROMATIC_IMAGE,
             ComplicationType.SMALL_IMAGE
-        ),
-        DefaultComplicationDataSourcePolicy(
-            SystemDataSources.DATA_SOURCE_WATCH_BATTERY,
-            ComplicationType.SHORT_TEXT
-        ),
-        ComplicationSlotBounds(
-            createBoundsRect(
-                LEFT_CIRCLE_COMPLICATION_CENTER_FRACTION,
-                CIRCLE_COMPLICATION_DIAMETER_FRACTION
-            )
         )
-    ).setNameResourceId(R.string.left_complication_screen_name)
-        .setScreenReaderNameResourceId(R.string.left_complication_screen_reader_name).build()
-
-    private val rightComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-        ComplicationID.RIGHT.ordinal,
-        canvasComplicationFactory,
-        listOf(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        ),
-        DefaultComplicationDataSourcePolicy(
-            SystemDataSources.DATA_SOURCE_DATE,
-            ComplicationType.SHORT_TEXT
-        ),
-        ComplicationSlotBounds(
-            createBoundsRect(
-                RIGHT_CIRCLE_COMPLICATION_CENTER_FRACTION,
-                CIRCLE_COMPLICATION_DIAMETER_FRACTION
-            )
-        )
-    ).setNameResourceId(R.string.right_complication_screen_name)
-        .setScreenReaderNameResourceId(R.string.right_complication_screen_reader_name).build()
-
-    private val upperAndLowerComplicationTypes = listOf(
-        ComplicationType.LONG_TEXT,
-        ComplicationType.RANGED_VALUE,
-        ComplicationType.GOAL_PROGRESS,
-        ComplicationType.WEIGHTED_ELEMENTS,
-        ComplicationType.SHORT_TEXT,
-        ComplicationType.MONOCHROMATIC_IMAGE,
-        ComplicationType.SMALL_IMAGE
-    )
 
     // The upper and lower complicationSlots change shape depending on the complication's type.
-    private val upperComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-        ComplicationID.UPPER.ordinal,
-        canvasComplicationFactory,
-        upperAndLowerComplicationTypes,
-        DefaultComplicationDataSourcePolicy(
-            SystemDataSources.DATA_SOURCE_WORLD_CLOCK,
-            ComplicationType.LONG_TEXT
-        ),
-        ComplicationSlotBounds(
-            ComplicationType.values().associateWith {
-                if (it == ComplicationType.LONG_TEXT || it == ComplicationType.NO_DATA) {
-                    createBoundsRect(
-                        UPPER_ROUND_RECT_COMPLICATION_CENTER_FRACTION,
-                        ROUND_RECT_COMPLICATION_SIZE_FRACTION
-                    )
-                } else {
-                    createBoundsRect(
-                        UPPER_CIRCLE_COMPLICATION_CENTER_FRACTION,
-                        CIRCLE_COMPLICATION_DIAMETER_FRACTION
-                    )
-                }
-            },
-            ComplicationType.values().associateWith { RectF() }
-        )
-    ).setNameResourceId(R.string.upper_complication_screen_name)
-        .setScreenReaderNameResourceId(R.string.upper_complication_screen_reader_name).build()
+    private val upperComplication =
+        ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                ComplicationID.UPPER.ordinal,
+                canvasComplicationFactory,
+                upperAndLowerComplicationTypes,
+                DefaultComplicationDataSourcePolicy(
+                    SystemDataSources.DATA_SOURCE_WORLD_CLOCK,
+                    ComplicationType.LONG_TEXT
+                ),
+                ComplicationSlotBounds(
+                    ComplicationType.values().associateWith {
+                        if (it == ComplicationType.LONG_TEXT || it == ComplicationType.NO_DATA) {
+                            createBoundsRect(
+                                UPPER_ROUND_RECT_COMPLICATION_CENTER_FRACTION,
+                                ROUND_RECT_COMPLICATION_SIZE_FRACTION
+                            )
+                        } else {
+                            createBoundsRect(
+                                UPPER_CIRCLE_COMPLICATION_CENTER_FRACTION,
+                                CIRCLE_COMPLICATION_DIAMETER_FRACTION
+                            )
+                        }
+                    },
+                    ComplicationType.values().associateWith { RectF() }
+                )
+            )
+            .setNameResourceId(R.string.upper_complication_screen_name)
+            .setScreenReaderNameResourceId(R.string.upper_complication_screen_reader_name)
+            .build()
 
-    private val lowerComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-        ComplicationID.LOWER.ordinal,
-        canvasComplicationFactory,
-        upperAndLowerComplicationTypes,
-        DefaultComplicationDataSourcePolicy(
-            SystemDataSources.DATA_SOURCE_NEXT_EVENT,
-            ComplicationType.LONG_TEXT
-        ),
-        ComplicationSlotBounds(
-            ComplicationType.values().associateWith {
-                if (it == ComplicationType.LONG_TEXT || it == ComplicationType.NO_DATA) {
-                    createBoundsRect(
-                        LOWER_ROUND_RECT_COMPLICATION_CENTER_FRACTION,
-                        ROUND_RECT_COMPLICATION_SIZE_FRACTION
-                    )
-                } else {
-                    createBoundsRect(
-                        LOWER_CIRCLE_COMPLICATION_CENTER_FRACTION,
-                        CIRCLE_COMPLICATION_DIAMETER_FRACTION
-                    )
-                }
-            },
-            ComplicationType.values().associateWith { RectF() }
-        )
-    ).setNameResourceId(R.string.lower_complication_screen_name)
-        .setScreenReaderNameResourceId(R.string.lower_complication_screen_reader_name).build()
+    private val lowerComplication =
+        ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                ComplicationID.LOWER.ordinal,
+                canvasComplicationFactory,
+                upperAndLowerComplicationTypes,
+                DefaultComplicationDataSourcePolicy(
+                    SystemDataSources.DATA_SOURCE_NEXT_EVENT,
+                    ComplicationType.LONG_TEXT
+                ),
+                ComplicationSlotBounds(
+                    ComplicationType.values().associateWith {
+                        if (it == ComplicationType.LONG_TEXT || it == ComplicationType.NO_DATA) {
+                            createBoundsRect(
+                                LOWER_ROUND_RECT_COMPLICATION_CENTER_FRACTION,
+                                ROUND_RECT_COMPLICATION_SIZE_FRACTION
+                            )
+                        } else {
+                            createBoundsRect(
+                                LOWER_CIRCLE_COMPLICATION_CENTER_FRACTION,
+                                CIRCLE_COMPLICATION_DIAMETER_FRACTION
+                            )
+                        }
+                    },
+                    ComplicationType.values().associateWith { RectF() }
+                )
+            )
+            .setNameResourceId(R.string.lower_complication_screen_name)
+            .setScreenReaderNameResourceId(R.string.lower_complication_screen_reader_name)
+            .build()
 
-    private val backgroundComplication = ComplicationSlot.createBackgroundComplicationSlotBuilder(
-        ComplicationID.BACKGROUND.ordinal,
-        canvasComplicationFactory,
-        listOf(ComplicationType.PHOTO_IMAGE),
-        DefaultComplicationDataSourcePolicy()
-    ).setNameResourceId(R.string.background_complication_screen_name)
-        .setScreenReaderNameResourceId(R.string.background_complication_screen_reader_name).build()
+    private val backgroundComplication =
+        ComplicationSlot.createBackgroundComplicationSlotBuilder(
+                ComplicationID.BACKGROUND.ordinal,
+                canvasComplicationFactory,
+                listOf(ComplicationType.PHOTO_IMAGE),
+                DefaultComplicationDataSourcePolicy()
+            )
+            .setNameResourceId(R.string.background_complication_screen_name)
+            .setScreenReaderNameResourceId(R.string.background_complication_screen_reader_name)
+            .build()
 
     override fun createUserStyleSchema() = UserStyleSchema(listOf(colorStyleSetting))
 
     override fun createComplicationSlotsManager(
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = ComplicationSlotsManager(
-        listOf(
-            leftComplication,
-            rightComplication,
-            upperComplication,
-            lowerComplication,
-            backgroundComplication
-        ),
-        currentUserStyleRepository
-    )
+    ) =
+        ComplicationSlotsManager(
+            listOf(
+                leftComplication,
+                rightComplication,
+                upperComplication,
+                lowerComplication,
+                backgroundComplication
+            ),
+            currentUserStyleRepository
+        )
 
     override suspend fun createWatchFace(
         surfaceHolder: SurfaceHolder,
@@ -264,15 +281,16 @@
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
-        val renderer = ExampleDigitalWatchCanvasRenderer(
-            surfaceHolder,
-            this,
-            watchFaceStyle,
-            currentUserStyleRepository,
-            watchState,
-            colorStyleSetting,
-            complicationSlotsManager
-        )
+        val renderer =
+            ExampleDigitalWatchCanvasRenderer(
+                surfaceHolder,
+                this,
+                watchFaceStyle,
+                currentUserStyleRepository,
+                watchState,
+                colorStyleSetting,
+                complicationSlotsManager
+            )
 
         // createWatchFace is called on a worker thread but the observers should be called from the
         // UiThread.
@@ -294,9 +312,7 @@
             }
         }
         return WatchFace(WatchFaceType.DIGITAL, renderer)
-            .setComplicationDeniedDialogIntent(
-                Intent(this, ComplicationDeniedActivity::class.java)
-            )
+            .setComplicationDeniedDialogIntent(Intent(this, ComplicationDeniedActivity::class.java))
             .setComplicationRationaleDialogIntent(
                 Intent(this, ComplicationRationalActivity::class.java)
             )
@@ -313,29 +329,29 @@
         watchState: WatchState,
         private val colorStyleSetting: UserStyleSetting.ListUserStyleSetting,
         private val complicationSlotsManager: ComplicationSlotsManager
-    ) : Renderer.CanvasRenderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        CanvasType.HARDWARE,
-        INTERACTIVE_UPDATE_RATE_MS,
-        clearWithBackgroundTintBeforeRenderingHighlightLayer = true
-    ) {
+    ) :
+        Renderer.CanvasRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            CanvasType.HARDWARE,
+            INTERACTIVE_UPDATE_RATE_MS,
+            clearWithBackgroundTintBeforeRenderingHighlightLayer = true
+        ) {
         internal var oldBounds = Rect(0, 0, 0, 0)
 
-        private fun getBaseDigitPaint() = Paint().apply {
-            typeface = Typeface.create(DIGITAL_TYPE_FACE, Typeface.NORMAL)
-            isAntiAlias = true
-        }
+        private fun getBaseDigitPaint() =
+            Paint().apply {
+                typeface = Typeface.create(DIGITAL_TYPE_FACE, Typeface.NORMAL)
+                isAntiAlias = true
+            }
 
         private val digitTextHoursPaint = getBaseDigitPaint()
         private val digitTextMinutesPaint = getBaseDigitPaint()
         private val digitTextSecondsPaint = getBaseDigitPaint()
 
         // Used for drawing the cached digits to the watchface.
-        private val digitBitmapPaint = Paint().apply {
-            isFilterBitmap = true
-        }
+        private val digitBitmapPaint = Paint().apply { isFilterBitmap = true }
 
         // Used for computing text sizes, not directly used for rendering.
         private var digitTextPaint = getBaseDigitPaint()
@@ -357,60 +373,50 @@
         private var prevDrawMode = DrawMode.INTERACTIVE
 
         // Animation played when exiting ambient mode.
-        private val ambientExitAnimator = AnimatorSet().apply {
-            val linearOutSlow = AnimationUtils.loadInterpolator(
-                context,
-                android.R.interpolator.linear_out_slow_in
-            )
-            playTogether(
-                ObjectAnimator.ofFloat(
-                    drawProperties,
-                    DrawProperties.TIME_SCALE,
-                    1.0f
-                ).apply {
-                    duration = AMBIENT_TRANSITION_MS
-                    interpolator = linearOutSlow
-                    setAutoCancel(true)
-                },
-                ObjectAnimator.ofFloat(
-                    drawProperties,
-                    DrawProperties.SECONDS_SCALE,
-                    1.0f
-                ).apply {
-                    duration = AMBIENT_TRANSITION_MS
-                    interpolator = linearOutSlow
-                    setAutoCancel(true)
-                }
-            )
-        }
+        private val ambientExitAnimator =
+            AnimatorSet().apply {
+                val linearOutSlow =
+                    AnimationUtils.loadInterpolator(
+                        context,
+                        android.R.interpolator.linear_out_slow_in
+                    )
+                playTogether(
+                    ObjectAnimator.ofFloat(drawProperties, DrawProperties.TIME_SCALE, 1.0f).apply {
+                        duration = AMBIENT_TRANSITION_MS
+                        interpolator = linearOutSlow
+                        setAutoCancel(true)
+                    },
+                    ObjectAnimator.ofFloat(drawProperties, DrawProperties.SECONDS_SCALE, 1.0f)
+                        .apply {
+                            duration = AMBIENT_TRANSITION_MS
+                            interpolator = linearOutSlow
+                            setAutoCancel(true)
+                        }
+                )
+            }
 
         // Animation played when entering ambient mode.
-        private val ambientEnterAnimator = AnimatorSet().apply {
-            val fastOutLinearIn = AnimationUtils.loadInterpolator(
-                context,
-                android.R.interpolator.fast_out_linear_in
-            )
-            playTogether(
-                ObjectAnimator.ofFloat(
-                    drawProperties,
-                    DrawProperties.TIME_SCALE,
-                    1.0f
-                ).apply {
-                    duration = AMBIENT_TRANSITION_MS
-                    interpolator = fastOutLinearIn
-                    setAutoCancel(true)
-                },
-                ObjectAnimator.ofFloat(
-                    drawProperties,
-                    DrawProperties.SECONDS_SCALE,
-                    0.0f
-                ).apply {
-                    duration = AMBIENT_TRANSITION_MS
-                    interpolator = fastOutLinearIn
-                    setAutoCancel(true)
-                }
-            )
-        }
+        private val ambientEnterAnimator =
+            AnimatorSet().apply {
+                val fastOutLinearIn =
+                    AnimationUtils.loadInterpolator(
+                        context,
+                        android.R.interpolator.fast_out_linear_in
+                    )
+                playTogether(
+                    ObjectAnimator.ofFloat(drawProperties, DrawProperties.TIME_SCALE, 1.0f).apply {
+                        duration = AMBIENT_TRANSITION_MS
+                        interpolator = fastOutLinearIn
+                        setAutoCancel(true)
+                    },
+                    ObjectAnimator.ofFloat(drawProperties, DrawProperties.SECONDS_SCALE, 0.0f)
+                        .apply {
+                            duration = AMBIENT_TRANSITION_MS
+                            interpolator = fastOutLinearIn
+                            setAutoCancel(true)
+                        }
+                )
+            }
 
         // A mapping from digit type to cached bitmap. One bitmap is cached per digit type, and the
         // digit shown in the cached image is stored in [currentCachedDigits].
@@ -432,11 +438,12 @@
                             userStyle[colorStyleSetting]!!.toString()
                         )
 
-                    watchfaceColors = WatchFaceColors(
-                        Color.valueOf(watchFaceColorStyle.activeStyle.primaryColor),
-                        Color.valueOf(watchFaceColorStyle.activeStyle.secondaryColor),
-                        Color.valueOf(Color.DKGRAY)
-                    )
+                    watchfaceColors =
+                        WatchFaceColors(
+                            Color.valueOf(watchFaceColorStyle.activeStyle.primaryColor),
+                            Color.valueOf(watchFaceColorStyle.activeStyle.secondaryColor),
+                            Color.valueOf(Color.DKGRAY)
+                        )
 
                     // Apply the userStyle to the complicationSlots. ComplicationDrawables for each
                     // of the styles are defined in XML so we need to replace the complication's
@@ -475,32 +482,35 @@
         }
 
         private fun applyColorStyleAndDrawMode(drawMode: DrawMode) {
-            digitTextHoursPaint.color = when (drawMode) {
-                DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.primaryColor
-                DrawMode.LOW_BATTERY_INTERACTIVE ->
-                    multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.6f)
+            digitTextHoursPaint.color =
+                when (drawMode) {
+                    DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.primaryColor
+                    DrawMode.LOW_BATTERY_INTERACTIVE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.6f)
+                    DrawMode.MUTE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.8f)
+                    DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.primaryColor
+                }
 
-                DrawMode.MUTE -> multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.8f)
-                DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.primaryColor
-            }
+            digitTextMinutesPaint.color =
+                when (drawMode) {
+                    DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.primaryColor
+                    DrawMode.LOW_BATTERY_INTERACTIVE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.6f)
+                    DrawMode.MUTE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.8f)
+                    DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.primaryColor
+                }
 
-            digitTextMinutesPaint.color = when (drawMode) {
-                DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.primaryColor
-                DrawMode.LOW_BATTERY_INTERACTIVE ->
-                    multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.6f)
-
-                DrawMode.MUTE -> multiplyColor(watchFaceColorStyle.activeStyle.primaryColor, 0.8f)
-                DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.primaryColor
-            }
-
-            digitTextSecondsPaint.color = when (drawMode) {
-                DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.secondaryColor
-                DrawMode.LOW_BATTERY_INTERACTIVE ->
-                    multiplyColor(watchFaceColorStyle.activeStyle.secondaryColor, 0.6f)
-
-                DrawMode.MUTE -> multiplyColor(watchFaceColorStyle.activeStyle.secondaryColor, 0.8f)
-                DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.secondaryColor
-            }
+            digitTextSecondsPaint.color =
+                when (drawMode) {
+                    DrawMode.INTERACTIVE -> watchFaceColorStyle.activeStyle.secondaryColor
+                    DrawMode.LOW_BATTERY_INTERACTIVE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.secondaryColor, 0.6f)
+                    DrawMode.MUTE ->
+                        multiplyColor(watchFaceColorStyle.activeStyle.secondaryColor, 0.8f)
+                    DrawMode.AMBIENT -> watchFaceColorStyle.ambientStyle.secondaryColor
+                }
 
             if (prevDrawMode != drawMode) {
                 prevDrawMode = drawMode
@@ -530,10 +540,11 @@
                 val animationStartFraction =
                     DIGIT_ANIMATION_START_TIME_FRACTION[DigitMode.OUTGOING]!!
                 this.interactiveDrawModeUpdateDelayMillis =
-                    if (secondProgress < animationStartFraction &&
-                        !ambientEnterAnimator.isRunning
+                    if (
+                        secondProgress < animationStartFraction && !ambientEnterAnimator.isRunning
                     ) {
-                        // The seconds only animate part of the time so we can sleep until the seconds next need to
+                        // The seconds only animate part of the time so we can sleep until the
+                        // seconds next need to
                         // animate, which improves battery life.
                         max(
                             INTERACTIVE_UPDATE_RATE_MS,
@@ -544,22 +555,22 @@
                     }
 
                 // Move the left position to the left if there are fewer than two hour digits, to
-                // ensure it is centered. If the clock is in transition from one to two hour digits or
+                // ensure it is centered. If the clock is in transition from one to two hour digits
+                // or
                 // vice versa, interpolate to animate the clock's position.
-                // Move the left position to the left if there are fewer than two hour digits, to ensure
+                // Move the left position to the left if there are fewer than two hour digits, to
+                // ensure
                 // it is centered. If the clock is in transition from one to two hour digits or
                 // vice versa, interpolate to animate the clock's position.
-                val centeringAdjustment = (
-                    getInterpolatedValue(
+                val centeringAdjustment =
+                    (getInterpolatedValue(
                         (2 - currentDigitStrings.getNumberOfHoursDigits()).toFloat(),
                         (2 - nextDigitStrings.getNumberOfHoursDigits()).toFloat(),
                         POSITION_ANIMATION_START_TIME,
                         POSITION_ANIMATION_END_TIME,
                         secondProgress,
                         CENTERING_ADJUSTMENT_INTERPOLATOR
-                    ) *
-                        digitWidth
-                    )
+                    ) * digitWidth)
 
                 // This total width assumes two hours digits.
                 val totalWidth = 2f * digitWidth + gapWidth + 2f * smallDigitWidth
@@ -569,8 +580,10 @@
                 val wholeTimeSaveCount = canvas.save()
                 try {
                     canvas.scale(
-                        drawProperties.timeScale, drawProperties.timeScale,
-                        clockBounds.exactCenterX(), clockBounds.exactCenterY()
+                        drawProperties.timeScale,
+                        drawProperties.timeScale,
+                        clockBounds.exactCenterX(),
+                        clockBounds.exactCenterY()
                     )
 
                     // Draw hours.
@@ -617,8 +630,9 @@
                     // Scale the seconds if they're not fully showing, in and out of ambient for
                     // example.
                     val scaleSeconds = drawProperties.secondsScale < 1.0f
-                    if (drawProperties.secondsScale > 0f &&
-                        (renderParameters.drawMode != DrawMode.AMBIENT || scaleSeconds)
+                    if (
+                        drawProperties.secondsScale > 0f &&
+                            (renderParameters.drawMode != DrawMode.AMBIENT || scaleSeconds)
                     ) {
                         val restoreCount = canvas.save()
                         if (scaleSeconds) {
@@ -689,17 +703,19 @@
                     complicationSlotsManager[it]!!.isActiveAt(zonedDateTime.toInstant())
                 }
 
-            val marginX = if (hasHorizontalComplication) {
-                (MARGIN_FRACTION_WITH_COMPLICATION.x * bounds.width().toFloat()).toInt()
-            } else {
-                (MARGIN_FRACTION_WITHOUT_COMPLICATION.x * bounds.width().toFloat()).toInt()
-            }
+            val marginX =
+                if (hasHorizontalComplication) {
+                    (MARGIN_FRACTION_WITH_COMPLICATION.x * bounds.width().toFloat()).toInt()
+                } else {
+                    (MARGIN_FRACTION_WITHOUT_COMPLICATION.x * bounds.width().toFloat()).toInt()
+                }
 
-            val marginY = if (hasVerticalComplication) {
-                (MARGIN_FRACTION_WITH_COMPLICATION.y * bounds.height().toFloat()).toInt()
-            } else {
-                (MARGIN_FRACTION_WITHOUT_COMPLICATION.y * bounds.height().toFloat()).toInt()
-            }
+            val marginY =
+                if (hasVerticalComplication) {
+                    (MARGIN_FRACTION_WITH_COMPLICATION.y * bounds.height().toFloat()).toInt()
+                } else {
+                    (MARGIN_FRACTION_WITHOUT_COMPLICATION.y * bounds.height().toFloat()).toInt()
+                }
 
             clockBounds.set(
                 bounds.left + marginX,
@@ -725,7 +741,8 @@
 
             // Calculate the total width fraction base on the text height.
             val totalWidthFraction: Float =
-                (2f * DIGIT_WIDTH_FRACTION) + (DIGIT_WIDTH_FRACTION * GAP_WIDTH_FRACTION) +
+                (2f * DIGIT_WIDTH_FRACTION) +
+                    (DIGIT_WIDTH_FRACTION * GAP_WIDTH_FRACTION) +
                     (2f * SMALL_DIGIT_SIZE_FRACTION * SMALL_DIGIT_WIDTH_FRACTION)
 
             textSize =
@@ -758,17 +775,14 @@
         }
 
         private fun drawBackground(canvas: Canvas) {
-            val backgroundColor = if (renderParameters.drawMode == DrawMode.AMBIENT) {
-                watchFaceColorStyle.ambientStyle.backgroundColor
-            } else {
-                watchFaceColorStyle.activeStyle.backgroundColor
-            }
+            val backgroundColor =
+                if (renderParameters.drawMode == DrawMode.AMBIENT) {
+                    watchFaceColorStyle.ambientStyle.backgroundColor
+                } else {
+                    watchFaceColorStyle.activeStyle.backgroundColor
+                }
             canvas.drawColor(
-                getRGBColor(
-                    backgroundColor,
-                    drawProperties.backgroundAlpha,
-                    Color.BLACK
-                )
+                getRGBColor(backgroundColor, drawProperties.backgroundAlpha, Color.BLACK)
             )
         }
 
@@ -777,11 +791,7 @@
             if (renderParameters.drawMode != DrawMode.AMBIENT) {
                 complicationSlotsManager[ComplicationID.BACKGROUND.ordinal]?.let {
                     if (it.complicationData.value.type != ComplicationType.NO_DATA) {
-                        it.render(
-                            canvas,
-                            zonedDateTime,
-                            renderParameters
-                        )
+                        it.render(canvas, zonedDateTime, renderParameters)
                     }
                 }
             }
@@ -855,7 +865,10 @@
             digitMode: DigitMode
         ) {
             getDigitDrawProperties(
-                secondProgress, getTimeOffsetSeconds(digitType), digitMode, digitDrawProperties
+                secondProgress,
+                getTimeOffsetSeconds(digitType),
+                digitMode,
+                digitDrawProperties
             )
 
             if (!digitDrawProperties.shouldDraw) {
@@ -875,11 +888,7 @@
             canvas.restoreToCount(restoreCount)
         }
 
-        private fun createBitmap(
-            width: Int,
-            height: Int,
-            digitType: DigitType
-        ): Bitmap {
+        private fun createBitmap(width: Int, height: Int, digitType: DigitType): Bitmap {
             val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
             digitBitmapCache.put(digitType.ordinal, bitmap)
             return bitmap
@@ -894,19 +903,20 @@
             val height: Int
             val paint: Paint
             when (digitType) {
-                DigitType.HOUR_TENS, DigitType.HOUR_UNITS -> {
+                DigitType.HOUR_TENS,
+                DigitType.HOUR_UNITS -> {
                     width = digitWidth
                     height = digitHeight
                     paint = digitTextHoursPaint
                 }
-
-                DigitType.MINUTE_TENS, DigitType.MINUTE_UNITS -> {
+                DigitType.MINUTE_TENS,
+                DigitType.MINUTE_UNITS -> {
                     width = smallDigitWidth
                     height = smallDigitHeight
                     paint = digitTextMinutesPaint
                 }
-
-                DigitType.SECOND_TENS, DigitType.SECOND_UNITS -> {
+                DigitType.SECOND_TENS,
+                DigitType.SECOND_UNITS -> {
                     width = smallDigitWidth
                     height = smallDigitHeight
                     paint = digitTextSecondsPaint
@@ -945,7 +955,8 @@
         BACKGROUND
     }
 
-    // Changing digits are animated. This enum is used to label the start and end animation parameters.
+    // Changing digits are animated. This enum is used to label the start and end animation
+    // parameters.
     private enum class DigitMode {
         OUTGOING,
         INCOMING
@@ -993,7 +1004,9 @@
             secondUnits = getUnitsDigitString(secondsValue)
         }
 
-        /** Returns a string representing the specified digit of the time represented by this object. */
+        /**
+         * Returns a string representing the specified digit of the time represented by this object.
+         */
         fun get(digitType: DigitType): String {
             return when (digitType) {
                 DigitType.HOUR_TENS -> hourTens
@@ -1006,8 +1019,8 @@
         }
 
         /**
-         * Returns the number of hour digits in this object. If the representation is 24-hour, this will
-         * always return 2. If 12-hour, this will return 1 or 2.
+         * Returns the number of hour digits in this object. If the representation is 24-hour, this
+         * will always return 2. If 12-hour, this will return 1 or 2.
          */
         fun getNumberOfHoursDigits(): Int {
             return if (hourTens == "") 1 else 2
@@ -1022,7 +1035,8 @@
             if (value < 10 && !padWithZeroes) {
                 return ""
             }
-            // We don't use toString() because during draw calls we don't want to avoid allocating objects.
+            // We don't use toString() because during draw calls we don't want to avoid allocating
+            // objects.
             return DIGITS[(value / 10) % 10]
         }
 
@@ -1031,7 +1045,8 @@
          * value}.
          */
         private fun getUnitsDigitString(value: Int): String {
-            // We don't use toString() because during draw calls we don't want to avoid allocating objects.
+            // We don't use toString() because during draw calls we don't want to avoid allocating
+            // objects.
             return DIGITS[value % 10]
         }
     }
@@ -1049,25 +1064,27 @@
         var secondsScale: Float = 1f
     ) {
         companion object {
-            val TIME_SCALE = object : FloatProperty<DrawProperties>("timeScale") {
-                override fun setValue(obj: DrawProperties, value: Float) {
-                    obj.timeScale = value
+            val TIME_SCALE =
+                object : FloatProperty<DrawProperties>("timeScale") {
+                    override fun setValue(obj: DrawProperties, value: Float) {
+                        obj.timeScale = value
+                    }
+
+                    override fun get(obj: DrawProperties): Float {
+                        return obj.timeScale
+                    }
                 }
 
-                override fun get(obj: DrawProperties): Float {
-                    return obj.timeScale
-                }
-            }
+            val SECONDS_SCALE =
+                object : FloatProperty<DrawProperties>("secondsScale") {
+                    override fun setValue(obj: DrawProperties, value: Float) {
+                        obj.secondsScale = value
+                    }
 
-            val SECONDS_SCALE = object : FloatProperty<DrawProperties>("secondsScale") {
-                override fun setValue(obj: DrawProperties, value: Float) {
-                    obj.secondsScale = value
+                    override fun get(obj: DrawProperties): Float {
+                        return obj.secondsScale
+                    }
                 }
-
-                override fun get(obj: DrawProperties): Float {
-                    return obj.secondsScale
-                }
-            }
         }
     }
 
@@ -1102,18 +1119,17 @@
         private val MARGIN_FRACTION_WITHOUT_COMPLICATION = Vec2f(0.2f, 0.2f)
         private val MARGIN_FRACTION_WITH_COMPLICATION = Vec2f(0.4f, 0.4f)
 
-        private val VERTICAL_COMPLICATION_IDS = arrayOf(
-            ComplicationID.UPPER.ordinal,
-            ComplicationID.LOWER.ordinal
-        )
-        private val HORIZONTAL_COMPLICATION_IDS = arrayOf(
-            ComplicationID.LEFT.ordinal,
-            ComplicationID.RIGHT.ordinal
-        )
-        private val FOREGROUND_COMPLICATION_IDS = arrayOf(
-            ComplicationID.UPPER.ordinal, ComplicationID.RIGHT.ordinal,
-            ComplicationID.LOWER.ordinal, ComplicationID.LEFT.ordinal
-        )
+        private val VERTICAL_COMPLICATION_IDS =
+            arrayOf(ComplicationID.UPPER.ordinal, ComplicationID.LOWER.ordinal)
+        private val HORIZONTAL_COMPLICATION_IDS =
+            arrayOf(ComplicationID.LEFT.ordinal, ComplicationID.RIGHT.ordinal)
+        private val FOREGROUND_COMPLICATION_IDS =
+            arrayOf(
+                ComplicationID.UPPER.ordinal,
+                ComplicationID.RIGHT.ordinal,
+                ComplicationID.LOWER.ordinal,
+                ComplicationID.LEFT.ordinal
+            )
 
         // The name of the font used for drawing the text in the digit watch face.
         private const val DIGITAL_TYPE_FACE = "sans-serif-condensed-light"
@@ -1121,18 +1137,21 @@
         // The width of the large digit bitmaps, as a fraction of their height.
         private const val DIGIT_WIDTH_FRACTION = 0.65f
 
-        // The height of the small digits (used for minutes and seconds), given as a fraction of the  height
+        // The height of the small digits (used for minutes and seconds), given as a fraction of the
+        //  height
         // of the large digits.
         private const val SMALL_DIGIT_SIZE_FRACTION = 0.45f
 
         // The width of the small digit bitmaps, as a fraction of their height.
         private const val SMALL_DIGIT_WIDTH_FRACTION = 0.7f
 
-        // The padding at the top and bottom of the digit bitmaps, given as a fraction of the height.
+        // The padding at the top and bottom of the digit bitmaps, given as a fraction of the
+        // height.
         // Needed as some characters may ascend or descend slightly (e.g. "8").
         private const val DIGIT_PADDING_FRACTION = 0.05f
 
-        // The gap between the hours and the minutes/seconds, given as a fraction of the width of the large
+        // The gap between the hours and the minutes/seconds, given as a fraction of the width of
+        // the large
         // digits.
         private const val GAP_WIDTH_FRACTION = 0.1f
 
@@ -1145,53 +1164,53 @@
         // (So 0.5 means that the animation of that digit will begin half-way through the second).
         // Note that because we only cache one digit of each type, the current and next times must
         // not overlap.
-        private val DIGIT_ANIMATION_START_TIME_FRACTION = mapOf(
-            DigitMode.OUTGOING to 0.5f,
-            DigitMode.INCOMING to 0.667f
-        )
-        private val DIGIT_ANIMATION_END_TIME = mapOf(
-            DigitMode.OUTGOING to 0.667f,
-            DigitMode.INCOMING to 1f
-        )
+        private val DIGIT_ANIMATION_START_TIME_FRACTION =
+            mapOf(DigitMode.OUTGOING to 0.5f, DigitMode.INCOMING to 0.667f)
+        private val DIGIT_ANIMATION_END_TIME =
+            mapOf(DigitMode.OUTGOING to 0.667f, DigitMode.INCOMING to 1f)
         private const val POSITION_ANIMATION_START_TIME = 0.0833f
         private const val POSITION_ANIMATION_END_TIME = 0.5833f
 
-        // Parameters governing the animation of the current and next digits. NB Scale is a size multiplier.
-        // The first index is the values for the outgoing digit, and the second index for the incoming
-        // digit. If seconds are changing from 1 -> 2 for example, the 1 will scale from 1f to 0.65f, and
+        // Parameters governing the animation of the current and next digits. NB Scale is a size
+        // multiplier.
+        // The first index is the values for the outgoing digit, and the second index for the
+        // incoming
+        // digit. If seconds are changing from 1 -> 2 for example, the 1 will scale from 1f to
+        // 0.65f, and
         // rotate from 0f to 82f. The 2 will scale from 0.65f to 1f, and rotate from -97f to 0f.
         private val DIGIT_SCALE_START = mapOf(DigitMode.OUTGOING to 1f, DigitMode.INCOMING to 0.65f)
         private val DIGIT_SCALE_END = mapOf(DigitMode.OUTGOING to 0.65f, DigitMode.INCOMING to 1f)
-        private val DIGIT_ROTATE_START_DEGREES = mapOf(
-            DigitMode.OUTGOING to 0f,
-            DigitMode.INCOMING to -97f
-        )
+        private val DIGIT_ROTATE_START_DEGREES =
+            mapOf(DigitMode.OUTGOING to 0f, DigitMode.INCOMING to -97f)
         private val DIGIT_ROTATE_END_DEGREES =
             mapOf(DigitMode.OUTGOING to 82f, DigitMode.INCOMING to 0f)
         private val DIGIT_OPACITY_START =
             mapOf(DigitMode.OUTGOING to 1f, DigitMode.INCOMING to 0.07f)
         private val DIGIT_OPACITY_END = mapOf(DigitMode.OUTGOING to 0f, DigitMode.INCOMING to 1f)
 
-        // The offset used to stagger the animation when multiple digits are animating at the same time.
+        // The offset used to stagger the animation when multiple digits are animating at the same
+        // time.
         private const val TIME_OFFSET_SECONDS_PER_DIGIT_TYPE = -5 / 60f
 
         // The duration of the ambient mode change animation.
         private const val AMBIENT_TRANSITION_MS = 333L
 
-        private val DIGIT_SCALE_INTERPOLATOR = mapOf(
-            DigitMode.OUTGOING to PathInterpolator(0.4f, 0f, 0.67f, 1f),
-            DigitMode.INCOMING to PathInterpolator(0.33f, 0f, 0.2f, 1f)
-        )
-        private val DIGIT_ROTATION_INTERPOLATOR = mapOf(
-            DigitMode.OUTGOING to PathInterpolator(0.57f, 0f, 0.73f, 0.49f),
-            DigitMode.INCOMING to PathInterpolator(0.15f, 0.49f, 0.37f, 1f)
-        )
-        private val DIGIT_OPACITY_INTERPOLATOR = mapOf(
-            DigitMode.OUTGOING to PathInterpolator(0.4f, 0f, 1f, 1f),
-            DigitMode.INCOMING to PathInterpolator(0f, 0f, 0.2f, 1f)
-        )
-        private val CENTERING_ADJUSTMENT_INTERPOLATOR =
-            PathInterpolator(0.4f, 0f, 0.2f, 1f)
+        private val DIGIT_SCALE_INTERPOLATOR =
+            mapOf(
+                DigitMode.OUTGOING to PathInterpolator(0.4f, 0f, 0.67f, 1f),
+                DigitMode.INCOMING to PathInterpolator(0.33f, 0f, 0.2f, 1f)
+            )
+        private val DIGIT_ROTATION_INTERPOLATOR =
+            mapOf(
+                DigitMode.OUTGOING to PathInterpolator(0.57f, 0f, 0.73f, 0.49f),
+                DigitMode.INCOMING to PathInterpolator(0.15f, 0.49f, 0.37f, 1f)
+            )
+        private val DIGIT_OPACITY_INTERPOLATOR =
+            mapOf(
+                DigitMode.OUTGOING to PathInterpolator(0.4f, 0f, 1f, 1f),
+                DigitMode.INCOMING to PathInterpolator(0f, 0f, 0.2f, 1f)
+            )
+        private val CENTERING_ADJUSTMENT_INTERPOLATOR = PathInterpolator(0.4f, 0f, 0.2f, 1f)
 
         @ColorInt
         private fun colorRgb(red: Float, green: Float, blue: Float) =
@@ -1207,8 +1226,8 @@
         private fun blueFraction(@ColorInt color: Int) = Color.blue(color).toFloat() / 255.0f
 
         /**
-         * Returns an RGB color that has the same effect as drawing `color` with `alphaFraction` over a
-         * `backgroundColor` background.
+         * Returns an RGB color that has the same effect as drawing `color` with `alphaFraction`
+         * over a `backgroundColor` background.
          *
          * @param color the foreground color
          * @param alphaFraction the fraction of the alpha value, range from 0 to 1
@@ -1226,7 +1245,7 @@
             )
         }
 
-        /** Returns a linear interpolation between a and b using the scalar s.  */
+        /** Returns a linear interpolation between a and b using the scalar s. */
         private fun lerp(a: Float, b: Float, s: Float) = a + s * (b - a)
 
         /**
@@ -1245,11 +1264,12 @@
             currentTime: Float,
             interpolator: TimeInterpolator
         ): Float {
-            val progress = when {
-                currentTime < startTime -> 0f
-                currentTime > endTime -> 1f
-                else -> interpolator.getInterpolation(lerpInv(startTime, endTime, currentTime))
-            }
+            val progress =
+                when {
+                    currentTime < startTime -> 0f
+                    currentTime > endTime -> 1f
+                    else -> interpolator.getInterpolation(lerpInv(startTime, endTime, currentTime))
+                }
             return lerp(startValue, endValue, progress)
         }
 
@@ -1257,8 +1277,8 @@
          * Sets the [DigitDrawProperties] that should be used for drawing, given the specified
          * parameters.
          *
-         * @param secondProgress the sub-second part of the current time, where 0 means the current second
-         * has just begun, and 1 means the current second has just ended
+         * @param secondProgress the sub-second part of the current time, where 0 means the current
+         *   second has just begun, and 1 means the current second has just ended
          * @param offsetSeconds a value added to the start and end time of the animations
          * @param digitMode whether the digit is OUTGOING or INCOMING
          * @param output the [DigitDrawProperties] that will be set
@@ -1271,35 +1291,39 @@
         ) {
             val startTime = DIGIT_ANIMATION_START_TIME_FRACTION[digitMode]!! + offsetSeconds
             val endTime = DIGIT_ANIMATION_END_TIME[digitMode]!! + offsetSeconds
-            output.shouldDraw = if (digitMode == DigitMode.OUTGOING) {
-                secondProgress < endTime
-            } else {
-                secondProgress >= startTime
-            }
-            output.scale = getInterpolatedValue(
-                DIGIT_SCALE_START[digitMode]!!,
-                DIGIT_SCALE_END[digitMode]!!,
-                startTime,
-                endTime,
-                secondProgress,
-                DIGIT_SCALE_INTERPOLATOR[digitMode]!!
-            )
-            output.rotation = getInterpolatedValue(
-                DIGIT_ROTATE_START_DEGREES[digitMode]!!,
-                DIGIT_ROTATE_END_DEGREES[digitMode]!!,
-                startTime,
-                endTime,
-                secondProgress,
-                DIGIT_ROTATION_INTERPOLATOR[digitMode]!!
-            )
-            output.opacity = getInterpolatedValue(
-                DIGIT_OPACITY_START[digitMode]!!,
-                DIGIT_OPACITY_END[digitMode]!!,
-                startTime,
-                endTime,
-                secondProgress,
-                DIGIT_OPACITY_INTERPOLATOR[digitMode]!!
-            )
+            output.shouldDraw =
+                if (digitMode == DigitMode.OUTGOING) {
+                    secondProgress < endTime
+                } else {
+                    secondProgress >= startTime
+                }
+            output.scale =
+                getInterpolatedValue(
+                    DIGIT_SCALE_START[digitMode]!!,
+                    DIGIT_SCALE_END[digitMode]!!,
+                    startTime,
+                    endTime,
+                    secondProgress,
+                    DIGIT_SCALE_INTERPOLATOR[digitMode]!!
+                )
+            output.rotation =
+                getInterpolatedValue(
+                    DIGIT_ROTATE_START_DEGREES[digitMode]!!,
+                    DIGIT_ROTATE_END_DEGREES[digitMode]!!,
+                    startTime,
+                    endTime,
+                    secondProgress,
+                    DIGIT_ROTATION_INTERPOLATOR[digitMode]!!
+                )
+            output.opacity =
+                getInterpolatedValue(
+                    DIGIT_OPACITY_START[digitMode]!!,
+                    DIGIT_OPACITY_END[digitMode]!!,
+                    startTime,
+                    endTime,
+                    secondProgress,
+                    DIGIT_OPACITY_INTERPOLATOR[digitMode]!!
+                )
         }
 
         private fun getTimeOffsetSeconds(digitType: DigitType): Float {
@@ -1323,10 +1347,7 @@
             )
         }
 
-        private fun createBoundsRect(
-            centerFraction: PointF,
-            size: Vec2f
-        ): RectF {
+        private fun createBoundsRect(centerFraction: PointF, size: Vec2f): RectF {
             val halfWidth = size.x / 2.0f
             val halfHeight = size.y / 2.0f
             return RectF(
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleHierarchicalStyleWatchFaceService.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleHierarchicalStyleWatchFaceService.kt
index 766c9e5..23be167 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleHierarchicalStyleWatchFaceService.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleHierarchicalStyleWatchFaceService.kt
@@ -85,35 +85,36 @@
             R.string.digital_complications_setting,
             R.string.digital_complications_setting_description,
             icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("On"),
-                    resources,
-                    R.string.digital_complication_on_screen_name,
-                    Icon.createWithResource(this, R.drawable.on),
-                    listOf(
-                        ComplicationSlotOverlay(
-                            COMPLICATION1_ID,
-                            enabled = true,
-                            complicationSlotBounds =
-                                ComplicationSlotBounds(RectF(0.1f, 0.4f, 0.3f, 0.6f))
+            complicationConfig =
+                listOf(
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id("On"),
+                        resources,
+                        R.string.digital_complication_on_screen_name,
+                        Icon.createWithResource(this, R.drawable.on),
+                        listOf(
+                            ComplicationSlotOverlay(
+                                COMPLICATION1_ID,
+                                enabled = true,
+                                complicationSlotBounds =
+                                    ComplicationSlotBounds(RectF(0.1f, 0.4f, 0.3f, 0.6f))
+                            ),
+                            ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
+                            ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
                         ),
-                        ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
-                        ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
                     ),
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("Off"),
-                    resources,
-                    R.string.digital_complication_off_screen_name,
-                    Icon.createWithResource(this, R.drawable.off),
-                    listOf(
-                        ComplicationSlotOverlay(COMPLICATION1_ID, enabled = false),
-                        ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
-                        ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id("Off"),
+                        resources,
+                        R.string.digital_complication_off_screen_name,
+                        Icon.createWithResource(this, R.drawable.off),
+                        listOf(
+                            ComplicationSlotOverlay(COMPLICATION1_ID, enabled = false),
+                            ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
+                            ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
+                        )
                     )
-                )
-            ),
+                ),
             listOf(WatchFaceLayer.COMPLICATIONS)
         )
     }
@@ -197,41 +198,42 @@
             R.string.watchface_complications_setting,
             R.string.watchface_complications_setting_description,
             icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("One"),
-                    resources,
-                    R.string.analog_complication_one_screen_name,
-                    Icon.createWithResource(this, R.drawable.one),
-                    listOf(
-                        ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
-                        ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
-                        ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
+            complicationConfig =
+                listOf(
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id("One"),
+                        resources,
+                        R.string.analog_complication_one_screen_name,
+                        Icon.createWithResource(this, R.drawable.one),
+                        listOf(
+                            ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
+                            ComplicationSlotOverlay(COMPLICATION2_ID, enabled = false),
+                            ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
+                        )
+                    ),
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id("Two"),
+                        resources,
+                        R.string.analog_complication_two_screen_name,
+                        Icon.createWithResource(this, R.drawable.two),
+                        listOf(
+                            ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
+                            ComplicationSlotOverlay(COMPLICATION2_ID, enabled = true),
+                            ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
+                        )
+                    ),
+                    ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
+                        UserStyleSetting.Option.Id("Three"),
+                        resources,
+                        R.string.analog_complication_three_screen_name,
+                        Icon.createWithResource(this, R.drawable.three),
+                        listOf(
+                            ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
+                            ComplicationSlotOverlay(COMPLICATION2_ID, enabled = true),
+                            ComplicationSlotOverlay(COMPLICATION3_ID, enabled = true)
+                        )
                     )
                 ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("Two"),
-                    resources,
-                    R.string.analog_complication_two_screen_name,
-                    Icon.createWithResource(this, R.drawable.two),
-                    listOf(
-                        ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
-                        ComplicationSlotOverlay(COMPLICATION2_ID, enabled = true),
-                        ComplicationSlotOverlay(COMPLICATION3_ID, enabled = false)
-                    )
-                ),
-                ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(
-                    UserStyleSetting.Option.Id("Three"),
-                    resources,
-                    R.string.analog_complication_three_screen_name,
-                    Icon.createWithResource(this, R.drawable.three),
-                    listOf(
-                        ComplicationSlotOverlay(COMPLICATION1_ID, enabled = true),
-                        ComplicationSlotOverlay(COMPLICATION2_ID, enabled = true),
-                        ComplicationSlotOverlay(COMPLICATION3_ID, enabled = true)
-                    )
-                )
-            ),
             listOf(WatchFaceLayer.COMPLICATIONS)
         )
     }
@@ -243,11 +245,8 @@
             R.string.style_digital_watch,
             R.string.style_digital_watch_screen_reader,
             icon = Icon.createWithResource(this, R.drawable.d),
-            childSettings = listOf(
-                digitalClockStyleSetting,
-                colorStyleSetting,
-                digitalComplicationSettings
-            )
+            childSettings =
+                listOf(digitalClockStyleSetting, colorStyleSetting, digitalComplicationSettings)
         )
     }
 
@@ -258,11 +257,7 @@
             R.string.style_analog_watch,
             R.string.style_analog_watch_screen_reader,
             icon = Icon.createWithResource(this, R.drawable.a),
-            childSettings = listOf(
-                colorStyleSetting,
-                drawHoursSetting,
-                analogComplicationSettings
-            )
+            childSettings = listOf(colorStyleSetting, drawHoursSetting, analogComplicationSettings)
         )
     }
 
@@ -278,95 +273,102 @@
         )
     }
 
-    public override fun createUserStyleSchema() = UserStyleSchema(
-        listOf(
-            watchFaceType,
-            digitalClockStyleSetting,
-            colorStyleSetting,
-            drawHoursSetting,
-            digitalComplicationSettings,
-            analogComplicationSettings
+    public override fun createUserStyleSchema() =
+        UserStyleSchema(
+            listOf(
+                watchFaceType,
+                digitalClockStyleSetting,
+                colorStyleSetting,
+                drawHoursSetting,
+                digitalComplicationSettings,
+                analogComplicationSettings
+            )
         )
-    )
 
-    private val watchFaceStyle by lazy {
-        WatchFaceColorStyle.create(this, "red_style")
-    }
+    private val watchFaceStyle by lazy { WatchFaceColorStyle.create(this, "red_style") }
 
     public override fun createComplicationSlotsManager(
         currentUserStyleRepository: CurrentUserStyleRepository
     ): ComplicationSlotsManager {
-        val canvasComplicationFactory =
-            CanvasComplicationFactory { watchState, listener ->
-                CanvasComplicationDrawable(
-                    watchFaceStyle.getDrawable(this@ExampleHierarchicalStyleWatchFaceService)!!,
-                    watchState,
-                    listener
+        val canvasComplicationFactory = CanvasComplicationFactory { watchState, listener ->
+            CanvasComplicationDrawable(
+                watchFaceStyle.getDrawable(this@ExampleHierarchicalStyleWatchFaceService)!!,
+                watchState,
+                listener
+            )
+        }
+
+        val complicationOne =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    COMPLICATION1_ID,
+                    canvasComplicationFactory,
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.GOAL_PROGRESS,
+                        ComplicationType.WEIGHTED_ELEMENTS,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_WATCH_BATTERY,
+                        ComplicationType.RANGED_VALUE
+                    ),
+                    ComplicationSlotBounds(RectF(0.6f, 0.1f, 0.8f, 0.3f))
                 )
-            }
+                .setNameResourceId(R.string.hierarchical_complication1_screen_name)
+                .setScreenReaderNameResourceId(
+                    R.string.hierarchical_complication1_screen_reader_name
+                )
+                .build()
 
-        val complicationOne = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            COMPLICATION1_ID,
-            canvasComplicationFactory,
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.GOAL_PROGRESS,
-                ComplicationType.WEIGHTED_ELEMENTS,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(
-                SystemDataSources.DATA_SOURCE_WATCH_BATTERY,
-                ComplicationType.RANGED_VALUE
-            ),
-            ComplicationSlotBounds(RectF(0.6f, 0.1f, 0.8f, 0.3f))
-        ).setNameResourceId(R.string.hierarchical_complication1_screen_name)
-            .setScreenReaderNameResourceId(
-                R.string.hierarchical_complication1_screen_reader_name
-            ).build()
+        val complicationTwo =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    COMPLICATION2_ID,
+                    canvasComplicationFactory,
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.GOAL_PROGRESS,
+                        ComplicationType.WEIGHTED_ELEMENTS,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_TIME_AND_DATE,
+                        ComplicationType.SHORT_TEXT
+                    ),
+                    ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+                )
+                .setNameResourceId(R.string.hierarchical_complication2_screen_name)
+                .setScreenReaderNameResourceId(
+                    R.string.hierarchical_complication2_screen_reader_name
+                )
+                .build()
 
-        val complicationTwo = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            COMPLICATION2_ID,
-            canvasComplicationFactory,
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.GOAL_PROGRESS,
-                ComplicationType.WEIGHTED_ELEMENTS,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(
-                SystemDataSources.DATA_SOURCE_TIME_AND_DATE,
-                ComplicationType.SHORT_TEXT
-            ),
-            ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
-        ).setNameResourceId(R.string.hierarchical_complication2_screen_name)
-            .setScreenReaderNameResourceId(
-                R.string.hierarchical_complication2_screen_reader_name
-            ).build()
-
-        val complicationThree = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            COMPLICATION3_ID,
-            canvasComplicationFactory,
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.GOAL_PROGRESS,
-                ComplicationType.WEIGHTED_ELEMENTS,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
-                ComplicationType.SHORT_TEXT
-            ),
-            ComplicationSlotBounds(RectF(0.6f, 0.7f, 0.8f, 0.9f))
-        ).setNameResourceId(R.string.hierarchical_complication3_screen_name)
-            .setScreenReaderNameResourceId(
-                R.string.hierarchical_complication3_screen_reader_name
-            ).build()
+        val complicationThree =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    COMPLICATION3_ID,
+                    canvasComplicationFactory,
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                        ComplicationType.GOAL_PROGRESS,
+                        ComplicationType.WEIGHTED_ELEMENTS,
+                        ComplicationType.SHORT_TEXT,
+                        ComplicationType.MONOCHROMATIC_IMAGE,
+                        ComplicationType.SMALL_IMAGE
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                        ComplicationType.SHORT_TEXT
+                    ),
+                    ComplicationSlotBounds(RectF(0.6f, 0.7f, 0.8f, 0.9f))
+                )
+                .setNameResourceId(R.string.hierarchical_complication3_screen_name)
+                .setScreenReaderNameResourceId(
+                    R.string.hierarchical_complication3_screen_reader_name
+                )
+                .build()
 
         return ComplicationSlotsManager(
             listOf(complicationOne, complicationTwo, complicationThree),
@@ -379,137 +381,154 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.ANALOG,
-        @Suppress("Deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16L
-        ) {
-            val renderer = ExampleHierarchicalStyleWatchFaceRenderer()
-            val context: Context = this@ExampleHierarchicalStyleWatchFaceService
+    ) =
+        WatchFace(
+            WatchFaceType.ANALOG,
+            @Suppress("Deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16L
+                ) {
+                val renderer = ExampleHierarchicalStyleWatchFaceRenderer()
+                val context: Context = this@ExampleHierarchicalStyleWatchFaceService
 
-            init {
-                CoroutineScope(Dispatchers.Main.immediate).launch {
-                    currentUserStyleRepository.userStyle.collect { userStyle ->
-                        for ((_, complication) in complicationSlotsManager.complicationSlots) {
-                            (complication.renderer as CanvasComplicationDrawable).drawable =
-                                when (userStyle[colorStyleSetting]) {
-                                    redStyle ->
-                                        WatchFaceColorStyle.create(context, "red_style")
-                                            .getDrawable(context)!!
-                                    greenStyle ->
-                                        WatchFaceColorStyle.create(context, "green_style")
-                                            .getDrawable(context)!!
-                                    blueStyle ->
-                                        WatchFaceColorStyle.create(context, "blue_style")
-                                             .getDrawable(context)!!
-                                    else -> throw IllegalArgumentException(
-                                        "Unrecognized colorStyleSetting "
-                                    )
-                                }
+                init {
+                    CoroutineScope(Dispatchers.Main.immediate).launch {
+                        currentUserStyleRepository.userStyle.collect { userStyle ->
+                            for ((_, complication) in complicationSlotsManager.complicationSlots) {
+                                (complication.renderer as CanvasComplicationDrawable).drawable =
+                                    when (userStyle[colorStyleSetting]) {
+                                        redStyle ->
+                                            WatchFaceColorStyle.create(context, "red_style")
+                                                .getDrawable(context)!!
+                                        greenStyle ->
+                                            WatchFaceColorStyle.create(context, "green_style")
+                                                .getDrawable(context)!!
+                                        blueStyle ->
+                                            WatchFaceColorStyle.create(context, "blue_style")
+                                                .getDrawable(context)!!
+                                        else ->
+                                            throw IllegalArgumentException(
+                                                "Unrecognized colorStyleSetting "
+                                            )
+                                    }
+                            }
                         }
                     }
                 }
-            }
 
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                val currentStyle = currentUserStyleRepository.userStyle.value
-                when (currentStyle[watchFaceType]) {
-                    digitalWatchFaceType -> renderer.renderDigital(
-                        canvas,
-                        bounds,
-                        zonedDateTime,
-                        renderParameters,
-                        watchState,
-                        currentStyle[digitalClockStyleSetting] == twentyFourHourClockOption,
-                        when (currentStyle[colorStyleSetting]) {
-                            redStyle -> intArrayOf(1, 0, 0)
-                            greenStyle -> intArrayOf(0, 1, 0)
-                            blueStyle -> intArrayOf(0, 0, 1)
-                            else -> throw IllegalArgumentException(
-                                "Unrecognized colorStyleSetting " +
-                                    currentStyle[colorStyleSetting]
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    val currentStyle = currentUserStyleRepository.userStyle.value
+                    when (currentStyle[watchFaceType]) {
+                        digitalWatchFaceType ->
+                            renderer.renderDigital(
+                                canvas,
+                                bounds,
+                                zonedDateTime,
+                                renderParameters,
+                                watchState,
+                                currentStyle[digitalClockStyleSetting] == twentyFourHourClockOption,
+                                when (currentStyle[colorStyleSetting]) {
+                                    redStyle -> intArrayOf(1, 0, 0)
+                                    greenStyle -> intArrayOf(0, 1, 0)
+                                    blueStyle -> intArrayOf(0, 0, 1)
+                                    else ->
+                                        throw IllegalArgumentException(
+                                            "Unrecognized colorStyleSetting " +
+                                                currentStyle[colorStyleSetting]
+                                        )
+                                }
+                            )
+                        analogWatchFaceType ->
+                            renderer.renderAnalog(
+                                canvas,
+                                bounds,
+                                zonedDateTime,
+                                renderParameters,
+                                (currentStyle[drawHoursSetting]!!
+                                        as UserStyleSetting.BooleanUserStyleSetting.BooleanOption)
+                                    .value,
+                            )
+                        else -> {
+                            throw IllegalStateException(
+                                "Unrecognized chosenSettingId " +
+                                    currentUserStyleRepository.userStyle.value
                             )
                         }
-                    )
+                    }
 
-                    analogWatchFaceType -> renderer.renderAnalog(
-                        canvas,
-                        bounds,
-                        zonedDateTime,
-                        renderParameters,
-                        (currentStyle[drawHoursSetting]!!
-                            as UserStyleSetting.BooleanUserStyleSetting.BooleanOption).value,
-                    )
-
-                    else -> {
-                        throw IllegalStateException(
-                            "Unrecognized chosenSettingId " +
-                                currentUserStyleRepository.userStyle.value
-                        )
+                    for ((_, complication) in complicationSlotsManager.complicationSlots) {
+                        if (complication.enabled) {
+                            complication.render(canvas, zonedDateTime, renderParameters)
+                        }
                     }
                 }
 
-                for ((_, complication) in complicationSlotsManager.complicationSlots) {
-                    if (complication.enabled) {
-                        complication.render(canvas, zonedDateTime, renderParameters)
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    for ((_, complication) in complicationSlotsManager.complicationSlots) {
+                        if (complication.enabled) {
+                            complication.renderHighlightLayer(
+                                canvas,
+                                zonedDateTime,
+                                renderParameters
+                            )
+                        }
                     }
                 }
             }
-
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                for ((_, complication) in complicationSlotsManager.complicationSlots) {
-                    if (complication.enabled) {
-                        complication.renderHighlightLayer(canvas, zonedDateTime, renderParameters)
-                    }
-                }
-            }
-        }
-    )
+        )
 
     private class ExampleHierarchicalStyleWatchFaceRenderer {
-        internal val paint = Paint().apply {
-            textAlign = Paint.Align.CENTER
-            isAntiAlias = true
-        }
+        internal val paint =
+            Paint().apply {
+                textAlign = Paint.Align.CENTER
+                isAntiAlias = true
+            }
 
         internal val textBounds = Rect()
 
         @Px
-        internal val timeActiveHeight = Rect().apply {
-            paint.textSize = TIME_TEXT_ACTIVE_HEIGHT
-            paint.getTextBounds(timeText, 0, timeText.size, this)
-        }.height()
+        internal val timeActiveHeight =
+            Rect()
+                .apply {
+                    paint.textSize = TIME_TEXT_ACTIVE_HEIGHT
+                    paint.getTextBounds(timeText, 0, timeText.size, this)
+                }
+                .height()
 
         @Px
-        internal val timeAmbientHeight = Rect().apply {
-            paint.textSize = TIME_TEXT_AMBIENT_HEIGHT
-            paint.getTextBounds(timeText, 0, timeText.size, this)
-        }.height()
+        internal val timeAmbientHeight =
+            Rect()
+                .apply {
+                    paint.textSize = TIME_TEXT_AMBIENT_HEIGHT
+                    paint.getTextBounds(timeText, 0, timeText.size, this)
+                }
+                .height()
 
         @Px
-        internal val secondsHeight = Rect().apply {
-            paint.textSize = SECONDS_TEXT_HEIGHT
-            paint.getTextBounds(secondsText, 0, secondsText.size, this)
-        }.height()
+        internal val secondsHeight =
+            Rect()
+                .apply {
+                    paint.textSize = SECONDS_TEXT_HEIGHT
+                    paint.getTextBounds(secondsText, 0, secondsText.size, this)
+                }
+                .height()
 
         @Px
         internal val timeActiveOffset =
             (timeActiveHeight + secondsHeight + TEXT_PADDING) / 2 - timeActiveHeight
 
-        @Px
-        internal val timeAmbientOffset = timeAmbientHeight / 2 - timeAmbientHeight
+        @Px internal val timeAmbientOffset = timeAmbientHeight / 2 - timeAmbientHeight
 
-        @Px
-        internal val secondsActiveOffset = timeActiveOffset - secondsHeight - TEXT_PADDING
+        @Px internal val secondsActiveOffset = timeActiveOffset - secondsHeight - TEXT_PADDING
 
         fun renderDigital(
             canvas: Canvas,
@@ -525,12 +544,13 @@
             val minute = zonedDateTime.minute
             val second = zonedDateTime.second
 
-            paint.color = if (isActive) {
-                val scale = 64 + 192 * second / 60
-                Color.rgb(color[0] * scale, color[1] * scale, color[2] * scale)
-            } else {
-                Color.BLACK
-            }
+            paint.color =
+                if (isActive) {
+                    val scale = 64 + 192 * second / 60
+                    Color.rgb(color[0] * scale, color[1] * scale, color[2] * scale)
+                } else {
+                    Color.BLACK
+                }
             canvas.drawRect(bounds, paint)
 
             paint.color = Color.WHITE
@@ -597,8 +617,9 @@
 
             val hours = (zonedDateTime.hour % 12).toFloat()
             val minutes = zonedDateTime.minute.toFloat()
-            val seconds = zonedDateTime.second.toFloat() +
-                (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
+            val seconds =
+                zonedDateTime.second.toFloat() +
+                    (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
 
             val hourRot = (hours + minutes / 60.0f + seconds / 3600.0f) / 12.0f * 360.0f
             val minuteRot = (minutes + seconds / 60.0f) / 60.0f * 360.0f
@@ -641,17 +662,13 @@
         private val timeText = charArrayOf('1', '0', ':', '0', '9')
         private val secondsText = charArrayOf('3', '0')
 
-        @Px
-        private val SECONDS_TEXT_HEIGHT = 180f
+        @Px private val SECONDS_TEXT_HEIGHT = 180f
 
-        @Px
-        private val TIME_TEXT_ACTIVE_HEIGHT = 64f
+        @Px private val TIME_TEXT_ACTIVE_HEIGHT = 64f
 
-        @Px
-        private val TIME_TEXT_AMBIENT_HEIGHT = 96f
+        @Px private val TIME_TEXT_AMBIENT_HEIGHT = 96f
 
-        @Px
-        private val TEXT_PADDING = 12
+        @Px private val TEXT_PADDING = 12
 
         const val COMPLICATION1_ID = 101
         const val COMPLICATION2_ID = 102
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
index cb5ad23..4c887ab 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
@@ -51,22 +51,23 @@
             R.string.colors_style_setting,
             R.string.colors_style_setting_description,
             icon = null,
-            options = listOf(
-                UserStyleSetting.ListUserStyleSetting.ListOption(
-                    UserStyleSetting.Option.Id("yellow_style"),
-                    resources,
-                    R.string.colors_style_yellow,
-                    R.string.colors_style_yellow_screen_reader,
-                    Icon.createWithResource(this, R.drawable.yellow_style)
+            options =
+                listOf(
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        UserStyleSetting.Option.Id("yellow_style"),
+                        resources,
+                        R.string.colors_style_yellow,
+                        R.string.colors_style_yellow_screen_reader,
+                        Icon.createWithResource(this, R.drawable.yellow_style)
+                    ),
+                    UserStyleSetting.ListUserStyleSetting.ListOption(
+                        UserStyleSetting.Option.Id("blue_style"),
+                        resources,
+                        R.string.colors_style_blue,
+                        R.string.colors_style_blue_screen_reader,
+                        Icon.createWithResource(this, R.drawable.blue_style)
+                    )
                 ),
-                UserStyleSetting.ListUserStyleSetting.ListOption(
-                    UserStyleSetting.Option.Id("blue_style"),
-                    resources,
-                    R.string.colors_style_blue,
-                    R.string.colors_style_blue_screen_reader,
-                    Icon.createWithResource(this, R.drawable.blue_style)
-                )
-            ),
             listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
     }
@@ -90,9 +91,7 @@
                 colorStyleSetting
             )
         return WatchFace(WatchFaceType.ANALOG, renderer)
-            .setComplicationDeniedDialogIntent(
-                Intent(this, ComplicationDeniedActivity::class.java)
-            )
+            .setComplicationDeniedDialogIntent(Intent(this, ComplicationDeniedActivity::class.java))
             .setComplicationRationaleDialogIntent(
                 Intent(this, ComplicationRationalActivity::class.java)
             )
@@ -105,18 +104,10 @@
         val watchHandTexture = loadTextureFromResource(resources, R.drawable.hand)
 
         val triangleTextureProgram = Gles2TexturedTriangleList.Program()
-        val backgroundQuad = createTexturedQuad(
-            triangleTextureProgram, -10f, -10f, 20f, 20f
-        )
-        val secondHandQuad = createTexturedQuad(
-            triangleTextureProgram, -0.75f, -6f, 1.5f, 8f
-        )
-        val minuteHandQuad = createTexturedQuad(
-            triangleTextureProgram, -0.33f, -4.5f, 0.66f, 6f
-        )
-        val hourHandQuad = createTexturedQuad(
-            triangleTextureProgram, -0.25f, -3f, 0.5f, 4f
-        )
+        val backgroundQuad = createTexturedQuad(triangleTextureProgram, -10f, -10f, 20f, 20f)
+        val secondHandQuad = createTexturedQuad(triangleTextureProgram, -0.75f, -6f, 1.5f, 8f)
+        val minuteHandQuad = createTexturedQuad(triangleTextureProgram, -0.33f, -4.5f, 0.66f, 6f)
+        val hourHandQuad = createTexturedQuad(triangleTextureProgram, -0.25f, -3f, 0.5f, 4f)
 
         override fun onDestroy() {
             GLES20.glDeleteTextures(
@@ -135,65 +126,44 @@
             top: Float,
             width: Float,
             height: Float
-        ) = Gles2TexturedTriangleList(
-            program,
-            floatArrayOf(
-                top + 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,
-                1.0f,
-
-                1.0f,
-                0.0f,
-
-                0.0f,
-                1.0f,
-
-                1.0f,
-                0.0f,
-
-                0.0f,
-                1.0f,
-
-                0.0f,
-                0.0f
+        ) =
+            Gles2TexturedTriangleList(
+                program,
+                floatArrayOf(
+                    top + 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, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f)
             )
-        )
 
         private fun loadTextureFromResource(resources: Resources, resourceId: Int): Int {
             val textureHandle = IntArray(1)
             GLES20.glGenTextures(1, textureHandle, 0)
             if (textureHandle[0] != 0) {
-                val bitmap = BitmapFactory.decodeResource(
-                    resources,
-                    resourceId,
-                    BitmapFactory.Options().apply {
-                        inScaled = false // No pre-scaling
-                    }
-                )
+                val bitmap =
+                    BitmapFactory.decodeResource(
+                        resources,
+                        resourceId,
+                        BitmapFactory.Options().apply {
+                            inScaled = false // No pre-scaling
+                        }
+                    )
                 GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0])
                 checkGLError("glBindTexture")
                 GLES20.glTexParameteri(
@@ -219,28 +189,18 @@
         watchState: WatchState,
         private val resources: Resources,
         private val colorStyleSetting: UserStyleSetting.ListUserStyleSetting,
-    ) : Renderer.GlesRenderer2<ExampleSharedAssets>(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        FRAME_PERIOD_MS
-    ) {
+    ) :
+        Renderer.GlesRenderer2<ExampleSharedAssets>(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            FRAME_PERIOD_MS
+        ) {
         private val projectionMatrix = FloatArray(16)
-        private val viewMatrix = FloatArray(16).apply {
-            Matrix.setLookAtM(
-                this,
-                0,
-                0f,
-                0f,
-                -1.0f,
-                0f,
-                0f,
-                0f,
-                0f,
-                1f,
-                0f
-            )
-        }
+        private val viewMatrix =
+            FloatArray(16).apply {
+                Matrix.setLookAtM(this, 0, 0f, 0f, -1.0f, 0f, 0f, 0f, 0f, 1f, 0f)
+            }
         private val handPositionMatrix = FloatArray(16)
         private val handViewMatrix = FloatArray(16)
         private val vpMatrix = FloatArray(16)
@@ -290,8 +250,9 @@
 
             val hours = (zonedDateTime.hour % 12).toFloat()
             val minutes = zonedDateTime.minute.toFloat()
-            val seconds = zonedDateTime.second.toFloat() +
-                (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
+            val seconds =
+                zonedDateTime.second.toFloat() +
+                    (zonedDateTime.nano.toDouble() / 1000000000.0).toFloat()
 
             val secondsRot = seconds / 60.0f * 360.0f
             Matrix.setRotateM(handPositionMatrix, 0, secondsRot, 0f, 0f, 1f)
@@ -330,10 +291,10 @@
     }
 
     companion object {
-        /** Expected frame rate in interactive mode.  */
+        /** Expected frame rate in interactive mode. */
         private const val FPS: Long = 60
 
-        /** How long each frame is displayed at expected frame rate.  */
+        /** How long each frame is displayed at expected frame rate. */
         private const val FRAME_PERIOD_MS: Long = 1000 / FPS
 
         private fun checkGLError(op: String) {
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
index 5d59314..b102b22 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
@@ -57,17 +57,14 @@
 import kotlinx.coroutines.launch
 
 /**
- * Sample watch face using OpenGL. The watch face is rendered using
- * [Gles2ColoredTriangleList]s. The camera moves around in interactive mode and stops moving
- * when the watch enters ambient mode.
+ * Sample watch face using OpenGL. The watch face is rendered using [Gles2ColoredTriangleList]s. The
+ * camera moves around in interactive mode and stops moving when the watch enters ambient mode.
  *
  * NB this is open for testing.
  */
 open class ExampleOpenGLWatchFaceService : WatchFaceService() {
     // Lazy because the context isn't initialized till later.
-    private val watchFaceStyle by lazy {
-        WatchFaceColorStyle.create(this, "white_style")
-    }
+    private val watchFaceStyle by lazy { WatchFaceColorStyle.create(this, "white_style") }
 
     private val colorStyleSetting by lazy {
         ListUserStyleSetting(
@@ -76,50 +73,53 @@
             R.string.colors_style_setting,
             R.string.colors_style_setting_description,
             icon = null,
-            options = listOf(
-                ListUserStyleSetting.ListOption(
-                    Option.Id("red_style"),
-                    resources,
-                    R.string.colors_style_red,
-                    R.string.colors_style_red_screen_reader,
-                    Icon.createWithResource(this, R.drawable.red_style)
+            options =
+                listOf(
+                    ListUserStyleSetting.ListOption(
+                        Option.Id("red_style"),
+                        resources,
+                        R.string.colors_style_red,
+                        R.string.colors_style_red_screen_reader,
+                        Icon.createWithResource(this, R.drawable.red_style)
+                    ),
+                    ListUserStyleSetting.ListOption(
+                        Option.Id("green_style"),
+                        resources,
+                        R.string.colors_style_green,
+                        R.string.colors_style_green_screen_reader,
+                        Icon.createWithResource(this, R.drawable.green_style)
+                    )
                 ),
-                ListUserStyleSetting.ListOption(
-                    Option.Id("green_style"),
-                    resources,
-                    R.string.colors_style_green,
-                    R.string.colors_style_green_screen_reader,
-                    Icon.createWithResource(this, R.drawable.green_style)
-                )
-            ),
             listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
     }
 
-    private val complication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-        EXAMPLE_OPENGL_COMPLICATION_ID,
-        { watchState, listener ->
-            CanvasComplicationDrawable(
-                watchFaceStyle.getDrawable(this@ExampleOpenGLWatchFaceService)!!,
-                watchState,
-                listener
+    private val complication =
+        ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                EXAMPLE_OPENGL_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(
+                        watchFaceStyle.getDrawable(this@ExampleOpenGLWatchFaceService)!!,
+                        watchState,
+                        listener
+                    )
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.GOAL_PROGRESS,
+                    ComplicationType.WEIGHTED_ELEMENTS,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(
+                    SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                    ComplicationType.SHORT_TEXT
+                ),
+                ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
             )
-        },
-        listOf(
-            ComplicationType.RANGED_VALUE,
-            ComplicationType.GOAL_PROGRESS,
-            ComplicationType.WEIGHTED_ELEMENTS,
-            ComplicationType.LONG_TEXT,
-            ComplicationType.SHORT_TEXT,
-            ComplicationType.MONOCHROMATIC_IMAGE,
-            ComplicationType.SMALL_IMAGE
-        ),
-        DefaultComplicationDataSourcePolicy(
-            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
-            ComplicationType.SHORT_TEXT
-        ),
-        ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
-    ).build()
+            .build()
 
     public override fun createUserStyleSchema() = UserStyleSchema(listOf(colorStyleSetting))
 
@@ -132,29 +132,24 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.ANALOG,
-        ExampleOpenGLRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            colorStyleSetting,
-            complication
-        )
-    )
-        .setLegacyWatchFaceStyle(
-            WatchFace.LegacyWatchFaceOverlayStyle(
-                0,
-                Gravity.RIGHT or Gravity.TOP,
-                true
+    ) =
+        WatchFace(
+                WatchFaceType.ANALOG,
+                ExampleOpenGLRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    colorStyleSetting,
+                    complication
+                )
             )
-        )
-        .setComplicationDeniedDialogIntent(
-            Intent(this, ComplicationDeniedActivity::class.java)
-        )
-        .setComplicationRationaleDialogIntent(
-            Intent(this, ComplicationRationalActivity::class.java)
-        )
+            .setLegacyWatchFaceStyle(
+                WatchFace.LegacyWatchFaceOverlayStyle(0, Gravity.RIGHT or Gravity.TOP, true)
+            )
+            .setComplicationDeniedDialogIntent(Intent(this, ComplicationDeniedActivity::class.java))
+            .setComplicationRationaleDialogIntent(
+                Intent(this, ComplicationRationalActivity::class.java)
+            )
 
     @OptIn(WatchFaceExperimental::class)
     @Suppress("Deprecation")
@@ -165,14 +160,15 @@
         watchState: WatchState,
         private val colorStyleSetting: ListUserStyleSetting,
         private val complicationSlot: ComplicationSlot
-    ) : Renderer.GlesRenderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        FRAME_PERIOD_MS
-    ) {
+    ) :
+        Renderer.GlesRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            FRAME_PERIOD_MS
+        ) {
 
-        /** Projection transformation matrix. Converts from 3D to 2D.  */
+        /** Projection transformation matrix. Converts from 3D to 2D. */
         private val projectionMatrix = FloatArray(16)
 
         /**
@@ -181,7 +177,7 @@
          */
         private val viewMatrices = Array(numCameraAngles) { FloatArray(16) }
 
-        /** The view transformation matrix to use in ambient mode  */
+        /** The view transformation matrix to use in ambient mode */
         private val ambientViewMatrix = FloatArray(16)
 
         /**
@@ -190,34 +186,28 @@
          */
         private val modelMatrices = Array(360) { FloatArray(16) }
 
-        /**
-         * Products of [viewMatrices] and [projectionMatrix]. One matrix per camera
-         * position.
-         */
+        /** Products of [viewMatrices] and [projectionMatrix]. One matrix per camera position. */
         private val vpMatrices = Array(numCameraAngles) { FloatArray(16) }
 
-        /** The product of [ambientViewMatrix] and [projectionMatrix]  */
+        /** The product of [ambientViewMatrix] and [projectionMatrix] */
         private val ambientVpMatrix = FloatArray(16)
 
-        /**
-         * Product of [modelMatrices], [viewMatrices], and
-         * [projectionMatrix].
-         */
+        /** Product of [modelMatrices], [viewMatrices], and [projectionMatrix]. */
         private val mvpMatrix = FloatArray(16)
 
-        /** Triangles for the 4 major ticks. These are grouped together to speed up rendering.  */
+        /** Triangles for the 4 major ticks. These are grouped together to speed up rendering. */
         private lateinit var majorTickTriangles: Gles2ColoredTriangleList
 
-        /** Triangles for the 8 minor ticks. These are grouped together to speed up rendering.  */
+        /** Triangles for the 8 minor ticks. These are grouped together to speed up rendering. */
         private lateinit var minorTickTriangles: Gles2ColoredTriangleList
 
-        /** Triangle for the second hand.  */
+        /** Triangle for the second hand. */
         private lateinit var secondHandTriangleMap: Map<String, Gles2ColoredTriangleList>
 
-        /** Triangle for the minute hand.  */
+        /** Triangle for the minute hand. */
         private lateinit var minuteHandTriangle: Gles2ColoredTriangleList
 
-        /** Triangle for the hour hand.  */
+        /** Triangle for the hour hand. */
         private lateinit var hourHandTriangle: Gles2ColoredTriangleList
 
         private lateinit var complicationTexture: GlesTextureComplication
@@ -231,21 +221,22 @@
         init {
             CoroutineScope(Dispatchers.Main.immediate).launch {
                 currentUserStyleRepository.userStyle.collect { userStyle ->
-                    watchfaceColors = when (userStyle[colorStyleSetting]!!.toString()) {
-                        "red_style" -> WatchFaceColors(
-                            Color.valueOf(0.5f, 0.2f, 0.2f, 1f),
-                            Color.valueOf(0.4f, 0.15f, 0.15f, 1f),
-                            Color.valueOf(0.1f, 0.1f, 0.1f, 1f)
-                        )
-
-                        "green_style" -> WatchFaceColors(
-                            Color.valueOf(0.2f, 0.5f, 0.2f, 1f),
-                            Color.valueOf(0.15f, 0.4f, 0.15f, 1f),
-                            Color.valueOf(0.1f, 0.1f, 0.1f, 1f)
-                        )
-
-                        else -> null
-                    }
+                    watchfaceColors =
+                        when (userStyle[colorStyleSetting]!!.toString()) {
+                            "red_style" ->
+                                WatchFaceColors(
+                                    Color.valueOf(0.5f, 0.2f, 0.2f, 1f),
+                                    Color.valueOf(0.4f, 0.15f, 0.15f, 1f),
+                                    Color.valueOf(0.1f, 0.1f, 0.1f, 1f)
+                                )
+                            "green_style" ->
+                                WatchFaceColors(
+                                    Color.valueOf(0.2f, 0.5f, 0.2f, 1f),
+                                    Color.valueOf(0.15f, 0.4f, 0.15f, 1f),
+                                    Color.valueOf(0.1f, 0.1f, 0.1f, 1f)
+                                )
+                            else -> null
+                        }
                 }
             }
         }
@@ -260,71 +251,64 @@
 
             // Create program for drawing triangles.
             textureTriangleProgram = Gles2TexturedTriangleList.Program()
-            complicationTriangles = createComplicationQuad(
-                textureTriangleProgram,
-                -0.9f,
-                -0.1f,
-                0.6f,
-                0.6f
-            )
+            complicationTriangles =
+                createComplicationQuad(textureTriangleProgram, -0.9f, -0.1f, 0.6f, 0.6f)
 
-            complicationHighlightTriangles = createComplicationHighlightQuad(
-                coloredTriangleProgram,
-                -0.9f,
-                -0.1f,
-                0.6f,
-                0.6f
-            )
+            complicationHighlightTriangles =
+                createComplicationHighlightQuad(coloredTriangleProgram, -0.9f, -0.1f, 0.6f, 0.6f)
 
             // Create triangles for the hands.
-            secondHandTriangleMap = mapOf(
-                "red_style" to
-                    createHand(
-                        coloredTriangleProgram,
-                        0.02f /* width */,
-                        1.0f /* height */,
-                        floatArrayOf(
-                            1.0f /* red */,
-                            0.0f /* green */,
-                            0.0f /* blue */,
-                            1.0f /* alpha */
+            secondHandTriangleMap =
+                mapOf(
+                    "red_style" to
+                        createHand(
+                            coloredTriangleProgram,
+                            0.02f /* width */,
+                            1.0f /* height */,
+                            floatArrayOf(
+                                1.0f /* red */,
+                                0.0f /* green */,
+                                0.0f /* blue */,
+                                1.0f /* alpha */
+                            )
+                        ),
+                    "greenstyle" to
+                        createHand(
+                            coloredTriangleProgram,
+                            0.02f /* width */,
+                            1.0f /* height */,
+                            floatArrayOf(
+                                0.0f /* red */,
+                                1.0f /* green */,
+                                0.0f /* blue */,
+                                1.0f /* alpha */
+                            )
                         )
-                    ),
-                "greenstyle" to
-                    createHand(
-                        coloredTriangleProgram,
-                        0.02f /* width */,
-                        1.0f /* height */,
-                        floatArrayOf(
-                            0.0f /* red */,
-                            1.0f /* green */,
-                            0.0f /* blue */,
-                            1.0f /* alpha */
-                        )
+                )
+            minuteHandTriangle =
+                createHand(
+                    coloredTriangleProgram,
+                    0.06f /* width */,
+                    1f /* height */,
+                    floatArrayOf(
+                        0.7f /* red */,
+                        0.7f /* green */,
+                        0.7f /* blue */,
+                        1.0f /* alpha */
                     )
-            )
-            minuteHandTriangle = createHand(
-                coloredTriangleProgram,
-                0.06f /* width */,
-                1f /* height */,
-                floatArrayOf(
-                    0.7f /* red */,
-                    0.7f /* green */,
-                    0.7f /* blue */,
-                    1.0f /* alpha */
                 )
-            )
-            hourHandTriangle = createHand(
-                coloredTriangleProgram,
-                0.1f /* width */,
-                0.6f /* height */,
-                floatArrayOf(
-                    0.9f /* red */,
-                    0.9f /* green */,
-                    0.9f /* blue */,
-                    1.0f /* alpha */
+            hourHandTriangle =
+                createHand(
+                    coloredTriangleProgram,
+                    0.1f /* width */,
+                    0.6f /* height */,
+                    floatArrayOf(
+                        0.9f /* red */,
+                        0.9f /* green */,
+                        0.9f /* blue */,
+                        1.0f /* alpha */
+                    )
                 )
-            )
 
             // Precompute the clock angles.
             for (i in modelMatrices.indices) {
@@ -335,8 +319,7 @@
             for (i in 0 until numCameraAngles) {
                 // Set the camera position (View matrix). When active, move the eye around to show
                 // off that this is 3D.
-                val cameraAngle =
-                    (i.toFloat() / numCameraAngles * 2 * Math.PI).toFloat()
+                val cameraAngle = (i.toFloat() / numCameraAngles * 2 * Math.PI).toFloat()
                 val eyeX = Math.cos(cameraAngle.toDouble()).toFloat()
                 val eyeY = Math.sin(cameraAngle.toDouble()).toFloat()
                 Matrix.setLookAtM(
@@ -367,12 +350,8 @@
                 0f
             ) // up vector
 
-            complicationTexture = GlesTextureComplication(
-                complicationSlot,
-                128,
-                128,
-                GLES20.GL_TEXTURE_2D
-            )
+            complicationTexture =
+                GlesTextureComplication(complicationSlot, 128, 128, GLES20.GL_TEXTURE_2D)
         }
 
         override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
@@ -409,21 +388,12 @@
             width: Float,
             length: Float,
             color: FloatArray
-        ) = Gles2ColoredTriangleList(
-            program,
-            floatArrayOf(
-                0f,
-                length,
-                0f,
-                -width / 2,
-                0f,
-                0f,
-                width / 2,
-                0f,
-                0f
-            ),
-            color
-        )
+        ) =
+            Gles2ColoredTriangleList(
+                program,
+                floatArrayOf(0f, length, 0f, -width / 2, 0f, 0f, width / 2, 0f, 0f),
+                color
+            )
 
         /**
          * Creates a triangle list for the major ticks on the watch face.
@@ -437,22 +407,12 @@
             val trianglesCoords = FloatArray(9 * 4)
             for (i in 0..3) {
                 val triangleCoords = getMajorTickTriangleCoords(i)
-                System.arraycopy(
-                    triangleCoords,
-                    0,
-                    trianglesCoords,
-                    i * 9,
-                    triangleCoords.size
-                )
+                System.arraycopy(triangleCoords, 0, trianglesCoords, i * 9, triangleCoords.size)
             }
             return Gles2ColoredTriangleList(
-                program, trianglesCoords,
-                floatArrayOf(
-                    1.0f /* red */,
-                    1.0f /* green */,
-                    1.0f /* blue */,
-                    1.0f /* alpha */
-                )
+                program,
+                trianglesCoords,
+                floatArrayOf(1.0f /* red */, 1.0f /* green */, 1.0f /* blue */, 1.0f /* alpha */)
             )
         }
 
@@ -473,137 +433,94 @@
                     continue
                 }
                 val triangleCoords = getMinorTickTriangleCoords(i)
-                System.arraycopy(
-                    triangleCoords,
-                    0,
-                    trianglesCoords,
-                    index,
-                    triangleCoords.size
-                )
+                System.arraycopy(triangleCoords, 0, trianglesCoords, index, triangleCoords.size)
                 index += 9
             }
             return Gles2ColoredTriangleList(
-                program, trianglesCoords,
-                floatArrayOf(
-                    0.5f /* red */,
-                    0.5f /* green */,
-                    0.5f /* blue */,
-                    1.0f /* alpha */
-                )
+                program,
+                trianglesCoords,
+                floatArrayOf(0.5f /* red */, 0.5f /* green */, 0.5f /* blue */, 1.0f /* alpha */)
             )
         }
 
-        /**
-         * Creates a triangle list for the complication.
-         */
+        /** Creates a triangle list for the complication. */
         private fun createComplicationQuad(
             program: Gles2TexturedTriangleList.Program,
             left: Float,
             top: Float,
             width: Float,
             height: Float
-        ) = Gles2TexturedTriangleList(
-            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,
-                1.0f,
-
-                1.0f,
-                0.0f,
-
-                0.0f,
-                1.0f,
-
-                1.0f,
-                0.0f,
-
-                0.0f,
-                1.0f,
-
-                0.0f,
-                0.0f
+        ) =
+            Gles2TexturedTriangleList(
+                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, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f)
             )
-        )
 
-        /**
-         * Creates a triangle list for the complication highlight quad.
-         */
+        /** 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 */
+        ) =
+            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 */,
+                0.03f /* width */,
+                0.09f /* length */,
                 index * 360 / 4 /* angleDegrees */
             )
         }
 
         private fun getMinorTickTriangleCoords(index: Int): FloatArray {
             return getTickTriangleCoords(
-                0.02f /* width */, 0.06f /* length */,
+                0.02f /* width */,
+                0.06f /* length */,
                 index * 360 / 12 /* angleDegrees */
             )
         }
@@ -614,17 +531,8 @@
             angleDegrees: Int
         ): FloatArray {
             // Create the data for the VBO.
-            val coords = floatArrayOf(
-                0f,
-                1f,
-                0f,
-                width / 2,
-                length + 1,
-                0f,
-                -width / 2,
-                length + 1,
-                0f
-            )
+            val coords =
+                floatArrayOf(0f, 1f, 0f, width / 2, length + 1, 0f, -width / 2, length + 1, 0f)
             rotateCoords(coords, angleDegrees)
             return coords
         }
@@ -635,12 +543,9 @@
          *
          * @param coords flattened 3D coordinates
          * @param angleDegrees angle in degrees clockwise when viewed from negative infinity on the
-         * Z axis
+         *   Z axis
          */
-        private fun rotateCoords(
-            coords: FloatArray,
-            angleDegrees: Int
-        ) {
+        private fun rotateCoords(coords: FloatArray, angleDegrees: Int) {
             val angleRadians = Math.toRadians(angleDegrees.toDouble())
             val cos = cos(angleRadians)
             val sin = sin(angleRadians)
@@ -655,22 +560,28 @@
         }
 
         override fun render(zonedDateTime: ZonedDateTime) {
-            // Draw background color and select the appropriate view projection matrix. The background
-            // should always be black in ambient mode. The view projection matrix used is overhead in
+            // Draw background color and select the appropriate view projection matrix. The
+            // background
+            // should always be black in ambient mode. The view projection matrix used is overhead
+            // in
             // ambient. In interactive mode, it's tilted depending on the current time.
-            val vpMatrix = if (renderParameters.drawMode == DrawMode.AMBIENT) {
-                GLES20.glClearColor(0f, 0f, 0f, 1f)
-                ambientVpMatrix
-            } else {
-                when (currentUserStyleRepository.userStyle.value[colorStyleSetting]!!.toString()) {
-                    "red_style" -> GLES20.glClearColor(0.5f, 0.2f, 0.2f, 1f)
-                    "green_style" -> GLES20.glClearColor(0.2f, 0.5f, 0.2f, 1f)
+            val vpMatrix =
+                if (renderParameters.drawMode == DrawMode.AMBIENT) {
+                    GLES20.glClearColor(0f, 0f, 0f, 1f)
+                    ambientVpMatrix
+                } else {
+                    when (
+                        currentUserStyleRepository.userStyle.value[colorStyleSetting]!!.toString()
+                    ) {
+                        "red_style" -> GLES20.glClearColor(0.5f, 0.2f, 0.2f, 1f)
+                        "green_style" -> GLES20.glClearColor(0.2f, 0.5f, 0.2f, 1f)
+                    }
+                    val cameraIndex =
+                        (zonedDateTime.toInstant().toEpochMilli() / FRAME_PERIOD_MS %
+                                numCameraAngles)
+                            .toInt()
+                    vpMatrices[cameraIndex]
                 }
-                val cameraIndex =
-                    (zonedDateTime.toInstant().toEpochMilli() / FRAME_PERIOD_MS % numCameraAngles)
-                        .toInt()
-                vpMatrices[cameraIndex]
-            }
             GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
 
             // Draw the complication first.
@@ -700,38 +611,18 @@
 
             // Render hands.
             if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS_OVERLAY)) {
-                Matrix.multiplyMM(
-                    mvpMatrix,
-                    0,
-                    vpMatrix,
-                    0,
-                    modelMatrices[hoursIndex],
-                    0
-                )
+                Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, modelMatrices[hoursIndex], 0)
                 hourHandTriangle.draw(mvpMatrix)
 
-                Matrix.multiplyMM(
-                    mvpMatrix,
-                    0,
-                    vpMatrix,
-                    0,
-                    modelMatrices[minIndex],
-                    0
-                )
+                Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, modelMatrices[minIndex], 0)
                 minuteHandTriangle.draw(mvpMatrix)
 
                 if (renderParameters.drawMode != DrawMode.AMBIENT) {
-                    Matrix.multiplyMM(
-                        mvpMatrix,
-                        0,
-                        vpMatrix,
-                        0,
-                        modelMatrices[secIndex],
-                        0
-                    )
+                    Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, modelMatrices[secIndex], 0)
                     secondHandTriangleMap[
-                        currentUserStyleRepository.userStyle.value[colorStyleSetting]!!.toString()
-                    ]?.draw(mvpMatrix)
+                            currentUserStyleRepository.userStyle.value[colorStyleSetting]!!
+                                .toString()]
+                        ?.draw(mvpMatrix)
                 }
             }
 
@@ -744,8 +635,8 @@
 
         override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
             val cameraIndex =
-                (zonedDateTime.toInstant()
-                    .toEpochMilli() / FRAME_PERIOD_MS % numCameraAngles).toInt()
+                (zonedDateTime.toInstant().toEpochMilli() / FRAME_PERIOD_MS % numCameraAngles)
+                    .toInt()
             val vpMatrix = vpMatrices[cameraIndex]
 
             val highlightLayer = renderParameters.highlightLayer!!
@@ -767,16 +658,16 @@
     }
 
     companion object {
-        /** Expected frame rate in interactive mode.  */
+        /** Expected frame rate in interactive mode. */
         private const val FPS: Long = 60
 
-        /** Z distance from the camera to the watchface.  */
+        /** Z distance from the camera to the watchface. */
         private const val EYE_Z = -2.3f
 
-        /** How long each frame is displayed at expected frame rate.  */
+        /** How long each frame is displayed at expected frame rate. */
         private const val FRAME_PERIOD_MS: Long = 1000 / FPS
 
-        /** Cycle time before the camera motion repeats.  */
+        /** Cycle time before the camera motion repeats. */
         private const val CYCLE_PERIOD_SECONDS: Long = 5
 
         /** Number of camera angles to precompute. */
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2ColoredTriangleList.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2ColoredTriangleList.kt
index 21dcca8..bf3409c 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2ColoredTriangleList.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2ColoredTriangleList.kt
@@ -24,9 +24,7 @@
 import java.nio.ByteOrder
 import java.nio.FloatBuffer
 
-/**
- * A list of triangles drawn in a single solid color using OpenGL ES 2.0.
- */
+/** A list of triangles drawn in a single solid color using OpenGL ES 2.0. */
 internal class Gles2ColoredTriangleList(
     private val program: Program,
     triangleCoords: FloatArray,
@@ -39,16 +37,17 @@
         require(color.size == NUM_COLOR_COMPONENTS) { "wrong number of color components" }
     }
 
-    /** The VBO containing the vertex coordinates.  */
+    /** The VBO containing the vertex coordinates. */
     private val vertexBuffer =
         ByteBuffer.allocateDirect(triangleCoords.size * BYTES_PER_FLOAT)
             .apply { order(ByteOrder.nativeOrder()) }
-            .asFloatBuffer().apply {
+            .asFloatBuffer()
+            .apply {
                 put(triangleCoords)
                 position(0)
             }
 
-    /** Number of coordinates in this triangle list.  */
+    /** Number of coordinates in this triangle list. */
     private val numCoords = triangleCoords.size / COORDS_PER_VERTEX
 
     /**
@@ -62,46 +61,46 @@
 
         // Draw the triangle list.
         GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numCoords)
-        if (CHECK_GL_ERRORS) checkGlError(
-            "glDrawArrays"
-        )
+        if (CHECK_GL_ERRORS) checkGlError("glDrawArrays")
     }
 
-    /** OpenGL shaders for drawing solid colored triangle lists.  */
+    /** OpenGL shaders for drawing solid colored triangle lists. */
     class Program {
-        /** ID OpenGL uses to identify this program.  */
+        /** ID OpenGL uses to identify this program. */
         private val programId: Int
 
-        /** Handle for uMvpMatrix uniform in vertex shader.  */
+        /** Handle for uMvpMatrix uniform in vertex shader. */
         private val mvpMatrixHandle: Int
 
-        /** Handle for aPosition attribute in vertex shader.  */
+        /** Handle for aPosition attribute in vertex shader. */
         private val positionHandle: Int
 
-        /** Handle for uColor uniform in fragment shader.  */
+        /** Handle for uColor uniform in fragment shader. */
         private val colorHandle: Int
 
         companion object {
-            /** Trivial vertex shader that transforms the input vertex by the MVP matrix.  */
-            private const val VERTEX_SHADER_CODE = "" +
-                "uniform mat4 uMvpMatrix;\n" +
-                "attribute vec4 aPosition;\n" +
-                "void main() {\n" +
-                "    gl_Position = uMvpMatrix * aPosition;\n" +
-                "}\n"
+            /** Trivial vertex shader that transforms the input vertex by the MVP matrix. */
+            private const val VERTEX_SHADER_CODE =
+                "" +
+                    "uniform mat4 uMvpMatrix;\n" +
+                    "attribute vec4 aPosition;\n" +
+                    "void main() {\n" +
+                    "    gl_Position = uMvpMatrix * aPosition;\n" +
+                    "}\n"
 
-            /** Trivial fragment shader that draws with a fixed color.  */
-            private const val FRAGMENT_SHADER_CODE = "" +
-                "precision mediump float;\n" +
-                "uniform vec4 uColor;\n" +
-                "void main() {\n" +
-                "    gl_FragColor = uColor;\n" +
-                "}\n"
+            /** Trivial fragment shader that draws with a fixed color. */
+            private const val FRAGMENT_SHADER_CODE =
+                "" +
+                    "precision mediump float;\n" +
+                    "uniform vec4 uColor;\n" +
+                    "void main() {\n" +
+                    "    gl_FragColor = uColor;\n" +
+                    "}\n"
         }
 
         /**
-         * Tells OpenGL to use this program. Call this method before drawing a sequence of
-         * triangle lists.
+         * Tells OpenGL to use this program. Call this method before drawing a sequence of triangle
+         * lists.
          */
         fun bindProgramAndAttribs() {
             GLES20.glUseProgram(programId)
@@ -123,16 +122,15 @@
             }
         }
 
-        /** Sends the given MVP matrix, vertex data, and color to OpenGL.  */
-        fun bind(
-            mvpMatrix: FloatArray?,
-            vertexBuffer: FloatBuffer?,
-            color: FloatArray?
-        ) {
+        /** Sends the given MVP matrix, vertex data, and color to OpenGL. */
+        fun bind(mvpMatrix: FloatArray?, vertexBuffer: FloatBuffer?, color: FloatArray?) {
             // Pass the MVP matrix to OpenGL.
             GLES20.glUniformMatrix4fv(
-                mvpMatrixHandle, 1 /* count */, false /* transpose */,
-                mvpMatrix, 0 /* offset */
+                mvpMatrixHandle,
+                1 /* count */,
+                false /* transpose */,
+                mvpMatrix,
+                0 /* offset */
             )
             if (CHECK_GL_ERRORS) {
                 checkGlError("glUniformMatrix4fv")
@@ -168,20 +166,12 @@
          */
         init {
             // Prepare shaders.
-            val vertexShader = loadShader(
-                GLES20.GL_VERTEX_SHADER,
-                VERTEX_SHADER_CODE
-            )
-            val fragmentShader = loadShader(
-                GLES20.GL_FRAGMENT_SHADER,
-                FRAGMENT_SHADER_CODE
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCreateProgram")
             check(programId != 0) { "glCreateProgram failed" }
 
             // Add the shaders to the program.
@@ -223,43 +213,42 @@
     companion object {
         private const val TAG = "GlColoredTriangleList"
 
-        /** Whether to check for GL errors. This is slow, so not appropriate for production builds.  */
+        /**
+         * Whether to check for GL errors. This is slow, so not appropriate for production builds.
+         */
         private const val CHECK_GL_ERRORS = false
 
-        /** Number of coordinates per vertex in this array: one for each of x, y, and z.  */
+        /** 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 bytes to store a float in GL.  */
+        /** Number of bytes to store a float in GL. */
         const val BYTES_PER_FLOAT = 4
 
-        /** Number of bytes per vertex.  */
+        /** Number of bytes per vertex. */
         private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT
 
-        /** Triangles have three vertices.  */
+        /** Triangles have three vertices. */
         private const val VERTICES_PER_TRIANGLE = 3
 
         /**
          * Number of components in an OpenGL color. The components are:
-         *  1. red
-         *  1. green
-         *  1. blue
-         *  1. alpha
-         *
+         * 1. red
+         * 1. green
+         * 1. blue
+         * 1. alpha
          */
         private const val NUM_COLOR_COMPONENTS = 4
 
         /**
          * 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:
-         *
+         * 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
@@ -272,8 +261,11 @@
                     errorString = GLUtils.getEGLErrorString(error)
                 }
                 val message =
-                    glOperation + " caused GL error 0x" + Integer.toHexString(error) +
-                        ": " + errorString
+                    glOperation +
+                        " caused GL error 0x" +
+                        Integer.toHexString(error) +
+                        ": " +
+                        errorString
                 Log.e(TAG, message)
                 throw RuntimeException(message)
             }
@@ -289,20 +281,14 @@
         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"
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glShaderSource")
             GLES20.glCompileShader(shader)
-            if (CHECK_GL_ERRORS) checkGlError(
-                "glCompileShader"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCompileShader")
             return shader
         }
     }
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2TexturedTriangleList.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2TexturedTriangleList.kt
index 0161406..f7ba47c 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2TexturedTriangleList.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Gles2TexturedTriangleList.kt
@@ -24,9 +24,7 @@
 import java.nio.ByteOrder
 import java.nio.FloatBuffer
 
-/**
- * A list of triangles drawn with a texture using OpenGL ES 2.0.
- */
+/** A list of triangles drawn with a texture using OpenGL ES 2.0. */
 internal class Gles2TexturedTriangleList(
     private val program: Program,
     triangleCoords: FloatArray,
@@ -37,10 +35,8 @@
             ("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"
-                )
+            ("must be multiple of VERTICES_PER_TRIANGLE * NUM_TEXTURE_COMPONENTS texture " +
+                "coordinates")
         }
     }
 
@@ -48,7 +44,8 @@
     private val vertexBuffer =
         ByteBuffer.allocateDirect(triangleCoords.size * BYTES_PER_FLOAT)
             .apply { order(ByteOrder.nativeOrder()) }
-            .asFloatBuffer().apply {
+            .asFloatBuffer()
+            .apply {
                 put(triangleCoords)
                 position(0)
             }
@@ -57,12 +54,13 @@
     private val textureCoordsBuffer =
         ByteBuffer.allocateDirect(textureCoords.size * BYTES_PER_FLOAT)
             .apply { order(ByteOrder.nativeOrder()) }
-            .asFloatBuffer().apply {
+            .asFloatBuffer()
+            .apply {
                 put(textureCoords)
                 position(0)
             }
 
-    /** Number of coordinates in this triangle list.  */
+    /** Number of coordinates in this triangle list. */
     private val numCoords = triangleCoords.size / COORDS_PER_VERTEX
 
     /**
@@ -76,49 +74,49 @@
 
         // Draw the triangle list.
         GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numCoords)
-        if (CHECK_GL_ERRORS) checkGlError(
-            "glDrawArrays"
-        )
+        if (CHECK_GL_ERRORS) checkGlError("glDrawArrays")
     }
 
-    /** OpenGL shaders for drawing textured triangle lists.  */
+    /** OpenGL shaders for drawing textured triangle lists. */
     class Program {
-        /** ID OpenGL uses to identify this program.  */
+        /** ID OpenGL uses to identify this program. */
         private val programId: Int
 
-        /** Handle for uMvpMatrix uniform in vertex shader.  */
+        /** Handle for uMvpMatrix uniform in vertex shader. */
         private val mvpMatrixHandle: Int
 
-        /** Handle for aPosition attribute in vertex shader.  */
+        /** Handle for aPosition attribute in vertex shader. */
         private val positionHandle: Int
 
-        /** Handle for aTextureCoordinate uniform in fragment shader.  */
+        /** Handle for aTextureCoordinate uniform in fragment shader. */
         private val textureCoordinateHandle: Int
 
         companion object {
-            /** Trivial vertex shader that transforms the input vertex by the MVP matrix.  */
-            private const val VERTEX_SHADER_CODE = "" +
-                "uniform mat4 uMvpMatrix;\n" +
-                "attribute vec4 aPosition;\n" +
-                "attribute vec4 aTextureCoordinate;\n" +
-                "varying vec2 textureCoordinate;\n" +
-                "void main() {\n" +
-                "    gl_Position = uMvpMatrix * aPosition;\n" +
-                "    textureCoordinate = aTextureCoordinate.xy;" +
-                "}\n"
+            /** Trivial vertex shader that transforms the input vertex by the MVP matrix. */
+            private const val VERTEX_SHADER_CODE =
+                "" +
+                    "uniform mat4 uMvpMatrix;\n" +
+                    "attribute vec4 aPosition;\n" +
+                    "attribute vec4 aTextureCoordinate;\n" +
+                    "varying vec2 textureCoordinate;\n" +
+                    "void main() {\n" +
+                    "    gl_Position = uMvpMatrix * aPosition;\n" +
+                    "    textureCoordinate = aTextureCoordinate.xy;" +
+                    "}\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"
+            /** 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.
+         * Tells OpenGL to use this program. Call this method before drawing a sequence of triangle
+         * lists.
          */
         fun bindProgramAndAttribs() {
             GLES20.glUseProgram(programId)
@@ -157,7 +155,7 @@
             }
         }
 
-        /** Sends the given MVP matrix, vertex data, and color to OpenGL.  */
+        /** Sends the given MVP matrix, vertex data, and color to OpenGL. */
         fun bind(
             mvpMatrix: FloatArray?,
             vertexBuffer: FloatBuffer?,
@@ -165,8 +163,11 @@
         ) {
             // Pass the MVP matrix to OpenGL.
             GLES20.glUniformMatrix4fv(
-                mvpMatrixHandle, 1 /* count */, false /* transpose */,
-                mvpMatrix, 0 /* offset */
+                mvpMatrixHandle,
+                1 /* count */,
+                false /* transpose */,
+                mvpMatrix,
+                0 /* offset */
             )
             if (CHECK_GL_ERRORS) {
                 checkGlError("glUniformMatrix4fv")
@@ -205,20 +206,12 @@
          */
         init {
             // Prepare shaders.
-            val vertexShader = loadShader(
-                GLES20.GL_VERTEX_SHADER,
-                VERTEX_SHADER_CODE
-            )
-            val fragmentShader = loadShader(
-                GLES20.GL_FRAGMENT_SHADER,
-                FRAGMENT_SHADER_CODE
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCreateProgram")
             check(programId != 0) { "glCreateProgram failed" }
 
             // Add the shaders to the program.
@@ -250,8 +243,7 @@
             }
 
             // Get a handle to vertex shader's aUV attribute.
-            textureCoordinateHandle =
-                GLES20.glGetAttribLocation(programId, "aTextureCoordinate")
+            textureCoordinateHandle = GLES20.glGetAttribLocation(programId, "aTextureCoordinate")
             if (CHECK_GL_ERRORS) {
                 checkGlError("glGetAttribLocation")
             }
@@ -272,21 +264,20 @@
          */
         private const val CHECK_GL_ERRORS = false
 
-        /** Number of coordinates per vertex in this array: one for each of x, y, and z.  */
+        /** 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.  */
+        /** Number of bytes to store a float in GL. */
         const val BYTES_PER_FLOAT = 4
 
-        /** Number of bytes per vertex.  */
+        /** 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
+        /** 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
@@ -295,14 +286,12 @@
          * 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
@@ -315,8 +304,11 @@
                     errorString = GLUtils.getEGLErrorString(error)
                 }
                 val message =
-                    glOperation + " caused GL error 0x" + Integer.toHexString(error) +
-                        ": " + errorString
+                    glOperation +
+                        " caused GL error 0x" +
+                        Integer.toHexString(error) +
+                        ": " +
+                        errorString
                 Log.e(TAG, message)
                 throw RuntimeException(message)
             }
@@ -332,20 +324,14 @@
         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"
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glShaderSource")
             GLES20.glCompileShader(shader)
-            if (CHECK_GL_ERRORS) checkGlError(
-                "glCompileShader"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCompileShader")
             return shader
         }
     }
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
index 622c224..acb1d98 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
@@ -71,29 +71,30 @@
                         R.string.colors_style_setting,
                         R.string.colors_style_setting_description,
                         icon = null,
-                        options = listOf(
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(RED_STYLE),
-                                resources,
-                                R.string.colors_style_red,
-                                R.string.colors_style_red_screen_reader,
-                                icon = null
+                        options =
+                            listOf(
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(RED_STYLE),
+                                    resources,
+                                    R.string.colors_style_red,
+                                    R.string.colors_style_red_screen_reader,
+                                    icon = null
+                                ),
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(GREEN_STYLE),
+                                    resources,
+                                    R.string.colors_style_green,
+                                    R.string.colors_style_green_screen_reader,
+                                    icon = null
+                                ),
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(BLUE_STYLE),
+                                    resources,
+                                    R.string.colors_style_blue,
+                                    R.string.colors_style_blue_screen_reader,
+                                    icon = null
+                                )
                             ),
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(GREEN_STYLE),
-                                resources,
-                                R.string.colors_style_green,
-                                R.string.colors_style_green_screen_reader,
-                                icon = null
-                            ),
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(BLUE_STYLE),
-                                resources,
-                                R.string.colors_style_blue,
-                                R.string.colors_style_blue_screen_reader,
-                                icon = null
-                            )
-                        ),
                         listOf(
                             WatchFaceLayer.BASE,
                             WatchFaceLayer.COMPLICATIONS,
@@ -106,29 +107,30 @@
                         R.string.hand_style_setting,
                         R.string.hand_style_setting_description,
                         icon = null,
-                        options = listOf(
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(CLASSIC_STYLE),
-                                resources,
-                                R.string.hand_style_classic,
-                                R.string.hand_style_classic_screen_reader,
-                                icon = null
+                        options =
+                            listOf(
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(CLASSIC_STYLE),
+                                    resources,
+                                    R.string.hand_style_classic,
+                                    R.string.hand_style_classic_screen_reader,
+                                    icon = null
+                                ),
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(MODERN_STYLE),
+                                    resources,
+                                    R.string.hand_style_modern,
+                                    R.string.hand_style_modern_screen_reader,
+                                    icon = null
+                                ),
+                                ListUserStyleSetting.ListOption(
+                                    Option.Id(GOTHIC_STYLE),
+                                    resources,
+                                    R.string.hand_style_gothic,
+                                    R.string.hand_style_gothic_screen_reader,
+                                    icon = null
+                                )
                             ),
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(MODERN_STYLE),
-                                resources,
-                                R.string.hand_style_modern,
-                                R.string.hand_style_modern_screen_reader,
-                                icon = null
-                            ),
-                            ListUserStyleSetting.ListOption(
-                                Option.Id(GOTHIC_STYLE),
-                                resources,
-                                R.string.hand_style_gothic,
-                                R.string.hand_style_gothic_screen_reader,
-                                icon = null
-                            )
-                        ),
                         listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
                     )
                 )
@@ -137,52 +139,52 @@
         override fun createComplicationSlotsManager(
             currentUserStyleRepository: CurrentUserStyleRepository
         ): ComplicationSlotsManager {
-            val canvasComplicationFactory =
-                CanvasComplicationFactory { watchState, listener ->
-                    CanvasComplicationDrawable(ComplicationDrawable(this), watchState, listener)
-                }
+            val canvasComplicationFactory = CanvasComplicationFactory { watchState, listener ->
+                CanvasComplicationDrawable(ComplicationDrawable(this), watchState, listener)
+            }
             return ComplicationSlotsManager(
                 listOf(
                     ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                        /*id */ 0,
-                        canvasComplicationFactory,
-                        listOf(
-                            ComplicationType.RANGED_VALUE,
-                            ComplicationType.LONG_TEXT,
-                            ComplicationType.SHORT_TEXT,
-                            ComplicationType.MONOCHROMATIC_IMAGE,
-                            ComplicationType.SMALL_IMAGE
-                        ),
-                        DefaultComplicationDataSourcePolicy(
-                            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
-                            ComplicationType.SHORT_TEXT
-                        ),
-                        ComplicationSlotBounds(RectF(0.15625f, 0.1875f, 0.84375f, 0.3125f))
-                    ).build(),
+                            /*id */ 0,
+                            canvasComplicationFactory,
+                            listOf(
+                                ComplicationType.RANGED_VALUE,
+                                ComplicationType.LONG_TEXT,
+                                ComplicationType.SHORT_TEXT,
+                                ComplicationType.MONOCHROMATIC_IMAGE,
+                                ComplicationType.SMALL_IMAGE
+                            ),
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK,
+                                ComplicationType.SHORT_TEXT
+                            ),
+                            ComplicationSlotBounds(RectF(0.15625f, 0.1875f, 0.84375f, 0.3125f))
+                        )
+                        .build(),
                     ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                        /*id */ 1,
-                        canvasComplicationFactory,
-                        listOf(
-                            ComplicationType.RANGED_VALUE,
-                            ComplicationType.LONG_TEXT,
-                            ComplicationType.SHORT_TEXT,
-                            ComplicationType.MONOCHROMATIC_IMAGE,
-                            ComplicationType.SMALL_IMAGE
-                        ),
-                        DefaultComplicationDataSourcePolicy(
-                            SystemDataSources.DATA_SOURCE_STEP_COUNT,
-                            ComplicationType.SHORT_TEXT
-                        ),
-                        ComplicationSlotBounds(RectF(0.1f, 0.5625f, 0.35f, 0.8125f))
-                    ).build()
+                            /*id */ 1,
+                            canvasComplicationFactory,
+                            listOf(
+                                ComplicationType.RANGED_VALUE,
+                                ComplicationType.LONG_TEXT,
+                                ComplicationType.SHORT_TEXT,
+                                ComplicationType.MONOCHROMATIC_IMAGE,
+                                ComplicationType.SMALL_IMAGE
+                            ),
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_STEP_COUNT,
+                                ComplicationType.SHORT_TEXT
+                            ),
+                            ComplicationSlotBounds(RectF(0.1f, 0.5625f, 0.35f, 0.8125f))
+                        )
+                        .build()
                 ),
                 currentUserStyleRepository
             )
         }
 
         inner class MySharedAssets : Renderer.SharedAssets {
-            override fun onDestroy() {
-            }
+            override fun onDestroy() {}
         }
 
         override suspend fun createWatchFace(
@@ -190,52 +192,54 @@
             watchState: WatchState,
             complicationSlotsManager: ComplicationSlotsManager,
             currentUserStyleRepository: CurrentUserStyleRepository
-        ) = WatchFace(
-            WatchFaceType.ANALOG,
-            object : Renderer.CanvasRenderer2<MySharedAssets>(
-                surfaceHolder,
-                currentUserStyleRepository,
-                watchState,
-                CanvasType.HARDWARE,
-                interactiveDrawModeUpdateDelayMillis = 16,
-                clearWithBackgroundTintBeforeRenderingHighlightLayer = true
-            ) {
-                init {
-                    // Listen for user style changes.
-                    CoroutineScope(Dispatchers.Main.immediate).launch {
-                        currentUserStyleRepository.userStyle.collect {
-                            // `userStyle` will contain two userStyle categories with options
-                            // from the lists above. ..
+        ) =
+            WatchFace(
+                WatchFaceType.ANALOG,
+                object :
+                    Renderer.CanvasRenderer2<MySharedAssets>(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        CanvasType.HARDWARE,
+                        interactiveDrawModeUpdateDelayMillis = 16,
+                        clearWithBackgroundTintBeforeRenderingHighlightLayer = true
+                    ) {
+                    init {
+                        // Listen for user style changes.
+                        CoroutineScope(Dispatchers.Main.immediate).launch {
+                            currentUserStyleRepository.userStyle.collect {
+                                // `userStyle` will contain two userStyle categories with options
+                                // from the lists above. ..
+                            }
                         }
                     }
-                }
 
-                override fun render(
-                    canvas: Canvas,
-                    bounds: Rect,
-                    zonedDateTime: ZonedDateTime,
-                    sharedAssets: MySharedAssets
-                ) {
-                    // ...
-                }
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime,
+                        sharedAssets: MySharedAssets
+                    ) {
+                        // ...
+                    }
 
-                override fun renderHighlightLayer(
-                    canvas: Canvas,
-                    bounds: Rect,
-                    zonedDateTime: ZonedDateTime,
-                    sharedAssets: MySharedAssets
-                ) {
-                    canvas.drawColor(renderParameters.highlightLayer!!.backgroundTint)
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime,
+                        sharedAssets: MySharedAssets
+                    ) {
+                        canvas.drawColor(renderParameters.highlightLayer!!.backgroundTint)
 
-                    // ...
-                }
+                        // ...
+                    }
 
-                override suspend fun createSharedAssets(): MySharedAssets {
-                    // Insert resource loading here.
-                    return MySharedAssets()
+                    override suspend fun createSharedAssets(): MySharedAssets {
+                        // Insert resource loading here.
+                        return MySharedAssets()
+                    }
                 }
-            }
-        )
+            )
     }
 
     return ExampleCanvasWatchFaceService()
diff --git a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Style.kt b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Style.kt
index c0c0d0e..f7c983c 100644
--- a/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Style.kt
+++ b/wear/watchface/watchface/samples/src/main/java/androidx/wear/watchface/samples/Style.kt
@@ -25,22 +25,12 @@
     attributeId: Int,
     defaultResourceId: Int
 ): Int {
-    val styleArray = obtainStyledAttributes(
-        styleResourceId,
-        intArrayOf(attributeId)
-    )
+    val styleArray = obtainStyledAttributes(styleResourceId, intArrayOf(attributeId))
     return styleArray.getResourceId(0, defaultResourceId).also { styleArray.recycle() }
 }
 
-private fun Context.getStyleColor(
-    styleResourceId: Int,
-    attributeId: Int,
-    defaultColor: Int
-): Int {
-    val colorArray = obtainStyledAttributes(
-        styleResourceId,
-        intArrayOf(attributeId)
-    )
+private fun Context.getStyleColor(styleResourceId: Int, attributeId: Int, defaultColor: Int): Int {
+    val colorArray = obtainStyledAttributes(styleResourceId, intArrayOf(attributeId))
     return colorArray.getColor(0, defaultColor).also { colorArray.recycle() }
 }
 
@@ -81,7 +71,9 @@
             val styleResourceId =
                 context.resources.getIdentifier(styleName, "style", context.packageName)
             return context.getStyleResourceId(
-                styleResourceId, R.attr.complication, R.drawable.complication_green_style
+                styleResourceId,
+                R.attr.complication,
+                R.drawable.complication_green_style
             )
         }
     }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/ComplicationHelperActivityTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/ComplicationHelperActivityTest.kt
index db2ad24..bade28d 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/ComplicationHelperActivityTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/ComplicationHelperActivityTest.kt
@@ -29,13 +29,13 @@
 import androidx.wear.watchface.complications.data.ComplicationType.MONOCHROMATIC_IMAGE
 import androidx.wear.watchface.complications.data.ComplicationType.SHORT_TEXT
 import com.google.common.truth.Truth.assertThat
-import org.junit.Test
 import com.nhaarman.mockitokotlin2.doReturn
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.never
 import com.nhaarman.mockitokotlin2.verify
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import org.junit.Test
 import org.junit.runner.RunWith
 
 const val TIME_OUT_MILLIS = 500L
@@ -45,12 +45,12 @@
 public class ComplicationHelperActivityTest {
     private val mainThreadHandler = Handler(Looper.getMainLooper())
 
-    private val scenarios = mapOf(
-        ComplicationHelperActivity.PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER to createIntent(),
-
-        ComplicationHelperActivity.PERMISSION_REQUEST_CODE_REQUEST_ONLY to
-            createPermissionOnlyIntent()
-    )
+    private val scenarios =
+        mapOf(
+            ComplicationHelperActivity.PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER to createIntent(),
+            ComplicationHelperActivity.PERMISSION_REQUEST_CODE_REQUEST_ONLY to
+                createPermissionOnlyIntent()
+        )
 
     @Test
     public fun createProviderChooserHelperIntent_action() {
@@ -99,9 +99,10 @@
     @Test
     public fun instanceId() {
         assertThat(
-            createIntent(instanceId = "ID-1")
-                .getStringExtra(ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID)
-        ).isEqualTo("ID-1")
+                createIntent(instanceId = "ID-1")
+                    .getStringExtra(ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID)
+            )
+            .isEqualTo("ID-1")
     }
 
     fun runOnMainThread(task: () -> Unit) {
@@ -119,9 +120,8 @@
             scenarios.forEach { (_, intent) ->
                 val helper = ComplicationHelperActivity()
                 helper.intent = intent
-                helper.mDelegate = mock() {
-                    on { shouldShowRequestPermissionRationale() } doReturn true
-                }
+                helper.mDelegate =
+                    mock() { on { shouldShowRequestPermissionRationale() } doReturn true }
 
                 helper.start(true)
                 verify(helper.mDelegate).launchComplicationRationaleActivity()
@@ -135,9 +135,8 @@
             scenarios.forEach { (_, intent) ->
                 val helper = ComplicationHelperActivity()
                 helper.intent = intent
-                helper.mDelegate = mock() {
-                    on { shouldShowRequestPermissionRationale() } doReturn false
-                }
+                helper.mDelegate =
+                    mock() { on { shouldShowRequestPermissionRationale() } doReturn false }
 
                 helper.start(true)
                 verify(helper.mDelegate, never()).launchComplicationRationaleActivity()
@@ -151,9 +150,8 @@
             scenarios.forEach { (_, intent) ->
                 val helper = ComplicationHelperActivity()
                 helper.intent = intent
-                helper.mDelegate = mock() {
-                    on { shouldShowRequestPermissionRationale() } doReturn true
-                }
+                helper.mDelegate =
+                    mock() { on { shouldShowRequestPermissionRationale() } doReturn true }
 
                 helper.start(false)
                 verify(helper.mDelegate, never()).launchComplicationRationaleActivity()
@@ -167,10 +165,11 @@
             scenarios.forEach { (requestId, intent) ->
                 val helper = ComplicationHelperActivity()
                 helper.intent = intent
-                helper.mDelegate = mock() {
-                    on { shouldShowRequestPermissionRationale() } doReturn false
-                    on { checkPermission() } doReturn false
-                }
+                helper.mDelegate =
+                    mock() {
+                        on { shouldShowRequestPermissionRationale() } doReturn false
+                        on { checkPermission() } doReturn false
+                    }
 
                 helper.start(true)
                 verify(helper.mDelegate).requestPermissions(requestId)
@@ -184,10 +183,11 @@
             scenarios.forEach { (requestId, intent) ->
                 val helper = ComplicationHelperActivity()
                 helper.intent = intent
-                helper.mDelegate = mock() {
-                    on { shouldShowRequestPermissionRationale() } doReturn false
-                    on { checkPermission() } doReturn true
-                }
+                helper.mDelegate =
+                    mock() {
+                        on { shouldShowRequestPermissionRationale() } doReturn false
+                        on { checkPermission() } doReturn true
+                    }
 
                 helper.start(true)
                 verify(helper.mDelegate, never()).requestPermissions(requestId)
@@ -252,13 +252,13 @@
 
     @Test
     public fun complicationDeniedActivity_not_launched_if_permission_denied_with_dont_show() {
-        val deniedScenarios = mapOf(
-            ComplicationHelperActivity.PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT to
-                createIntent(),
-
-            ComplicationHelperActivity.PERMISSION_REQUEST_CODE_REQUEST_ONLY_NO_DENIED_INTENT to
-                createPermissionOnlyIntent()
-        )
+        val deniedScenarios =
+            mapOf(
+                ComplicationHelperActivity
+                    .PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT to createIntent(),
+                ComplicationHelperActivity.PERMISSION_REQUEST_CODE_REQUEST_ONLY_NO_DENIED_INTENT to
+                    createPermissionOnlyIntent()
+            )
         runOnMainThread {
             deniedScenarios.forEach { (requestId, intent) ->
                 val helper = ComplicationHelperActivity()
@@ -284,26 +284,28 @@
         vararg supportedTypes: ComplicationType = defaultSupportedTypes,
         complicationDeniedIntent: Intent? = Intent(),
         complicationRationalIntent: Intent? = Intent()
-    ) = ComplicationHelperActivity.createComplicationDataSourceChooserHelperIntent(
-        context,
-        watchFaceComponentName,
-        complicationSlotId,
-        supportedTypes.asList(),
-        instanceId,
-        complicationDeniedIntent,
-        complicationRationalIntent
-    )
+    ) =
+        ComplicationHelperActivity.createComplicationDataSourceChooserHelperIntent(
+            context,
+            watchFaceComponentName,
+            complicationSlotId,
+            supportedTypes.asList(),
+            instanceId,
+            complicationDeniedIntent,
+            complicationRationalIntent
+        )
 
     private fun createPermissionOnlyIntent(
         watchFaceComponentName: ComponentName = defaultWatchFaceComponentName,
         complicationDeniedIntent: Intent? = Intent(),
         complicationRationalIntent: Intent? = Intent()
-    ) = ComplicationHelperActivity.createPermissionRequestHelperIntent(
-        context,
-        watchFaceComponentName,
-        complicationDeniedIntent,
-        complicationRationalIntent
-    )
+    ) =
+        ComplicationHelperActivity.createPermissionRequestHelperIntent(
+            context,
+            watchFaceComponentName,
+            complicationDeniedIntent,
+            complicationRationalIntent
+        )
 
     private companion object {
         /** The context to be used in the various tests. */
@@ -323,9 +325,10 @@
 /** The watch face component name encoded in the intent. */
 @Suppress("DEPRECATION")
 private val Intent.watchFaceComponentName
-    get() = getParcelableExtra<ComponentName>(
-        ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME
-    )
+    get() =
+        getParcelableExtra<ComponentName>(
+            ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME
+        )
 
 /** The complication ID encoded in the intent. */
 private val Intent.complicationSlotId
@@ -333,6 +336,7 @@
 
 /** The support types encoded in the intent. */
 private val Intent.supportedTypes
-    get() = ComplicationType.fromWireTypes(
-        getIntArrayExtra(ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES)!!
-    )
+    get() =
+        ComplicationType.fromWireTypes(
+            getIntArrayExtra(ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES)!!
+        )
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/WatchFaceServiceAndroidTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/WatchFaceServiceAndroidTest.kt
index 3f6fe61..485823b 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/WatchFaceServiceAndroidTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/WatchFaceServiceAndroidTest.kt
@@ -34,40 +34,42 @@
     @Test
     fun measuresWatchFaceIconsFromCustomContext() {
         val context: Context = ApplicationProvider.getApplicationContext()
-        val serviceSpy = object : SimpleWatchFaceTestService() {
-            override val resourcesContext: Context
-                get() = this.createPackageContext(context.packageName,
-                    Context.CONTEXT_RESTRICTED
-                )
-        }
+        val serviceSpy =
+            object : SimpleWatchFaceTestService() {
+                override val resourcesContext: Context
+                    get() =
+                        this.createPackageContext(context.packageName, Context.CONTEXT_RESTRICTED)
+            }
         val engine = serviceSpy.onCreateEngine() as WatchFaceService.EngineWrapper
 
         try {
-            val schema = UserStyleSchema(
-                listOf(
-                    UserStyleSetting.ListUserStyleSetting(
-                        UserStyleSetting.Id("someId"),
-                        "displayName",
-                        "description",
-                        Icon.createWithResource(
-                            context,
-                            androidx.wear.watchface.test.R.drawable.example_icon_24
-                        ),
-                        listOf(
-                            UserStyleSetting.ListUserStyleSetting.ListOption(
-                                UserStyleSetting.Option.Id("red_style"),
-                                displayName = "Red",
-                                screenReaderName = "Red watchface style",
-                                icon = Icon.createWithResource(
-                                    context,
-                                    androidx.wear.watchface.test.R.drawable.example_icon_24
-                                ),
-                            )
-                        ),
-                        listOf(WatchFaceLayer.BASE)
+            val schema =
+                UserStyleSchema(
+                    listOf(
+                        UserStyleSetting.ListUserStyleSetting(
+                            UserStyleSetting.Id("someId"),
+                            "displayName",
+                            "description",
+                            Icon.createWithResource(
+                                context,
+                                androidx.wear.watchface.test.R.drawable.example_icon_24
+                            ),
+                            listOf(
+                                UserStyleSetting.ListUserStyleSetting.ListOption(
+                                    UserStyleSetting.Option.Id("red_style"),
+                                    displayName = "Red",
+                                    screenReaderName = "Red watchface style",
+                                    icon =
+                                        Icon.createWithResource(
+                                            context,
+                                            androidx.wear.watchface.test.R.drawable.example_icon_24
+                                        ),
+                                )
+                            ),
+                            listOf(WatchFaceLayer.BASE)
+                        )
                     )
                 )
-            )
 
             // expect no exception
             engine.validateSchemaWireSize(schema)
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/SimpleWatchFaceTestService.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/SimpleWatchFaceTestService.kt
index 0738ffe..7184120 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/SimpleWatchFaceTestService.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/SimpleWatchFaceTestService.kt
@@ -25,14 +25,13 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 
 /**
- * A simple WatchFaceService that does not get initialized (because it is PreAndroidR) if there
- * is no pendingWallpaperInstance. Use it to unit test methods of the EngineWrapper or to spy on it.
+ * A simple WatchFaceService that does not get initialized (because it is PreAndroidR) if there is
+ * no pendingWallpaperInstance. Use it to unit test methods of the EngineWrapper or to spy on it.
  */
 open class SimpleWatchFaceTestService : WatchFaceService() {
 
     init {
-        @Suppress("LeakingThis")
-        attachBaseContext(ApplicationProvider.getApplicationContext())
+        @Suppress("LeakingThis") attachBaseContext(ApplicationProvider.getApplicationContext())
     }
 
     override suspend fun createWatchFace(
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
index 217a28a..81ba33e 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
@@ -47,11 +47,12 @@
 
     // We can't subclass ExampleCanvasAnalogWatchFaceService because we want to override internal
     // methods, so instead we use composition.
-    private val delegate = object : ExampleCanvasAnalogWatchFaceService() {
-        init {
-            attachBaseContext(testContext)
+    private val delegate =
+        object : ExampleCanvasAnalogWatchFaceService() {
+            init {
+                attachBaseContext(testContext)
+            }
         }
-    }
 
     init {
         attachBaseContext(testContext)
@@ -88,15 +89,13 @@
 
     override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
 
-    override val wearSdkVersion = when (preRInitFlow) {
-        true -> Build.VERSION_CODES.O_MR1
-        false -> Build.VERSION_CODES.R
-    }
+    override val wearSdkVersion =
+        when (preRInitFlow) {
+            true -> Build.VERSION_CODES.O_MR1
+            false -> Build.VERSION_CODES.R
+        }
 
-    override fun readDirectBootPrefs(
-        context: Context,
-        fileName: String
-    ) = directBootParams
+    override fun readDirectBootPrefs(context: Context, fileName: String) = directBootParams
 
     override fun writeDirectBootPrefs(
         context: Context,
@@ -119,9 +118,10 @@
         onInvalidateCountDownLatch?.countDown()
     }
 
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = mockSystemTimeMillis
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = mockSystemTimeMillis
 
-        override fun getSystemTimeZoneId() = mockZoneId
-    }
+            override fun getSystemTimeZoneId() = mockZoneId
+        }
 }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
index 548327a..8bd10f2 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
@@ -43,11 +43,12 @@
 
     // We can't subclass ExampleOpenGLWatchFaceService because we want to override internal methods,
     // so instead we use composition.
-    private val delegate = object : ExampleOpenGLWatchFaceService() {
-        init {
-            attachBaseContext(testContext)
+    private val delegate =
+        object : ExampleOpenGLWatchFaceService() {
+            init {
+                attachBaseContext(testContext)
+            }
         }
-    }
 
     init {
         attachBaseContext(testContext)
@@ -84,10 +85,7 @@
 
     override fun getWallpaperSurfaceHolderOverride() = surfacHolderOverride
 
-    override fun readDirectBootPrefs(
-        context: Context,
-        fileName: String
-    ) = directBootParams
+    override fun readDirectBootPrefs(context: Context, fileName: String) = directBootParams
 
     override fun writeDirectBootPrefs(
         context: Context,
@@ -106,9 +104,10 @@
         byteArray: ByteArray
     ) {}
 
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = mockSystemTimeMillis
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = mockSystemTimeMillis
 
-        override fun getSystemTimeZoneId() = mockZoneId
-    }
+            override fun getSystemTimeZoneId() = mockZoneId
+        }
 }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
index f7e7a0b..68265ed 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
@@ -31,9 +31,6 @@
 import androidx.test.filters.MediumTest
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
-import androidx.wear.watchface.complications.data.ComplicationText
-import androidx.wear.watchface.complications.data.PlainComplicationText
-import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.ComplicationSlotsManager
 import androidx.wear.watchface.DrawMode
@@ -44,8 +41,11 @@
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
 import androidx.wear.watchface.complications.data.ColorRamp
+import androidx.wear.watchface.complications.data.ComplicationText
 import androidx.wear.watchface.complications.data.GoalProgressComplicationData
+import androidx.wear.watchface.complications.data.PlainComplicationText
 import androidx.wear.watchface.complications.data.RangedValueComplicationData
+import androidx.wear.watchface.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.complications.data.WeightedElementsComplicationData
 import androidx.wear.watchface.control.IHeadlessWatchFace
 import androidx.wear.watchface.control.IWatchFaceControlService
@@ -63,16 +63,16 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
+import java.time.ZonedDateTime
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import org.junit.After
 import org.junit.Assume
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.time.ZonedDateTime
-import org.junit.After
 
 // This service constructs a WatchFace with a task that's posted on the UI thread.
 internal class AsyncInitWithUiThreadTaskWatchFace : WatchFaceService() {
@@ -83,431 +83,457 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ): WatchFace = withContext(mainThreadCoroutineScope.coroutineContext) {
-        WatchFace(
-            WatchFaceType.DIGITAL,
-            @Suppress("deprecation")
-            object : Renderer.CanvasRenderer(
-                surfaceHolder,
-                currentUserStyleRepository,
-                watchState,
-                CanvasType.SOFTWARE,
-                16
-            ) {
-                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ): WatchFace =
+        withContext(mainThreadCoroutineScope.coroutineContext) {
+            WatchFace(
+                WatchFaceType.DIGITAL,
+                @Suppress("deprecation")
+                object :
+                    Renderer.CanvasRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        CanvasType.SOFTWARE,
+                        16
+                    ) {
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {}
 
-                override fun renderHighlightLayer(
-                    canvas: Canvas,
-                    bounds: Rect,
-                    zonedDateTime: ZonedDateTime
-                ) {}
-            }
-        )
-    }
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {}
+                }
+            )
+        }
 }
 
 const val TIME_MILLIS: Long = 123456789
-val DEVICE_CONFIG = DeviceConfig(
-    /* hasLowBitAmbient = */ false,
-    /* hasBurnInProtection = */ false,
-    /* analogPreviewReferenceTimeMillis = */ 0,
-    /* digitalPreviewReferenceTimeMillis = */ 0
-)
+val DEVICE_CONFIG =
+    DeviceConfig(
+        /* hasLowBitAmbient = */ false,
+        /* hasBurnInProtection = */ false,
+        /* analogPreviewReferenceTimeMillis = */ 0,
+        /* digitalPreviewReferenceTimeMillis = */ 0
+    )
 
 @RunWith(AndroidJUnit4::class)
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 @MediumTest
 public class WatchFaceControlServiceTest {
 
-   @get:Rule
-   internal val screenshotRule = AndroidXScreenshotTestRule("wear/wear-watchface")
+    @get:Rule internal val screenshotRule = AndroidXScreenshotTestRule("wear/wear-watchface")
 
-   private lateinit var instance: IHeadlessWatchFace
+    private lateinit var instance: IHeadlessWatchFace
 
-   @Before
-   public fun setUp() {
-       Assume.assumeTrue("This test suite assumes API 27", Build.VERSION.SDK_INT >= 27)
-   }
+    @Before
+    public fun setUp() {
+        Assume.assumeTrue("This test suite assumes API 27", Build.VERSION.SDK_INT >= 27)
+    }
 
-   @After
-   public fun tearDown() {
-       if (this::instance.isInitialized) {
-           instance.release()
-       }
-   }
+    @After
+    public fun tearDown() {
+        if (this::instance.isInitialized) {
+            instance.release()
+        }
+    }
 
-   private fun createInstance(width: Int, height: Int) {
-       val instanceService = IWatchFaceControlService.Stub.asInterface(
-           WatchFaceControlService().apply {
-               setContext(ApplicationProvider.getApplicationContext<Context>())
-           }.onBind(
-               Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE)
-           )
-       )
-       instance = instanceService.createHeadlessWatchFaceInstance(
-           HeadlessWatchFaceInstanceParams(
-               ComponentName(
-                   ApplicationProvider.getApplicationContext<Context>(),
-                   ExampleCanvasAnalogWatchFaceService::class.java
-               ),
-               DEVICE_CONFIG,
-               width,
-               height,
-               null
-           )
-       )
-   }
+    private fun createInstance(width: Int, height: Int) {
+        val instanceService =
+            IWatchFaceControlService.Stub.asInterface(
+                WatchFaceControlService()
+                    .apply { setContext(ApplicationProvider.getApplicationContext<Context>()) }
+                    .onBind(Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE))
+            )
+        instance =
+            instanceService.createHeadlessWatchFaceInstance(
+                HeadlessWatchFaceInstanceParams(
+                    ComponentName(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        ExampleCanvasAnalogWatchFaceService::class.java
+                    ),
+                    DEVICE_CONFIG,
+                    width,
+                    height,
+                    null
+                )
+            )
+    }
 
-   private fun createOpenGlInstance(width: Int, height: Int) {
-       val instanceService = IWatchFaceControlService.Stub.asInterface(
-           WatchFaceControlService().apply {
-               setContext(ApplicationProvider.getApplicationContext<Context>())
-           }.onBind(
-               Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE)
-           )
-       )
-       instance = instanceService.createHeadlessWatchFaceInstance(
-           HeadlessWatchFaceInstanceParams(
-               ComponentName(
-                   ApplicationProvider.getApplicationContext<Context>(),
-                   ExampleOpenGLWatchFaceService::class.java
-               ),
-               DEVICE_CONFIG,
-               width,
-               height,
-               null
-           )
-       )
-   }
+    private fun createOpenGlInstance(width: Int, height: Int) {
+        val instanceService =
+            IWatchFaceControlService.Stub.asInterface(
+                WatchFaceControlService()
+                    .apply { setContext(ApplicationProvider.getApplicationContext<Context>()) }
+                    .onBind(Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE))
+            )
+        instance =
+            instanceService.createHeadlessWatchFaceInstance(
+                HeadlessWatchFaceInstanceParams(
+                    ComponentName(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        ExampleOpenGLWatchFaceService::class.java
+                    ),
+                    DEVICE_CONFIG,
+                    width,
+                    height,
+                    null
+                )
+            )
+    }
 
-   @Test
-   public fun createWatchFaceInstanceWithRangedValueComplications() {
-       createInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderWatchFaceToBitmap(
-               WatchFaceRenderParams(
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   null,
-                   listOf(
-                       IdAndComplicationDataWireFormat(
-                           EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                           RangedValueComplicationData.Builder(
-                               value = 100.0f,
-                               min = 0.0f,
-                               max = 100.0f,
-                               ComplicationText.EMPTY
-                           )
-                               .setText(PlainComplicationText.Builder("100%").build())
-                               .build()
-                               .asWireComplicationData()
-                       ),
-                       IdAndComplicationDataWireFormat(
-                           EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                           RangedValueComplicationData.Builder(
-                               value = 75.0f,
-                               min = 0.0f,
-                               max = 100.0f,
-                               ComplicationText.EMPTY
-                           )
-                               .setText(PlainComplicationText.Builder("75%").build())
-                               .build()
-                               .asWireComplicationData()
-                       )
-                   )
-               )
-           )
-       )
+    @Test
+    public fun createWatchFaceInstanceWithRangedValueComplications() {
+        createInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        null,
+                        listOf(
+                            IdAndComplicationDataWireFormat(
+                                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                                RangedValueComplicationData.Builder(
+                                        value = 100.0f,
+                                        min = 0.0f,
+                                        max = 100.0f,
+                                        ComplicationText.EMPTY
+                                    )
+                                    .setText(PlainComplicationText.Builder("100%").build())
+                                    .build()
+                                    .asWireComplicationData()
+                            ),
+                            IdAndComplicationDataWireFormat(
+                                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                                RangedValueComplicationData.Builder(
+                                        value = 75.0f,
+                                        min = 0.0f,
+                                        max = 100.0f,
+                                        ComplicationText.EMPTY
+                                    )
+                                    .setText(PlainComplicationText.Builder("75%").build())
+                                    .build()
+                                    .asWireComplicationData()
+                            )
+                        )
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(screenshotRule, "ranged_value_complications")
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "ranged_value_complications")
+    }
 
-   @Test
-   public fun createHeadlessWatchFaceInstance() {
-       createInstance(width = 100, height = 100)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderWatchFaceToBitmap(
-               WatchFaceRenderParams(
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   null,
-                   listOf(
-                       IdAndComplicationDataWireFormat(
-                           EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                           ShortTextComplicationData.Builder(
-                               PlainComplicationText.Builder("Mon").build(),
-                               ComplicationText.EMPTY
-                           )
-                               .setTitle(PlainComplicationText.Builder("23rd").build())
-                               .build()
-                               .asWireComplicationData()
-                       ),
-                       IdAndComplicationDataWireFormat(
-                           EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                           ShortTextComplicationData.Builder(
-                               PlainComplicationText.Builder("100").build(),
-                               ComplicationText.EMPTY
-                           )
-                               .setTitle(PlainComplicationText.Builder("Steps").build())
-                               .build()
-                               .asWireComplicationData()
-                       )
-                   )
-               )
-           )
-       )
+    @Test
+    public fun createHeadlessWatchFaceInstance() {
+        createInstance(width = 100, height = 100)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        null,
+                        listOf(
+                            IdAndComplicationDataWireFormat(
+                                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                                ShortTextComplicationData.Builder(
+                                        PlainComplicationText.Builder("Mon").build(),
+                                        ComplicationText.EMPTY
+                                    )
+                                    .setTitle(PlainComplicationText.Builder("23rd").build())
+                                    .build()
+                                    .asWireComplicationData()
+                            ),
+                            IdAndComplicationDataWireFormat(
+                                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
+                                ShortTextComplicationData.Builder(
+                                        PlainComplicationText.Builder("100").build(),
+                                        ComplicationText.EMPTY
+                                    )
+                                    .setTitle(PlainComplicationText.Builder("Steps").build())
+                                    .build()
+                                    .asWireComplicationData()
+                            )
+                        )
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(screenshotRule, "service_interactive")
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "service_interactive")
+    }
 
-   @Test
-   public fun createHeadlessOpenglWatchFaceInstance() {
-       createOpenGlInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderWatchFaceToBitmap(
-               WatchFaceRenderParams(
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   null,
-                   listOf(
-                       IdAndComplicationDataWireFormat(
-                           EXAMPLE_OPENGL_COMPLICATION_ID,
-                           ShortTextComplicationData.Builder(
-                               PlainComplicationText.Builder("Mon").build(),
-                               ComplicationText.EMPTY
-                           )
-                               .setTitle(PlainComplicationText.Builder("23rd").build())
-                               .build()
-                               .asWireComplicationData()
-                       )
-                   )
-               )
-           )
-       )
+    @Test
+    public fun createHeadlessOpenglWatchFaceInstance() {
+        createOpenGlInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderWatchFaceToBitmap(
+                    WatchFaceRenderParams(
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        null,
+                        listOf(
+                            IdAndComplicationDataWireFormat(
+                                EXAMPLE_OPENGL_COMPLICATION_ID,
+                                ShortTextComplicationData.Builder(
+                                        PlainComplicationText.Builder("Mon").build(),
+                                        ComplicationText.EMPTY
+                                    )
+                                    .setTitle(PlainComplicationText.Builder("23rd").build())
+                                    .build()
+                                    .asWireComplicationData()
+                            )
+                        )
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(screenshotRule, "opengl_headless")
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "opengl_headless")
+    }
 
-   @Test
-   public fun testCommandTakeComplicationScreenShot() {
-       createInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderComplicationToBitmap(
-               ComplicationRenderParams(
-                   EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null,
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   ShortTextComplicationData.Builder(
-                       PlainComplicationText.Builder("Mon").build(),
-                       ComplicationText.EMPTY
-                   )
-                       .setTitle(PlainComplicationText.Builder("23rd").build())
-                       .build()
-                       .asWireComplicationData(),
-                   null
-               )
-           )
-       )
+    @Test
+    public fun testCommandTakeComplicationScreenShot() {
+        createInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null,
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        ShortTextComplicationData.Builder(
+                                PlainComplicationText.Builder("Mon").build(),
+                                ComplicationText.EMPTY
+                            )
+                            .setTitle(PlainComplicationText.Builder("23rd").build())
+                            .build()
+                            .asWireComplicationData(),
+                        null
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(
-           screenshotRule,
-           "leftComplication"
-       )
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "leftComplication")
+    }
 
-   @Test
-   @Suppress("NewApi")
-   public fun testGoalProgressComplication() {
-       createInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderComplicationToBitmap(
-               ComplicationRenderParams(
-                   EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null,
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   GoalProgressComplicationData.Builder(
-                       value = 12345.0f,
-                       targetValue = 10000.0f,
-                       PlainComplicationText.Builder("12345 steps").build()
-                   ).setText(PlainComplicationText.Builder("12345").build())
-                       .setTitle(PlainComplicationText.Builder("Steps").build())
-                       .build()
-                       .asWireComplicationData(),
-                   null
-               )
-           )
-       )
+    @Test
+    @Suppress("NewApi")
+    public fun testGoalProgressComplication() {
+        createInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null,
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        GoalProgressComplicationData.Builder(
+                                value = 12345.0f,
+                                targetValue = 10000.0f,
+                                PlainComplicationText.Builder("12345 steps").build()
+                            )
+                            .setText(PlainComplicationText.Builder("12345").build())
+                            .setTitle(PlainComplicationText.Builder("Steps").build())
+                            .build()
+                            .asWireComplicationData(),
+                        null
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(
-           screenshotRule,
-           "goalProgressComplication"
-       )
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "goalProgressComplication")
+    }
 
-   @Test
-   public fun testColorRampRangedValueComplication() {
-       createInstance(400, 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderComplicationToBitmap(
-               ComplicationRenderParams(
-                   EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null,
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   RangedValueComplicationData.Builder(
-                       value = 75f,
-                       min = 0.0f,
-                       max = 100.0f,
-                       PlainComplicationText.Builder("Rainbow colors").build()
-                   ).setText(PlainComplicationText.Builder("Colors").build())
-                       .setValueType(RangedValueComplicationData.TYPE_RATING)
-                       .setColorRamp(
-                           ColorRamp(
-                               intArrayOf(
-                                   Color.GREEN,
-                                   Color.YELLOW,
-                                   Color.argb(255, 255, 255, 0),
-                                   Color.RED,
-                                   Color.argb(255, 255, 0, 255),
-                                   Color.argb(255, 92, 64, 51)
-                               ),
-                               interpolated = true
-                           )
-                       )
-                       .build()
-                       .asWireComplicationData(),
-                   null
-               )
-           )
-       )
+    @Test
+    public fun testColorRampRangedValueComplication() {
+        createInstance(400, 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null,
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        RangedValueComplicationData.Builder(
+                                value = 75f,
+                                min = 0.0f,
+                                max = 100.0f,
+                                PlainComplicationText.Builder("Rainbow colors").build()
+                            )
+                            .setText(PlainComplicationText.Builder("Colors").build())
+                            .setValueType(RangedValueComplicationData.TYPE_RATING)
+                            .setColorRamp(
+                                ColorRamp(
+                                    intArrayOf(
+                                        Color.GREEN,
+                                        Color.YELLOW,
+                                        Color.argb(255, 255, 255, 0),
+                                        Color.RED,
+                                        Color.argb(255, 255, 0, 255),
+                                        Color.argb(255, 92, 64, 51)
+                                    ),
+                                    interpolated = true
+                                )
+                            )
+                            .build()
+                            .asWireComplicationData(),
+                        null
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(
-           screenshotRule,
-           "colorRampRangedValueComplication"
-       )
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "colorRampRangedValueComplication")
+    }
 
-   @Test
-   public fun testNonInterpolatedColorRampRangedValueComplication() {
-       createInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderComplicationToBitmap(
-               ComplicationRenderParams(
-                   EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null,
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   RangedValueComplicationData.Builder(
-                       value = 75f,
-                       min = 0.0f,
-                       max = 100.0f,
-                       PlainComplicationText.Builder("Rainbow colors").build()
-                   ).setText(PlainComplicationText.Builder("Colors").build())
-                       .setValueType(RangedValueComplicationData.TYPE_RATING)
-                       .setColorRamp(
-                           ColorRamp(
-                               intArrayOf(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW),
-                               interpolated = false
-                           )
-                       )
-                       .build()
-                       .asWireComplicationData(),
-                   null
-               )
-           )
-       )
+    @Test
+    public fun testNonInterpolatedColorRampRangedValueComplication() {
+        createInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null,
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        RangedValueComplicationData.Builder(
+                                value = 75f,
+                                min = 0.0f,
+                                max = 100.0f,
+                                PlainComplicationText.Builder("Rainbow colors").build()
+                            )
+                            .setText(PlainComplicationText.Builder("Colors").build())
+                            .setValueType(RangedValueComplicationData.TYPE_RATING)
+                            .setColorRamp(
+                                ColorRamp(
+                                    intArrayOf(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW),
+                                    interpolated = false
+                                )
+                            )
+                            .build()
+                            .asWireComplicationData(),
+                        null
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(
-           screenshotRule,
-           "nonInterpolatedColorRampRangedValueComplication"
-       )
-   }
+        bitmap.assertAgainstGolden(
+            screenshotRule,
+            "nonInterpolatedColorRampRangedValueComplication"
+        )
+    }
 
-   @Test
-   @Suppress("NewApi")
-   public fun testWeightedElementComplication() {
-       createInstance(width = 400, height = 400)
-       val bitmap = SharedMemoryImage.ashmemReadImageBundle(
-           instance.renderComplicationToBitmap(
-               ComplicationRenderParams(
-                   EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                   RenderParameters(
-                       DrawMode.INTERACTIVE,
-                       WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                       null,
-                   ).toWireFormat(),
-                   TIME_MILLIS,
-                   WeightedElementsComplicationData.Builder(
-                       listOf(
-                           WeightedElementsComplicationData.Element(weight = 1.0f, Color.RED),
-                           WeightedElementsComplicationData.Element(weight = 1.0f, Color.GREEN),
-                           WeightedElementsComplicationData.Element(weight = 2.0f, Color.BLUE),
-                           WeightedElementsComplicationData.Element(weight = 3.0f, Color.YELLOW)
-                       ),
-                       PlainComplicationText.Builder("Example").build()
-                   ).setText(PlainComplicationText.Builder("Calories").build())
-                       .build()
-                       .asWireComplicationData(),
-                   null
-               )
-           )
-       )
+    @Test
+    @Suppress("NewApi")
+    public fun testWeightedElementComplication() {
+        createInstance(width = 400, height = 400)
+        val bitmap =
+            SharedMemoryImage.ashmemReadImageBundle(
+                instance.renderComplicationToBitmap(
+                    ComplicationRenderParams(
+                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                        RenderParameters(
+                                DrawMode.INTERACTIVE,
+                                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                null,
+                            )
+                            .toWireFormat(),
+                        TIME_MILLIS,
+                        WeightedElementsComplicationData.Builder(
+                                listOf(
+                                    WeightedElementsComplicationData.Element(
+                                        weight = 1.0f,
+                                        Color.RED
+                                    ),
+                                    WeightedElementsComplicationData.Element(
+                                        weight = 1.0f,
+                                        Color.GREEN
+                                    ),
+                                    WeightedElementsComplicationData.Element(
+                                        weight = 2.0f,
+                                        Color.BLUE
+                                    ),
+                                    WeightedElementsComplicationData.Element(
+                                        weight = 3.0f,
+                                        Color.YELLOW
+                                    )
+                                ),
+                                PlainComplicationText.Builder("Example").build()
+                            )
+                            .setText(PlainComplicationText.Builder("Calories").build())
+                            .build()
+                            .asWireComplicationData(),
+                        null
+                    )
+                )
+            )
 
-       bitmap.assertAgainstGolden(
-           screenshotRule,
-           "weightedElementComplication"
-       )
-   }
+        bitmap.assertAgainstGolden(screenshotRule, "weightedElementComplication")
+    }
 
-   @Test
-   public fun asyncInitWithUiThreadTaskWatchFace() {
-       val instanceService = IWatchFaceControlService.Stub.asInterface(
-           WatchFaceControlService().apply {
-               setContext(ApplicationProvider.getApplicationContext<Context>())
-           }.onBind(
-               Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE)
-           )
-       )
-       // This shouldn't hang.
-       instance = instanceService.createHeadlessWatchFaceInstance(
-           HeadlessWatchFaceInstanceParams(
-               ComponentName(
-                   ApplicationProvider.getApplicationContext<Context>(),
-                   AsyncInitWithUiThreadTaskWatchFace::class.java
-               ),
-               DEVICE_CONFIG,
-               /* width = */ 100,
-               /* height = */100,
-               /* instanceId = */null
-           )
-       )
+    @Test
+    public fun asyncInitWithUiThreadTaskWatchFace() {
+        val instanceService =
+            IWatchFaceControlService.Stub.asInterface(
+                WatchFaceControlService()
+                    .apply { setContext(ApplicationProvider.getApplicationContext<Context>()) }
+                    .onBind(Intent(WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE))
+            )
+        // This shouldn't hang.
+        instance =
+            instanceService.createHeadlessWatchFaceInstance(
+                HeadlessWatchFaceInstanceParams(
+                    ComponentName(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        AsyncInitWithUiThreadTaskWatchFace::class.java
+                    ),
+                    DEVICE_CONFIG,
+                    /* width = */ 100,
+                    /* height = */ 100,
+                    /* instanceId = */ null
+                )
+            )
 
-       assertThat(instance.userStyleSchema.mSchema).isEmpty()
-   }
+        assertThat(instance.userStyleSchema.mSchema).isEmpty()
+    }
 }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
index 93526dc..2b72c30 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
@@ -121,9 +121,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        synchronized(lock) {
-            theIntent = intent
-        }
+        synchronized(lock) { theIntent = intent }
         countDown!!.countDown()
         finish()
     }
@@ -134,11 +132,9 @@
 @RequiresApi(Build.VERSION_CODES.O_MR1)
 public class WatchFaceServiceImageTest {
 
-    @Mock
-    private lateinit var surfaceHolder: SurfaceHolder
+    @Mock private lateinit var surfaceHolder: SurfaceHolder
 
-    @Mock
-    private lateinit var surface: Surface
+    @Mock private lateinit var surface: Surface
 
     private val handler = Handler(Looper.getMainLooper())
 
@@ -149,36 +145,37 @@
     private val pretendBinderThread = HandlerThread("PretendBinderThread")
     private lateinit var pretendBinderHandler: Handler
 
-    private val complicationDataSources = mapOf(
-        SystemDataSources.DATA_SOURCE_DAY_OF_WEEK to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("Mon").build(),
-                ComplicationText.EMPTY
-            )
-                .setTitle(PlainComplicationText.Builder("23rd").build())
-                .setTapAction(
-                    PendingIntent.getActivity(
-                        ApplicationProvider.getApplicationContext<Context>(),
-                        123,
-                        Intent(
-                            ApplicationProvider.getApplicationContext<Context>(),
-                            ComplicationTapActivity::class.java
-                        ).apply {
-                        },
-                        PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
+    private val complicationDataSources =
+        mapOf(
+            SystemDataSources.DATA_SOURCE_DAY_OF_WEEK to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Mon").build(),
+                        ComplicationText.EMPTY
                     )
-                )
-                .build()
-                .asWireComplicationData(),
-        SystemDataSources.DATA_SOURCE_STEP_COUNT to
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("100").build(),
-                ComplicationText.EMPTY
-            )
-                .setTitle(PlainComplicationText.Builder("Steps").build())
-                .build()
-                .asWireComplicationData()
-    )
+                    .setTitle(PlainComplicationText.Builder("23rd").build())
+                    .setTapAction(
+                        PendingIntent.getActivity(
+                            ApplicationProvider.getApplicationContext<Context>(),
+                            123,
+                            Intent(
+                                    ApplicationProvider.getApplicationContext<Context>(),
+                                    ComplicationTapActivity::class.java
+                                )
+                                .apply {},
+                            PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
+                        )
+                    )
+                    .build()
+                    .asWireComplicationData(),
+            SystemDataSources.DATA_SOURCE_STEP_COUNT to
+                ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("100").build(),
+                        ComplicationText.EMPTY
+                    )
+                    .setTitle(PlainComplicationText.Builder("Steps").build())
+                    .build()
+                    .asWireComplicationData()
+        )
 
     @get:Rule
     public val screenshotRule: AndroidXScreenshotTestRule =
@@ -220,16 +217,17 @@
     }
 
     private fun initCanvasWatchFace(onInvalidateCountDownLatch: CountDownLatch? = null) {
-        canvasAnalogWatchFaceService = TestCanvasAnalogWatchFaceService(
-            ApplicationProvider.getApplicationContext<Context>(),
-            handler,
-            100000,
-            ZoneId.of("UTC"),
-            surfaceHolder,
-            true, // Not direct boot.
-            null,
-            onInvalidateCountDownLatch
-        )
+        canvasAnalogWatchFaceService =
+            TestCanvasAnalogWatchFaceService(
+                ApplicationProvider.getApplicationContext<Context>(),
+                handler,
+                100000,
+                ZoneId.of("UTC"),
+                surfaceHolder,
+                true, // Not direct boot.
+                null,
+                onInvalidateCountDownLatch
+            )
 
         Mockito.`when`(surfaceHolder.surfaceFrame)
             .thenReturn(Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT))
@@ -247,14 +245,15 @@
     }
 
     private fun initGles2WatchFace() {
-        glesWatchFaceService = TestGlesWatchFaceService(
-            ApplicationProvider.getApplicationContext<Context>(),
-            handler,
-            100000,
-            ZoneId.of("UTC"),
-            surfaceHolder,
-            null
-        )
+        glesWatchFaceService =
+            TestGlesWatchFaceService(
+                ApplicationProvider.getApplicationContext<Context>(),
+                handler,
+                100000,
+                ZoneId.of("UTC"),
+                surfaceHolder,
+                null
+            )
 
         surfaceTexture.setDefaultBufferSize(BITMAP_WIDTH, BITMAP_HEIGHT)
 
@@ -269,40 +268,37 @@
     }
 
     private fun setPendingWallpaperInteractiveWatchFaceInstance() {
-        val existingInstance = InteractiveInstanceManager
-            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
-                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
-                    WallpaperInteractiveWatchFaceInstanceParams(
-                        INTERACTIVE_INSTANCE_ID,
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
+        val existingInstance =
+            InteractiveInstanceManager
+                .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                    InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                        WallpaperInteractiveWatchFaceInstanceParams(
+                            INTERACTIVE_INSTANCE_ID,
+                            DeviceConfig(false, false, 0, 0),
+                            WatchUiState(false, 0),
+                            UserStyleWireFormat(emptyMap()),
+                            null,
+                            null,
+                            null
                         ),
-                        WatchUiState(false, 0),
-                        UserStyleWireFormat(emptyMap()),
-                        null,
-                        null,
-                        null
-                    ),
-                    object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        object : IPendingInteractiveWatchFace.Stub() {
+                            override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
-                        override fun onInteractiveWatchFaceCreated(
-                            iInteractiveWatchFace: IInteractiveWatchFace
-                        ) {
-                            interactiveWatchFaceInstance = iInteractiveWatchFace
-                            initLatch.countDown()
-                        }
+                            override fun onInteractiveWatchFaceCreated(
+                                iInteractiveWatchFace: IInteractiveWatchFace
+                            ) {
+                                interactiveWatchFaceInstance = iInteractiveWatchFace
+                                initLatch.countDown()
+                            }
 
-                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
-                            fail("WatchFace crashed: $exception")
+                            override fun onInteractiveWatchFaceCrashed(
+                                exception: CrashInfoParcel?
+                            ) {
+                                fail("WatchFace crashed: $exception")
+                            }
                         }
-                    }
+                    )
                 )
-            )
         assertThat(existingInstance).isNull()
     }
 
@@ -324,12 +320,7 @@
             )!!
 
         try {
-            interactiveWatchFaceInstance.setWatchUiState(
-                WatchUiState(
-                    ambient,
-                    0
-                )
-            )
+            interactiveWatchFaceInstance.setWatchUiState(WatchUiState(ambient, 0))
         } finally {
             interactiveWatchFaceInstance.release()
         }
@@ -342,9 +333,7 @@
         assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         sendComplications()
 
-        handler.post {
-            engineWrapper.draw(engineWrapper.getWatchFaceImplOrNull())
-        }
+        handler.post { engineWrapper.draw(engineWrapper.getWatchFaceImplOrNull()) }
 
         assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap.assertAgainstGolden(screenshotRule, "active_screenshot")
@@ -376,28 +365,27 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.AMBIENT,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.AMBIENT,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
                             null
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "testCommandTakeScreenShot"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "testCommandTakeScreenShot")
     }
 
     @SuppressLint("NewApi")
@@ -411,28 +399,27 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
                             null
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "ambient_gl_screenshot"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "ambient_gl_screenshot")
     }
 
     @Test
@@ -472,9 +459,7 @@
             UserStyleWireFormat(mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray()))
         )
 
-        handler.post {
-            engineWrapper.draw(engineWrapper.getWatchFaceImplOrNull())
-        }
+        handler.post { engineWrapper.draw(engineWrapper.getWatchFaceImplOrNull()) }
 
         assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap.assertAgainstGolden(screenshotRule, "green_screenshot_no_complication_data")
@@ -490,22 +475,26 @@
         // Latch that countsDown when the complication below has been delivered.
         val complicationReceivedLatch = CountDownLatch(2)
         CoroutineScope(handler.asCoroutineDispatcher()).launch {
-            engineWrapper.deferredWatchFaceImpl.await().complicationSlotsManager[
-                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
-            ]!!.complicationData.collect {
-                if (it is NoDataComplicationData && it.placeholder != null) {
-                    complicationReceivedLatch.countDown()
+            engineWrapper.deferredWatchFaceImpl
+                .await()
+                .complicationSlotsManager[EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID]!!
+                .complicationData
+                .collect {
+                    if (it is NoDataComplicationData && it.placeholder != null) {
+                        complicationReceivedLatch.countDown()
+                    }
                 }
-            }
         }
         CoroutineScope(handler.asCoroutineDispatcher()).launch {
-            engineWrapper.deferredWatchFaceImpl.await().complicationSlotsManager[
-                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-            ]!!.complicationData.collect {
-                if (it is NoDataComplicationData && it.placeholder != null) {
-                    complicationReceivedLatch.countDown()
+            engineWrapper.deferredWatchFaceImpl
+                .await()
+                .complicationSlotsManager[EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID]!!
+                .complicationData
+                .collect {
+                    if (it is NoDataComplicationData && it.placeholder != null) {
+                        complicationReceivedLatch.countDown()
+                    }
                 }
-            }
         }
 
         // This is a oneway call.
@@ -514,28 +503,30 @@
                 IdAndComplicationDataWireFormat(
                     EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
                     NoDataComplicationData(
-                        LongTextComplicationData.Builder(
-                            ComplicationText.PLACEHOLDER,
-                            ComplicationText.EMPTY
+                            LongTextComplicationData.Builder(
+                                    ComplicationText.PLACEHOLDER,
+                                    ComplicationText.EMPTY
+                                )
+                                .setTitle(ComplicationText.PLACEHOLDER)
+                                .setSmallImage(SmallImage.PLACEHOLDER)
+                                .build(),
                         )
-                            .setTitle(ComplicationText.PLACEHOLDER)
-                            .setSmallImage(SmallImage.PLACEHOLDER)
-                            .build(),
-                    ).asWireComplicationData()
+                        .asWireComplicationData()
                 ),
                 IdAndComplicationDataWireFormat(
                     EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
                     NoDataComplicationData(
-                        RangedValueComplicationData.Builder(
-                            RangedValueComplicationData.PLACEHOLDER,
-                            0f,
-                            100f,
-                            ComplicationText.EMPTY
+                            RangedValueComplicationData.Builder(
+                                    RangedValueComplicationData.PLACEHOLDER,
+                                    0f,
+                                    100f,
+                                    ComplicationText.EMPTY
+                                )
+                                .setText(ComplicationText.PLACEHOLDER)
+                                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                                .build()
                         )
-                            .setText(ComplicationText.PLACEHOLDER)
-                            .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
-                            .build()
-                    ).asWireComplicationData()
+                        .asWireComplicationData()
                 )
             )
         )
@@ -544,28 +535,27 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.AMBIENT,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.AMBIENT,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
                             null
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "placeholderComplications"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "placeholderComplications")
     }
 
     @SuppressLint("NewApi")
@@ -576,18 +566,18 @@
         // Latch that countsDown when the complications below have been delivered and the images
         // have been loaded asynchronoiusly.
         val onInvalidateCountDownLatch = CountDownLatch(2)
-        handler.post {
-            initCanvasWatchFace(onInvalidateCountDownLatch)
-        }
+        handler.post { initCanvasWatchFace(onInvalidateCountDownLatch) }
         assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
 
-        val smallImage = SmallImage.Builder(
-            Icon.createWithResource(
-                ApplicationProvider.getApplicationContext<Context>(),
-                R.drawable.color_icon
-            ),
-            SmallImageType.ICON
-        ).build()
+        val smallImage =
+            SmallImage.Builder(
+                    Icon.createWithResource(
+                        ApplicationProvider.getApplicationContext<Context>(),
+                        R.drawable.color_icon
+                    ),
+                    SmallImageType.ICON
+                )
+                .build()
 
         // This is a oneway call.
         interactiveWatchFaceInstance.updateComplicationData(
@@ -595,21 +585,16 @@
                 IdAndComplicationDataWireFormat(
                     EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
                     ShortTextComplicationData.Builder(
-                        PlainComplicationText.Builder("Test").build(),
-                        ComplicationText.EMPTY
-                    )
+                            PlainComplicationText.Builder("Test").build(),
+                            ComplicationText.EMPTY
+                        )
                         .setSmallImage(smallImage)
                         .build()
                         .asWireComplicationData()
                 ),
                 IdAndComplicationDataWireFormat(
                     EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                    RangedValueComplicationData.Builder(
-                        25f,
-                        0f,
-                        100f,
-                        ComplicationText.EMPTY
-                    )
+                    RangedValueComplicationData.Builder(25f, 0f, 100f, ComplicationText.EMPTY)
                         .setSmallImage(smallImage)
                         .build()
                         .asWireComplicationData()
@@ -621,28 +606,27 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
                             null
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "smallImageComplications"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "smallImageComplications")
     }
 
     @SuppressLint("NewApi")
@@ -656,32 +640,31 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                            RenderParameters.HighlightLayer(
-                                RenderParameters.HighlightedElement.AllComplicationSlots,
-                                Color.RED,
-                                Color.argb(128, 0, 0, 0)
-                            )
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    RenderParameters.HighlightLayer(
+                                        RenderParameters.HighlightedElement.AllComplicationSlots,
+                                        Color.RED,
+                                        Color.argb(128, 0, 0, 0)
+                                    )
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
+                            null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "highlight_complications"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "highlight_complications")
     }
 
     @SuppressLint("NewApi")
@@ -695,32 +678,31 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null,
+                                    mapOf(
+                                        EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
+                                            TapEvent(1, 1, Instant.ofEpochMilli(123456789))
+                                    )
+                                )
+                                .toWireFormat(),
+                            123456789,
                             null,
-                            mapOf(
-                                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
-                                    TapEvent(1, 1, Instant.ofEpochMilli(123456789))
-                            )
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+                            null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "left_complication_pressed"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "left_complication_pressed")
     }
 
     @SuppressLint("NewApi")
@@ -734,62 +716,62 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                            RenderParameters.HighlightLayer(
-                                RenderParameters.HighlightedElement.ComplicationSlot(
-                                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
-                                ),
-                                Color.RED,
-                                Color.argb(128, 0, 0, 0)
-                            )
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        null
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    RenderParameters.HighlightLayer(
+                                        RenderParameters.HighlightedElement.ComplicationSlot(
+                                            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
+                                        ),
+                                        Color.RED,
+                                        Color.argb(128, 0, 0, 0)
+                                    )
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
+                            null
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "highlight_right_complication"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "highlight_right_complication")
     }
 
     @SuppressLint("NewApi")
     @Test
     public fun testScreenshotWithPreviewComplicationData() {
         val latch = CountDownLatch(1)
-        val previewComplicationData = listOf(
-            IdAndComplicationDataWireFormat(
-                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                ShortTextComplicationData.Builder(
-                    PlainComplicationText.Builder("A").build(),
-                    ComplicationText.EMPTY
+        val previewComplicationData =
+            listOf(
+                IdAndComplicationDataWireFormat(
+                    EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
+                    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(),
+                            ComplicationText.EMPTY
+                        )
+                        .setTitle(PlainComplicationText.Builder("Preview").build())
+                        .build()
+                        .asWireComplicationData()
                 )
-                    .setTitle(PlainComplicationText.Builder("Preview").build())
-                    .build()
-                    .asWireComplicationData()
-            ),
-            IdAndComplicationDataWireFormat(
-                EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                ShortTextComplicationData.Builder(
-                    PlainComplicationText.Builder("B").build(),
-                    ComplicationText.EMPTY
-                )
-                    .setTitle(PlainComplicationText.Builder("Preview").build())
-                    .build()
-                    .asWireComplicationData()
             )
-        )
 
         handler.post(this::initCanvasWatchFace)
         assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
@@ -797,28 +779,27 @@
 
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
-            bitmap = SharedMemoryImage.ashmemReadImageBundle(
-                interactiveWatchFaceInstance.renderWatchFaceToBitmap(
-                    WatchFaceRenderParams(
-                        RenderParameters(
-                            DrawMode.INTERACTIVE,
-                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                            null
-                        ).toWireFormat(),
-                        123456789,
-                        null,
-                        previewComplicationData
+            bitmap =
+                SharedMemoryImage.ashmemReadImageBundle(
+                    interactiveWatchFaceInstance.renderWatchFaceToBitmap(
+                        WatchFaceRenderParams(
+                            RenderParameters(
+                                    DrawMode.INTERACTIVE,
+                                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                                    null
+                                )
+                                .toWireFormat(),
+                            123456789,
+                            null,
+                            previewComplicationData
+                        )
                     )
                 )
-            )
             latch.countDown()
         }
 
         assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
-        bitmap!!.assertAgainstGolden(
-            screenshotRule,
-            "preview_complications"
-        )
+        bitmap!!.assertAgainstGolden(screenshotRule, "preview_complications")
     }
 
     @Test
@@ -836,38 +817,32 @@
         // pending PendingWallpaperInteractiveWatchFaceInstance and no wallpaper command. It
         // instead uses the WallpaperInteractiveWatchFaceInstanceParams which normally would be
         // read from disk, but provided directly in this test.
-        val service = TestCanvasAnalogWatchFaceService(
-            ApplicationProvider.getApplicationContext<Context>(),
-            handler,
-            100000,
-            ZoneId.of("UTC"),
-            surfaceHolder,
-            false, // Direct boot.
-            WallpaperInteractiveWatchFaceInstanceParams(
-                INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
+        val service =
+            TestCanvasAnalogWatchFaceService(
+                ApplicationProvider.getApplicationContext<Context>(),
+                handler,
+                100000,
+                ZoneId.of("UTC"),
+                surfaceHolder,
+                false, // Direct boot.
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    INTERACTIVE_INSTANCE_ID,
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyleWireFormat(
+                        mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray())
+                    ),
+                    null,
+                    null,
+                    null
                 ),
-                WatchUiState(false, 0),
-                UserStyleWireFormat(
-                    mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray())
-                ),
-                null,
-                null,
                 null
-            ),
-            null
-        )
+            )
 
         val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
 
         // Make sure init has completed before trying to draw.
-        runBlocking {
-            engineWrapper.deferredWatchFaceImpl.await()
-        }
+        runBlocking { engineWrapper.deferredWatchFaceImpl.await() }
 
         handler.post { engineWrapper.draw(engineWrapper.getWatchFaceImplOrNull()) }
 
@@ -899,11 +874,7 @@
                 interactiveWatchFaceInstance.instanceId
             )!!
         try {
-            interactiveWatchFaceInstance.sendTouchEvent(
-                85,
-                165,
-                TapType.UP
-            )
+            interactiveWatchFaceInstance.sendTouchEvent(85, 165, TapType.UP)
 
             assertThat(ComplicationTapActivity.awaitIntent()).isNotNull()
         } finally {
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
index 1da812c..f375f2a 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/XmlDefinedUserStyleSchemaAndComplicationSlotsTest.kt
@@ -59,7 +59,11 @@
 import androidx.wear.watchface.style.UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 import com.google.common.truth.Truth.assertThat
+import java.time.ZonedDateTime
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.runBlocking
+import org.junit.After
 import org.junit.Assert
 import org.junit.Assume
 import org.junit.Before
@@ -68,10 +72,6 @@
 import org.mockito.Mock
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
-import java.time.ZonedDateTime
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import org.junit.After
 
 private const val BITMAP_WIDTH = 400
 private const val BITMAP_HEIGHT = 400
@@ -93,7 +93,8 @@
 
     override fun getComplicationSlotInflationFactory(
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = object : ComplicationSlotInflationFactory() {
+    ) =
+        object : ComplicationSlotInflationFactory() {
             override fun getCanvasComplicationFactory(slotId: Int): CanvasComplicationFactory {
                 return CanvasComplicationFactory { _, _ ->
                     object : CanvasComplication {
@@ -103,8 +104,7 @@
                             zonedDateTime: ZonedDateTime,
                             renderParameters: RenderParameters,
                             slotId: Int
-                        ) {
-                        }
+                        ) {}
 
                         override fun drawHighlight(
                             canvas: Canvas,
@@ -112,57 +112,54 @@
                             boundsType: Int,
                             zonedDateTime: ZonedDateTime,
                             color: Int
-                        ) {
-                        }
+                        ) {}
 
                         override fun getData() = NoDataComplicationData()
 
                         override fun loadData(
                             complicationData: ComplicationData,
                             loadDrawablesAsynchronous: Boolean
-                        ) {
-                        }
+                        ) {}
                     }
                 }
+            }
         }
-    }
 
     override suspend fun createWatchFace(
         surfaceHolder: SurfaceHolder,
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16L
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16L
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {}
             }
-        }
-    )
+        )
 }
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 public class XmlDefinedUserStyleSchemaAndComplicationSlotsTest {
 
-    @Mock
-    private lateinit var surfaceHolder: SurfaceHolder
+    @Mock private lateinit var surfaceHolder: SurfaceHolder
 
-    @Mock
-    private lateinit var surface: Surface
+    @Mock private lateinit var surface: Surface
 
     private val bitmap = Bitmap.createBitmap(BITMAP_WIDTH, BITMAP_HEIGHT, Bitmap.Config.ARGB_8888)
     private val canvas = Canvas(bitmap)
@@ -184,50 +181,48 @@
     }
 
     private fun setPendingWallpaperInteractiveWatchFaceInstance() {
-        val existingInstance = InteractiveInstanceManager
-            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
-                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
-                    WallpaperInteractiveWatchFaceInstanceParams(
-                        INTERACTIVE_INSTANCE_ID,
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
+        val existingInstance =
+            InteractiveInstanceManager
+                .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                    InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                        WallpaperInteractiveWatchFaceInstanceParams(
+                            INTERACTIVE_INSTANCE_ID,
+                            DeviceConfig(false, false, 0, 0),
+                            WatchUiState(false, 0),
+                            UserStyleWireFormat(emptyMap()),
+                            null,
+                            null,
+                            null
                         ),
-                        WatchUiState(false, 0),
-                        UserStyleWireFormat(emptyMap()),
-                        null,
-                        null,
-                        null
-                    ),
-                    object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        object : IPendingInteractiveWatchFace.Stub() {
+                            override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
-                        override fun onInteractiveWatchFaceCreated(
-                            iInteractiveWatchFace: IInteractiveWatchFace
-                        ) {
-                            interactiveWatchFaceInstance = iInteractiveWatchFace
-                            initLatch.countDown()
-                        }
+                            override fun onInteractiveWatchFaceCreated(
+                                iInteractiveWatchFace: IInteractiveWatchFace
+                            ) {
+                                interactiveWatchFaceInstance = iInteractiveWatchFace
+                                initLatch.countDown()
+                            }
 
-                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
-                            Assert.fail("WatchFace crashed: $exception")
+                            override fun onInteractiveWatchFaceCrashed(
+                                exception: CrashInfoParcel?
+                            ) {
+                                Assert.fail("WatchFace crashed: $exception")
+                            }
                         }
-                    }
+                    )
                 )
-            )
         assertThat(existingInstance).isNull()
     }
 
     @Test
     @Suppress("Deprecation", "NewApi") // userStyleSettings
     public fun staticSchemaAndComplicationsRead() {
-        val service = TestXmlWatchFaceService(
-            ApplicationProvider.getApplicationContext<Context>(),
-            surfaceHolder
-        )
+        val service =
+            TestXmlWatchFaceService(
+                ApplicationProvider.getApplicationContext<Context>(),
+                surfaceHolder
+            )
 
         Mockito.`when`(surfaceHolder.surfaceFrame)
             .thenReturn(Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT))
@@ -243,68 +238,57 @@
         runBlocking {
             val watchFaceImpl = wrapper.deferredWatchFaceImpl.await()
             val schema = watchFaceImpl.currentUserStyleRepository.schema
-            assertThat(schema.userStyleSettings.map { it.id.value }).containsExactly(
-                "TimeStyle", "BooleanId", "DoubleId", "LongId"
-            )
+            assertThat(schema.userStyleSettings.map { it.id.value })
+                .containsExactly("TimeStyle", "BooleanId", "DoubleId", "LongId")
 
-            assertThat(
-                watchFaceImpl.complicationSlotsManager.complicationSlots.size
-            ).isEqualTo(5)
+            assertThat(watchFaceImpl.complicationSlotsManager.complicationSlots.size).isEqualTo(5)
 
             val slotA = watchFaceImpl.complicationSlotsManager.complicationSlots[10]!!
             assertThat(slotA.boundsType).isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
-            assertThat(slotA.supportedTypes).containsExactly(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.SMALL_IMAGE
-            ).inOrder()
+            assertThat(slotA.supportedTypes)
+                .containsExactly(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.SMALL_IMAGE
+                )
+                .inOrder()
             assertThat(slotA.defaultDataSourcePolicy.primaryDataSource).isNull()
-            assertThat(slotA.defaultDataSourcePolicy.primaryDataSourceDefaultType)
-                .isNull()
+            assertThat(slotA.defaultDataSourcePolicy.primaryDataSourceDefaultType).isNull()
             assertThat(slotA.defaultDataSourcePolicy.secondaryDataSource).isNull()
-            assertThat(slotA.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
-                .isNull()
-            assertThat(slotA.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_WATCH_BATTERY
-            )
+            assertThat(slotA.defaultDataSourcePolicy.secondaryDataSourceDefaultType).isNull()
+            assertThat(slotA.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_WATCH_BATTERY)
             assertThat(slotA.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.RANGED_VALUE)
             assertThat(
-                slotA.complicationSlotBounds.perComplicationTypeBounds[
-                    ComplicationType.SHORT_TEXT
-                ]!!
-            ).isEqualTo(
-                RectF(0.3f, 0.7f, 0.7f, 0.9f)
-            )
+                    slotA.complicationSlotBounds.perComplicationTypeBounds[
+                            ComplicationType.SHORT_TEXT]!!
+                )
+                .isEqualTo(RectF(0.3f, 0.7f, 0.7f, 0.9f))
             assertThat(slotA.nameResourceId).isEqualTo(R.string.complication_name_one)
             assertThat(slotA.screenReaderNameResourceId)
                 .isEqualTo(R.string.complication_screen_reader_name_one)
 
             val slotB = watchFaceImpl.complicationSlotsManager.complicationSlots[20]!!
             assertThat(slotB.boundsType).isEqualTo(ComplicationSlotBoundsType.BACKGROUND)
-            assertThat(slotB.supportedTypes).containsExactly(
-                ComplicationType.LONG_TEXT, ComplicationType.SHORT_TEXT
-            ).inOrder()
-            assertThat(slotB.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app")
-            )
+            assertThat(slotB.supportedTypes)
+                .containsExactly(ComplicationType.LONG_TEXT, ComplicationType.SHORT_TEXT)
+                .inOrder()
+            assertThat(slotB.defaultDataSourcePolicy.primaryDataSource)
+                .isEqualTo(ComponentName("com.package", "com.app"))
             assertThat(slotB.defaultDataSourcePolicy.primaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.SHORT_TEXT)
             assertThat(slotB.defaultDataSourcePolicy.secondaryDataSource).isNull()
-            assertThat(slotB.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
-                .isNull()
-            assertThat(slotB.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
-            )
+            assertThat(slotB.defaultDataSourcePolicy.secondaryDataSourceDefaultType).isNull()
+            assertThat(slotB.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET)
             assertThat(slotB.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.LONG_TEXT)
             assertThat(
-                slotB.complicationSlotBounds.perComplicationTypeBounds[
-                    ComplicationType.SHORT_TEXT
-                ]!!
-            ).isEqualTo(
-                RectF(0.1f, 0.2f, 0.3f, 0.4f)
-            )
+                    slotB.complicationSlotBounds.perComplicationTypeBounds[
+                            ComplicationType.SHORT_TEXT]!!
+                )
+                .isEqualTo(RectF(0.1f, 0.2f, 0.3f, 0.4f))
             assertThat(slotB.nameResourceId).isEqualTo(R.string.complication_name_two)
             assertThat(slotB.screenReaderNameResourceId)
                 .isEqualTo(R.string.complication_screen_reader_name_two)
@@ -314,43 +298,42 @@
             assertThat(slotC.defaultDataSourcePolicy.primaryDataSourceDefaultType).isNull()
             assertThat(slotC.defaultDataSourcePolicy.secondaryDataSource).isNull()
             assertThat(slotC.defaultDataSourcePolicy.secondaryDataSourceDefaultType).isNull()
-            assertThat(slotC.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.NO_DATA_SOURCE
-            )
+            assertThat(slotC.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.NO_DATA_SOURCE)
             assertThat(slotC.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.NOT_CONFIGURED)
 
             val slotD = watchFaceImpl.complicationSlotsManager.complicationSlots[40]!!
-            assertThat(slotD.supportedTypes).containsExactly(
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.SMALL_IMAGE
-            ).inOrder()
-            assertThat(slotD.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app.example1"))
+            assertThat(slotD.supportedTypes)
+                .containsExactly(
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.SMALL_IMAGE
+                )
+                .inOrder()
+            assertThat(slotD.defaultDataSourcePolicy.primaryDataSource)
+                .isEqualTo(ComponentName("com.package", "com.app.example1"))
             assertThat(slotD.defaultDataSourcePolicy.primaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.SHORT_TEXT)
-            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app.example2"))
+            assertThat(slotD.defaultDataSourcePolicy.secondaryDataSource)
+                .isEqualTo(ComponentName("com.package", "com.app.example2"))
             assertThat(slotD.defaultDataSourcePolicy.secondaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.SMALL_IMAGE)
-            assertThat(slotD.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_WATCH_BATTERY
-            )
+            assertThat(slotD.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_WATCH_BATTERY)
             assertThat(slotD.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.RANGED_VALUE)
 
             val slotE = watchFaceImpl.complicationSlotsManager.complicationSlots[50]!!
-            assertThat(slotE.supportedTypes).containsExactly(
-                ComplicationType.GOAL_PROGRESS, ComplicationType.WEIGHTED_ELEMENTS
-            ).inOrder()
-            assertThat(slotE.defaultDataSourcePolicy.primaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app"))
+            assertThat(slotE.supportedTypes)
+                .containsExactly(ComplicationType.GOAL_PROGRESS, ComplicationType.WEIGHTED_ELEMENTS)
+                .inOrder()
+            assertThat(slotE.defaultDataSourcePolicy.primaryDataSource)
+                .isEqualTo(ComponentName("com.package", "com.app"))
             assertThat(slotE.defaultDataSourcePolicy.primaryDataSourceDefaultType)
                 .isEqualTo(ComplicationType.GOAL_PROGRESS)
-            assertThat(slotE.defaultDataSourcePolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_WATCH_BATTERY
-            )
+            assertThat(slotE.defaultDataSourcePolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_WATCH_BATTERY)
             assertThat(slotE.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
                 .isEqualTo(ComplicationType.WEIGHTED_ELEMENTS)
 
@@ -375,36 +358,38 @@
             val complications = flavor.complications
             assertThat(complications.size).isEqualTo(1)
             val complicationPolicy = complications[10]!!
-            assertThat(complicationPolicy.primaryDataSource).isEqualTo(
-                ComponentName("com.package", "com.app"))
-            assertThat(complicationPolicy.primaryDataSourceDefaultType).isEqualTo(
-                ComplicationType.SHORT_TEXT)
-            assertThat(complicationPolicy.systemDataSourceFallback).isEqualTo(
-                SystemDataSources.DATA_SOURCE_DAY_AND_DATE)
-            assertThat(complicationPolicy.systemDataSourceFallbackDefaultType).isEqualTo(
-                ComplicationType.SHORT_TEXT)
+            assertThat(complicationPolicy.primaryDataSource)
+                .isEqualTo(ComponentName("com.package", "com.app"))
+            assertThat(complicationPolicy.primaryDataSourceDefaultType)
+                .isEqualTo(ComplicationType.SHORT_TEXT)
+            assertThat(complicationPolicy.systemDataSourceFallback)
+                .isEqualTo(SystemDataSources.DATA_SOURCE_DAY_AND_DATE)
+            assertThat(complicationPolicy.systemDataSourceFallbackDefaultType)
+                .isEqualTo(ComplicationType.SHORT_TEXT)
 
             var fixedString = flavor.toString()
 
             // remove binary data from option values
             val booleanIndex = fixedString.indexOf("BooleanId=") + "BooleanId=".length
-            fixedString = fixedString.removeRange(booleanIndex,
-                fixedString.indexOf(',', booleanIndex))
+            fixedString =
+                fixedString.removeRange(booleanIndex, fixedString.indexOf(',', booleanIndex))
 
             val doubleIndex = fixedString.indexOf("DoubleId=") + "DoubleId=".length
-            fixedString = fixedString.removeRange(doubleIndex,
-                fixedString.indexOf(',', doubleIndex))
+            fixedString =
+                fixedString.removeRange(doubleIndex, fixedString.indexOf(',', doubleIndex))
 
             val longIndex = fixedString.indexOf("LongId=") + "LongId=".length
-            fixedString = fixedString.removeRange(longIndex,
-                fixedString.indexOf('}', longIndex))
+            fixedString = fixedString.removeRange(longIndex, fixedString.indexOf('}', longIndex))
 
-            assertThat(fixedString).isEqualTo("UserStyleFlavor[flavor1: " +
-                "{BooleanId=, TimeStyle=minimal, DoubleId=, LongId=}, " +
-                "{10=DefaultComplicationDataSourcePolicy[" +
-                    "primary(ComponentInfo{com.package/com.app}, SHORT_TEXT), " +
-                    "secondary(null, null), " +
-                    "system(16, SHORT_TEXT)]}]")
+            assertThat(fixedString)
+                .isEqualTo(
+                    "UserStyleFlavor[flavor1: " +
+                        "{BooleanId=, TimeStyle=minimal, DoubleId=, LongId=}, " +
+                        "{10=DefaultComplicationDataSourcePolicy[" +
+                        "primary(ComponentInfo{com.package/com.app}, SHORT_TEXT), " +
+                        "secondary(null, null), " +
+                        "system(16, SHORT_TEXT)]}]"
+                )
         }
     }
 }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
index baf683c..62ec1af 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
@@ -51,15 +51,11 @@
     }
 
     override fun onActionTimeZoneChanged() {
-        uiThreadCoroutineScope.launch {
-            deferredWatchFaceImpl.await().onActionTimeZoneChanged()
-        }
+        uiThreadCoroutineScope.launch { deferredWatchFaceImpl.await().onActionTimeZoneChanged() }
     }
 
     override fun onActionTimeChanged() {
-        uiThreadCoroutineScope.launch {
-            deferredWatchFaceImpl.await().onActionTimeChanged()
-        }
+        uiThreadCoroutineScope.launch { deferredWatchFaceImpl.await().onActionTimeChanged() }
     }
 
     override fun onActionBatteryLow() {
@@ -87,14 +83,11 @@
     }
 
     override fun onMockTime(intent: Intent) {
-        uiThreadCoroutineScope.launch {
-            deferredWatchFaceImpl.await().onMockTime(intent)
-        }
+        uiThreadCoroutineScope.launch { deferredWatchFaceImpl.await().onMockTime(intent) }
     }
 
     private fun updateBatteryLowAndNotChargingStatus(value: Boolean) {
-        val isBatteryLowAndNotCharging =
-            watchState.isBatteryLowAndNotCharging as MutableStateFlow
+        val isBatteryLowAndNotCharging = watchState.isBatteryLowAndNotCharging as MutableStateFlow
         if (!isBatteryLowAndNotCharging.hasValue() || value != isBatteryLowAndNotCharging.value) {
             isBatteryLowAndNotCharging.value = value
             watchFaceHostApi.invalidate()
@@ -123,17 +116,16 @@
         // This is a backup signal for when SysUI is unable to deliver the ambient state (e.g. in
         // direct boot mode). We need to distinguish between ACTION_SCREEN_OFF for entering ambient
         // and the screen turning off. This is only possible from R.
-        isAmbient.value = if (ambientSettingAvailable) {
-            Settings.Global.getInt(contentResolver, AMBIENT_ENABLED_PATH, 0) == 1
-        } else {
-            // On P and below we just have to assume we're not ambient.
-            false
-        }
+        isAmbient.value =
+            if (ambientSettingAvailable) {
+                Settings.Global.getInt(contentResolver, AMBIENT_ENABLED_PATH, 0) == 1
+            } else {
+                // On P and below we just have to assume we're not ambient.
+                false
+            }
     }
 
     override fun onActionScreenOn() {
-        (watchState.isLocked as MutableStateFlow).value = false
-
         // Before SysUI has connected, we use ActionScreenOn/ActionScreenOff as a trigger to query
         // AMBIENT_ENABLED_PATH in order to determine if the device os ambient or not.
         if (sysUiHasSentWatchUiState) {
@@ -143,4 +135,8 @@
         val isAmbient = watchState.isAmbient as MutableStateFlow
         isAmbient.value = false
     }
-}
\ No newline at end of file
+
+    override fun onActionUserPresent() {
+        (watchState.isLocked as MutableStateFlow).value = false
+    }
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
index e8c9d5a..456f2af 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
@@ -28,56 +28,46 @@
 /**
  * This class decouples [BroadcastEventObserver]s from the actual broadcast event receivers to make
  * testing easier.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class BroadcastsReceiver constructor(
-    private val context: Context,
-    private val observer: BroadcastEventObserver
-) {
+public class BroadcastsReceiver
+constructor(private val context: Context, private val observer: BroadcastEventObserver) {
 
     public interface BroadcastEventObserver {
         /** Called when we receive [Intent.ACTION_TIME_TICK]. */
-        @UiThread
-        public fun onActionTimeTick()
+        @UiThread public fun onActionTimeTick()
 
         /** Called when we receive [Intent.ACTION_TIMEZONE_CHANGED]. */
-        @UiThread
-        public fun onActionTimeZoneChanged()
+        @UiThread public fun onActionTimeZoneChanged()
 
         /** Called when we receive [Intent.ACTION_TIME_CHANGED]. */
-        @UiThread
-        public fun onActionTimeChanged()
+        @UiThread public fun onActionTimeChanged()
 
         /** Called when we receive [Intent.ACTION_BATTERY_LOW]. */
-        @UiThread
-        public fun onActionBatteryLow()
+        @UiThread public fun onActionBatteryLow()
 
         /** Called when we receive [Intent.ACTION_BATTERY_OKAY]. */
-        @UiThread
-        public fun onActionBatteryOkay()
+        @UiThread public fun onActionBatteryOkay()
 
         /** Called when we receive [Intent.ACTION_POWER_CONNECTED]. */
-        @UiThread
-        public fun onActionPowerConnected()
+        @UiThread public fun onActionPowerConnected()
 
         /** Called when we receive [Intent.ACTION_POWER_DISCONNECTED]. */
-        @UiThread
-        public fun onActionPowerDisconnected()
+        @UiThread public fun onActionPowerDisconnected()
 
         /** Called when we receive [WatchFaceImpl.MOCK_TIME_INTENT]. */
-        @UiThread
-        public fun onMockTime(intent: Intent)
+        @UiThread public fun onMockTime(intent: Intent)
 
         /** Called when we receive [Intent.ACTION_SCREEN_OFF] */
-        @UiThread
-        public fun onActionScreenOff() {
-        }
+        @UiThread public fun onActionScreenOff() {}
 
         /** Called when we receive [Intent.ACTION_SCREEN_ON] */
-        @UiThread
-        public fun onActionScreenOn() {
-        }
+        @UiThread public fun onActionScreenOn() {}
+
+        /** Called when we receive [Intent.ACTION_USER_PRESENT] */
+        @UiThread public fun onActionUserPresent() {}
     }
 
     companion object {
@@ -88,24 +78,26 @@
         internal const val INITIAL_LOW_BATTERY_THRESHOLD = 15f
     }
 
-    internal val receiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            when (intent.action) {
-                Intent.ACTION_BATTERY_LOW -> observer.onActionBatteryLow()
-                Intent.ACTION_BATTERY_OKAY -> observer.onActionBatteryOkay()
-                Intent.ACTION_POWER_CONNECTED -> observer.onActionPowerConnected()
-                Intent.ACTION_POWER_DISCONNECTED -> observer.onActionPowerDisconnected()
-                Intent.ACTION_TIME_CHANGED -> observer.onActionTimeChanged()
-                Intent.ACTION_TIME_TICK -> observer.onActionTimeTick()
-                Intent.ACTION_TIMEZONE_CHANGED -> observer.onActionTimeZoneChanged()
-                Intent.ACTION_SCREEN_OFF -> observer.onActionScreenOff()
-                Intent.ACTION_SCREEN_ON -> observer.onActionScreenOn()
-                WatchFaceImpl.MOCK_TIME_INTENT -> observer.onMockTime(intent)
-                else -> System.err.println("<< IGNORING $intent")
+    internal val receiver: BroadcastReceiver =
+        object : BroadcastReceiver() {
+            @SuppressWarnings("SyntheticAccessor")
+            override fun onReceive(context: Context, intent: Intent) {
+                when (intent.action) {
+                    Intent.ACTION_BATTERY_LOW -> observer.onActionBatteryLow()
+                    Intent.ACTION_BATTERY_OKAY -> observer.onActionBatteryOkay()
+                    Intent.ACTION_POWER_CONNECTED -> observer.onActionPowerConnected()
+                    Intent.ACTION_POWER_DISCONNECTED -> observer.onActionPowerDisconnected()
+                    Intent.ACTION_TIME_CHANGED -> observer.onActionTimeChanged()
+                    Intent.ACTION_TIME_TICK -> observer.onActionTimeTick()
+                    Intent.ACTION_TIMEZONE_CHANGED -> observer.onActionTimeZoneChanged()
+                    Intent.ACTION_SCREEN_OFF -> observer.onActionScreenOff()
+                    Intent.ACTION_SCREEN_ON -> observer.onActionScreenOn()
+                    Intent.ACTION_USER_PRESENT -> observer.onActionUserPresent()
+                    WatchFaceImpl.MOCK_TIME_INTENT -> observer.onMockTime(intent)
+                    else -> System.err.println("<< IGNORING $intent")
+                }
             }
         }
-    }
 
     init {
         context.registerReceiver(
@@ -119,6 +111,7 @@
                 addAction(Intent.ACTION_BATTERY_OKAY)
                 addAction(Intent.ACTION_POWER_CONNECTED)
                 addAction(Intent.ACTION_POWER_DISCONNECTED)
+                addAction(Intent.ACTION_USER_PRESENT)
                 addAction(WatchFaceImpl.MOCK_TIME_INTENT)
             }
         )
@@ -127,19 +120,22 @@
     /** Called to send observers initial battery state in advance of receiving any broadcasts. */
     internal fun processBatteryStatus(batteryStatus: Intent?) {
         val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
-        if (status == BatteryManager.BATTERY_STATUS_CHARGING ||
-            status == BatteryManager.BATTERY_STATUS_FULL
+        if (
+            status == BatteryManager.BATTERY_STATUS_CHARGING ||
+                status == BatteryManager.BATTERY_STATUS_FULL
         ) {
             observer.onActionPowerConnected()
         } else {
             observer.onActionPowerDisconnected()
         }
 
-        val batteryPercent: Float = batteryStatus?.let { intent ->
-            val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
-            val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
-            level * 100 / scale.toFloat()
-        } ?: 100.0f
+        val batteryPercent: Float =
+            batteryStatus?.let { intent ->
+                val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
+                val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
+                level * 100 / scale.toFloat()
+            }
+                ?: 100.0f
         if (batteryPercent < INITIAL_LOW_BATTERY_THRESHOLD) {
             observer.onActionBatteryLow()
         } else {
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CancellableUniqueTask.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CancellableUniqueTask.kt
index 76fdc41..64d7a5a 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CancellableUniqueTask.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CancellableUniqueTask.kt
@@ -19,9 +19,7 @@
 import android.os.Handler
 import java.time.Duration
 
-/**
- * Task posting helper which allows only one pending task at a time.
- */
+/** Task posting helper which allows only one pending task at a time. */
 internal class CancellableUniqueTask(private val handler: Handler) {
     private var pendingTask: Runnable? = null
 
@@ -41,4 +39,4 @@
         handler.postDelayed(runnable, delay.toMillis())
         pendingTask = runnable
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
index 25c050a..ac5d1a0 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
@@ -20,8 +20,8 @@
 import androidx.annotation.WorkerThread;
 
 /**
- * Factory for creating a CanvasComplication. This decouples construction of Complications and
- * their CanvasComplication renderers.
+ * Factory for creating a CanvasComplication. This decouples construction of Complications and their
+ * CanvasComplication renderers.
  */
 // TODO(b/188035300): Put links into the comments.
 public interface CanvasComplicationFactory {
@@ -34,9 +34,9 @@
      *
      * @param watchState The current WatchState
      * @param invalidateCallback The CanvasComplication.InvalidateCallback the constructed
-     * CanvasComplication can use to request redrawing. This is typically used in
-     * conjunction with asynchronous loading of Drawables to update the watch face once the
-     * drawable has loaded.
+     *     CanvasComplication can use to request redrawing. This is typically used in conjunction
+     *     with asynchronous loading of Drawables to update the watch face once the drawable has
+     *     loaded.
      * @return The constructed CanvasComplication.
      */
     @NonNull
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationDataSourceChooserIntent.java b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationDataSourceChooserIntent.java
index 6105f6b..1bd1a98 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationDataSourceChooserIntent.java
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationDataSourceChooserIntent.java
@@ -35,9 +35,7 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class ComplicationDataSourceChooserIntent {
 
-    /**
-     * The intent action used to open the complication data source chooser activity.
-     */
+    /** The intent action used to open the complication data source chooser activity. */
     @SuppressWarnings("ActionValue")
     private static final String ACTION_CHOOSE_DATA_SOURCE =
             "com.google.android.clockwork.home.complications.ACTION_CHOOSE_PROVIDER";
@@ -139,9 +137,9 @@
      * will not work. The result delivered back to your activity will have a result code of {@link
      * Activity#RESULT_OK RESULT_OK} if a complication data source was successfully set, or a result
      * code of {@link Activity#RESULT_CANCELED RESULT_CANCELED} if no complication data source was
-     * set. In the case where a complication data source was set,
-     * {@link ComplicationProviderInfo} for the chosen complication data source will be included
-     * in the data intent of the result, as an extra with the key {@link #EXTRA_PROVIDER_INFO}.
+     * set. In the case where a complication data source was set, {@link ComplicationProviderInfo}
+     * for the chosen complication data source will be included in the data intent of the result, as
+     * an extra with the key {@link #EXTRA_PROVIDER_INFO}.
      *
      * <p>The package of the calling Activity must match the package of the watch face, or this will
      * not work.
@@ -178,8 +176,8 @@
      * automatically if it is not already granted.
      *
      * <p>This is intended for use when starting the chooser directly from the watch face. If the
-     * chooser is being started from an Activity, use
-     * {@link #createComplicationDataSourceChooserIntent} instead.
+     * chooser is being started from an Activity, use {@link
+     * #createComplicationDataSourceChooserIntent} instead.
      *
      * <p>The package of the caller must match the package of the watch face, or this will not work.
      *
@@ -197,11 +195,13 @@
             @NonNull ComponentName watchFace,
             int watchFaceComplicationId,
             @NonNull @ComplicationData.ComplicationType int... supportedTypes) {
-        Intent intent = createComplicationDataSourceChooserIntent(
-                watchFace, watchFaceComplicationId, supportedTypes);
+        Intent intent =
+                createComplicationDataSourceChooserIntent(
+                        watchFace, watchFaceComplicationId, supportedTypes);
         // Add a placeholder PendingIntent to allow the UID to be checked.
         intent.putExtra(
-                EXTRA_PENDING_INTENT, PendingIntent.getActivity(
+                EXTRA_PENDING_INTENT,
+                PendingIntent.getActivity(
                         context, 0, new Intent(""), PendingIntent.FLAG_IMMUTABLE));
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent);
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationHelperActivity.java b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationHelperActivity.java
index bf2a9f7..454e02e 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationHelperActivity.java
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationHelperActivity.java
@@ -40,17 +40,17 @@
 /**
  * Activity to handle permission requests for complications.
  *
- * <p>This can be used to start the complication data source chooser, making a permission request
- * if necessary, or to just make a permission request, and update all active complications if the
+ * <p>This can be used to start the complication data source chooser, making a permission request if
+ * necessary, or to just make a permission request, and update all active complications if the
  * permission is granted.
  *
  * <p>To use, add this activity to your app, and also add the {@code
  * com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA} permission.
  *
- * <p>Then, to start the complication data source chooser chooser, use
- * {@link #createComplicationDataSourceChooserHelperIntent} to obtain an intent. If the
- * permission has not yet been granted, the permission will be requested and the complication
- * data source chooser chooser will only be started if the request is accepted by the user.
+ * <p>Then, to start the complication data source chooser chooser, use {@link
+ * #createComplicationDataSourceChooserHelperIntent} to obtain an intent. If the permission has not
+ * yet been granted, the permission will be requested and the complication data source chooser
+ * chooser will only be started if the request is accepted by the user.
  *
  * <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
@@ -66,7 +66,7 @@
      * Whether to invoke a specified activity instead of the system's complication data source
      * chooser.
      *
-     * To be used in tests.
+     * <p>To be used in tests.
      */
     public static boolean useTestComplicationDataSourceChooserActivity = false;
 
@@ -74,7 +74,7 @@
      * Whether to skip th permission check and directly attempt to invoke the complication data
      * source chooser.
      *
-     * To be used in tests.
+     * <p>To be used in tests.
      */
     public static boolean skipPermissionCheck = false;
 
@@ -114,14 +114,10 @@
     private static final String COMPLICATIONS_PERMISSION_PRIVILEGED =
             "com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA_PRIVILEGED";
 
-    @Nullable
-    ComponentName mWatchFace;
+    @Nullable ComponentName mWatchFace;
     int mWfComplicationId;
-    @Nullable
-    Bundle mAdditionalExtras;
-    @Nullable
-    @ComplicationData.ComplicationType
-    int[] mTypes;
+    @Nullable Bundle mAdditionalExtras;
+    @Nullable @ComplicationData.ComplicationType int[] mTypes;
     Delegate mDelegate = new DelegateImpl(this);
 
     /** Allows the logic to be tested. */
@@ -159,27 +155,28 @@
         @Override
         public boolean checkPermission() {
             return ActivityCompat.checkSelfPermission(
-                    mActivity, COMPLICATIONS_PERMISSION_PRIVILEGED)
-                    == PackageManager.PERMISSION_GRANTED
+                                    mActivity, COMPLICATIONS_PERMISSION_PRIVILEGED)
+                            == PackageManager.PERMISSION_GRANTED
                     || ActivityCompat.checkSelfPermission(mActivity, COMPLICATIONS_PERMISSION)
-                    == PackageManager.PERMISSION_GRANTED
+                            == PackageManager.PERMISSION_GRANTED
                     || skipPermissionCheck;
         }
 
         @Override
         public void requestPermissions(int requestCode) {
             ActivityCompat.requestPermissions(
-                    mActivity,
-                    new String[]{COMPLICATIONS_PERMISSION},
-                    requestCode);
+                    mActivity, new String[] {COMPLICATIONS_PERMISSION}, requestCode);
         }
 
         @Override
         @SuppressWarnings("deprecation") // startActivityForResult
         public boolean launchComplicationRationaleActivity() {
             Intent complicationRationalIntent =
-                    mActivity.getIntent().getParcelableExtra(
-                            ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE);
+                    mActivity
+                            .getIntent()
+                            .getParcelableExtra(
+                                    ComplicationDataSourceChooserIntent
+                                            .EXTRA_COMPLICATION_RATIONALE);
 
             if (complicationRationalIntent != null) {
                 mActivity.startActivityForResult(
@@ -194,8 +191,10 @@
         @SuppressWarnings("deprecation")
         public void launchComplicationDeniedActivity() {
             Intent complicationDeniedIntent =
-                    mActivity.getIntent().getParcelableExtra(
-                            ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED);
+                    mActivity
+                            .getIntent()
+                            .getParcelableExtra(
+                                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED);
 
             if (complicationDeniedIntent != null) {
                 mActivity.startActivity(complicationDeniedIntent);
@@ -216,10 +215,11 @@
             extras.putAll(intent.getExtras());
             intent.replaceExtras(extras);
             if (useTestComplicationDataSourceChooserActivity) {
-                intent.setComponent(new ComponentName(
-                        "androidx.wear.watchface.editor.test",
-                        "androidx.wear.watchface.editor"
-                                + ".TestComplicationDataSourceChooserActivity"));
+                intent.setComponent(
+                        new ComponentName(
+                                "androidx.wear.watchface.editor.test",
+                                "androidx.wear.watchface.editor"
+                                        + ".TestComplicationDataSourceChooserActivity"));
             }
             mActivity.startActivityForResult(intent, START_REQUEST_CODE_PROVIDER_CHOOSER);
         }
@@ -257,33 +257,39 @@
 
         switch (Objects.requireNonNull(intent.getAction())) {
             case ACTION_START_PROVIDER_CHOOSER:
-                mWatchFace = intent.getParcelableExtra(
-                        ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME);
+                mWatchFace =
+                        intent.getParcelableExtra(
+                                ComplicationDataSourceChooserIntent
+                                        .EXTRA_WATCH_FACE_COMPONENT_NAME);
                 mWfComplicationId =
                         intent.getIntExtra(
                                 ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_ID, 0);
-                mTypes = intent.getIntArrayExtra(
-                        ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES);
+                mTypes =
+                        intent.getIntArrayExtra(
+                                ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES);
                 mAdditionalExtras = getAdditionalExtras(intent);
                 if (mDelegate.checkPermission()) {
                     mDelegate.startComplicationDataSourceChooser();
                 } else {
-                    int requestCode = shouldShowRequestPermissionRationale
-                            ? PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER :
-                            PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT;
+                    int requestCode =
+                            shouldShowRequestPermissionRationale
+                                    ? PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER
+                                    : PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT;
                     mDelegate.requestPermissions(requestCode);
                 }
                 break;
             case ACTION_PERMISSION_REQUEST_ONLY:
-                mWatchFace = intent.getParcelableExtra(
-                        ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME);
+                mWatchFace =
+                        intent.getParcelableExtra(
+                                ComplicationDataSourceChooserIntent
+                                        .EXTRA_WATCH_FACE_COMPONENT_NAME);
                 if (mDelegate.checkPermission()) {
                     finish();
                 } else {
                     mDelegate.requestPermissions(
                             shouldShowRequestPermissionRationale
-                                    ? PERMISSION_REQUEST_CODE_REQUEST_ONLY :
-                                    PERMISSION_REQUEST_CODE_REQUEST_ONLY_NO_DENIED_INTENT);
+                                    ? PERMISSION_REQUEST_CODE_REQUEST_ONLY
+                                    : PERMISSION_REQUEST_CODE_REQUEST_ONLY_NO_DENIED_INTENT);
                 }
                 break;
             default:
@@ -302,8 +308,7 @@
         }
         if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             if (requestCode == PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER
-                    || requestCode
-                    == PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT) {
+                    || requestCode == PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER_NO_DENIED_INTENT) {
                 mDelegate.startComplicationDataSourceChooser();
             } else {
                 finish();
@@ -353,28 +358,25 @@
      * RESULT_OK} if a complication data source was successfully set, or a result code of {@link
      * Activity#RESULT_CANCELED RESULT_CANCELED} if no complication data source was set. In the case
      * where a complication data source was set, {@link ComplicationProviderInfo} for the chosen
-     * complication data source will be included in the data intent of the result, as an extra
-     * with the key android.support.wearable.complications.EXTRA_PROVIDER_INFO.
+     * complication data source will be included in the data intent of the result, as an extra with
+     * the key android.support.wearable.complications.EXTRA_PROVIDER_INFO.
      *
      * <p>The package of the calling app must match the package of the watch face, or this will not
      * work.
      *
      * <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 complication data source 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.
-     * @param complicationDenied      Intent to launch the complication permission denied dialog.
-     * @param complicationRationale   Intent to launch the complication permission rationale dialog.
+     *     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 complication data source 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.
+     * @param complicationDenied Intent to launch the complication permission denied dialog.
+     * @param complicationRationale Intent to launch the complication permission rationale dialog.
      */
     @NonNull
     public static Intent createComplicationDataSourceChooserHelperIntent(
@@ -392,15 +394,18 @@
         intent.putExtra(
                 ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_ID, watchFaceComplicationId);
         if (watchFaceInstanceId != null) {
-            intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID,
+            intent.putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID,
                     watchFaceInstanceId);
         }
         if (complicationDenied != null) {
-            intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED,
+            intent.putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED,
                     complicationDenied);
         }
         if (complicationRationale != null) {
-            intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE,
+            intent.putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE,
                     complicationRationale);
         }
         int[] wireSupportedTypes = new int[supportedTypes.size()];
@@ -408,8 +413,8 @@
         for (ComplicationType supportedType : supportedTypes) {
             wireSupportedTypes[i++] = supportedType.toWireComplicationType();
         }
-        intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES,
-                wireSupportedTypes);
+        intent.putExtra(
+                ComplicationDataSourceChooserIntent.EXTRA_SUPPORTED_TYPES, wireSupportedTypes);
         return intent;
     }
 
@@ -429,11 +434,9 @@
      * 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 watchFace             the ComponentName of the WatchFaceService for the current
-     *                              watch face
-     * @param complicationDenied    Intent to launch the complication permission denied dialog.
+     * @param context context for the current app, that must contain a ComplicationHelperActivity
+     * @param watchFace the ComponentName of the WatchFaceService for the current watch face
+     * @param complicationDenied Intent to launch the complication permission denied dialog.
      * @param complicationRationale Intent to launch the complication permission rationale dialog.
      */
     @NonNull
@@ -444,14 +447,16 @@
             @Nullable Intent complicationRationale) {
         Intent intent = new Intent(context, ComplicationHelperActivity.class);
         intent.setAction(ACTION_PERMISSION_REQUEST_ONLY);
-        intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME,
-                watchFace);
+        intent.putExtra(
+                ComplicationDataSourceChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME, watchFace);
         if (complicationDenied != null) {
-            intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED,
+            intent.putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_DENIED,
                     complicationDenied);
         }
         if (complicationRationale != null) {
-            intent.putExtra(ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE,
+            intent.putExtra(
+                    ComplicationDataSourceChooserIntent.EXTRA_COMPLICATION_RATIONALE,
                     complicationRationale);
         }
         return intent;
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
index 7d5ff70..f1e65dd 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
@@ -16,13 +16,13 @@
 
 package androidx.wear.watchface
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.graphics.RectF
 import android.graphics.drawable.Drawable
 import android.os.Build
 import android.os.Bundle
+import android.support.wearable.complications.ComplicationData as WireComplicationData
 import androidx.annotation.ColorInt
 import androidx.annotation.IntDef
 import androidx.annotation.Px
@@ -76,14 +76,13 @@
      * [Renderer] is created asynchronously which is why we can't pass it in via
      * [CanvasComplicationFactory.create] as it may not be available at that time.
      */
-    @WorkerThread
-    public fun onRendererCreated(renderer: Renderer) {}
+    @WorkerThread public fun onRendererCreated(renderer: Renderer) {}
 
     /**
-     * Draws the complication defined by [getData] into the canvas with the specified bounds.
-     * This will usually be called by user watch face drawing code, but the system may also call it
-     * for complication selection UI rendering. The width and height will be the same as that
-     * computed by computeBounds but the translation and canvas size may differ.
+     * Draws the complication defined by [getData] into the canvas with the specified bounds. This
+     * will usually be called by user watch face drawing code, but the system may also call it for
+     * complication selection UI rendering. The width and height will be the same as that computed
+     * by computeBounds but the translation and canvas size may differ.
      *
      * @param canvas The [Canvas] to render into
      * @param bounds A [Rect] describing the bounds of the complication
@@ -122,8 +121,8 @@
 
     /**
      * Draws a highlight for a [ComplicationSlotBoundsType.ROUND_RECT] complication. The default
-     * implementation does this by drawing a dashed line around the complication, other visual effects
-     * may be used if desired.
+     * 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 A [Rect] describing the bounds of the complication
@@ -201,7 +200,9 @@
     ): Boolean = hitTest(complicationSlot, screenBounds, x, y, false)
 }
 
-/** Default [ComplicationTapFilter] for [ComplicationSlotBoundsType.ROUND_RECT] complicationSlots. */
+/**
+ * Default [ComplicationTapFilter] for [ComplicationSlotBoundsType.ROUND_RECT] complicationSlots.
+ */
 public class RoundRectComplicationTapFilter : ComplicationTapFilter {
     override fun hitTest(
         complicationSlot: ComplicationSlot,
@@ -212,7 +213,9 @@
     ): Boolean = complicationSlot.computeBounds(screenBounds, includeMargins).contains(x, y)
 }
 
-/** Default [ComplicationTapFilter] for [ComplicationSlotBoundsType.BACKGROUND] complicationSlots. */
+/**
+ * Default [ComplicationTapFilter] for [ComplicationSlotBoundsType.BACKGROUND] complicationSlots.
+ */
 public class BackgroundComplicationTapFilter : ComplicationTapFilter {
     override fun hitTest(
         complicationSlot: ComplicationSlot,
@@ -225,11 +228,12 @@
 
 /** @hide */
 @IntDef(
-    value = [
-        ComplicationSlotBoundsType.ROUND_RECT,
-        ComplicationSlotBoundsType.BACKGROUND,
-        ComplicationSlotBoundsType.EDGE
-    ]
+    value =
+        [
+            ComplicationSlotBoundsType.ROUND_RECT,
+            ComplicationSlotBoundsType.BACKGROUND,
+            ComplicationSlotBoundsType.EDGE
+        ]
 )
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public annotation class ComplicationSlotBoundsType {
@@ -254,8 +258,8 @@
  *
  * @property startAngle The staring angle of the arc in degrees (0 degrees = 12 o'clock position).
  * @property totalAngle The total angle of the arc on degrees.
- * @property thickness The thickness of the arc as a fraction of
- * min(boundingRect.width, boundingRect.height).
+ * @property thickness The thickness of the arc as a fraction of min(boundingRect.width,
+ *   boundingRect.height).
  */
 @ComplicationExperimental
 public class BoundingArc(val startAngle: Float, val totalAngle: Float, @Px val thickness: Float) {
@@ -329,47 +333,46 @@
 
 /**
  * Represents the slot an individual complication on the screen may go in. The number of
- * ComplicationSlots is fixed (see [ComplicationSlotsManager]) but ComplicationSlots can be
- * enabled or disabled via [UserStyleSetting.ComplicationSlotsUserStyleSetting].
+ * ComplicationSlots is fixed (see [ComplicationSlotsManager]) but ComplicationSlots can be enabled
+ * or disabled via [UserStyleSetting.ComplicationSlotsUserStyleSetting].
  *
  * Taps on the watch are tested first against each ComplicationSlot's
  * [ComplicationSlotBounds.perComplicationTypeBounds] for the relevant [ComplicationType]. Its
  * assumed that [ComplicationSlotBounds.perComplicationTypeBounds] don't overlap. If no intersection
  * was found then taps are checked against [ComplicationSlotBounds.perComplicationTypeBounds]
- * expanded by [ComplicationSlotBounds.perComplicationTypeMargins]. Expanded bounds can overlap
- * so the [ComplicationSlot] with the lowest id that intersects the coordinates, if any, is
- * selected.
+ * expanded by [ComplicationSlotBounds.perComplicationTypeMargins]. Expanded bounds can overlap so
+ * the [ComplicationSlot] with the lowest id that intersects the coordinates, if any, is selected.
  *
- * @property id The Watch Face's ID for the complication slot.
  * @param accessibilityTraversalIndex Used to sort Complications when generating accessibility
- * content description labels.
- * @property boundsType The [ComplicationSlotBoundsType] of the complication slot.
+ *   content description labels.
  * @param bounds The complication slot's [ComplicationSlotBounds].
- * @property canvasComplicationFactory The [CanvasComplicationFactory] used to generate a
- * [CanvasComplication] for rendering the complication. The factory allows us to decouple
- * ComplicationSlot from potentially expensive asset loading.
  * @param supportedTypes The list of [ComplicationType]s accepted by this complication slot. Used
- * during complication data source selection, this list should be non-empty.
- * @param defaultPolicy The [DefaultComplicationDataSourcePolicy] which controls the
- * initial complication data source when the watch face is first installed.
+ *   during complication data source selection, this list should be non-empty.
+ * @param defaultPolicy The [DefaultComplicationDataSourcePolicy] which controls the initial
+ *   complication data source when the watch face is first installed.
  * @param defaultDataSourceType The default [ComplicationType] for the default complication data
- * source.
- * @property initiallyEnabled At creation a complication slot is either enabled or disabled. This
- * can be overridden by a [ComplicationSlotsUserStyleSetting] (see
- * [ComplicationSlotOverlay.enabled]).
- * Editors need to know the initial state of a complication slot to predict the effects of making a
- * style change.
+ *   source.
  * @param configExtras Extras to be merged into the Intent sent when invoking the complication data
- * source chooser activity. This features is intended for OEM watch faces where they have elements
- * that behave like a complication but are in fact entirely watch face specific.
- * @property fixedComplicationDataSource  Whether or not the complication data source is fixed (i.e.
- * can't be changed by the user).  This is useful for watch faces built around specific
- * complications.
+ *   source chooser activity. This features is intended for OEM watch faces where they have elements
+ *   that behave like a complication but are in fact entirely watch face specific.
+ * @property id The Watch Face's ID for the complication slot.
+ * @property boundsType The [ComplicationSlotBoundsType] of the complication slot.
+ * @property canvasComplicationFactory The [CanvasComplicationFactory] used to generate a
+ *   [CanvasComplication] for rendering the complication. The factory allows us to decouple
+ *   ComplicationSlot from potentially expensive asset loading.
+ * @property initiallyEnabled At creation a complication slot is either enabled or disabled. This
+ *   can be overridden by a [ComplicationSlotsUserStyleSetting] (see
+ *   [ComplicationSlotOverlay.enabled]). Editors need to know the initial state of a complication
+ *   slot to predict the effects of making a style change.
+ * @property fixedComplicationDataSource Whether or not the complication data source is fixed (i.e.
+ *   can't be changed by the user). This is useful for watch faces built around specific
+ *   complications.
  * @property tapFilter The [ComplicationTapFilter] used to determine whether or not a tap hit the
- * complication slot.
+ *   complication slot.
  */
 public class ComplicationSlot
-@ComplicationExperimental internal constructor(
+@ComplicationExperimental
+internal constructor(
     public val id: Int,
     accessibilityTraversalIndex: Int,
     @ComplicationSlotBoundsType public val boundsType: Int,
@@ -378,19 +381,16 @@
     public val supportedTypes: List<ComplicationType>,
     defaultPolicy: DefaultComplicationDataSourcePolicy,
     defaultDataSourceType: ComplicationType,
-    @get:JvmName("isInitiallyEnabled")
-    public val initiallyEnabled: Boolean,
+    @get:JvmName("isInitiallyEnabled") public val initiallyEnabled: Boolean,
     configExtras: Bundle,
-    @get:JvmName("isFixedComplicationDataSource")
-    public val fixedComplicationDataSource: Boolean,
+    @get:JvmName("isFixedComplicationDataSource") public val fixedComplicationDataSource: Boolean,
     public val tapFilter: ComplicationTapFilter,
     nameResourceId: Int?,
     screenReaderNameResourceId: Int?,
     // TODO(b/230364881): This should really be public but some metalava bug is preventing
     // @ComplicationExperimental from working on the getter so it's currently hidden.
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public val boundingArc: BoundingArc?
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public val boundingArc: BoundingArc?
 ) {
     /**
      * The [ComplicationSlotsManager] this is attached to. Only set after the
@@ -450,33 +450,33 @@
             entries[writeIndex] = entry
         }
 
-        override fun iterator() = object : Iterator<ComplicationDataHistoryEntry> {
-            var iteratorReadIndex = readIndex
+        override fun iterator() =
+            object : Iterator<ComplicationDataHistoryEntry> {
+                var iteratorReadIndex = readIndex
 
-            override fun hasNext() = iteratorReadIndex != writeIndex
+                override fun hasNext() = iteratorReadIndex != writeIndex
 
-            override fun next(): ComplicationDataHistoryEntry {
-                iteratorReadIndex = (iteratorReadIndex + 1) % size
-                return entries[iteratorReadIndex]!!
+                override fun next(): ComplicationDataHistoryEntry {
+                    iteratorReadIndex = (iteratorReadIndex + 1) % size
+                    return entries[iteratorReadIndex]!!
+                }
             }
-        }
     }
 
     /**
      * In userdebug builds maintain a history of the last [MAX_COMPLICATION_HISTORY_ENTRIES]-1
      * complications, which is logged in dumpsys to help debug complication issues.
      */
-    private val complicationHistory = if (Build.TYPE.equals("userdebug")) {
-        RingBuffer(MAX_COMPLICATION_HISTORY_ENTRIES)
-    } else {
-        null
-    }
+    private val complicationHistory =
+        if (Build.TYPE.equals("userdebug")) {
+            RingBuffer(MAX_COMPLICATION_HISTORY_ENTRIES)
+        } else {
+            null
+        }
 
     init {
         require(id >= 0) { "id must be >= 0" }
-        require(accessibilityTraversalIndex >= 0) {
-            "accessibilityTraversalIndex must be >= 0"
-        }
+        require(accessibilityTraversalIndex >= 0) { "accessibilityTraversalIndex must be >= 0" }
     }
 
     public companion object {
@@ -489,18 +489,18 @@
 
         /**
          * Constructs a [Builder] for a complication with bounds type
-         * [ComplicationSlotBoundsType.ROUND_RECT]. This is the most common type of complication. These
-         * can be tapped by the user to trigger the associated intent.
+         * [ComplicationSlotBoundsType.ROUND_RECT]. This is the most common type of complication.
+         * These 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.
+         *   unique within the watch face.
          * @param canvasComplicationFactory The [CanvasComplicationFactory] to supply the
-         * [CanvasComplication] to use for rendering. Note renderers should not be shared between
-         * complicationSlots.
+         *   [CanvasComplication] to use for rendering. Note renderers should not be shared between
+         *   complicationSlots.
          * @param supportedTypes The types of complication supported by this ComplicationSlot. Used
-         * during complication, this list should be non-empty.
+         *   during complication, this list should be non-empty.
          * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select
-         * the initial complication data source when the watch is first installed.
+         *   the initial complication data source when the watch is first installed.
          * @param bounds The complication's [ComplicationSlotBounds].
          */
         @JvmStatic
@@ -510,33 +510,34 @@
             supportedTypes: List<ComplicationType>,
             defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy,
             bounds: ComplicationSlotBounds
-        ): Builder = Builder(
-            id,
-            canvasComplicationFactory,
-            supportedTypes,
-            defaultDataSourcePolicy,
-            ComplicationSlotBoundsType.ROUND_RECT,
-            bounds,
-            RoundRectComplicationTapFilter(),
-            null
-        )
+        ): Builder =
+            Builder(
+                id,
+                canvasComplicationFactory,
+                supportedTypes,
+                defaultDataSourcePolicy,
+                ComplicationSlotBoundsType.ROUND_RECT,
+                bounds,
+                RoundRectComplicationTapFilter(),
+                null
+            )
 
         /**
          * Constructs a [Builder] for a complication with bound type
          * [ComplicationSlotBoundsType.BACKGROUND] whose bounds cover the entire screen. A
          * background complication is for watch faces that wish to have a full screen user
-         * selectable  backdrop. This sort of complication isn't clickable and at most one may be
+         * selectable backdrop. This sort of complication isn't clickable and at most one may be
          * present in the list of complicationSlots.
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         * unique within the watch face.
+         *   unique within the watch face.
          * @param canvasComplicationFactory The [CanvasComplicationFactory] to supply the
-         * [CanvasComplication] to use for rendering. Note renderers should not be shared between
-         * complicationSlots.
+         *   [CanvasComplication] to use for rendering. Note renderers should not be shared between
+         *   complicationSlots.
          * @param supportedTypes The types of complication supported by this ComplicationSlot. Used
-         * during complication, this list should be non-empty.
+         *   during complication, this list should be non-empty.
          * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select
-         * the initial complication data source when the watch is first installed.
+         *   the initial complication data source when the watch is first installed.
          */
         @JvmStatic
         public fun createBackgroundComplicationSlotBuilder(
@@ -544,42 +545,44 @@
             canvasComplicationFactory: CanvasComplicationFactory,
             supportedTypes: List<ComplicationType>,
             defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy
-        ): Builder = Builder(
-            id,
-            canvasComplicationFactory,
-            supportedTypes,
-            defaultDataSourcePolicy,
-            ComplicationSlotBoundsType.BACKGROUND,
-            ComplicationSlotBounds(RectF(0f, 0f, 1f, 1f)),
-            BackgroundComplicationTapFilter(),
-            null
-        )
+        ): Builder =
+            Builder(
+                id,
+                canvasComplicationFactory,
+                supportedTypes,
+                defaultDataSourcePolicy,
+                ComplicationSlotBoundsType.BACKGROUND,
+                ComplicationSlotBounds(RectF(0f, 0f, 1f, 1f)),
+                BackgroundComplicationTapFilter(),
+                null
+            )
 
         /**
          * Constructs a [Builder] for a complication with bounds type
          * [ComplicationSlotBoundsType.EDGE].
          *
          * 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 complicationSlots should have a custom [renderer] with
+         * logic (see [complicationTapFilter]). When tapped the associated intent is dispatched.
+         * Edge complicationSlots should have a custom [renderer] with
          * [CanvasComplication.drawHighlight] overridden.
          *
          * Note hit detection in an editor for [ComplicationSlot]s created with this method is not
          * supported.
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         * unique within the watch face.
+         *   unique within the watch face.
          * @param canvasComplicationFactory The [CanvasComplicationFactory] to supply the
-         * [CanvasComplication] to use for rendering. Note renderers should not be shared between
-         * complicationSlots.
+         *   [CanvasComplication] to use for rendering. Note renderers should not be shared between
+         *   complicationSlots.
          * @param supportedTypes The types of complication supported by this ComplicationSlot. Used
-         * during complication, this list should be non-empty.
+         *   during complication, this list should be non-empty.
          * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select
-         * the initial complication data source when the watch is first installed.
+         *   the initial complication data source when the watch is first installed.
          * @param bounds The complication's [ComplicationSlotBounds]. Its likely the bounding rect
-         * will 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.
+         *   will 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.
          */
         // TODO(b/230364881): Deprecate when BoundingArc is no longer experimental.
         @JvmStatic
@@ -590,32 +593,34 @@
             defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy,
             bounds: ComplicationSlotBounds,
             complicationTapFilter: ComplicationTapFilter
-        ): Builder = Builder(
-            id,
-            canvasComplicationFactory,
-            supportedTypes,
-            defaultDataSourcePolicy,
-            ComplicationSlotBoundsType.EDGE,
-            bounds,
-            complicationTapFilter,
-            null
-        )
+        ): Builder =
+            Builder(
+                id,
+                canvasComplicationFactory,
+                supportedTypes,
+                defaultDataSourcePolicy,
+                ComplicationSlotBoundsType.EDGE,
+                bounds,
+                complicationTapFilter,
+                null
+            )
 
         /**
          * Constructs a [Builder] for a complication with bounds type
          * [ComplicationSlotBoundsType.EDGE], whose contents are contained within [boundingArc].
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         * unique within the watch face.
+         *   unique within the watch face.
          * @param canvasComplicationFactory The [CanvasComplicationFactory] to supply the
-         * [CanvasComplication] to use for rendering. Note renderers should not be shared between
-         * complicationSlots.
+         *   [CanvasComplication] to use for rendering. Note renderers should not be shared between
+         *   complicationSlots.
          * @param supportedTypes The types of complication supported by this ComplicationSlot. Used
-         * during complication, this list should be non-empty.
+         *   during complication, this list should be non-empty.
          * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select
-         * the initial complication data source when the watch is first installed.
+         *   the initial complication data source when the watch is first installed.
          * @param bounds The complication's [ComplicationSlotBounds]. Its likely the bounding rect
-         * will be much larger than the complication and shouldn't directly be used for hit testing.
+         *   will be much larger than the complication and shouldn't directly be used for hit
+         *   testing.
          */
         @JvmStatic
         @JvmOverloads
@@ -627,50 +632,54 @@
             defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy,
             bounds: ComplicationSlotBounds,
             boundingArc: BoundingArc,
-            complicationTapFilter: ComplicationTapFilter = object : ComplicationTapFilter {
-                override fun hitTest(
-                    complicationSlot: ComplicationSlot,
-                    screenBounds: Rect,
-                    x: Int,
-                    y: Int,
-                    @Suppress("UNUSED_PARAMETER") includeMargins: Boolean
-                ) = boundingArc.hitTest(
-                    complicationSlot.computeBounds(screenBounds),
-                    x.toFloat(),
-                    y.toFloat()
-                )
-            }
-        ): Builder = Builder(
-            id,
-            canvasComplicationFactory,
-            supportedTypes,
-            defaultDataSourcePolicy,
-            ComplicationSlotBoundsType.EDGE,
-            bounds,
-            complicationTapFilter,
-            boundingArc
-        )
+            complicationTapFilter: ComplicationTapFilter =
+                object : ComplicationTapFilter {
+                    override fun hitTest(
+                        complicationSlot: ComplicationSlot,
+                        screenBounds: Rect,
+                        x: Int,
+                        y: Int,
+                        @Suppress("UNUSED_PARAMETER") includeMargins: Boolean
+                    ) =
+                        boundingArc.hitTest(
+                            complicationSlot.computeBounds(screenBounds),
+                            x.toFloat(),
+                            y.toFloat()
+                        )
+                }
+        ): Builder =
+            Builder(
+                id,
+                canvasComplicationFactory,
+                supportedTypes,
+                defaultDataSourcePolicy,
+                ComplicationSlotBoundsType.EDGE,
+                bounds,
+                complicationTapFilter,
+                boundingArc
+            )
     }
 
     /**
      * Builder for constructing [ComplicationSlot]s.
      *
      * @param id The watch face's ID for this complication. Can be any integer but should be unique
-     * within the watch face.
+     *   within the watch face.
      * @param canvasComplicationFactory The [CanvasComplicationFactory] to supply the
-     * [CanvasComplication] to use for rendering. Note renderers should not be shared between
-     * complicationSlots.
+     *   [CanvasComplication] to use for rendering. Note renderers should not be shared between
+     *   complicationSlots.
      * @param supportedTypes The types of complication supported by this ComplicationSlot. Used
-     * during complication, this list should be non-empty.
-     * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select
-     * the initial complication data source when the watch is first installed.
+     *   during complication, this list should be non-empty.
+     * @param defaultDataSourcePolicy The [DefaultComplicationDataSourcePolicy] used to select the
+     *   initial complication data source when the watch is first installed.
      * @param boundsType The [ComplicationSlotBoundsType] of the complication.
      * @param bounds The complication's [ComplicationSlotBounds].
      * @param complicationTapFilter The [ComplicationTapFilter] used to perform hit testing for this
-     * complication.
+     *   complication.
      */
     @OptIn(ComplicationExperimental::class)
-    public class Builder internal constructor(
+    public class Builder
+    internal constructor(
         private val id: Int,
         private val canvasComplicationFactory: CanvasComplicationFactory,
         private val supportedTypes: List<ComplicationType>,
@@ -698,9 +707,7 @@
          */
         public fun setAccessibilityTraversalIndex(accessibilityTraversalIndex: Int): Builder {
             this.accessibilityTraversalIndex = accessibilityTraversalIndex
-            require(accessibilityTraversalIndex >= 0) {
-                "accessibilityTraversalIndex must be >= 0"
-            }
+            require(accessibilityTraversalIndex >= 0) { "accessibilityTraversalIndex must be >= 0" }
             return this
         }
 
@@ -713,36 +720,34 @@
             "Instead set DefaultComplicationDataSourcePolicy" +
                 ".systemDataSourceFallbackDefaultType."
         )
-        public fun setDefaultDataSourceType(
-            defaultDataSourceType: ComplicationType
-        ): Builder {
-            defaultDataSourcePolicy = when {
-                defaultDataSourcePolicy.secondaryDataSource != null ->
-                    DefaultComplicationDataSourcePolicy(
-                        defaultDataSourcePolicy.primaryDataSource!!,
-                        defaultDataSourcePolicy.primaryDataSourceDefaultType
-                            ?: defaultDataSourceType,
-                        defaultDataSourcePolicy.secondaryDataSource!!,
-                        defaultDataSourcePolicy.secondaryDataSourceDefaultType
-                            ?: defaultDataSourceType,
-                        defaultDataSourcePolicy.systemDataSourceFallback,
-                        defaultDataSourceType
-                    )
-
-                defaultDataSourcePolicy.primaryDataSource != null ->
-                    DefaultComplicationDataSourcePolicy(
-                        defaultDataSourcePolicy.primaryDataSource!!,
-                        defaultDataSourcePolicy.primaryDataSourceDefaultType
-                            ?: defaultDataSourceType,
-                        defaultDataSourcePolicy.systemDataSourceFallback,
-                        defaultDataSourceType
-                    )
-
-                else -> DefaultComplicationDataSourcePolicy(
-                    defaultDataSourcePolicy.systemDataSourceFallback,
-                    defaultDataSourceType
-                )
-            }
+        public fun setDefaultDataSourceType(defaultDataSourceType: ComplicationType): Builder {
+            defaultDataSourcePolicy =
+                when {
+                    defaultDataSourcePolicy.secondaryDataSource != null ->
+                        DefaultComplicationDataSourcePolicy(
+                            defaultDataSourcePolicy.primaryDataSource!!,
+                            defaultDataSourcePolicy.primaryDataSourceDefaultType
+                                ?: defaultDataSourceType,
+                            defaultDataSourcePolicy.secondaryDataSource!!,
+                            defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                                ?: defaultDataSourceType,
+                            defaultDataSourcePolicy.systemDataSourceFallback,
+                            defaultDataSourceType
+                        )
+                    defaultDataSourcePolicy.primaryDataSource != null ->
+                        DefaultComplicationDataSourcePolicy(
+                            defaultDataSourcePolicy.primaryDataSource!!,
+                            defaultDataSourcePolicy.primaryDataSourceDefaultType
+                                ?: defaultDataSourceType,
+                            defaultDataSourcePolicy.systemDataSourceFallback,
+                            defaultDataSourceType
+                        )
+                    else ->
+                        DefaultComplicationDataSourcePolicy(
+                            defaultDataSourcePolicy.systemDataSourceFallback,
+                            defaultDataSourceType
+                        )
+                }
             this.defaultDataSourceType = defaultDataSourceType
             return this
         }
@@ -765,9 +770,7 @@
             return this
         }
 
-        /**
-         * Whether or not the complication source is fixed (i.e. the user can't change it).
-         */
+        /** Whether or not the complication source is fixed (i.e. the user can't change it). */
         @Suppress("MissingGetterMatchingBuilder")
         public fun setFixedComplicationDataSource(fixedComplicationDataSource: Boolean): Builder {
             this.fixedComplicationDataSource = fixedComplicationDataSource
@@ -777,19 +780,17 @@
         /**
          * If non-null sets the ID of a string resource containing the name of this complication
          * slot, for use visually in an editor. This resource should be short and should not contain
-         * the word "Complication".  E.g. "Left" for the left complication.
+         * the word "Complication". E.g. "Left" for the left complication.
          */
-        public fun setNameResourceId(
-            @Suppress("AutoBoxing") nameResourceId: Int?
-        ): Builder {
+        public fun setNameResourceId(@Suppress("AutoBoxing") nameResourceId: Int?): Builder {
             this.nameResourceId = nameResourceId
             return this
         }
 
         /**
          * If non-null sets the ID of a string resource containing the name of this complication
-         * slot, for use by a screen reader. This resource should be a short sentence. E.g.
-         * "Left complication" for the left complication.
+         * slot, for use by a screen reader. This resource should be a short sentence. E.g. "Left
+         * complication" for the left complication.
          */
         public fun setScreenReaderNameResourceId(
             @Suppress("AutoBoxing") screenReaderNameResourceId: Int?
@@ -799,23 +800,24 @@
         }
 
         /** Constructs the [ComplicationSlot]. */
-        public fun build(): ComplicationSlot = ComplicationSlot(
-            id,
-            accessibilityTraversalIndex,
-            boundsType,
-            bounds,
-            canvasComplicationFactory,
-            supportedTypes,
-            defaultDataSourcePolicy,
-            defaultDataSourceType,
-            initiallyEnabled,
-            configExtras,
-            fixedComplicationDataSource,
-            complicationTapFilter,
-            nameResourceId,
-            screenReaderNameResourceId,
-            boundingArc
-        )
+        public fun build(): ComplicationSlot =
+            ComplicationSlot(
+                id,
+                accessibilityTraversalIndex,
+                boundsType,
+                bounds,
+                canvasComplicationFactory,
+                supportedTypes,
+                defaultDataSourcePolicy,
+                defaultDataSourceType,
+                initiallyEnabled,
+                configExtras,
+                fixedComplicationDataSource,
+                complicationTapFilter,
+                nameResourceId,
+                screenReaderNameResourceId,
+                boundingArc
+            )
     }
 
     internal interface InvalidateListener {
@@ -830,12 +832,11 @@
     /**
      * The complication's [ComplicationSlotBounds] which are converted to pixels during rendering.
      *
-     * Note it's not allowed to change the bounds of a background complication because
-     * they are assumed to always cover the entire screen.
+     * Note it's not allowed to change the bounds of a background complication because they are
+     * assumed to always cover the entire screen.
      */
     public var complicationSlotBounds: ComplicationSlotBounds = bounds
-        @UiThread
-        get
+        @UiThread get
         @UiThread
         internal set(value) {
             require(boundsType != ComplicationSlotBoundsType.BACKGROUND)
@@ -850,9 +851,7 @@
 
     /** Whether or not the complication should be drawn and accept taps. */
     public var enabled: Boolean = initiallyEnabled
-        @JvmName("isEnabled")
-        @UiThread
-        get
+        @JvmName("isEnabled") @UiThread get
         @UiThread
         internal set(value) {
             if (field == value) {
@@ -869,8 +868,7 @@
      * providers selected when the user hasn't yet made a choice. See also [defaultDataSourceType].
      */
     public var defaultDataSourcePolicy: DefaultComplicationDataSourcePolicy = defaultPolicy
-        @UiThread
-        get
+        @UiThread get
         @UiThread
         internal set(value) {
             if (field == value) {
@@ -882,16 +880,12 @@
 
     internal var defaultDataSourceTypeDirty = true
 
-    /**
-     * The default [ComplicationType] to use alongside [defaultDataSourcePolicy].
-     */
+    /** The default [ComplicationType] to use alongside [defaultDataSourcePolicy]. */
     @Deprecated(
-        "Use DefaultComplicationDataSourcePolicy." +
-            "systemDataSourceFallbackDefaultType instead"
+        "Use DefaultComplicationDataSourcePolicy." + "systemDataSourceFallbackDefaultType instead"
     )
     public var defaultDataSourceType: ComplicationType = defaultDataSourceType
-        @UiThread
-        get
+        @UiThread get
         @UiThread
         internal set(value) {
             if (field == value) {
@@ -904,18 +898,15 @@
     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
-     * complicationSlots.  See also [Renderer.additionalContentDescriptionLabels].
+     * 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
+     * complicationSlots. See also [Renderer.additionalContentDescriptionLabels].
      */
     public var accessibilityTraversalIndex: Int = accessibilityTraversalIndex
-        @UiThread
-        get
+        @UiThread get
         @UiThread
         internal set(value) {
-            require(value >= 0) {
-                "accessibilityTraversalIndex must be >= 0"
-            }
+            require(value >= 0) { "accessibilityTraversalIndex must be >= 0" }
             if (field == value) {
                 return
             }
@@ -932,9 +923,7 @@
      * the user selects a complication slot for editing.
      */
     public var nameResourceId: Int? = nameResourceId
-        @Suppress("AutoBoxing")
-        @UiThread
-        get
+        @Suppress("AutoBoxing") @UiThread get
         @UiThread
         internal set(value) {
             require(value != 0)
@@ -948,15 +937,13 @@
     internal var screenReaderNameResourceIdDirty = true
 
     /**
-     * The optional ID of a string resource (or `null` if absent) for use by a
-     * watch face editor to identify the complication slot in a screen reader. While similar to
-     * [nameResourceId] this string can be longer and should be more descriptive. E.g. saying
-     * 'left complication' rather than just 'left'.
+     * The optional ID of a string resource (or `null` if absent) for use by a watch face editor to
+     * identify the complication slot in a screen reader. While similar to [nameResourceId] this
+     * string can be longer and should be more descriptive. E.g. saying 'left complication' rather
+     * than just 'left'.
      */
     public var screenReaderNameResourceId: Int? = screenReaderNameResourceId
-        @Suppress("AutoBoxing")
-        @UiThread
-        get
+        @Suppress("AutoBoxing") @UiThread get
         @UiThread
         internal set(value) {
             if (field == value) {
@@ -1028,9 +1015,9 @@
 
         // If the screen is locked and our policy is to not display it when locked then select
         // screenLockedFallback instead.
-        if ((best.displayPolicy and
-                ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED) != 0 &&
-            complicationSlotsManager.watchState.isLocked.value
+        if (
+            (best.displayPolicy and ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED) !=
+                0 && complicationSlotsManager.watchState.isLocked.value
         ) {
             best = screenLockedFallback // This is NoDataComplicationData.
         }
@@ -1103,7 +1090,6 @@
                     boundingArc
                 )
             }
-
             is HighlightedElement.ComplicationSlot -> {
                 if (highlightedElement.id == id) {
                     renderer.drawHighlight(
@@ -1116,11 +1102,9 @@
                     )
                 }
             }
-
             is HighlightedElement.UserStyle -> {
                 // Nothing
             }
-
             null -> {
                 // Nothing
             }
@@ -1142,7 +1126,7 @@
      *
      * @param screen A [Rect] describing the dimensions of the screen.
      * @param complicationType The [ComplicationType] to use when looking up the slot's
-     * [ComplicationSlotBounds.perComplicationTypeBounds].
+     *   [ComplicationSlotBounds.perComplicationTypeBounds].
      * @param applyMargins Whether or not the margins should be applied to the computed [Rect].
      * @hide
      */
@@ -1184,10 +1168,8 @@
      * @param applyMargins Whether or not the margins should be applied to the computed [Rect].
      */
     @JvmOverloads
-    public fun computeBounds(
-        screen: Rect,
-        applyMargins: Boolean = false
-    ): Rect = computeBounds(screen, complicationData.value.type, applyMargins)
+    public fun computeBounds(screen: Rect, applyMargins: Boolean = false): Rect =
+        computeBounds(screen, complicationData.value.type, applyMargins)
 
     @UiThread
     internal fun dump(writer: IndentingPrintWriter) {
@@ -1225,8 +1207,7 @@
         writer.println("timelineComplicationData=$timelineComplicationData")
         writer.println("timelineEntries=" + timelineEntries?.joinToString())
         writer.println("data=${renderer.getData()}")
-        @OptIn(ComplicationExperimental::class)
-        writer.println("boundingArc=$boundingArc")
+        @OptIn(ComplicationExperimental::class) writer.println("boundingArc=$boundingArc")
         writer.println("complicationSlotBounds=$complicationSlotBounds")
         writer.println("lastComplicationUpdate=$lastComplicationUpdate")
         writer.println("data history")
@@ -1253,15 +1234,15 @@
         if (complicationSlotBounds != other.complicationSlotBounds) return false
         if (
             supportedTypes.size != other.supportedTypes.size ||
-            !supportedTypes.containsAll(other.supportedTypes)
-        ) return false
+                !supportedTypes.containsAll(other.supportedTypes)
+        )
+            return false
         if (defaultDataSourcePolicy != other.defaultDataSourcePolicy) return false
         if (initiallyEnabled != other.initiallyEnabled) return false
         if (fixedComplicationDataSource != other.fixedComplicationDataSource) return false
         if (nameResourceId != other.nameResourceId) return false
         if (screenReaderNameResourceId != other.screenReaderNameResourceId) return false
-        @OptIn(ComplicationExperimental::class)
-        if (boundingArc != other.boundingArc) return false
+        @OptIn(ComplicationExperimental::class) if (boundingArc != other.boundingArc) return false
 
         return true
     }
@@ -1269,10 +1250,17 @@
     override fun hashCode(): Int {
         @OptIn(ComplicationExperimental::class)
         return Objects.hash(
-            id, accessibilityTraversalIndex, boundsType, complicationSlotBounds,
+            id,
+            accessibilityTraversalIndex,
+            boundsType,
+            complicationSlotBounds,
             supportedTypes.sorted(),
-            defaultDataSourcePolicy, initiallyEnabled, fixedComplicationDataSource,
-            nameResourceId, screenReaderNameResourceId, boundingArc
+            defaultDataSourcePolicy,
+            initiallyEnabled,
+            fixedComplicationDataSource,
+            nameResourceId,
+            screenReaderNameResourceId,
+            boundingArc
         )
     }
 }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotInflationFactory.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotInflationFactory.kt
index 5215aa9..c00ba43 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotInflationFactory.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotInflationFactory.kt
@@ -34,4 +34,4 @@
     open fun getEdgeComplicationTapFilter(slotId: Int): ComplicationTapFilter {
         throw UnsupportedOperationException("You need to override getEdgeComplicationTapFilter")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
index a693dc2..ea17261 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
@@ -33,21 +33,19 @@
 import androidx.wear.watchface.complications.data.ComplicationData
 import androidx.wear.watchface.complications.data.ComplicationExperimental
 import androidx.wear.watchface.complications.data.ComplicationType
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat
 import androidx.wear.watchface.data.ComplicationStateWireFormat
 import androidx.wear.watchface.data.IdAndComplicationStateWireFormat
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
+import androidx.wear.watchface.utility.TraceEvent
+import java.time.Instant
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
-import java.time.Instant
 
-private fun getComponentName(context: Context) = ComponentName(
-    context.packageName,
-    context.javaClass.name
-)
+private fun getComponentName(context: Context) =
+    ComponentName(context.packageName, context.javaClass.name)
 
 /**
  * The [ComplicationSlot]s associated with the [WatchFace]. Dynamic creation of ComplicationSlots
@@ -55,9 +53,9 @@
  * [ComplicationSlotsUserStyleSetting].
  *
  * @param complicationSlotCollection The [ComplicationSlot]s associated with the watch face, may be
- * empty.
+ *   empty.
  * @param currentUserStyleRepository The [CurrentUserStyleRepository] used to listen for
- * [ComplicationSlotsUserStyleSetting] changes and apply them.
+ *   [ComplicationSlotsUserStyleSetting] changes and apply them.
  */
 public class ComplicationSlotsManager(
     complicationSlotCollection: Collection<ComplicationSlot>,
@@ -172,9 +170,7 @@
             )
 
         // Apply the initial settings on the worker thread.
-        previousOption?.let {
-            applyComplicationSlotsStyleCategoryOption(it)
-        }
+        previousOption?.let { applyComplicationSlotsStyleCategoryOption(it) }
 
         // Add a listener so we can track changes and automatically apply them on the UIThread
         coroutineScope.launch {
@@ -201,27 +197,31 @@
     internal fun init(
         renderer: Renderer,
         complicationSlotInvalidateListener: ComplicationSlot.InvalidateListener
-    ) = TraceEvent("ComplicationSlotsManager.init").use {
-        this.renderer = renderer
+    ) =
+        TraceEvent("ComplicationSlotsManager.init").use {
+            this.renderer = renderer
 
-        for ((_, complication) in complicationSlots) {
-            complication.init(complicationSlotInvalidateListener, renderer.watchState.isHeadless)
+            for ((_, complication) in complicationSlots) {
+                complication.init(
+                    complicationSlotInvalidateListener,
+                    renderer.watchState.isHeadless
+                )
 
-            // Force lazy construction of renderers.
-            complication.renderer.onRendererCreated(renderer)
+                // Force lazy construction of renderers.
+                complication.renderer.onRendererCreated(renderer)
+            }
+
+            require(
+                complicationSlots.values.distinctBy { it.renderer }.size ==
+                    complicationSlots.values.size
+            ) {
+                "Complication renderer instances are not sharable."
+            }
+
+            // Activate complicationSlots.
+            onComplicationsUpdated()
         }
 
-        require(
-            complicationSlots.values.distinctBy { it.renderer }.size ==
-                complicationSlots.values.size
-        ) {
-            "Complication renderer instances are not sharable."
-        }
-
-        // Activate complicationSlots.
-        onComplicationsUpdated()
-    }
-
     internal fun applyComplicationSlotsStyleCategoryOption(styleOption: ComplicationSlotsOption) {
         for ((id, complication) in complicationSlots) {
             val override = styleOption.complicationSlotOverlays.find { it.complicationSlotId == id }
@@ -229,8 +229,7 @@
             // Apply styleOption overrides.
             complication.complicationSlotBounds =
                 override?.complicationSlotBounds ?: initialConfig.complicationSlotBounds
-            complication.enabled =
-                override?.enabled ?: initialConfig.enabled
+            complication.enabled = override?.enabled ?: initialConfig.enabled
             complication.accessibilityTraversalIndex =
                 override?.accessibilityTraversalIndex ?: initialConfig.accessibilityTraversalIndex
             complication.nameResourceId = override?.nameResourceId ?: initialConfig.nameResourceId
@@ -244,71 +243,73 @@
     public operator fun get(id: Int): ComplicationSlot? = complicationSlots[id]
 
     @UiThread
-    internal fun onComplicationsUpdated() = TraceEvent(
-        "ComplicationSlotsManager.updateComplications"
-    ).use {
-        if (!this::watchFaceHostApi.isInitialized) {
-            return
-        }
-        val activeKeys = mutableListOf<Int>()
+    internal fun onComplicationsUpdated() =
+        TraceEvent("ComplicationSlotsManager.updateComplications").use {
+            if (!this::watchFaceHostApi.isInitialized) {
+                return
+            }
+            val activeKeys = mutableListOf<Int>()
 
-        // Work out what's changed using the dirty flags and issue appropriate watchFaceHostApi
-        // calls.
-        var enabledDirty = false
-        var labelsDirty = false
-        for ((id, complication) in complicationSlots) {
-            enabledDirty = enabledDirty || complication.enabledDirty
-            labelsDirty = labelsDirty || complication.enabledDirty
+            // Work out what's changed using the dirty flags and issue appropriate watchFaceHostApi
+            // calls.
+            var enabledDirty = false
+            var labelsDirty = false
+            for ((id, complication) in complicationSlots) {
+                enabledDirty = enabledDirty || complication.enabledDirty
+                labelsDirty = labelsDirty || complication.enabledDirty
 
-            if (complication.enabled) {
-                activeKeys.add(id)
+                if (complication.enabled) {
+                    activeKeys.add(id)
 
-                labelsDirty =
-                    labelsDirty || complication.dataDirty || complication.complicationBoundsDirty ||
-                        complication.accessibilityTraversalIndexDirty ||
-                        complication.nameResourceIdDirty ||
-                        complication.screenReaderNameResourceIdDirty
+                    labelsDirty =
+                        labelsDirty ||
+                            complication.dataDirty ||
+                            complication.complicationBoundsDirty ||
+                            complication.accessibilityTraversalIndexDirty ||
+                            complication.nameResourceIdDirty ||
+                            complication.screenReaderNameResourceIdDirty
 
-                if (complication.defaultDataSourcePolicyDirty ||
-                    complication.defaultDataSourceTypeDirty
-                ) {
-                    // Note this is a NOP in the androidx flow.
-                    watchFaceHostApi.setDefaultComplicationDataSourceWithFallbacks(
-                        complication.id,
-                        complication.defaultDataSourcePolicy.dataSourcesAsList(),
-                        complication.defaultDataSourcePolicy.systemDataSourceFallback,
-                        complication.defaultDataSourcePolicy
-                            .systemDataSourceFallbackDefaultType.toWireComplicationType()
-                    )
+                    if (
+                        complication.defaultDataSourcePolicyDirty ||
+                            complication.defaultDataSourceTypeDirty
+                    ) {
+                        // Note this is a NOP in the androidx flow.
+                        watchFaceHostApi.setDefaultComplicationDataSourceWithFallbacks(
+                            complication.id,
+                            complication.defaultDataSourcePolicy.dataSourcesAsList(),
+                            complication.defaultDataSourcePolicy.systemDataSourceFallback,
+                            complication.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                                .toWireComplicationType()
+                        )
+                    }
+
+                    complication.dataDirty = false
+                    complication.complicationBoundsDirty = false
+                    complication.defaultDataSourcePolicyDirty = false
+                    complication.defaultDataSourceTypeDirty = false
+                    complication.accessibilityTraversalIndexDirty = false
+                    complication.nameResourceIdDirty = false
+                    complication.screenReaderNameResourceIdDirty = false
                 }
 
-                complication.dataDirty = false
-                complication.complicationBoundsDirty = false
-                complication.defaultDataSourcePolicyDirty = false
-                complication.defaultDataSourceTypeDirty = false
-                complication.accessibilityTraversalIndexDirty = false
-                complication.nameResourceIdDirty = false
-                complication.screenReaderNameResourceIdDirty = false
+                complication.enabledDirty = false
             }
 
-            complication.enabledDirty = false
-        }
+            if (enabledDirty) {
+                watchFaceHostApi.setActiveComplicationSlots(activeKeys.toIntArray())
+            }
 
-        if (enabledDirty) {
-            watchFaceHostApi.setActiveComplicationSlots(activeKeys.toIntArray())
+            if (labelsDirty) {
+                watchFaceHostApi.updateContentDescriptionLabels()
+            }
         }
 
-        if (labelsDirty) {
-            watchFaceHostApi.updateContentDescriptionLabels()
-        }
-    }
-
     /**
      * Called when new complication data is received.
      *
-     * @param complicationSlotId 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 complicationSlotId 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
@@ -326,8 +327,7 @@
             )
             return
         }
-        complication.dataDirty = complication.dataDirty ||
-            (complication.renderer.getData() != data)
+        complication.dataDirty = complication.dataDirty || (complication.renderer.getData() != data)
         complication.setComplicationData(data, true, instant)
     }
 
@@ -378,22 +378,25 @@
      */
     public fun getComplicationSlotAt(@Px x: Int, @Px y: Int): ComplicationSlot? =
         findLowestIdMatchingComplicationOrNull { complication ->
-            complication.enabled && complication.tapFilter.hitTest(
-                complication,
-                renderer.screenBounds,
-                x,
-                y,
-                includeMargins = false
-            )
-        } ?: findLowestIdMatchingComplicationOrNull { complication ->
-            complication.enabled && complication.tapFilter.hitTest(
-                complication,
-                renderer.screenBounds,
-                x,
-                y,
-                includeMargins = true
-            )
+            complication.enabled &&
+                complication.tapFilter.hitTest(
+                    complication,
+                    renderer.screenBounds,
+                    x,
+                    y,
+                    includeMargins = false
+                )
         }
+            ?: findLowestIdMatchingComplicationOrNull { complication ->
+                complication.enabled &&
+                    complication.tapFilter.hitTest(
+                        complication,
+                        renderer.screenBounds,
+                        x,
+                        y,
+                        includeMargins = true
+                    )
+            }
 
     /**
      * Finds the [ComplicationSlot] with the lowest id for which [predicate] returns true, returns
@@ -419,9 +422,9 @@
      * @return The background [ComplicationSlot] if there is one or `null` otherwise
      */
     public fun getBackgroundComplicationSlot(): ComplicationSlot? =
-        complicationSlots.entries.firstOrNull {
-            it.value.boundsType == ComplicationSlotBoundsType.BACKGROUND
-        }?.value
+        complicationSlots.entries
+            .firstOrNull { it.value.boundsType == ComplicationSlotBoundsType.BACKGROUND }
+            ?.value
 
     /**
      * Called when the user single taps on a [ComplicationSlot], invokes the permission request
@@ -435,14 +438,17 @@
         // Check if the complication is missing permissions.
         val data = complicationSlots[complicationSlotId]?.renderer?.getData() ?: return
         if (data.type == ComplicationType.NO_PERMISSION) {
-            watchFaceHostApi.getContext().startActivity(
-                ComplicationHelperActivity.createPermissionRequestHelperIntent(
-                    watchFaceHostApi.getContext(),
-                    getComponentName(watchFaceHostApi.getContext()),
-                    watchFaceHostApi.getComplicationDeniedIntent(),
-                    watchFaceHostApi.getComplicationRationaleIntent()
-                ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-            )
+            watchFaceHostApi
+                .getContext()
+                .startActivity(
+                    ComplicationHelperActivity.createPermissionRequestHelperIntent(
+                            watchFaceHostApi.getContext(),
+                            getComponentName(watchFaceHostApi.getContext()),
+                            watchFaceHostApi.getComplicationDeniedIntent(),
+                            watchFaceHostApi.getComplicationRationaleIntent()
+                        )
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                )
             return
         }
 
@@ -463,35 +469,38 @@
      */
     @OptIn(ComplicationExperimental::class)
     @UiThread
-    internal fun getComplicationsState(screenBounds: Rect) = complicationSlots.map {
-        val systemDataSourceFallbackDefaultType =
-            it.value.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
-                .toWireComplicationType()
-        IdAndComplicationStateWireFormat(
-            it.key,
-            ComplicationStateWireFormat(
-                it.value.computeBounds(screenBounds, applyMargins = false),
-                it.value.computeBounds(screenBounds, applyMargins = true),
-                it.value.boundsType,
-                ComplicationType.toWireTypes(it.value.supportedTypes),
-                it.value.defaultDataSourcePolicy.dataSourcesAsList(),
-                it.value.defaultDataSourcePolicy.systemDataSourceFallback,
-                systemDataSourceFallbackDefaultType,
-                it.value.defaultDataSourcePolicy.primaryDataSourceDefaultType
-                    ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType,
-                it.value.defaultDataSourcePolicy.secondaryDataSourceDefaultType
-                    ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType,
-                it.value.enabled,
-                it.value.initiallyEnabled,
-                it.value.renderer.getData().type.toWireComplicationType(),
-                it.value.fixedComplicationDataSource,
-                it.value.configExtras,
-                it.value.nameResourceId,
-                it.value.screenReaderNameResourceId,
-                it.value.boundingArc?.toWireFormat()
+    internal fun getComplicationsState(screenBounds: Rect) =
+        complicationSlots.map {
+            val systemDataSourceFallbackDefaultType =
+                it.value.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                    .toWireComplicationType()
+            IdAndComplicationStateWireFormat(
+                it.key,
+                ComplicationStateWireFormat(
+                    it.value.computeBounds(screenBounds, applyMargins = false),
+                    it.value.computeBounds(screenBounds, applyMargins = true),
+                    it.value.boundsType,
+                    ComplicationType.toWireTypes(it.value.supportedTypes),
+                    it.value.defaultDataSourcePolicy.dataSourcesAsList(),
+                    it.value.defaultDataSourcePolicy.systemDataSourceFallback,
+                    systemDataSourceFallbackDefaultType,
+                    it.value.defaultDataSourcePolicy.primaryDataSourceDefaultType
+                        ?.toWireComplicationType()
+                        ?: systemDataSourceFallbackDefaultType,
+                    it.value.defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                        ?.toWireComplicationType()
+                        ?: systemDataSourceFallbackDefaultType,
+                    it.value.enabled,
+                    it.value.initiallyEnabled,
+                    it.value.renderer.getData().type.toWireComplicationType(),
+                    it.value.fixedComplicationDataSource,
+                    it.value.configExtras,
+                    it.value.nameResourceId,
+                    it.value.screenReaderNameResourceId,
+                    it.value.boundingArc?.toWireFormat()
+                )
             )
-        )
-    }
+        }
 
     @UiThread
     internal fun onTapDown(complicationSlotId: Int, tapEvent: TapEvent) {
@@ -507,9 +516,7 @@
         complicationListeners.add(tapCallback)
     }
 
-    /**
-     * Removes a [TapCallback] previously added by [addTapListener].
-     */
+    /** Removes a [TapCallback] previously added by [addTapListener]. */
     @UiThread
     public fun removeTapListener(tapCallback: TapCallback) {
         complicationListeners.remove(tapCallback)
@@ -519,9 +526,10 @@
     internal fun dump(writer: IndentingPrintWriter) {
         writer.println("ComplicationSlotsManager:")
         writer.println(
-            "lastComplicationTapDownEvents=" + lastComplicationTapDownEvents.map {
-                it.key.toString() + "->" + it.value
-            }.joinToString(", ")
+            "lastComplicationTapDownEvents=" +
+                lastComplicationTapDownEvents
+                    .map { it.key.toString() + "->" + it.value }
+                    .joinToString(", ")
         )
         writer.increaseIndent()
         for ((_, complication) in complicationSlots) {
@@ -537,15 +545,17 @@
      */
     @WorkerThread
     internal fun getDefaultProviderPolicies(): Array<IdTypeAndDefaultProviderPolicyWireFormat> =
-        complicationSlots.map {
-            IdTypeAndDefaultProviderPolicyWireFormat(
-                it.key,
-                it.value.defaultDataSourcePolicy.dataSourcesAsList(),
-                it.value.defaultDataSourcePolicy.systemDataSourceFallback,
-                it.value.defaultDataSourcePolicy
-                    .systemDataSourceFallbackDefaultType.toWireComplicationType()
-            )
-        }.toTypedArray()
+        complicationSlots
+            .map {
+                IdTypeAndDefaultProviderPolicyWireFormat(
+                    it.key,
+                    it.value.defaultDataSourcePolicy.dataSourcesAsList(),
+                    it.value.defaultDataSourcePolicy.systemDataSourceFallback,
+                    it.value.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                        .toWireComplicationType()
+                )
+            }
+            .toTypedArray()
 
     /**
      * Returns the earliest [Instant] after [afterInstant] at which any complication field in any
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt
index bc87a3b..b9163d4 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt
@@ -28,8 +28,7 @@
  *
  * @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.
+ * @param tapAction [PendingIntent] to be used if the screen reader's user triggers a tap action.
  */
 public class ContentDescriptionLabel(
     public val text: ComplicationText,
@@ -52,10 +51,6 @@
             tapAction == other.tapAction
 
     override fun hashCode(): Int {
-        return Objects.hash(
-            text,
-            bounds,
-            tapAction
-        )
+        return Objects.hash(text, bounds, tapAction)
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
index 46db63b..cd27109 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
@@ -21,22 +21,20 @@
 import java.io.Writer
 
 /**
- * Lightweight wrapper around [java.io.PrintWriter] that automatically indents newlines based
- * on internal state.
+ * 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.
  */
-internal class IndentingPrintWriter(
-    writer: Writer,
-    private val singleIndent: String = "\t"
-) : Printer {
+internal class IndentingPrintWriter(writer: Writer, private val singleIndent: String = "\t") :
+    Printer {
     internal val writer: PrintWriter = PrintWriter(writer)
 
-    /** Mutable version of current indent  */
+    /** Mutable version of current indent */
     private val indentBuilder = StringBuilder()
 
-    /** Cache of current [indentBuilder] value  */
+    /** Cache of current [indentBuilder] value */
     private var currentIndent: CharArray? = null
 
     /**
@@ -45,32 +43,32 @@
      */
     private var emptyLine = true
 
-    /** Increases the indentation level for future lines.  */
+    /** Increases the indentation level for future lines. */
     fun increaseIndent() {
         indentBuilder.append(singleIndent)
         currentIndent = null
     }
 
-    /** Decreases the indentation level for future lines.  */
+    /** Decreases the indentation level for future lines. */
     fun decreaseIndent() {
         indentBuilder.delete(0, singleIndent.length)
         currentIndent = null
     }
 
-    /** Prints `string`, followed by a newline.  */
+    /** Prints `string`, followed by a newline. */
     // Printer
     override fun println(string: String) {
         print(string)
         print("\n")
     }
 
-    /** Prints `string`, or `"null"`  */
+    /** Prints `string`, or `"null"` */
     fun print(string: String?) {
         val str = string ?: "null"
         write(str, 0, str.length)
     }
 
-    /** Ensures that all pending data is sent out to the target  */
+    /** Ensures that all pending data is sent out to the target */
     fun flush() {
         writer.flush()
     }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
index fbc24f5..dbe6f3f 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
@@ -25,18 +25,15 @@
 import java.nio.ByteOrder
 import java.nio.FloatBuffer
 
-/**
- * Whether to check for GL errors. This is slow, so not appropriate for production builds.
- */
+/** 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:
- *
+ * 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>
@@ -55,8 +52,7 @@
             errorString = GLUtils.getEGLErrorString(error)
         }
         val message =
-            glOperation + " caused GL error 0x" + Integer.toHexString(error) +
-                ": " + errorString
+            glOperation + " caused GL error 0x" + Integer.toHexString(error) + ": " + errorString
         Log.e(TAG, message)
         throw RuntimeException(message)
     }
@@ -66,66 +62,40 @@
  * 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,
+internal class RenderBufferTexture(@Px private val width: Int, @Px private val height: Int) {
 
-    @Px
-    private val height: Int
-) {
     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,
+    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
+            ),
 
-            -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
+            // 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
@@ -142,16 +112,8 @@
             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.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,
@@ -221,9 +183,7 @@
     }
 }
 
-/**
- * A list of triangles drawn with a texture using OpenGL ES 2.0.
- */
+/** A list of triangles drawn with a texture using OpenGL ES 2.0. */
 internal class Gles2TexturedTriangleList(
     internal val program: Program,
     triangleCoords: FloatArray,
@@ -234,10 +194,8 @@
             ("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"
-                )
+            ("must be multiple of VERTICES_PER_TRIANGLE * NUM_TEXTURE_COMPONENTS texture " +
+                "coordinates")
         }
     }
 
@@ -245,7 +203,8 @@
     private val vertexBuffer =
         ByteBuffer.allocateDirect(triangleCoords.size * BYTES_PER_FLOAT)
             .apply { order(ByteOrder.nativeOrder()) }
-            .asFloatBuffer().apply {
+            .asFloatBuffer()
+            .apply {
                 put(triangleCoords)
                 position(0)
             }
@@ -254,64 +213,63 @@
     private val textureCoordsBuffer =
         ByteBuffer.allocateDirect(textureCoords.size * BYTES_PER_FLOAT)
             .apply { order(ByteOrder.nativeOrder()) }
-            .asFloatBuffer().apply {
+            .asFloatBuffer()
+            .apply {
                 put(textureCoords)
                 position(0)
             }
 
-    /** Number of coordinates in this triangle list.  */
+    /** Number of coordinates in this triangle list. */
     private val numCoords = triangleCoords.size / COORDS_PER_VERTEX
 
-    /**
-     * Draws this triangle list using OpenGL commands.
-     */
+    /** 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"
-        )
+        if (CHECK_GL_ERRORS) checkGlError("glDrawArrays")
 
         program.unbindAttribs()
     }
 
-    /** OpenGL shaders for drawing textured triangle lists.  */
+    /** OpenGL shaders for drawing textured triangle lists. */
     internal class Program {
-        /** ID OpenGL uses to identify this program.  */
+        /** ID OpenGL uses to identify this program. */
         private val programId: Int
 
-        /** Handle for aPosition attribute in vertex shader.  */
+        /** Handle for aPosition attribute in vertex shader. */
         private val positionHandle: Int
 
-        /** Handle for aTextureCoordinate uniform in fragment shader.  */
+        /** 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"
+            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"
+            /** 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.
+         * Tells OpenGL to use this program. Call this method before drawing a sequence of triangle
+         * lists.
          */
         fun bindProgramAndAttribs() {
             GLES20.glUseProgram(programId)
@@ -343,11 +301,8 @@
             }
         }
 
-        /** Sends the given MVP matrix, vertex data, and color to OpenGL.  */
-        fun bind(
-            vertexBuffer: FloatBuffer?,
-            textureCoordinatesBuffer: FloatBuffer?
-        ) {
+        /** 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,
@@ -381,20 +336,12 @@
          */
         init {
             // Prepare shaders.
-            val vertexShader = loadShader(
-                GLES20.GL_VERTEX_SHADER,
-                VERTEX_SHADER_CODE
-            )
-            val fragmentShader = loadShader(
-                GLES20.GL_FRAGMENT_SHADER,
-                FRAGMENT_SHADER_CODE
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCreateProgram")
             check(programId != 0) { "glCreateProgram failed" }
 
             // Add the shaders to the program.
@@ -417,8 +364,7 @@
             }
 
             // Get a handle to vertex shader's aUV attribute.
-            textureCoordinateHandle =
-                GLES20.glGetAttribLocation(programId, "aTextureCoordinate")
+            textureCoordinateHandle = GLES20.glGetAttribLocation(programId, "aTextureCoordinate")
             if (CHECK_GL_ERRORS) {
                 checkGlError("glGetAttribLocation textureCoordinateHandle")
             }
@@ -432,19 +378,19 @@
     }
 
     internal companion object {
-        /** Number of coordinates per vertex in this array: one for each of x, y, and z.  */
+        /** 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.  */
+        /** Number of bytes to store a float in GL. */
         const val BYTES_PER_FLOAT = 4
 
-        /** Number of bytes per vertex.  */
+        /** Number of bytes per vertex. */
         private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT
 
-        /** Number of bytes per vertex for texture coords.  */
+        /** 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. */
@@ -460,21 +406,15 @@
         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"
-            )
+            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"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glShaderSource")
             GLES20.glCompileShader(shader)
-            if (CHECK_GL_ERRORS) checkGlError(
-                "glCompileShader"
-            )
+            if (CHECK_GL_ERRORS) checkGlError("glCompileShader")
             return shader
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
index b6e4527..e86f82d 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
@@ -22,8 +22,8 @@
 import androidx.wear.watchface.RenderParameters.HighlightLayer
 import androidx.wear.watchface.data.IdAndTapEventWireFormat
 import androidx.wear.watchface.data.RenderParametersWireFormat
-import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyleSetting
+import androidx.wear.watchface.style.WatchFaceLayer
 import java.time.Instant
 
 /* Used to parameterize watch face drawing based on the current system state. */
@@ -36,14 +36,12 @@
     INTERACTIVE,
 
     /**
-     * This mode is used when the user is interacting with the watch face but the battery is
-     * low, the watch face should render fewer pixels, ideally with darker colors.
+     * This mode is used when the user is interacting with the watch face but the battery is low,
+     * the watch face should render fewer pixels, ideally with darker colors.
      */
     LOW_BATTERY_INTERACTIVE,
 
-    /**
-     * This mode is used when there's an interruption filter. The watch face should look muted.
-     */
+    /** This mode is used when there's an interruption filter. The watch face should look muted. */
     MUTE,
 
     /**
@@ -62,9 +60,9 @@
  *
  * Watch face rendering is split up in a number of layers: the base layer [WatchFaceLayer.BASE], the
  * [ComplicationSlot]s layer [WatchFaceLayer.COMPLICATIONS], and the layer above the
- * complicationSlots [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.
+ * complicationSlots [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 [ComplicationSlot]s (which may be a single
@@ -73,7 +71,7 @@
  * The watch face should provide a way to highlight any of the above combinations so that its own
  * editor, or the one provided by the Wear OS companion phone app is able to highlight the editable
  * part of the watch face to the user. If an individual user style setting is meant to affect the
- * entire watch face (e.g. an overall color setting),then  the entire watch face should be
+ * entire watch face (e.g. an overall color setting),then the entire watch face should be
  * highlighted.
  *
  * The watch face layers and highlight layer can be configured independently, so that it is possible
@@ -85,13 +83,15 @@
  *
  * @param drawMode The overall drawing parameters based on system state.
  * @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`.
+ * @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`.
  * @param lastComplicationTapDownEvents Map of [ComplicationSlot] id to the latest [TapType.DOWN]
- * [TapEvent] that ComplicationSlot received, if any.
+ *   [TapEvent] that ComplicationSlot received, if any.
  */
-public class RenderParameters @JvmOverloads constructor(
+public class RenderParameters
+@JvmOverloads
+constructor(
     public val drawMode: DrawMode,
     public val watchFaceLayers: Set<WatchFaceLayer>,
     public val highlightLayer: HighlightLayer? = null,
@@ -105,7 +105,7 @@
      * for screenshots.
      */
     public var isForScreenshot: Boolean = false
-      internal set
+        internal set
 
     init {
         require(watchFaceLayers.isNotEmpty() || highlightLayer != null) {
@@ -169,8 +169,8 @@
      * The highlight layer is used by editors to show the parts of the watch face affected by a
      * setting. E.g. a set of [ComplicationSlot]s 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
+     * 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.
@@ -178,18 +178,12 @@
      * @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.
+     *   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
+        @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
@@ -221,7 +215,9 @@
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public constructor(wireFormat: RenderParametersWireFormat) : this(
+    public constructor(
+        wireFormat: RenderParametersWireFormat
+    ) : this(
         DrawMode.values()[wireFormat.drawMode],
         HashSet<WatchFaceLayer>().apply {
             WatchFaceLayer.values().forEachIndexed { index, layer ->
@@ -232,7 +228,6 @@
         },
         when (wireFormat.elementType) {
             RenderParametersWireFormat.ELEMENT_TYPE_NONE -> null
-
             RenderParametersWireFormat.ELEMENT_TYPE_ALL_COMPLICATIONS -> {
                 HighlightLayer(
                     HighlightedElement.AllComplicationSlots,
@@ -240,7 +235,6 @@
                     wireFormat.backgroundTint
                 )
             }
-
             RenderParametersWireFormat.ELEMENT_TYPE_COMPLICATION -> {
                 HighlightLayer(
                     HighlightedElement.ComplicationSlot(wireFormat.elementComplicationSlotId),
@@ -248,7 +242,6 @@
                     wireFormat.backgroundTint
                 )
             }
-
             RenderParametersWireFormat.ELEMENT_TYPE_USER_STYLE -> {
                 HighlightLayer(
                     HighlightedElement.UserStyle(
@@ -258,69 +251,71 @@
                     wireFormat.backgroundTint
                 )
             }
-
             else -> null
         },
         wireFormat.idAndTapEventWireFormat?.associate {
             Pair(it.id, TapEvent(it.x, it.y, Instant.ofEpochMilli(it.calendarTapTimeMillis)))
-        } ?: emptyMap()
+        }
+            ?: emptyMap()
     )
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireFormat(): RenderParametersWireFormat {
-        val idAndTapEventWireFormats = lastComplicationTapDownEvents.map {
-            IdAndTapEventWireFormat(
-                it.key,
-                it.value.xPos,
-                it.value.yPos,
-                it.value.tapTime.toEpochMilli()
-            )
-        }
+        val idAndTapEventWireFormats =
+            lastComplicationTapDownEvents.map {
+                IdAndTapEventWireFormat(
+                    it.key,
+                    it.value.xPos,
+                    it.value.yPos,
+                    it.value.tapTime.toEpochMilli()
+                )
+            }
         return when (val thingHighlighted = highlightLayer?.highlightedElement) {
-            is HighlightedElement.AllComplicationSlots -> RenderParametersWireFormat(
-                drawMode.ordinal,
-                computeLayersBitfield(),
-                RenderParametersWireFormat.ELEMENT_TYPE_ALL_COMPLICATIONS,
-                0,
-                null,
-                highlightLayer!!.highlightTint,
-                highlightLayer.backgroundTint,
-                idAndTapEventWireFormats
-            )
-
-            is HighlightedElement.ComplicationSlot -> RenderParametersWireFormat(
-                drawMode.ordinal,
-                computeLayersBitfield(),
-                RenderParametersWireFormat.ELEMENT_TYPE_COMPLICATION,
-                thingHighlighted.id,
-                null,
-                highlightLayer!!.highlightTint,
-                highlightLayer.backgroundTint,
-                idAndTapEventWireFormats
-            )
-
-            is HighlightedElement.UserStyle -> RenderParametersWireFormat(
-                drawMode.ordinal,
-                computeLayersBitfield(),
-                RenderParametersWireFormat.ELEMENT_TYPE_USER_STYLE,
-                0,
-                thingHighlighted.id.value,
-                highlightLayer!!.highlightTint,
-                highlightLayer.backgroundTint,
-                idAndTapEventWireFormats
-            )
-
-            else -> RenderParametersWireFormat(
-                drawMode.ordinal,
-                computeLayersBitfield(),
-                RenderParametersWireFormat.ELEMENT_TYPE_NONE,
-                0,
-                null,
-                Color.BLACK,
-                Color.BLACK,
-                idAndTapEventWireFormats
-            )
+            is HighlightedElement.AllComplicationSlots ->
+                RenderParametersWireFormat(
+                    drawMode.ordinal,
+                    computeLayersBitfield(),
+                    RenderParametersWireFormat.ELEMENT_TYPE_ALL_COMPLICATIONS,
+                    0,
+                    null,
+                    highlightLayer!!.highlightTint,
+                    highlightLayer.backgroundTint,
+                    idAndTapEventWireFormats
+                )
+            is HighlightedElement.ComplicationSlot ->
+                RenderParametersWireFormat(
+                    drawMode.ordinal,
+                    computeLayersBitfield(),
+                    RenderParametersWireFormat.ELEMENT_TYPE_COMPLICATION,
+                    thingHighlighted.id,
+                    null,
+                    highlightLayer!!.highlightTint,
+                    highlightLayer.backgroundTint,
+                    idAndTapEventWireFormats
+                )
+            is HighlightedElement.UserStyle ->
+                RenderParametersWireFormat(
+                    drawMode.ordinal,
+                    computeLayersBitfield(),
+                    RenderParametersWireFormat.ELEMENT_TYPE_USER_STYLE,
+                    0,
+                    thingHighlighted.id.value,
+                    highlightLayer!!.highlightTint,
+                    highlightLayer.backgroundTint,
+                    idAndTapEventWireFormats
+                )
+            else ->
+                RenderParametersWireFormat(
+                    drawMode.ordinal,
+                    computeLayersBitfield(),
+                    RenderParametersWireFormat.ELEMENT_TYPE_NONE,
+                    0,
+                    null,
+                    Color.BLACK,
+                    Color.BLACK,
+                    idAndTapEventWireFormats
+                )
         }
     }
 
@@ -340,9 +335,10 @@
         writer.println("drawMode=${drawMode.name}")
         writer.println("watchFaceLayers=${watchFaceLayers.joinToString()}")
         writer.println(
-            "lastComplicationTapDownEvents=" + lastComplicationTapDownEvents.map {
-                it.key.toString() + "->" + it.value
-            }.joinToString(", ")
+            "lastComplicationTapDownEvents=" +
+                lastComplicationTapDownEvents
+                    .map { it.key.toString() + "->" + it.value }
+                    .joinToString(", ")
         )
 
         highlightLayer?.let {
@@ -352,14 +348,12 @@
                 is HighlightedElement.AllComplicationSlots -> {
                     writer.println("HighlightedElement.AllComplicationSlots:")
                 }
-
                 is HighlightedElement.ComplicationSlot -> {
                     writer.println("HighlightedElement.ComplicationSlot:")
                     writer.increaseIndent()
                     writer.println("id=${it.highlightedElement.id}")
                     writer.decreaseIndent()
                 }
-
                 is HighlightedElement.UserStyle -> {
                     writer.println("HighlightedElement.UserStyle:")
                     writer.increaseIndent()
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index 878108f..8af3b01 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -40,17 +40,17 @@
 import androidx.annotation.Px
 import androidx.annotation.UiThread
 import androidx.annotation.WorkerThread
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.utility.TraceEvent
+import java.io.PrintWriter
+import java.nio.ByteBuffer
+import java.time.ZonedDateTime
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
-import java.io.PrintWriter
-import java.nio.ByteBuffer
-import java.time.ZonedDateTime
 
 /**
  * Describes the type of [Canvas] a [Renderer.CanvasRenderer] or [Renderer.CanvasRenderer2] should
@@ -58,12 +58,7 @@
  *
  * @hide
  */
-@IntDef(
-    value = [
-        CanvasType.SOFTWARE,
-        CanvasType.HARDWARE
-    ]
-)
+@IntDef(value = [CanvasType.SOFTWARE, CanvasType.HARDWARE])
 public annotation class CanvasType {
     public companion object {
         /** A software canvas will be requested. */
@@ -84,28 +79,28 @@
     }
 }
 
-internal val EGL_CONFIG_ATTRIB_LIST = intArrayOf(
-    EGL14.EGL_RENDERABLE_TYPE,
-    EGL14.EGL_OPENGL_ES2_BIT,
-    EGL14.EGL_RED_SIZE,
-    8,
-    EGL14.EGL_GREEN_SIZE,
-    8,
-    EGL14.EGL_BLUE_SIZE,
-    8,
-    EGL14.EGL_ALPHA_SIZE,
-    8,
-    EGL14.EGL_NONE
-)
+internal val EGL_CONFIG_ATTRIB_LIST =
+    intArrayOf(
+        EGL14.EGL_RENDERABLE_TYPE,
+        EGL14.EGL_OPENGL_ES2_BIT,
+        EGL14.EGL_RED_SIZE,
+        8,
+        EGL14.EGL_GREEN_SIZE,
+        8,
+        EGL14.EGL_BLUE_SIZE,
+        8,
+        EGL14.EGL_ALPHA_SIZE,
+        8,
+        EGL14.EGL_NONE
+    )
 
 private val EGL_CONTEXT_ATTRIB_LIST =
     intArrayOf(EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE)
 
 internal val EGL_SURFACE_ATTRIB_LIST = intArrayOf(EGL14.EGL_NONE)
 
-private val HIGHLIGHT_LAYER_COMPOSITE_PAINT = Paint().apply {
-    xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
-}
+private val HIGHLIGHT_LAYER_COMPOSITE_PAINT =
+    Paint().apply { xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER) }
 
 /**
  * Flips a bitmap.
@@ -114,23 +109,13 @@
  * @param width The width of the bitmap in pixels
  * @param height The height of the bitmap in pixels
  */
-internal fun verticalFlip(
-    buffer: ByteBuffer,
-    width: Int,
-    height: Int
-) {
+internal fun verticalFlip(buffer: ByteBuffer, width: Int, height: Int) {
     val stride = width * 4
     val heightMinusOne = height - 1
     val halfHeight = height / 2
     val tmp = ByteArray(stride)
     for (i in 0 until halfHeight) {
-        System.arraycopy(
-            buffer.array(),
-            i * stride,
-            tmp,
-            0,
-            stride
-        )
+        System.arraycopy(buffer.array(), i * stride, tmp, 0, stride)
 
         System.arraycopy(
             buffer.array(),
@@ -140,21 +125,14 @@
             stride
         )
 
-        System.arraycopy(
-            tmp,
-            0,
-            buffer.array(),
-            (heightMinusOne - i) * stride,
-            stride
-        )
+        System.arraycopy(tmp, 0, buffer.array(), (heightMinusOne - i) * stride, stride)
     }
     buffer.rewind()
 }
 
 /**
- * The base class for [CanvasRenderer], [CanvasRenderer2], [GlesRenderer],
- * [GlesRenderer2].  Where possible it is recommended to use
- * [CanvasRenderer2] or [GlesRenderer2] which allow memory to be
+ * The base class for [CanvasRenderer], [CanvasRenderer2], [GlesRenderer], [GlesRenderer2]. Where
+ * possible it is recommended to use [CanvasRenderer2] or [GlesRenderer2] which allow memory to be
  * saved during editing because there can be more than one watchface instance during editing.
  *
  * Renderers are constructed on a background thread but all rendering is done on the UiThread. There
@@ -167,9 +145,9 @@
  * Please note [android.graphics.drawable.AnimatedImageDrawable] and similar classes which rely on
  * [android.graphics.drawable.Drawable.Callback] do not animate properly out of the box unless you
  * register an implementation with [android.graphics.drawable.Drawable.setCallback] that calls
- * [invalidate]. Even then these classes are not recommend because the [ZonedDateTime] passed
- * to [Renderer.CanvasRenderer.render] or [Renderer.GlesRenderer.render] is not guaranteed to match
- * the system time (e.g. for taking screenshots). In addition care is needed when implementing
+ * [invalidate]. Even then these classes are not recommend because the [ZonedDateTime] passed to
+ * [Renderer.CanvasRenderer.render] or [Renderer.GlesRenderer.render] is not guaranteed to match the
+ * system time (e.g. for taking screenshots). In addition care is needed when implementing
  * [android.graphics.drawable.Drawable.Callback] to ensure it does not animate in ambient mode which
  * could lead to a significant power regression.
  *
@@ -177,22 +155,22 @@
  * @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. In ambient mode the watch face will be rendered once per minute.
+ *   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. In ambient mode the watch face will be rendered once per minute.
  */
 @Suppress("Deprecation")
-public sealed class Renderer @WorkerThread constructor(
+public sealed class Renderer
+@WorkerThread
+constructor(
     public val surfaceHolder: SurfaceHolder,
     private val currentUserStyleRepository: CurrentUserStyleRepository,
     internal val watchState: WatchState,
-    @IntRange(from = 0, to = 60000)
-    public var interactiveDrawModeUpdateDelayMillis: Long,
+    @IntRange(from = 0, to = 60000) public var interactiveDrawModeUpdateDelayMillis: Long,
 ) {
-    @OptIn(WatchFaceExperimental::class)
-    private var pendingWatchFaceColors: WatchFaceColors? = null
+    @OptIn(WatchFaceExperimental::class) private var pendingWatchFaceColors: WatchFaceColors? = null
     private var pendingWatchFaceColorsSet = false
 
     // Protected by lock
@@ -202,10 +180,11 @@
     // Protected by lock. NB UI thread code doesn't need the lock.
     internal var watchFaceHostApi: WatchFaceHostApi? = null
         set(value) {
-            val pendingSendPreviewImageNeedsUpdateRequestCopy = synchronized(lock) {
-                field = value
-                pendingSendPreviewImageNeedsUpdateRequest
-            }
+            val pendingSendPreviewImageNeedsUpdateRequestCopy =
+                synchronized(lock) {
+                    field = value
+                    pendingSendPreviewImageNeedsUpdateRequest
+                }
             if (pendingWatchFaceColorsSet) {
                 @OptIn(WatchFaceExperimental::class)
                 value?.onWatchFaceColorsChanged(pendingWatchFaceColors)
@@ -252,14 +231,10 @@
         private val sharedAssetsCache = HashMap<String, SharedAssetsHolder>()
         private val sharedAssetsCacheLock = Mutex()
 
-        internal fun getOrCreateSharedAssetsHolder(
-            renderer: Renderer
-        ): SharedAssetsHolder {
+        internal fun getOrCreateSharedAssetsHolder(renderer: Renderer): SharedAssetsHolder {
             val key = renderer::class.java.name
             synchronized(sharedAssetsCacheLock) {
-                sharedAssetsCache.computeIfAbsent(key) {
-                    SharedAssetsHolder()
-                }
+                sharedAssetsCache.computeIfAbsent(key) { SharedAssetsHolder() }
                 val holder = sharedAssetsCache[key]!!
                 holder.refCount++
                 return holder
@@ -294,11 +269,9 @@
                     centerY = screenBounds.exactCenterY()
                 }
 
-                override fun surfaceDestroyed(holder: SurfaceHolder) {
-                }
+                override fun surfaceDestroyed(holder: SurfaceHolder) {}
 
-                override fun surfaceCreated(holder: SurfaceHolder) {
-                }
+                override fun surfaceCreated(holder: SurfaceHolder) {}
             }
         )
     }
@@ -306,7 +279,7 @@
     /**
      * The bounds of the [SurfaceHolder] this Renderer renders into. Depending on the shape of the
      * device's screen not all of these pixels may be visible to the user (see
-     * [Configuration.isScreenRound]).  Note also that API level 27+ devices draw indicators in the
+     * [Configuration.isScreenRound]). Note also that API level 27+ devices draw indicators in the
      * top and bottom 24dp of the screen, avoid rendering anything important there.
      */
     public var screenBounds: Rect = surfaceHolder.surfaceFrame
@@ -343,8 +316,8 @@
      * and each [ComplicationSlot]'s index is defined by its
      * [ComplicationSlot.accessibilityTraversalIndex].
      */
-    public var additionalContentDescriptionLabels:
-        Collection<Pair<Int, ContentDescriptionLabel>> = emptyList()
+    public var additionalContentDescriptionLabels: Collection<Pair<Int, ContentDescriptionLabel>> =
+        emptyList()
         set(value) {
             field = value
             for (pair in value) {
@@ -365,13 +338,11 @@
     }
 
     /** Called when the Renderer is destroyed. */
-    @UiThread
-    public open fun onDestroy() {
-    }
+    @UiThread public open fun onDestroy() {}
 
     /**
-     * Renders the watch face into the [surfaceHolder] using the current [renderParameters]
-     * with the user style specified by the [currentUserStyleRepository].
+     * Renders the watch face into the [surfaceHolder] using the current [renderParameters] with the
+     * user style specified by the [currentUserStyleRepository].
      *
      * @param zonedDateTime The [ZonedDateTime] to use when rendering the watch face
      * @return A [Bitmap] containing a screenshot of the watch face
@@ -399,15 +370,13 @@
      * Called when the [RenderParameters] has been updated. Will always be called before the first
      * call to [CanvasRenderer.render] or [GlesRenderer.render].
      */
-    @UiThread
-    protected open fun onRenderParametersChanged(renderParameters: RenderParameters) {
-    }
+    @UiThread protected open fun onRenderParametersChanged(renderParameters: RenderParameters) {}
 
     /**
      * This method is used for accessibility support to describe the portion of the screen
-     * containing  the main clock element. By default we assume this is contained in the central
-     * half of the watch face. Watch faces should override this to return the correct bounds for
-     * the main clock element.
+     * containing the main clock element. By default we assume this is contained in the central half
+     * of the watch face. Watch faces should override this to return the correct bounds for the main
+     * clock element.
      *
      * @return A [Rect] describing the bounds of the watch faces' main clock element
      */
@@ -416,8 +385,10 @@
         val quarterX = centerX / 2
         val quarterY = centerY / 2
         return Rect(
-            (centerX - quarterX).toInt(), (centerY - quarterY).toInt(),
-            (centerX + quarterX).toInt(), (centerY + quarterY).toInt()
+            (centerX - quarterX).toInt(),
+            (centerY - quarterY).toInt(),
+            (centerX + quarterX).toInt(),
+            (centerY + quarterY).toInt()
         )
     }
 
@@ -428,8 +399,8 @@
      * shouldAnimate returns true we inhibit entering [DrawMode.AMBIENT].
      *
      * By default we remain at an interactive frame rate when the watch face is visible and we're
-     * not in ambient mode. Watch faces with animated transitions for entering ambient mode may
-     * need to override this to ensure they play smoothly.
+     * not in ambient mode. Watch faces with animated transitions for entering ambient mode may need
+     * to override this to ensure they play smoothly.
      *
      * @return Whether we should schedule an onDraw call to maintain an interactive frame rate
      */
@@ -448,32 +419,29 @@
 
     /**
      * Posts a message to schedule a call to either [CanvasRenderer.render] or [GlesRenderer.render]
-     * to draw the next frame. Unlike [invalidate], this method is thread-safe and may be called
-     * on any thread.
+     * to draw the next frame. Unlike [invalidate], this method is thread-safe and may be called on
+     * any thread.
      */
     public fun postInvalidate() {
         watchFaceHostApi?.getUiThreadHandler()?.post { watchFaceHostApi!!.invalidate() }
     }
 
-    @UiThread
-    internal abstract fun dumpInternal(writer: IndentingPrintWriter)
+    @UiThread internal abstract fun dumpInternal(writer: IndentingPrintWriter)
 
     /**
      * Called when adb shell dumpsys is invoked for the WatchFaceService, allowing the renderer to
      * optionally record state for debugging purposes.
      */
-    @UiThread
-    public abstract fun onDump(writer: PrintWriter)
+    @UiThread public abstract fun onDump(writer: PrintWriter)
 
     /**
-     * Perform UiThread specific initialization.  Will be called once during initialization before
+     * Perform UiThread specific initialization. Will be called once during initialization before
      * any subsequent calls to [renderInternal] or [takeScreenshot].
      */
     @UiThread
     internal abstract suspend fun uiThreadInitInternal(uiThreadCoroutineScope: CoroutineScope)
 
-    @WorkerThread
-    internal open suspend fun backgroundThreadInitInternal() {}
+    @WorkerThread internal open suspend fun backgroundThreadInitInternal() {}
 
     /**
      * Representative [WatchFaceColors] which are made available to system clients via
@@ -488,17 +456,17 @@
     @get:WatchFaceExperimental
     @set:WatchFaceExperimental
     public var watchfaceColors: WatchFaceColors? = null
-       set(value) {
-           require(value != null) { "watchfaceColors must be non-null " }
+        set(value) {
+            require(value != null) { "watchfaceColors must be non-null " }
 
-           val hostApi = watchFaceHostApi
-           if (hostApi == null) {
-               pendingWatchFaceColors = value
-               pendingWatchFaceColorsSet = true
-           } else {
-               hostApi.onWatchFaceColorsChanged(value)
-           }
-       }
+            val hostApi = watchFaceHostApi
+            if (hostApi == null) {
+                pendingWatchFaceColors = value
+                pendingWatchFaceColorsSet = true
+            } else {
+                hostApi.onWatchFaceColorsChanged(value)
+            }
+        }
 
     /**
      * Multiple [WatchFaceService] instances and hence Renderers can exist concurrently (e.g. a
@@ -513,22 +481,21 @@
          * Notification that any resources owned by SharedAssets should be released, called when no
          * renderer instances are left.
          */
-        @UiThread
-        public fun onDestroy()
+        @UiThread public fun onDestroy()
     }
 
     internal abstract fun renderBlackFrame()
 
     /**
-     * Sends a request to the system asking it to update the preview image. This is useful for
-     * watch faces with configuration outside of the [UserStyleSchema] E.g. a watchface with a
-     * selectable background.
+     * Sends a request to the system asking it to update the preview image. This is useful for watch
+     * faces with configuration outside of the [UserStyleSchema] E.g. a watchface with a selectable
+     * background.
      *
      * The system may choose to rate limit this method for performance reasons and the system is
      * free to schedule when the update occurs.
      *
-     * Requires a compatible system to work (if the system is incompatible this does nothing).
-     * This can be called from any thread.
+     * Requires a compatible system to work (if the system is incompatible this does nothing). This
+     * can be called from any thread.
      */
     public fun sendPreviewImageNeedsUpdateRequest() {
         synchronized(lock) {
@@ -541,9 +508,9 @@
     }
 
     /**
-     * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class
-     * or [CanvasRenderer2] if they can take advantage of [SharedAssets] to save
-     * memory when editing (there can be more than once WatchFace instance when editing).
+     * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class or
+     * [CanvasRenderer2] if they can take advantage of [SharedAssets] to save memory when editing
+     * (there can be more than once WatchFace instance when editing).
      *
      * A CanvasRenderer is expected to be constructed on the background thread associated with
      * [WatchFaceService.getBackgroundThreadHandler] inside a call to
@@ -555,47 +522,48 @@
      * instead.
      *
      * @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 [CanvasType] to request. Note even if [CanvasType.HARDWARE] is used,
-     * screenshots will taken using the software rendering pipeline, as such [Bitmap]s with
-     * [Bitmap.Config.HARDWARE] must be avoided.
+     *   screenshots will taken using the software rendering pipeline, as such [Bitmap]s with
+     *   [Bitmap.Config.HARDWARE] must be avoided.
      * @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 framerate
-     * 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 framerate
+     *   inorder to sleep when not animating.
      * @param clearWithBackgroundTintBeforeRenderingHighlightLayer Whether the [Canvas] is cleared
-     * with [RenderParameters.HighlightLayer.backgroundTint] before [renderHighlightLayer] is
-     * called. Defaults to `false`.
+     *   with [RenderParameters.HighlightLayer.backgroundTint] before [renderHighlightLayer] is
+     *   called. Defaults to `false`.
      */
     @Deprecated(message = "CanvasRenderer is deprecated", ReplaceWith("CanvasRenderer2"))
-    public abstract class CanvasRenderer @WorkerThread @JvmOverloads constructor(
+    public abstract class CanvasRenderer
+    @WorkerThread
+    @JvmOverloads
+    constructor(
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
         @CanvasType private val canvasType: Int,
-        @IntRange(from = 0, to = 60000)
-        interactiveDrawModeUpdateDelayMillis: Long,
+        @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
         val clearWithBackgroundTintBeforeRenderingHighlightLayer: Boolean = false
-    ) : Renderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        interactiveDrawModeUpdateDelayMillis
-    ) {
-        internal override fun renderInternal(
-            zonedDateTime: ZonedDateTime
+    ) :
+        Renderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            interactiveDrawModeUpdateDelayMillis
         ) {
-            val canvas = (
-                if (canvasType == CanvasType.HARDWARE) {
+        internal override fun renderInternal(zonedDateTime: ZonedDateTime) {
+            val canvas =
+                (if (canvasType == CanvasType.HARDWARE) {
                     surfaceHolder.lockHardwareCanvas()
                 } else {
                     surfaceHolder.lockCanvas()
-                }
-                ) ?: return
+                })
+                    ?: return
             try {
                 if (Build.VERSION.SDK_INT >= 30 || watchState.isVisible.value!!) {
                     renderAndComposite(canvas, zonedDateTime)
@@ -610,23 +578,25 @@
         internal override fun takeScreenshot(
             zonedDateTime: ZonedDateTime,
             renderParameters: RenderParameters
-        ): Bitmap = TraceEvent("CanvasRenderer.takeScreenshot").use {
-            val bitmap = Bitmap.createBitmap(
-                screenBounds.width(),
-                screenBounds.height(),
-                Bitmap.Config.ARGB_8888
-            )
-            val prevRenderParameters = this.renderParameters
-            val originalIsForScreenshot = renderParameters.isForScreenshot
+        ): Bitmap =
+            TraceEvent("CanvasRenderer.takeScreenshot").use {
+                val bitmap =
+                    Bitmap.createBitmap(
+                        screenBounds.width(),
+                        screenBounds.height(),
+                        Bitmap.Config.ARGB_8888
+                    )
+                val prevRenderParameters = this.renderParameters
+                val originalIsForScreenshot = renderParameters.isForScreenshot
 
-            renderParameters.isForScreenshot = true
-            this.renderParameters = renderParameters
-            renderAndComposite(Canvas(bitmap), zonedDateTime)
-            this.renderParameters = prevRenderParameters
-            renderParameters.isForScreenshot = originalIsForScreenshot
+                renderParameters.isForScreenshot = true
+                this.renderParameters = renderParameters
+                renderAndComposite(Canvas(bitmap), zonedDateTime)
+                this.renderParameters = prevRenderParameters
+                renderParameters.isForScreenshot = originalIsForScreenshot
 
-            return bitmap
-        }
+                return bitmap
+            }
 
         private fun renderAndComposite(canvas: Canvas, zonedDateTime: ZonedDateTime) {
             // Usually renderParameters.watchFaceWatchFaceLayers will be non-empty.
@@ -636,11 +606,12 @@
                 // Render and composite the HighlightLayer
                 val highlightLayer = renderParameters.highlightLayer
                 if (highlightLayer != null) {
-                    val highlightLayerBitmap = Bitmap.createBitmap(
-                        screenBounds.width(),
-                        screenBounds.height(),
-                        Bitmap.Config.ARGB_8888
-                    )
+                    val highlightLayerBitmap =
+                        Bitmap.createBitmap(
+                            screenBounds.width(),
+                            screenBounds.height(),
+                            Bitmap.Config.ARGB_8888
+                        )
                     val highlightCanvas = Canvas(highlightLayerBitmap)
                     if (clearWithBackgroundTintBeforeRenderingHighlightLayer) {
                         highlightCanvas.drawColor(highlightLayer.backgroundTint)
@@ -667,20 +638,18 @@
         }
 
         /**
-         * Perform UiThread specific initialization.  Will be called once during initialization
-         * before any subsequent calls to [render].  If you need to override this method in java,
+         * Perform UiThread specific initialization. Will be called once during initialization
+         * before any subsequent calls to [render]. If you need to override this method in java,
          * consider using [androidx.wear.watchface.ListenableCanvasRenderer] instead.
          */
-        @UiThread
-        public open suspend fun init() {
-        }
+        @UiThread public open suspend fun init() {}
 
         /**
          * Sub-classes should override this to implement their watch face rendering logic which
          * should respect the current [renderParameters]. Please note [WatchState.isAmbient] may not
          * match the [RenderParameters.drawMode] and should not be used to decide what to render.
-         * E.g. when editing from the companion phone while the watch is ambient, renders
-         * may be requested with [DrawMode.INTERACTIVE].
+         * E.g. when editing from the companion phone while the watch is ambient, renders may be
+         * requested with [DrawMode.INTERACTIVE].
          *
          * Any highlights due to [RenderParameters.highlightLayer] should be rendered by
          * [renderHighlightLayer] instead where possible. For correct behavior this function must
@@ -689,23 +658,20 @@
          * Before any calls to render, [init] will be called once.
          *
          * @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 zonedDateTime The [ZonedDateTime] to render with
          */
         @UiThread
-        public abstract fun render(
-            canvas: Canvas,
-            bounds: Rect,
-            zonedDateTime: ZonedDateTime
-        )
+        public abstract fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime)
 
         internal override fun renderBlackFrame() {
-            val canvas = if (canvasType == CanvasType.SOFTWARE) {
-                surfaceHolder.lockCanvas()
-            } else {
-                surfaceHolder.lockHardwareCanvas()
-            }
+            val canvas =
+                if (canvasType == CanvasType.SOFTWARE) {
+                    surfaceHolder.lockCanvas()
+                } else {
+                    surfaceHolder.lockHardwareCanvas()
+                }
             try {
                 canvas.drawColor(Color.BLACK)
             } finally {
@@ -729,7 +695,7 @@
          * the Canvas if necessary.
          *
          * @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 zonedDateTime the [ZonedDateTime] to render with
          */
@@ -772,40 +738,42 @@
      * instead.
      *
      * @param SharedAssetsT The type extending [SharedAssets] returned by [createSharedAssets] and
-     * passed into [render] and [renderHighlightLayer].
+     *   passed into [render] and [renderHighlightLayer].
      * @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 [CanvasType] to request. Note even if [CanvasType.HARDWARE] is used,
-     * screenshots will taken using the software rendering pipeline, as such [Bitmap]s with
-     * [Bitmap.Config.HARDWARE] must be avoided.
+     *   screenshots will taken using the software rendering pipeline, as such [Bitmap]s with
+     *   [Bitmap.Config.HARDWARE] must be avoided.
      * @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 framerate
-     * 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 framerate
+     *   inorder to sleep when not animating.
      * @param clearWithBackgroundTintBeforeRenderingHighlightLayer Whether the [Canvas] is cleared
-     * with [RenderParameters.HighlightLayer.backgroundTint] before [renderHighlightLayer] is
-     * called. Defaults to `false`.
+     *   with [RenderParameters.HighlightLayer.backgroundTint] before [renderHighlightLayer] is
+     *   called. Defaults to `false`.
      */
-    public abstract class CanvasRenderer2<SharedAssetsT> @WorkerThread constructor(
+    public abstract class CanvasRenderer2<SharedAssetsT>
+    @WorkerThread
+    constructor(
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
         @CanvasType private val canvasType: Int,
-        @IntRange(from = 0, to = 60000)
-        interactiveDrawModeUpdateDelayMillis: Long,
+        @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
         clearWithBackgroundTintBeforeRenderingHighlightLayer: Boolean
-    ) : CanvasRenderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        canvasType,
-        interactiveDrawModeUpdateDelayMillis,
-        clearWithBackgroundTintBeforeRenderingHighlightLayer
-    ) where SharedAssetsT : SharedAssets {
+    ) :
+        CanvasRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            canvasType,
+            interactiveDrawModeUpdateDelayMillis,
+            clearWithBackgroundTintBeforeRenderingHighlightLayer
+        ) where SharedAssetsT : SharedAssets {
         /**
          * When editing multiple [WatchFaceService] instances and hence Renderers can exist
          * concurrently (e.g. a headless instance and an interactive instance) and using
@@ -823,8 +791,7 @@
          *
          * @return The [SharedAssetsT] that will be passed into [render] and [renderHighlightLayer].
          */
-        @WorkerThread
-        protected abstract suspend fun createSharedAssets(): SharedAssetsT
+        @WorkerThread protected abstract suspend fun createSharedAssets(): SharedAssetsT
 
         internal override suspend fun backgroundThreadInitInternal() {
             if (sharedAssetsHolder.sharedAssets == null) {
@@ -836,8 +803,8 @@
          * Sub-classes should override this to implement their watch face rendering logic which
          * should respect the current [renderParameters]. Please note [WatchState.isAmbient] may not
          * match the [RenderParameters.drawMode] and should not be used to decide what to render.
-         * E.g. when editing from the companion phone while the watch is ambient, renders
-         * may be requested with [DrawMode.INTERACTIVE].
+         * E.g. when editing from the companion phone while the watch is ambient, renders may be
+         * requested with [DrawMode.INTERACTIVE].
          *
          * Any highlights due to [RenderParameters.highlightLayer] should be rendered by
          * [renderHighlightLayer] instead where possible. For correct behavior this function must
@@ -846,7 +813,7 @@
          * Before any calls to render, [init] will be called once.
          *
          * @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 zonedDateTime The [ZonedDateTime] to render with
          * @param sharedAssets The [SharedAssetsT] returned by [createSharedAssets]
@@ -875,7 +842,7 @@
          * the Canvas if necessary.
          *
          * @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 zonedDateTime the [ZonedDateTime] to render with
          * @param sharedAssets The [SharedAssetsT] returned by [createSharedAssets]
@@ -914,9 +881,9 @@
     }
 
     /**
-     * Watch faces that require [GLES20] rendering should extend their [Renderer] from this class
-     * or [GlesRenderer2] if they can take advantage of [SharedAssets] to save memory
-     * when editing (there can be more than once WatchFace instance when editing).
+     * Watch faces that require [GLES20] rendering should extend their [Renderer] from this class or
+     * [GlesRenderer2] if they can take advantage of [SharedAssets] to save memory when editing
+     * (there can be more than once WatchFace instance when editing).
      *
      * A GlesRenderer is expected to be constructed on the background thread associated with
      * [WatchFaceService.getBackgroundThreadHandler] inside a call to
@@ -931,31 +898,31 @@
      *
      * If you need to make any OpenGl calls outside of [render],
      * [onBackgroundThreadGlContextCreated] or [onUiThreadGlSurfaceCreated] then you must use either
-     * [runUiThreadGlCommands] or [runBackgroundThreadGlCommands] to execute a [Runnable] inside
-     * of the corresponding context. Access to the GL contexts this way is necessary because GL
+     * [runUiThreadGlCommands] or [runBackgroundThreadGlCommands] to execute a [Runnable] inside of
+     * the corresponding context. Access to the GL contexts this way is necessary because GL
      * contexts are not shared between renderers and there can be multiple watch face instances
-     * existing concurrently (e.g. headless and interactive, potentially from different watch
-     * faces if an APK contains more than one [WatchFaceService]). In addition most drivers do not
-     * support concurrent access.
+     * existing concurrently (e.g. headless and interactive, potentially from different watch faces
+     * if an APK contains more than one [WatchFaceService]). In addition most drivers do not support
+     * concurrent access.
      *
      * In Java it may be easier to extend [androidx.wear.watchface.ListenableGlesRenderer] instead.
      *
      * @param surfaceHolder The [SurfaceHolder] whose [android.view.Surface] [render] will draw
-     * into.
+     *   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.
      * @param eglContextAttribList The attributes to be passed to [EGL14.eglCreateContext]. By
-     * default this selects [EGL14.EGL_CONTEXT_CLIENT_VERSION] 2.
+     *   default this selects [EGL14.EGL_CONTEXT_CLIENT_VERSION] 2.
      * @throws [GlesException] If any GL calls fail during initialization.
      */
     @Deprecated(message = "GlesRenderer is deprecated", ReplaceWith("GlesRenderer2"))
@@ -967,17 +934,17 @@
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
-        @IntRange(from = 0, to = 60000)
-        interactiveDrawModeUpdateDelayMillis: Long,
+        @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
         private val eglConfigAttribList: IntArray = EGL_CONFIG_ATTRIB_LIST,
         private val eglSurfaceAttribList: IntArray = EGL_SURFACE_ATTRIB_LIST,
         private val eglContextAttribList: IntArray = EGL_CONTEXT_ATTRIB_LIST
-    ) : Renderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        interactiveDrawModeUpdateDelayMillis
-    ) {
+    ) :
+        Renderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            interactiveDrawModeUpdateDelayMillis
+        ) {
         /** @hide */
         internal companion object {
             internal const val TAG = "Gles2WatchFace"
@@ -1009,11 +976,11 @@
 
         /**
          * The GlesRenderer's [EGLDisplay].
+         *
          * @throws UnsupportedOperationException setEglDisplay is unsupported.
          */
         public var eglDisplay: EGLDisplay
             get() = sharedAssetsHolder.eglDisplay
-
             @Deprecated("It's not intended for eglDisplay to be set")
             set(@Suppress("UNUSED_PARAMETER") eglDisplay) {
                 throw UnsupportedOperationException()
@@ -1021,11 +988,11 @@
 
         /**
          * The GlesRenderer's [EGLConfig].
+         *
          * @throws UnsupportedOperationException setEglConfig is unsupported.
          */
         public var eglConfig: EGLConfig
             get() = sharedAssetsHolder.eglConfig
-
             @Deprecated("It's not intended for eglConfig to be set")
             set(@Suppress("UNUSED_PARAMETER") eglConfig) {
                 throw UnsupportedOperationException()
@@ -1043,22 +1010,23 @@
             get() = sharedAssetsHolder.eglUiThreadContext
 
         // A 1x1 surface which is needed by EGL14.eglMakeCurrent.
-        private val fakeBackgroundThreadSurface = EGL14.eglCreatePbufferSurface(
-            eglDisplay,
-            eglConfig,
-            intArrayOf(
-                EGL14.EGL_WIDTH,
-                1,
-                EGL14.EGL_HEIGHT,
-                1,
-                EGL14.EGL_TEXTURE_TARGET,
-                EGL14.EGL_NO_TEXTURE,
-                EGL14.EGL_TEXTURE_FORMAT,
-                EGL14.EGL_NO_TEXTURE,
-                EGL14.EGL_NONE
-            ),
-            0
-        )
+        private val fakeBackgroundThreadSurface =
+            EGL14.eglCreatePbufferSurface(
+                eglDisplay,
+                eglConfig,
+                intArrayOf(
+                    EGL14.EGL_WIDTH,
+                    1,
+                    EGL14.EGL_HEIGHT,
+                    1,
+                    EGL14.EGL_TEXTURE_TARGET,
+                    EGL14.EGL_NO_TEXTURE,
+                    EGL14.EGL_TEXTURE_FORMAT,
+                    EGL14.EGL_NO_TEXTURE,
+                    EGL14.EGL_NONE
+                ),
+                0
+            )
         private lateinit var eglSurface: EGLSurface
         private var calledOnGlContextCreated = false
         private val renderBufferTexture by lazy {
@@ -1070,12 +1038,14 @@
 
         /**
          * Chooses the EGLConfig to use.
+         *
          * @throws [GlesException] if [EGL14.eglChooseConfig] fails
          */
         private fun chooseEglConfig(eglDisplay: EGLDisplay): EGLConfig {
             val numEglConfigs = IntArray(1)
             val eglConfigs = arrayOfNulls<EGLConfig>(1)
-            if (!EGL14.eglChooseConfig(
+            if (
+                !EGL14.eglChooseConfig(
                     eglDisplay,
                     eglConfigAttribList,
                     0,
@@ -1094,45 +1064,53 @@
             return eglConfigs[0]!!
         }
 
-        private suspend fun createWindowSurface(width: Int, height: Int) = TraceEvent(
-            "GlesRenderer.createWindowSurface"
-        ).use {
-            if (this::eglSurface.isInitialized) {
-                if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
-                    Log.w(TAG, "eglDestroySurface failed")
+        private suspend fun createWindowSurface(width: Int, height: Int) =
+            TraceEvent("GlesRenderer.createWindowSurface").use {
+                if (this::eglSurface.isInitialized) {
+                    if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
+                        Log.w(TAG, "eglDestroySurface failed")
+                    }
                 }
-            }
-            eglSurface = if (watchState.isHeadless) {
-                // Headless instances have a fake surfaceHolder so fall back to a Pbuffer.
-                EGL14.eglCreatePbufferSurface(
-                    eglDisplay,
-                    eglConfig,
-                    intArrayOf(EGL14.EGL_WIDTH, width, EGL14.EGL_HEIGHT, height, EGL14.EGL_NONE),
-                    0
-                )
-            } else {
-                require(surfaceHolder.surface.isValid) { "A valid surfaceHolder is required. " }
-                EGL14.eglCreateWindowSurface(
-                    eglDisplay,
-                    eglConfig,
-                    surfaceHolder.surface,
-                    eglSurfaceAttribList,
-                    0
-                )
-            }
-            if (eglSurface == EGL14.EGL_NO_SURFACE) {
-                throw GlesException("eglCreateWindowSurface failed")
-            }
+                eglSurface =
+                    if (watchState.isHeadless) {
+                        // Headless instances have a fake surfaceHolder so fall back to a Pbuffer.
+                        EGL14.eglCreatePbufferSurface(
+                            eglDisplay,
+                            eglConfig,
+                            intArrayOf(
+                                EGL14.EGL_WIDTH,
+                                width,
+                                EGL14.EGL_HEIGHT,
+                                height,
+                                EGL14.EGL_NONE
+                            ),
+                            0
+                        )
+                    } else {
+                        require(surfaceHolder.surface.isValid) {
+                            "A valid surfaceHolder is required. "
+                        }
+                        EGL14.eglCreateWindowSurface(
+                            eglDisplay,
+                            eglConfig,
+                            surfaceHolder.surface,
+                            eglSurfaceAttribList,
+                            0
+                        )
+                    }
+                if (eglSurface == EGL14.EGL_NO_SURFACE) {
+                    throw GlesException("eglCreateWindowSurface failed")
+                }
 
-            runUiThreadGlCommands {
-                if (!calledOnGlContextCreated) {
-                    calledOnGlContextCreated = true
-                }
-                TraceEvent("GlesRenderer.onGlSurfaceCreated").use {
-                    onUiThreadGlSurfaceCreated(width, height)
+                runUiThreadGlCommands {
+                    if (!calledOnGlContextCreated) {
+                        calledOnGlContextCreated = true
+                    }
+                    TraceEvent("GlesRenderer.onGlSurfaceCreated").use {
+                        onUiThreadGlSurfaceCreated(width, height)
+                    }
                 }
             }
-        }
 
         @CallSuper
         override fun onDestroy() {
@@ -1148,16 +1126,16 @@
          * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one,
          * executes [commands] and finally unsets the GL context.
          *
-         * Access to the GL context this way is necessary because GL contexts are not shared
-         * between renderers and there can be multiple watch face instances existing concurrently
-         * (e.g. headless and interactive, potentially from different watch faces if an APK
-         * contains more than one [WatchFaceService]).
+         * Access to the GL context this way is necessary because GL contexts are not shared between
+         * renderers and there can be multiple watch face instances existing concurrently (e.g.
+         * headless and interactive, potentially from different watch faces if an APK contains more
+         * than one [WatchFaceService]).
          *
-         * NB this function is called by the library before running
-         * [runBackgroundThreadGlCommands] so there's no need to use this directly in client
-         * code unless you need to make GL calls outside of those methods. If you need to call this
-         * method from java, consider using [androidx.wear.watchface.ListenableGlesRenderer] which
-         * provides an overload taking a [Runnable].
+         * NB this function is called by the library before running [runBackgroundThreadGlCommands]
+         * so there's no need to use this directly in client code unless you need to make GL calls
+         * outside of those methods. If you need to call this method from java, consider using
+         * [androidx.wear.watchface.ListenableGlesRenderer] which provides an overload taking a
+         * [Runnable].
          *
          * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
          */
@@ -1171,7 +1149,8 @@
             }
             // It's only safe to run GL command from one thread at a time.
             glContextLock.withLock {
-                if (!EGL14.eglMakeCurrent(
+                if (
+                    !EGL14.eglMakeCurrent(
                         eglDisplay,
                         fakeBackgroundThreadSurface,
                         fakeBackgroundThreadSurface,
@@ -1212,13 +1191,14 @@
         internal override suspend fun backgroundThreadInitInternal() =
             TraceEvent("GlesRenderer.initBackgroundThreadOpenGlContext").use {
                 if (!sharedAssetsHolder.eglBackgroundThreadContextInitialized()) {
-                    sharedAssetsHolder.eglBackgroundThreadContext = EGL14.eglCreateContext(
-                        eglDisplay,
-                        eglConfig,
-                        EGL14.EGL_NO_CONTEXT,
-                        eglContextAttribList,
-                        0
-                    )
+                    sharedAssetsHolder.eglBackgroundThreadContext =
+                        EGL14.eglCreateContext(
+                            eglDisplay,
+                            eglConfig,
+                            EGL14.EGL_NO_CONTEXT,
+                            eglContextAttribList,
+                            0
+                        )
                     if (sharedAssetsHolder.eglBackgroundThreadContext == EGL14.EGL_NO_CONTEXT) {
                         throw RuntimeException("eglCreateContext failed")
                     }
@@ -1237,13 +1217,13 @@
         }
 
         /**
-         * Inside of a [Mutex] this function sets the UiThread GL context as the current
-         * one, executes [commands] and finally unsets the GL context.
+         * Inside of a [Mutex] this function sets the UiThread GL context as the current one,
+         * executes [commands] and finally unsets the GL context.
          *
-         * Access to the GL context this way is necessary because GL contexts are not shared
-         * between renderers and there can be multiple watch face instances existing concurrently
-         * (e.g. headless and interactive, potentially from different watch faces if an APK
-         * contains more than one [WatchFaceService]).
+         * Access to the GL context this way is necessary because GL contexts are not shared between
+         * renderers and there can be multiple watch face instances existing concurrently (e.g.
+         * headless and interactive, potentially from different watch faces if an APK contains more
+         * than one [WatchFaceService]).
          *
          * If you need to call this method from java, consider using
          * [androidx.wear.watchface.ListenableGlesRenderer] which provides an overload taking a
@@ -1258,13 +1238,7 @@
 
             // It's only safe to run GL command from one thread at a time.
             glContextLock.withLock {
-                if (!EGL14.eglMakeCurrent(
-                        eglDisplay,
-                        eglSurface,
-                        eglSurface,
-                        eglUiThreadContext
-                    )
-                ) {
+                if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglUiThreadContext)) {
                     throw IllegalStateException(
                         "eglMakeCurrent failed, eglGetError() = " + EGL14.eglGetError()
                     )
@@ -1299,44 +1273,40 @@
         internal override suspend fun uiThreadInitInternal(uiThreadCoroutineScope: CoroutineScope) =
             TraceEvent("GlesRenderer.initUiThreadOpenGlContext").use {
                 if (!sharedAssetsHolder.eglUiThreadContextInitialized()) {
-                    sharedAssetsHolder.eglUiThreadContext = EGL14.eglCreateContext(
-                        eglDisplay,
-                        eglConfig,
-                        eglBackgroundThreadContext,
-                        intArrayOf(
-                            EGL14.EGL_CONTEXT_CLIENT_VERSION,
-                            2,
-                            EGL14.EGL_NONE
-                        ),
-                        0
-                    )
+                    sharedAssetsHolder.eglUiThreadContext =
+                        EGL14.eglCreateContext(
+                            eglDisplay,
+                            eglConfig,
+                            eglBackgroundThreadContext,
+                            intArrayOf(EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE),
+                            0
+                        )
                 }
 
-                surfaceHolder.addCallback(object : SurfaceHolder.Callback {
-                    @SuppressLint("SyntheticAccessor")
-                    override fun surfaceChanged(
-                        holder: SurfaceHolder,
-                        format: Int,
-                        width: Int,
-                        height: Int
-                    ) {
-                        uiThreadCoroutineScope.launch {
-                            createWindowSurface(width, height)
+                surfaceHolder.addCallback(
+                    object : SurfaceHolder.Callback {
+                        @SuppressLint("SyntheticAccessor")
+                        override fun surfaceChanged(
+                            holder: SurfaceHolder,
+                            format: Int,
+                            width: Int,
+                            height: Int
+                        ) {
+                            uiThreadCoroutineScope.launch { createWindowSurface(width, height) }
                         }
-                    }
 
-                    @SuppressLint("SyntheticAccessor")
-                    override fun surfaceDestroyed(holder: SurfaceHolder) {
-                        if (this@GlesRenderer::eglSurface.isInitialized) {
-                            if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
-                                Log.w(TAG, "eglDestroySurface failed")
+                        @SuppressLint("SyntheticAccessor")
+                        override fun surfaceDestroyed(holder: SurfaceHolder) {
+                            if (this@GlesRenderer::eglSurface.isInitialized) {
+                                if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
+                                    Log.w(TAG, "eglDestroySurface failed")
+                                }
                             }
                         }
-                    }
 
-                    override fun surfaceCreated(holder: SurfaceHolder) {
+                        override fun surfaceCreated(holder: SurfaceHolder) {}
                     }
-                })
+                )
 
                 // Note we have to call this after the derived class's init() method has run or it's
                 // typically going to fail because members have not been initialized.
@@ -1349,21 +1319,19 @@
         /**
          * Called once a background thread when a new GL context is created on the background
          * thread, before any subsequent calls to [render]. Note this function is called inside a
-         * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
-         * GL context.
+         * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the GL
+         * context.
          *
          * If you need to override this method in java, consider using
          * [androidx.wear.watchface.ListenableGlesRenderer] instead.
          */
-        @WorkerThread
-        public open suspend fun onBackgroundThreadGlContextCreated() {
-        }
+        @WorkerThread public open suspend fun onBackgroundThreadGlContextCreated() {}
 
         /**
-         * Called when a new GL surface is created on the UiThread, before any subsequent calls
-         * to [render] or in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
-         * is  called inside a lambda passed to [runUiThreadGlCommands] which has synchronized
-         * access to the GL context.
+         * Called when a new GL surface is created on the UiThread, before any subsequent calls to
+         * [render] or in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function is
+         * called inside a lambda passed to [runUiThreadGlCommands] which has synchronized access to
+         * the GL context.
          *
          * If you need to override this method in java, consider using
          * [androidx.wear.watchface.ListenableGlesRenderer] instead.
@@ -1372,15 +1340,9 @@
          * @param height height of surface in pixels
          */
         @UiThread
-        public open suspend fun onUiThreadGlSurfaceCreated(
-            @Px width: Int,
-            @Px height: Int
-        ) {
-        }
+        public open suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int) {}
 
-        internal override fun renderInternal(
-            zonedDateTime: ZonedDateTime
-        ) {
+        internal override fun renderInternal(zonedDateTime: ZonedDateTime) {
             runBlocking {
                 runUiThreadGlCommands {
                     renderAndComposite(zonedDateTime)
@@ -1394,37 +1356,39 @@
         internal override fun takeScreenshot(
             zonedDateTime: ZonedDateTime,
             renderParameters: RenderParameters
-        ): Bitmap = TraceEvent("GlesRenderer.takeScreenshot").use {
-            val width = screenBounds.width()
-            val height = screenBounds.height()
-            val pixelBuf = ByteBuffer.allocateDirect(width * height * 4)
-            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
-            runBlocking {
-                runUiThreadGlCommands {
-                    val prevRenderParameters = this@GlesRenderer.renderParameters
-                    this@GlesRenderer.renderParameters = renderParameters
-                    renderParameters.isForScreenshot = true
-                    renderAndComposite(zonedDateTime)
-                    renderParameters.isForScreenshot = false
-                    this@GlesRenderer.renderParameters = prevRenderParameters
-                    GLES20.glFinish()
-                    GLES20.glReadPixels(
-                        0,
-                        0,
-                        width,
-                        height,
-                        GLES20.GL_RGBA,
-                        GLES20.GL_UNSIGNED_BYTE,
-                        pixelBuf
-                    )
-                    // The image is flipped when using read pixels because the first pixel in the
-                    // OpenGL buffer is in bottom left.
-                    verticalFlip(pixelBuf, width, height)
-                    bitmap.copyPixelsFromBuffer(pixelBuf)
+        ): Bitmap =
+            TraceEvent("GlesRenderer.takeScreenshot").use {
+                val width = screenBounds.width()
+                val height = screenBounds.height()
+                val pixelBuf = ByteBuffer.allocateDirect(width * height * 4)
+                val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+                runBlocking {
+                    runUiThreadGlCommands {
+                        val prevRenderParameters = this@GlesRenderer.renderParameters
+                        this@GlesRenderer.renderParameters = renderParameters
+                        renderParameters.isForScreenshot = true
+                        renderAndComposite(zonedDateTime)
+                        renderParameters.isForScreenshot = false
+                        this@GlesRenderer.renderParameters = prevRenderParameters
+                        GLES20.glFinish()
+                        GLES20.glReadPixels(
+                            0,
+                            0,
+                            width,
+                            height,
+                            GLES20.GL_RGBA,
+                            GLES20.GL_UNSIGNED_BYTE,
+                            pixelBuf
+                        )
+                        // The image is flipped when using read pixels because the first pixel in
+                        // the
+                        // OpenGL buffer is in bottom left.
+                        verticalFlip(pixelBuf, width, height)
+                        bitmap.copyPixelsFromBuffer(pixelBuf)
+                    }
                 }
+                return bitmap
             }
-            return bitmap
-        }
 
         private fun renderAndComposite(zonedDateTime: ZonedDateTime) {
             GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)
@@ -1467,15 +1431,15 @@
          * Sub-classes should override this to implement their watch face rendering logic which
          * should respect the current [renderParameters]. Please note [WatchState.isAmbient] may not
          * match the [RenderParameters.drawMode] and should not be used to decide what to render.
-         * E.g. when editing from the companion phone while the watch is ambient, renders
-         * may be requested with [DrawMode.INTERACTIVE].
+         * E.g. when editing from the companion phone while the watch is ambient, renders may be
+         * requested with [DrawMode.INTERACTIVE].
          *
          * Any highlights due to [RenderParameters.highlightLayer] should be rendered by
          * [renderHighlightLayer] instead where possible. For correct behavior this function must
          * use the supplied [ZonedDateTime] in favor of any other ways of getting the time.
          *
-         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which
-         * has synchronized access to the GL context.
+         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which has
+         * synchronized access to the GL context.
          *
          * Note also `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` is called by the library
          * before this method.
@@ -1485,8 +1449,7 @@
          *
          * @param zonedDateTime The zonedDateTime [ZonedDateTime] to render with
          */
-        @UiThread
-        public abstract fun render(zonedDateTime: ZonedDateTime)
+        @UiThread public abstract fun render(zonedDateTime: ZonedDateTime)
 
         /**
          * Sub-classes should override this to implement their watch face highlight layer rendering
@@ -1498,16 +1461,15 @@
          * function must use the supplied [ZonedDateTime] in favor of any other ways of getting the
          * time.
          *
-         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which
-         * has synchronized access to the GL context.
+         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which has
+         * synchronized access to the GL context.
          *
          * Note also `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` is called by the library
          * before this method.
          *
          * @param zonedDateTime The zonedDateTime [ZonedDateTime] to render with
          */
-        @UiThread
-        public abstract fun renderHighlightLayer(zonedDateTime: ZonedDateTime)
+        @UiThread public abstract fun renderHighlightLayer(zonedDateTime: ZonedDateTime)
 
         internal override fun dumpInternal(writer: IndentingPrintWriter) {
             writer.println("GlesRenderer:")
@@ -1544,33 +1506,33 @@
      *
      * If you need to make any OpenGl calls outside of [render],
      * [onBackgroundThreadGlContextCreated] or [onUiThreadGlSurfaceCreated] then you must use either
-     * [runUiThreadGlCommands] or [runBackgroundThreadGlCommands] to execute a [Runnable] inside
-     * of the corresponding context. Access to the GL contexts this way is necessary because GL
+     * [runUiThreadGlCommands] or [runBackgroundThreadGlCommands] to execute a [Runnable] inside of
+     * the corresponding context. Access to the GL contexts this way is necessary because GL
      * contexts are not shared between renderers and there can be multiple watch face instances
-     * existing concurrently (e.g. headless and interactive, potentially from different watch
-     * faces if an APK contains more than one [WatchFaceService]). In addition most drivers do not
-     * support concurrent access.
+     * existing concurrently (e.g. headless and interactive, potentially from different watch faces
+     * if an APK contains more than one [WatchFaceService]). In addition most drivers do not support
+     * concurrent access.
      *
      * In Java it may be easier to extend [androidx.wear.watchface.ListenableGlesRenderer2] instead.
      *
      * @param SharedAssetsT The type extending [SharedAssets] returned by [createSharedAssets] and
-     * passed into [render] and [renderHighlightLayer].
+     *   passed into [render] and [renderHighlightLayer].
      * @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.
      * @param eglContextAttribList The attributes to be passed to [EGL14.eglCreateContext]. By
-     * default this selects [EGL14.EGL_CONTEXT_CLIENT_VERSION] 2.
+     *   default this selects [EGL14.EGL_CONTEXT_CLIENT_VERSION] 2.
      * @throws [Renderer.GlesException] If any GL calls fail during initialization.
      */
     public abstract class GlesRenderer2<SharedAssetsT>
@@ -1581,20 +1543,20 @@
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
-        @IntRange(from = 0, to = 60000)
-        interactiveDrawModeUpdateDelayMillis: Long,
+        @IntRange(from = 0, to = 60000) interactiveDrawModeUpdateDelayMillis: Long,
         eglConfigAttribList: IntArray = EGL_CONFIG_ATTRIB_LIST,
         eglSurfaceAttribList: IntArray = EGL_SURFACE_ATTRIB_LIST,
         eglContextAttribList: IntArray = EGL_CONTEXT_ATTRIB_LIST
-    ) : GlesRenderer(
-        surfaceHolder,
-        currentUserStyleRepository,
-        watchState,
-        interactiveDrawModeUpdateDelayMillis,
-        eglConfigAttribList,
-        eglSurfaceAttribList,
-        eglContextAttribList
-    ) where SharedAssetsT : SharedAssets {
+    ) :
+        GlesRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            interactiveDrawModeUpdateDelayMillis,
+            eglConfigAttribList,
+            eglSurfaceAttribList,
+            eglContextAttribList
+        ) where SharedAssetsT : SharedAssets {
         /**
          * When editing multiple [WatchFaceService] instances and hence Renderers can exist
          * concurrently (e.g. a headless instance and an interactive instance) and using
@@ -1602,8 +1564,8 @@
          * shaders, etc...) between them.
          *
          * To take advantage of SharedAssets, override this method. The constructed SharedAssets are
-         * passed into the [render] as an argument (NB you'll have to cast this to your type).
-         * It is safe to make GLES calls within this method.
+         * passed into the [render] as an argument (NB you'll have to cast this to your type). It is
+         * safe to make GLES calls within this method.
          *
          * When all instances using SharedAssets have been closed, [SharedAssets.onDestroy] will be
          * called.
@@ -1614,22 +1576,21 @@
          *
          * @return The [SharedAssetsT] that will be passed into [render] and [renderHighlightLayer].
          */
-        @WorkerThread
-        protected abstract suspend fun createSharedAssets(): SharedAssetsT
+        @WorkerThread protected abstract suspend fun createSharedAssets(): SharedAssetsT
 
         /**
          * Sub-classes should override this to implement their watch face rendering logic which
          * should respect the current [renderParameters]. Please note [WatchState.isAmbient] may not
          * match the [RenderParameters.drawMode] and should not be used to decide what to render.
-         * E.g. when editing from the companion phone while the watch is ambient, renders
-         * may be requested with [DrawMode.INTERACTIVE].
+         * E.g. when editing from the companion phone while the watch is ambient, renders may be
+         * requested with [DrawMode.INTERACTIVE].
          *
          * Any highlights due to [RenderParameters.highlightLayer] should be rendered by
          * [renderHighlightLayer] instead where possible. For correct behavior this function must
          * use the supplied [ZonedDateTime] in favor of any other ways of getting the time.
          *
-         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which
-         * has synchronized access to the GL context.
+         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which has
+         * synchronized access to the GL context.
          *
          * Note also `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` is called by the library
          * before this method.
@@ -1661,8 +1622,8 @@
          * function must use the supplied [ZonedDateTime] in favor of any other ways of getting the
          * time.
          *
-         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which
-         * has synchronized access to the GL context.
+         * Note this function is called inside a lambda passed to [runUiThreadGlCommands] which has
+         * synchronized access to the GL context.
          *
          * Note also `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` is called by the library
          * before this method.
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/TapEvent.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/TapEvent.kt
index 982e7a7..d091ddc 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/TapEvent.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/TapEvent.kt
@@ -22,21 +22,15 @@
 import java.time.Instant
 
 /** @hide */
-@IntDef(
-    value = [
-        TapType.DOWN,
-        TapType.UP,
-        TapType.CANCEL
-    ]
-)
+@IntDef(value = [TapType.DOWN, TapType.UP, TapType.CANCEL])
 public annotation class TapType {
     public companion object {
         /**
          * 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.
+         * 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
 
@@ -51,11 +45,11 @@
 
         /**
          * 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.
+         * 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
+         * 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
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index 6ed0000..fe4aaa7 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -55,17 +55,17 @@
 import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.utility.TraceEvent
 import java.lang.Long.min
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.launch
 import java.security.InvalidParameterException
 import java.time.Duration
 import java.time.Instant
 import java.time.ZoneId
 import java.time.ZonedDateTime
 import kotlin.math.max
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.launch
 
 // Human reaction time is limited to ~100ms.
 private const val MIN_PERCEPTIBLE_DELAY_MILLIS = 100
@@ -80,12 +80,7 @@
  *
  * @hide
  */
-@IntDef(
-    value = [
-        WatchFaceType.DIGITAL,
-        WatchFaceType.ANALOG
-    ]
-)
+@IntDef(value = [WatchFaceType.DIGITAL, WatchFaceType.ANALOG])
 public annotation class WatchFaceType {
     public companion object {
         /* The WatchFace has an analog time display. */
@@ -101,7 +96,7 @@
  * complicationSlots 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 renderer The [Renderer] for this WatchFace.
  */
 public class WatchFace(
@@ -160,6 +155,7 @@
 
         /**
          * For use by on watch face editors.
+         *
          * @hide
          */
         @JvmStatic
@@ -181,6 +177,7 @@
 
         /**
          * For use by on watch face editors.
+         *
          * @hide
          */
         @SuppressLint("NewApi")
@@ -195,9 +192,8 @@
             // Attempt to construct the class for the specified watchFaceName, failing if it either
             // doesn't exist or isn't a [WatchFaceService].
             val watchFaceServiceClass =
-                Class.forName(componentName.className) ?: throw IllegalArgumentException(
-                    "Can't create ${componentName.className}"
-                )
+                Class.forName(componentName.className)
+                    ?: throw IllegalArgumentException("Can't create ${componentName.className}")
             if (!WatchFaceService::class.java.isAssignableFrom(WatchFaceService::class.java)) {
                 throw IllegalArgumentException(
                     "${componentName.className} is not a WatchFaceService"
@@ -206,8 +202,8 @@
                 val watchFaceService =
                     watchFaceServiceClass.getConstructor().newInstance() as WatchFaceService
                 watchFaceService.setContext(context)
-                val engine = watchFaceService.createHeadlessEngine() as
-                    WatchFaceService.EngineWrapper
+                val engine =
+                    watchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
                 val headlessWatchFaceImpl = engine.createHeadlessInstance(params)
                 return engine.deferredWatchFaceImpl.await().WFEditorDelegate(headlessWatchFaceImpl)
             }
@@ -216,6 +212,7 @@
 
     /**
      * Delegate used by on watch face editors.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -223,7 +220,7 @@
         /** The [WatchFace]'s [UserStyleSchema]. */
         public val userStyleSchema: UserStyleSchema
 
-        /** The watch face's  [UserStyle]. */
+        /** The watch face's [UserStyle]. */
         public var userStyle: UserStyle
 
         /** The [WatchFace]'s [ComplicationSlotsManager]. */
@@ -283,13 +280,13 @@
          * - [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
+         * 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
+         * 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
@@ -311,33 +308,36 @@
      * 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 [WatchFaceStyle.PROTECT_STATUS_BAR], [WatchFaceStyle.PROTECT_HOTWORD_INDICATOR],
-     * [WatchFaceStyle.PROTECT_WHOLE_SCREEN].
+     *   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.
-     * `[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 `true` are indicating they are prepared to receive [TapType.DOWN],
-     * [TapType.CANCEL], and [TapType.UP] events.
+     *   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 `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(
+    public class LegacyWatchFaceOverlayStyle
+    @JvmOverloads
+    constructor(
         public val viewProtectionMode: Int,
         public val statusBarGravity: Int,
-        @get:JvmName("isTapEventsAccepted")
-        public val tapEventsAccepted: Boolean,
+        @get:JvmName("isTapEventsAccepted") public val tapEventsAccepted: Boolean,
         @ColorInt public val accentColor: Int = WatchFaceStyle.DEFAULT_ACCENT_COLOR
     ) {
         init {
-            if (viewProtectionMode < 0 ||
-                viewProtectionMode >
-                WatchFaceStyle.PROTECT_STATUS_BAR + WatchFaceStyle.PROTECT_HOTWORD_INDICATOR +
-                WatchFaceStyle.PROTECT_WHOLE_SCREEN
+            if (
+                viewProtectionMode < 0 ||
+                    viewProtectionMode >
+                        WatchFaceStyle.PROTECT_STATUS_BAR +
+                            WatchFaceStyle.PROTECT_HOTWORD_INDICATOR +
+                            WatchFaceStyle.PROTECT_WHOLE_SCREEN
             ) {
                 throw IllegalArgumentException(
                     "View protection must be combination " +
@@ -348,21 +348,14 @@
     }
 
     /** The legacy [LegacyWatchFaceOverlayStyle] which only affects Wear 2.0 devices. */
-    public var legacyWatchFaceStyle: LegacyWatchFaceOverlayStyle = LegacyWatchFaceOverlayStyle(
-        0,
-        0,
-        true
-    )
+    public var legacyWatchFaceStyle: LegacyWatchFaceOverlayStyle =
+        LegacyWatchFaceOverlayStyle(0, 0, true)
         private set
 
-    /**
-     * Sets the legacy [LegacyWatchFaceOverlayStyle] which only affects Wear 2.0 devices.
-     */
+    /** Sets the legacy [LegacyWatchFaceOverlayStyle] which only affects Wear 2.0 devices. */
     public fun setLegacyWatchFaceStyle(
         legacyWatchFaceStyle: LegacyWatchFaceOverlayStyle
-    ): WatchFace = apply {
-        this.legacyWatchFaceStyle = legacyWatchFaceStyle
-    }
+    ): WatchFace = apply { this.legacyWatchFaceStyle = legacyWatchFaceStyle }
 
     /**
      * This class allows the watch face to configure the status overlay which is rendered by the
@@ -433,12 +426,8 @@
     public var overlayStyle: OverlayStyle = OverlayStyle()
         private set
 
-    /**
-     * Sets the [OverlayStyle] which affects Wear 3.0 devices and beyond.
-     */
-    public fun setOverlayStyle(
-        watchFaceOverlayStyle: OverlayStyle
-    ): WatchFace = apply {
+    /** Sets the [OverlayStyle] which affects Wear 3.0 devices and beyond. */
+    public fun setOverlayStyle(watchFaceOverlayStyle: OverlayStyle): WatchFace = apply {
         this.overlayStyle = watchFaceOverlayStyle
     }
 
@@ -455,7 +444,9 @@
      * @param previewReferenceTimeMillis The UTC preview time in milliseconds since the epoch
      */
     public fun setOverridePreviewReferenceInstant(previewReferenceTimeMillis: Instant): WatchFace =
-        apply { overridePreviewReferenceInstant = previewReferenceTimeMillis }
+        apply {
+            overridePreviewReferenceInstant = previewReferenceTimeMillis
+        }
 
     /**
      * Sets an optional [TapListener] which if not `null` gets called on the ui thread whenever the
@@ -479,9 +470,7 @@
      */
     public fun setComplicationDeniedDialogIntent(
         complicationDeniedDialogIntent: Intent?
-    ): WatchFace = apply {
-        this.complicationDeniedDialogIntent = complicationDeniedDialogIntent
-    }
+    ): WatchFace = apply { this.complicationDeniedDialogIntent = complicationDeniedDialogIntent }
 
     /**
      * Sets the [Intent] to launch an activity that explains the rational for the requesting the
@@ -516,15 +505,15 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @SuppressLint("SyntheticAccessor")
-public class WatchFaceImpl @UiThread constructor(
+public class WatchFaceImpl
+@UiThread
+constructor(
     watchface: WatchFace,
     private val watchFaceHostApi: WatchFaceHostApi,
     private val watchState: WatchState,
     internal val currentUserStyleRepository: CurrentUserStyleRepository,
-
     @get:VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     public var complicationSlotsManager: ComplicationSlotsManager,
-
     internal val broadcastsObserver: BroadcastsObserver,
     internal var broadcastsReceiver: BroadcastsReceiver?
 ) {
@@ -597,10 +586,8 @@
     private val legacyWatchFaceStyle = watchface.legacyWatchFaceStyle
     internal val renderer = watchface.renderer
     private val tapListener = watchface.tapListener
-    internal var complicationDeniedDialogIntent =
-        watchface.complicationDeniedDialogIntent
-    internal var complicationRationaleDialogIntent =
-        watchface.complicationRationaleDialogIntent
+    internal var complicationDeniedDialogIntent = watchface.complicationDeniedDialogIntent
+    internal var complicationRationaleDialogIntent = watchface.complicationRationaleDialogIntent
     internal var overlayStyle = watchface.overlayStyle
 
     private var mockTime = MockTime(1.0, 0, Long.MAX_VALUE)
@@ -618,15 +605,16 @@
             watchFaceHostApi.getContext().javaClass.name
         )
 
-    internal fun getWatchFaceStyle() = WatchFaceStyle(
-        componentName,
-        legacyWatchFaceStyle.viewProtectionMode,
-        legacyWatchFaceStyle.statusBarGravity,
-        legacyWatchFaceStyle.accentColor,
-        false,
-        false,
-        legacyWatchFaceStyle.tapEventsAccepted
-    )
+    internal fun getWatchFaceStyle() =
+        WatchFaceStyle(
+            componentName,
+            legacyWatchFaceStyle.viewProtectionMode,
+            legacyWatchFaceStyle.statusBarGravity,
+            legacyWatchFaceStyle.accentColor,
+            false,
+            false,
+            legacyWatchFaceStyle.tapEventsAccepted
+        )
 
     internal fun onActionTimeZoneChanged() {
         renderer.invalidate()
@@ -639,14 +627,15 @@
     }
 
     internal fun onMockTime(intent: Intent) {
-        mockTime.speed = intent.getFloatExtra(
-            EXTRA_MOCK_TIME_SPEED_MULTIPLIER,
-            MOCK_TIME_DEFAULT_SPEED_MULTIPLIER
-        ).toDouble()
-        mockTime.minTime = intent.getLongExtra(
-            EXTRA_MOCK_TIME_WRAPPING_MIN_TIME,
-            MOCK_TIME_WRAPPING_MIN_TIME_DEFAULT
-        )
+        mockTime.speed =
+            intent
+                .getFloatExtra(EXTRA_MOCK_TIME_SPEED_MULTIPLIER, MOCK_TIME_DEFAULT_SPEED_MULTIPLIER)
+                .toDouble()
+        mockTime.minTime =
+            intent.getLongExtra(
+                EXTRA_MOCK_TIME_WRAPPING_MIN_TIME,
+                MOCK_TIME_WRAPPING_MIN_TIME_DEFAULT
+            )
         // If MOCK_TIME_WRAPPING_MIN_TIME_DEFAULT is specified then use the current time.
         if (mockTime.minTime == MOCK_TIME_WRAPPING_MIN_TIME_DEFAULT) {
             mockTime.minTime = systemTimeProvider.getSystemTimeMillis()
@@ -656,22 +645,24 @@
 
     /** The reference [Instant] time for editor preview images in milliseconds since the epoch. */
     public val previewReferenceInstant: Instant =
-        watchface.overridePreviewReferenceInstant ?: Instant.ofEpochMilli(
-            when (watchface.watchFaceType) {
-                WatchFaceType.ANALOG -> watchState.analogPreviewReferenceTimeMillis
-                WatchFaceType.DIGITAL -> watchState.digitalPreviewReferenceTimeMillis
-                else -> throw InvalidParameterException("Unrecognized watchFaceType")
-            }
-        )
+        watchface.overridePreviewReferenceInstant
+            ?: Instant.ofEpochMilli(
+                when (watchface.watchFaceType) {
+                    WatchFaceType.ANALOG -> watchState.analogPreviewReferenceTimeMillis
+                    WatchFaceType.DIGITAL -> watchState.digitalPreviewReferenceTimeMillis
+                    else -> throw InvalidParameterException("Unrecognized watchFaceType")
+                }
+            )
 
     internal var initComplete = false
 
     private fun interruptionFilter(it: Int) {
         // We are in mute mode in any of the following modes. The specific mode depends on the
         // device's implementation of "Do Not Disturb".
-        val inMuteMode = it == NotificationManager.INTERRUPTION_FILTER_NONE ||
-            it == NotificationManager.INTERRUPTION_FILTER_PRIORITY ||
-            it == NotificationManager.INTERRUPTION_FILTER_ALARMS
+        val inMuteMode =
+            it == NotificationManager.INTERRUPTION_FILTER_NONE ||
+                it == NotificationManager.INTERRUPTION_FILTER_PRIORITY ||
+                it == NotificationManager.INTERRUPTION_FILTER_ALARMS
         if (muteMode != inMuteMode) {
             muteMode = inMuteMode
             watchFaceHostApi.invalidate()
@@ -721,8 +712,9 @@
     init {
         renderer.watchFaceHostApi = watchFaceHostApi
 
-        if (renderer.additionalContentDescriptionLabels.isNotEmpty() ||
-            complicationSlotsManager.complicationSlots.isEmpty()
+        if (
+            renderer.additionalContentDescriptionLabels.isNotEmpty() ||
+                complicationSlotsManager.complicationSlots.isEmpty()
         ) {
             watchFaceHostApi.updateContentDescriptionLabels()
         }
@@ -772,11 +764,13 @@
     internal fun invalidateIfNotAnimating() {
         // Ensure we render a frame if the ComplicationSlot needs rendering, e.g. because it loaded
         // an image. However if we're animating there's no need to trigger an extra invalidation.
-        if (!renderer.shouldAnimate() || computeDelayTillNextFrame(
-                nextDrawTimeMillis,
-                systemTimeProvider.getSystemTimeMillis(),
-                Instant.now()
-            ) > MIN_PERCEPTIBLE_DELAY_MILLIS
+        if (
+            !renderer.shouldAnimate() ||
+                computeDelayTillNextFrame(
+                    nextDrawTimeMillis,
+                    systemTimeProvider.getSystemTimeMillis(),
+                    Instant.now()
+                ) > MIN_PERCEPTIBLE_DELAY_MILLIS
         ) {
             watchFaceHostApi.invalidate()
         }
@@ -816,38 +810,40 @@
             renderParameters: RenderParameters,
             instant: Instant,
             slotIdToComplicationData: Map<Int, ComplicationData>?
-        ): Bitmap = TraceEvent("WFEditorDelegate.takeScreenshot").use {
-            val oldComplicationData =
-                complicationSlotsManager.complicationSlots.values.associateBy(
-                    { it.id },
-                    { it.renderer.getData() }
-                )
+        ): Bitmap =
+            TraceEvent("WFEditorDelegate.takeScreenshot").use {
+                val oldComplicationData =
+                    complicationSlotsManager.complicationSlots.values.associateBy(
+                        { it.id },
+                        { it.renderer.getData() }
+                    )
 
-            slotIdToComplicationData?.let {
-                for ((id, complicationData) in it) {
-                    complicationSlotsManager.setComplicationDataUpdateSync(
-                        id,
-                        complicationData,
-                        instant
-                    )
+                slotIdToComplicationData?.let {
+                    for ((id, complicationData) in it) {
+                        complicationSlotsManager.setComplicationDataUpdateSync(
+                            id,
+                            complicationData,
+                            instant
+                        )
+                    }
                 }
-            }
-            val screenShot = renderer.takeScreenshot(
-                ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")),
-                renderParameters
-            )
-            slotIdToComplicationData?.let {
-                val now = getNow()
-                for ((id, complicationData) in oldComplicationData) {
-                    complicationSlotsManager.setComplicationDataUpdateSync(
-                        id,
-                        complicationData,
-                        now
+                val screenShot =
+                    renderer.takeScreenshot(
+                        ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")),
+                        renderParameters
                     )
+                slotIdToComplicationData?.let {
+                    val now = getNow()
+                    for ((id, complicationData) in oldComplicationData) {
+                        complicationSlotsManager.setComplicationDataUpdateSync(
+                            id,
+                            complicationData,
+                            now
+                        )
+                    }
                 }
+                return screenShot
             }
-            return screenShot
-        }
 
         override fun setComplicationSlotConfigExtrasChangeCallback(
             callback: WatchFace.ComplicationSlotConfigExtrasChangeCallback?
@@ -856,12 +852,13 @@
         }
 
         @SuppressLint("NewApi") // release
-        override fun onDestroy(): Unit = TraceEvent("WFEditorDelegate.onDestroy").use {
-            if (watchState.isHeadless) {
-                headlessWatchFaceImpl!!.release()
-                this@WatchFaceImpl.onDestroy()
+        override fun onDestroy(): Unit =
+            TraceEvent("WFEditorDelegate.onDestroy").use {
+                if (watchState.isHeadless) {
+                    headlessWatchFaceImpl!!.release()
+                    this@WatchFaceImpl.onDestroy()
+                }
             }
-        }
     }
 
     internal fun onDestroy() {
@@ -919,11 +916,12 @@
     /** @hide */
     @UiThread
     internal fun maybeUpdateDrawMode() {
-        var newDrawMode = if (watchState.isBatteryLowAndNotCharging.getValueOr(false)) {
-            DrawMode.LOW_BATTERY_INTERACTIVE
-        } else {
-            DrawMode.INTERACTIVE
-        }
+        var newDrawMode =
+            if (watchState.isBatteryLowAndNotCharging.getValueOr(false)) {
+                DrawMode.LOW_BATTERY_INTERACTIVE
+            } else {
+                DrawMode.INTERACTIVE
+            }
         // Watch faces may wish to run an animation while entering ambient mode and we let them
         // defer entering ambient mode.
         if (watchState.isAmbient.value!! && !renderer.shouldAnimate()) {
@@ -975,7 +973,6 @@
      * @param startTimeMillis The SystemTime in milliseconds at which we started rendering
      * @param currentTimeMillis The current SystemTime in milliseconds
      * @param nowInstant The current [Instant].
-     *
      * @hide
      */
     @UiThread
@@ -1008,13 +1005,14 @@
         }
 
         // If the delay is long then round to the beginning of the next period.
-        var nextFrameTimeMillis = if (updateRateMillis >= 500) {
-            val nextUnroundedTime = previousRequestedFrameTimeMillis + updateRateMillis
-            val delay = updateRateMillis - (nextUnroundedTime % updateRateMillis)
-            previousRequestedFrameTimeMillis + delay
-        } else {
-            previousRequestedFrameTimeMillis + updateRateMillis
-        }
+        var nextFrameTimeMillis =
+            if (updateRateMillis >= 500) {
+                val nextUnroundedTime = previousRequestedFrameTimeMillis + updateRateMillis
+                val delay = updateRateMillis - (nextUnroundedTime % updateRateMillis)
+                previousRequestedFrameTimeMillis + delay
+            } else {
+                previousRequestedFrameTimeMillis + updateRateMillis
+            }
 
         // If updateRateMillis is a multiple of 1 minute then align rendering to the beginning of
         // the minute.
@@ -1055,8 +1053,9 @@
 
         when (tapType) {
             TapType.UP -> {
-                if (tappedComplication.id != lastTappedComplicationId &&
-                    lastTappedComplicationId != null
+                if (
+                    tappedComplication.id != lastTappedComplicationId &&
+                        lastTappedComplicationId != null
                 ) {
                     // The UP event belongs to a different complication then the DOWN event,
                     // do not consider this a tap on either of them.
@@ -1077,112 +1076,118 @@
 
     @UiThread
     @RequiresApi(27)
-    internal fun renderWatchFaceToBitmap(
-        params: WatchFaceRenderParams
-    ): Bundle = TraceEvent("WatchFaceImpl.renderWatchFaceToBitmap").use {
-        val oldStyle = currentUserStyleRepository.userStyle.value
-        val instant = Instant.ofEpochMilli(params.calendarTimeMillis)
-
-        params.userStyle?.let {
-            currentUserStyleRepository.updateUserStyle(
-                UserStyle(UserStyleData(it), currentUserStyleRepository.schema)
-            )
-        }
-
-        val oldComplicationData =
-            complicationSlotsManager.complicationSlots.values.associateBy(
-                { it.id },
-                { it.renderer.getData() }
-            )
-
-        params.idAndComplicationDatumWireFormats?.let {
-            for (idAndData in it) {
-                complicationSlotsManager.setComplicationDataUpdateSync(
-                    idAndData.id, idAndData.complicationData.toApiComplicationData(), instant
-                )
-            }
-        }
-
-        val bitmap = renderer.takeScreenshot(
-            ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")),
-            RenderParameters(params.renderParametersWireFormat)
-        )
-
-        // Restore previous style & complicationSlots if required.
-        if (params.userStyle != null) {
-            currentUserStyleRepository.updateUserStyle(oldStyle)
-        }
-
-        if (params.idAndComplicationDatumWireFormats != null) {
-            val now = getNow()
-            for ((id, complicationData) in oldComplicationData) {
-                complicationSlotsManager.setComplicationDataUpdateSync(id, complicationData, now)
-            }
-        }
-
-        return SharedMemoryImage.ashmemWriteImageBundle(bitmap)
-    }
-
-    @UiThread
-    @RequiresApi(27)
-    internal fun renderComplicationToBitmap(
-        params: ComplicationRenderParams
-    ): Bundle? = TraceEvent("WatchFaceImpl.renderComplicationToBitmap").use {
-        val zonedDateTime = ZonedDateTime.ofInstant(
-            Instant.ofEpochMilli(params.calendarTimeMillis),
-            ZoneId.of("UTC")
-        )
-        return complicationSlotsManager[params.complicationSlotId]?.let {
+    internal fun renderWatchFaceToBitmap(params: WatchFaceRenderParams): Bundle =
+        TraceEvent("WatchFaceImpl.renderWatchFaceToBitmap").use {
             val oldStyle = currentUserStyleRepository.userStyle.value
             val instant = Instant.ofEpochMilli(params.calendarTimeMillis)
 
-            val newStyle = params.userStyle
-            if (newStyle != null) {
+            params.userStyle?.let {
                 currentUserStyleRepository.updateUserStyle(
-                    UserStyle(UserStyleData(newStyle), currentUserStyleRepository.schema)
+                    UserStyle(UserStyleData(it), currentUserStyleRepository.schema)
                 )
             }
 
-            val bounds = it.computeBounds(renderer.screenBounds)
-            val complicationBitmap =
-                Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888)
-
-            var prevData: ComplicationData? = null
-            val screenshotComplicationData = params.complicationData
-            if (screenshotComplicationData != null) {
-                prevData = it.renderer.getData()
-                complicationSlotsManager.setComplicationDataUpdateSync(
-                    params.complicationSlotId,
-                    screenshotComplicationData.toApiComplicationData(),
-                    instant
+            val oldComplicationData =
+                complicationSlotsManager.complicationSlots.values.associateBy(
+                    { it.id },
+                    { it.renderer.getData() }
                 )
+
+            params.idAndComplicationDatumWireFormats?.let {
+                for (idAndData in it) {
+                    complicationSlotsManager.setComplicationDataUpdateSync(
+                        idAndData.id,
+                        idAndData.complicationData.toApiComplicationData(),
+                        instant
+                    )
+                }
             }
 
-            it.renderer.render(
-                Canvas(complicationBitmap),
-                Rect(0, 0, bounds.width(), bounds.height()),
-                zonedDateTime,
-                RenderParameters(params.renderParametersWireFormat),
-                params.complicationSlotId
-            )
-
-            // Restore previous ComplicationData & style if required.
-            if (prevData != null) {
-                val now = getNow()
-                complicationSlotsManager.setComplicationDataUpdateSync(
-                    params.complicationSlotId,
-                    prevData,
-                    now
+            val bitmap =
+                renderer.takeScreenshot(
+                    ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")),
+                    RenderParameters(params.renderParametersWireFormat)
                 )
-            }
 
-            if (newStyle != null) {
+            // Restore previous style & complicationSlots if required.
+            if (params.userStyle != null) {
                 currentUserStyleRepository.updateUserStyle(oldStyle)
             }
 
-            SharedMemoryImage.ashmemWriteImageBundle(complicationBitmap)
+            if (params.idAndComplicationDatumWireFormats != null) {
+                val now = getNow()
+                for ((id, complicationData) in oldComplicationData) {
+                    complicationSlotsManager.setComplicationDataUpdateSync(
+                        id,
+                        complicationData,
+                        now
+                    )
+                }
+            }
+
+            return SharedMemoryImage.ashmemWriteImageBundle(bitmap)
         }
-    }
+
+    @UiThread
+    @RequiresApi(27)
+    internal fun renderComplicationToBitmap(params: ComplicationRenderParams): Bundle? =
+        TraceEvent("WatchFaceImpl.renderComplicationToBitmap").use {
+            val zonedDateTime =
+                ZonedDateTime.ofInstant(
+                    Instant.ofEpochMilli(params.calendarTimeMillis),
+                    ZoneId.of("UTC")
+                )
+            return complicationSlotsManager[params.complicationSlotId]?.let {
+                val oldStyle = currentUserStyleRepository.userStyle.value
+                val instant = Instant.ofEpochMilli(params.calendarTimeMillis)
+
+                val newStyle = params.userStyle
+                if (newStyle != null) {
+                    currentUserStyleRepository.updateUserStyle(
+                        UserStyle(UserStyleData(newStyle), currentUserStyleRepository.schema)
+                    )
+                }
+
+                val bounds = it.computeBounds(renderer.screenBounds)
+                val complicationBitmap =
+                    Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888)
+
+                var prevData: ComplicationData? = null
+                val screenshotComplicationData = params.complicationData
+                if (screenshotComplicationData != null) {
+                    prevData = it.renderer.getData()
+                    complicationSlotsManager.setComplicationDataUpdateSync(
+                        params.complicationSlotId,
+                        screenshotComplicationData.toApiComplicationData(),
+                        instant
+                    )
+                }
+
+                it.renderer.render(
+                    Canvas(complicationBitmap),
+                    Rect(0, 0, bounds.width(), bounds.height()),
+                    zonedDateTime,
+                    RenderParameters(params.renderParametersWireFormat),
+                    params.complicationSlotId
+                )
+
+                // Restore previous ComplicationData & style if required.
+                if (prevData != null) {
+                    val now = getNow()
+                    complicationSlotsManager.setComplicationDataUpdateSync(
+                        params.complicationSlotId,
+                        prevData,
+                        now
+                    )
+                }
+
+                if (newStyle != null) {
+                    currentUserStyleRepository.updateUserStyle(oldStyle)
+                }
+
+                SharedMemoryImage.ashmemWriteImageBundle(complicationBitmap)
+            }
+        }
 
     @UiThread
     internal fun dump(writer: IndentingPrintWriter) {
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceColors.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceColors.kt
index a74c8b6..c6b1d7b 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceColors.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceColors.kt
@@ -21,9 +21,8 @@
 import androidx.wear.watchface.data.WatchFaceColorsWireFormat
 
 /**
- * Provides information about the colors of a watch face, exposing the three most
- * representative colors. This may be used by the system to influence the colors used for the
- * system ui.
+ * Provides information about the colors of a watch face, exposing the three most representative
+ * colors. This may be used by the system to influence the colors used for the system ui.
  */
 @WatchFaceExperimental
 public class WatchFaceColors(
@@ -56,18 +55,20 @@
             "tertiaryColor=$tertiaryColor)"
     }
 
-    internal fun toWireFormat() = WatchFaceColorsWireFormat(
-        primaryColor.toArgb(),
-        secondaryColor.toArgb(),
-        tertiaryColor.toArgb()
-    )
+    internal fun toWireFormat() =
+        WatchFaceColorsWireFormat(
+            primaryColor.toArgb(),
+            secondaryColor.toArgb(),
+            tertiaryColor.toArgb()
+        )
 }
 
 /** @hide */
 @OptIn(WatchFaceExperimental::class)
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-fun WatchFaceColorsWireFormat.toApiFormat() = WatchFaceColors(
-    Color.valueOf(primaryColor),
-    Color.valueOf(secondaryColor),
-    Color.valueOf(tertiaryColor)
-)
\ No newline at end of file
+fun WatchFaceColorsWireFormat.toApiFormat() =
+    WatchFaceColors(
+        Color.valueOf(primaryColor),
+        Color.valueOf(secondaryColor),
+        Color.valueOf(tertiaryColor)
+    )
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceExperimental.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceExperimental.kt
index 13c27b4..758241a 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceExperimental.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceExperimental.kt
@@ -16,8 +16,6 @@
 
 package androidx.wear.watchface
 
-@RequiresOptIn(
-    "This is an experimental API that may change or be removed without warning."
-)
+@RequiresOptIn("This is an experimental API that may change or be removed without warning.")
 @Retention(AnnotationRetention.BINARY)
-annotation class WatchFaceExperimental
\ No newline at end of file
+annotation class WatchFaceExperimental
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
index 4e70ee1..47dab79 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
@@ -30,6 +30,7 @@
 
 /**
  * The API [WatchFaceImpl] uses to communicate with the system.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -67,13 +68,12 @@
      * Creates/updates ContentDescriptionLabels for text-to-speech screen readers to make your
      * [ComplicationSlot]s, buttons, and any other text on your watchface accessible.
      *
-     * Each label is a region of the screen in absolute pixel coordinates, along with
-     * time-dependent text, the labels are generated from data in [ComplicationSlotsManager],
+     * Each label is a region of the screen in absolute pixel coordinates, along with time-dependent
+     * text, the labels are generated from data in [ComplicationSlotsManager],
      * [Renderer.additionalContentDescriptionLabels], [Renderer.screenBounds] and
      * [Renderer.getMainClockElementBounds].
      *
-     * This is a fairly expensive operation so use it sparingly (e.g. do not call it in
-     * `onDraw()`).
+     * This is a fairly expensive operation so use it sparingly (e.g. do not call it in `onDraw()`).
      */
     public fun updateContentDescriptionLabels()
 
@@ -87,8 +87,7 @@
      * received will match the type chosen by the user. If no complication data source has been
      * configured, data of type [ComplicationData.TYPE_NOT_CONFIGURED] will be received.
      *
-     * Ids here are chosen by the watch face to represent each complication and can be any
-     * integer.
+     * Ids here are chosen by the watch face to represent each complication and can be any integer.
      */
     public fun setActiveComplicationSlots(complicationSlotIds: IntArray)
 
@@ -97,9 +96,9 @@
      *
      * Accepts a list of custom complication data sources to attempt to set as the default
      * complication data source for the specified watch face [ComplicationSlot] id. The custom
-     * complication data sources are tried in turn, if the first doesn't exist then the next one
-     * is tried and so on. If none of them exist then the specified system complication data
-     * source is set as the default instead.
+     * complication data sources are tried in turn, if the first doesn't exist then the next one is
+     * tried and so on. If none of them exist then the specified system complication data source is
+     * set as the default instead.
      *
      * This will do nothing if the complication data sources are not installed, or if the specified
      * type is not supported by the complication data sources, or if the user has already selected a
@@ -118,12 +117,11 @@
      *
      * @param complicationSlotId The [ComplicationSlot] id.
      * @param dataSources data sources The list of non-system complication data sources to try in
-     * order before falling back to
-     * fallbackSystemProvider. This list may be null.
+     *   order before falling back to fallbackSystemProvider. This list may be null.
      * @param fallbackSystemProvider The system complication data source to use if none of the
-     * complication data sources could be used.
+     *   complication data sources could be used.
      * @param type The type of complication data that should be provided. Must be one of the types
-     * defined in [ComplicationData].
+     *   defined in [ComplicationData].
      */
     public fun setDefaultComplicationDataSourceWithFallbacks(
         complicationSlotId: Int,
@@ -133,8 +131,7 @@
     )
 
     /** Schedules a call to [Renderer.renderInternal] to draw the next frame. */
-    @UiThread
-    public fun invalidate()
+    @UiThread public fun invalidate()
 
     public fun postInvalidate(delay: Duration = Duration.ZERO)
 
@@ -148,8 +145,7 @@
      * Sent by the system at the top of the minute. This may trigger rendering if SysUI hasn't sent
      * called setWatchUiState.
      */
-    @UiThread
-    public fun onActionTimeTick() {}
+    @UiThread public fun onActionTimeTick() {}
 
     /** The engine must notify the system that the watch face's colors have changed. */
     @OptIn(WatchFaceExperimental::class)
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index b3ee562..d2db005 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.watchface
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.app.KeyguardManager
 import android.content.ComponentName
 import android.content.Context
@@ -36,6 +35,7 @@
 import android.os.RemoteException
 import android.os.Trace
 import android.service.wallpaper.WallpaperService
+import android.support.wearable.complications.ComplicationData as WireComplicationData
 import android.support.wearable.watchface.Constants
 import android.support.wearable.watchface.IWatchFaceService
 import android.support.wearable.watchface.accessibility.AccessibilityUtils
@@ -122,14 +122,14 @@
 internal const val SURFACE_DRAW_TIMEOUT_MS = 100L
 
 /**
- * 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
- * structure of a WatchFaceService based watch face is:
+ * 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 structure of a
+ * WatchFaceService based watch face is:
  *
  * @sample androidx.wear.watchface.samples.kDocCreateExampleWatchFaceService
  *
- * Sub classes of WatchFaceService are expected to implement [createWatchFace] which is the
- * factory for making [WatchFace]s. If the watch faces uses complications then
+ * Sub classes of WatchFaceService are expected to implement [createWatchFace] which is the factory
+ * for making [WatchFace]s. If the watch faces uses complications then
  * [createComplicationSlotsManager] should be overridden. All [ComplicationSlot]s are assumed to be
  * enumerated up upfront and passed as a collection into [ComplicationSlotsManager]'s constructor
  * which is returned by [createComplicationSlotsManager].
@@ -138,37 +138,33 @@
  * hands and ticks, etc...) and companion editing is directly supported via [UserStyleSchema] and
  * [UserStyleSetting]. To enable support for styling override [createUserStyleSchema].
  *
- * WatchFaceService can expose pre-populated style presets by overriding [createUserStyleFlavors]
- * or via XML (see below). Each presents represents separate style configured with [UserStyle]
- * and complication slot policies configured with
- * [androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy]. The system will
- * only access flavors if metadata tag is present in manifest:
- *
+ * WatchFaceService can expose pre-populated style presets by overriding [createUserStyleFlavors] or
+ * via XML (see below). Each presents represents separate style configured with [UserStyle] and
+ * complication slot policies configured with
+ * [androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy]. The system will only
+ * access flavors if metadata tag is present in manifest:
  * ```
  *    <meta-data
  *      android:name="androidx.wear.watchface.FLAVORS_SUPPORTED"
  *      android:value="true" />
  * ```
  *
- * WatchFaces are initially constructed on a background thread before being used exclusively on
- * the ui thread afterwards. There is a memory barrier between construction and rendering so no
- * special threading primitives are required.
+ * WatchFaces are initially constructed on a background thread before being used exclusively on the
+ * ui thread afterwards. There is a memory barrier between construction and rendering so no special
+ * threading primitives are required.
  *
  * To aid debugging watch face animations, WatchFaceService allows you to speed up or slow down
- * time, and to loop between two instants.  This is controlled by MOCK_TIME_INTENT intents
- * with a float extra called "androidx.wear.watchface.extra.MOCK_TIME_SPEED_MULTIPLIE" and to long
- * extras called "androidx.wear.watchface.extra.MOCK_TIME_WRAPPING_MIN_TIME" and
+ * time, and to loop between two instants. This is controlled by MOCK_TIME_INTENT intents with a
+ * float extra called "androidx.wear.watchface.extra.MOCK_TIME_SPEED_MULTIPLIE" and to long extras
+ * called "androidx.wear.watchface.extra.MOCK_TIME_WRAPPING_MIN_TIME" and
  * "androidx.wear.watchface.extra.MOCK_TIME_WRAPPING_MAX_TIME" (which are UTC time in milliseconds).
  * If minTime is omitted or set to -1 then the current time is sampled as minTime.
  *
- * E.g, to make time go twice as fast:
- *  adb shell am broadcast -a androidx.wear.watchface.MockTime \
- *            --ef androidx.wear.watchface.extra.MOCK_TIME_SPEED_MULTIPLIER 2.0
- *
+ * E.g., to make time go twice as fast: adb shell am broadcast -a androidx.wear.watchface.MockTime \
+ * --ef androidx.wear.watchface.extra.MOCK_TIME_SPEED_MULTIPLIER 2.0
  *
  * To use the sample on watch face editor UI, import the wear:wear-watchface-editor-samples library
  * and add the following into your watch face's AndroidManifest.xml:
- *
  * ```
  * <activity
  *   android:name="androidx.wear.watchface.editor.sample.WatchFaceConfigActivity"
@@ -186,7 +182,6 @@
  *
  * To register a WatchFaceService with the system add a <service> tag to the <application> in your
  * watch face's AndroidManifest.xml:
- *
  * ```
  *  <service
  *    android:name=".MyWatchFaceServiceClass"
@@ -222,22 +217,19 @@
  * can choose to allow the user to create multiple instances (each with their own styling and a
  * distinct [WatchState.watchFaceInstanceId]) by adding this meta-data to your watch face's
  * manifest:
- *
  * ```
  *    <meta-data
  *      android:name="androidx.wear.watchface.MULTIPLE_INSTANCES_ALLOWED"
  *      android:value="true" />
  * ```
  *
- *
  * A watch face can declare the [UserStyleSchema], [ComplicationSlot]s and [UserStyleFlavors] in
  * XML. The main advantage is simplicity for the developer, however meta data queries (see
- * androidx.wear.watchface.client.WatchFaceMetadataClient) are faster because they can be
- * performed without having to bind to the WatchFaceService.
+ * androidx.wear.watchface.client.WatchFaceMetadataClient) are faster because they can be performed
+ * without having to bind to the WatchFaceService.
  *
- * To use xml inflation, add an androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition
- * meta date tag to your service:
- *
+ * To use xml inflation, add an androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition meta
+ * date tag to your service:
  * ```
  *     <meta-data
  *         android:name="androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition"
@@ -245,7 +237,6 @@
  * ```
  *
  * And the linked xml/my_watchface_definition resource must contain a XmlWatchFace node. E.g.:
- *
  * ```
  *     <XmlWatchFace xmlns:android="http://schemas.android.com/apk/res/android"
  *             xmlns:app="http://schemas.android.com/apk/res-auto">
@@ -290,8 +281,8 @@
  *    </XmlWatchFace>
  * ```
  *
- * If you use resources references to specify identifiers, they should be locale independent
- * (i.e. translatable="false").
+ * If you use resources references to specify identifiers, they should be locale independent (i.e.
+ * translatable="false").
  *
  * If you use XmlSchemaAndComplicationSlotsDefinition then you shouldn't override
  * [createUserStyleSchema] or [createComplicationSlotsManager]. However if <ComplicationSlot> tags
@@ -345,11 +336,9 @@
         internal const val MAX_REASONABLE_SCHEMA_WIRE_SIZE_BYTES = 50000
 
         /** The maximum reasonable wire size for an Icon in a [UserStyleSchema] in pixels. */
-        @Px
-        internal const val MAX_REASONABLE_SCHEMA_ICON_WIDTH = 400
+        @Px internal const val MAX_REASONABLE_SCHEMA_ICON_WIDTH = 400
 
-        @Px
-        internal const val MAX_REASONABLE_SCHEMA_ICON_HEIGHT = 400
+        @Px internal const val MAX_REASONABLE_SCHEMA_ICON_HEIGHT = 400
 
         /** @hide */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -363,8 +352,8 @@
         }
 
         /**
-         * Waits for deferredValue using runBlocking, then executes the task on the thread
-         * specified by executionThread param.
+         * Waits for deferredValue using runBlocking, then executes the task on the thread specified
+         * by executionThread param.
          */
         private fun <R, V> awaitDeferredThenRunTaskOnThread(
             engine: EngineWrapper?,
@@ -372,41 +361,42 @@
             executionThread: ExecutionThread,
             task: (deferredValue: V) -> R,
             waitDeferred: suspend (engine: EngineWrapper) -> V
-        ): R? = TraceEvent(traceName).use {
-            if (engine == null) {
-                Log.w(TAG, "Task $traceName posted after close(), ignoring.")
-                return null
-            }
-            runBlocking {
-                try {
-                    withTimeout(AWAIT_DEFERRED_TIMEOUT) {
-                        val deferredValue = waitDeferred(engine)
-                        when (executionThread) {
-                            ExecutionThread.UI -> {
-                                withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+        ): R? =
+            TraceEvent(traceName).use {
+                if (engine == null) {
+                    Log.w(TAG, "Task $traceName posted after close(), ignoring.")
+                    return null
+                }
+                runBlocking {
+                    try {
+                        withTimeout(AWAIT_DEFERRED_TIMEOUT) {
+                            val deferredValue = waitDeferred(engine)
+                            when (executionThread) {
+                                ExecutionThread.UI -> {
+                                    withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+                                        task(deferredValue)
+                                    }
+                                }
+                                ExecutionThread.CURRENT -> {
                                     task(deferredValue)
                                 }
                             }
-
-                            ExecutionThread.CURRENT -> {
-                                task(deferredValue)
-                            }
                         }
+                    } catch (e: Exception) {
+                        Log.e(TAG, "Operation $traceName failed", e)
+                        throw e
                     }
-                } catch (e: Exception) {
-                    Log.e(TAG, "Operation $traceName failed", e)
-                    throw e
                 }
             }
-        }
 
         internal fun <R> awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine: EngineWrapper?,
             traceName: String,
             task: (watchFaceImpl: WatchFaceImpl) -> R
-        ): R? = awaitDeferredThenRunTaskOnThread(engine, traceName, ExecutionThread.UI, task) {
-            it.deferredWatchFaceImpl.await()
-        }
+        ): R? =
+            awaitDeferredThenRunTaskOnThread(engine, traceName, ExecutionThread.UI, task) {
+                it.deferredWatchFaceImpl.await()
+            }
 
         /**
          * During startup tasks will run before those posted by
@@ -416,9 +406,10 @@
             engine: EngineWrapper?,
             traceName: String,
             task: (watchFace: WatchFace) -> R
-        ): R? = awaitDeferredThenRunTaskOnThread(engine, traceName, ExecutionThread.UI, task) {
-            it.deferredWatchFace.await()
-        }
+        ): R? =
+            awaitDeferredThenRunTaskOnThread(engine, traceName, ExecutionThread.UI, task) {
+                it.deferredWatchFace.await()
+            }
 
         /**
          * During startup tasks will run before those posted by
@@ -430,18 +421,19 @@
             traceName: String,
             executionThread: ExecutionThread,
             task: (earlyInitDetails: EarlyInitDetails) -> R
-        ): R? = awaitDeferredThenRunTaskOnThread(engine, traceName, executionThread, task) {
-            it.deferredEarlyInitDetails.await()
-        }
+        ): R? =
+            awaitDeferredThenRunTaskOnThread(engine, traceName, executionThread, task) {
+                it.deferredEarlyInitDetails.await()
+            }
     }
 
     /**
      * The context used to resolve resources. Unlocks future work.
+     *
      * @hide
      */
     protected open val resourcesContext: Context
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        get() = this
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) get() = this
 
     /**
      * Returns the id of the XmlSchemaAndComplicationSlotsDefinition XML resource or 0 if it can't
@@ -453,18 +445,18 @@
     @Suppress("DEPRECATION")
     public open fun getXmlWatchFaceResourceId(): Int {
         return try {
-            packageManager.getServiceInfo(
-                ComponentName(this, javaClass),
-                PackageManager.GET_META_DATA
-            ).metaData.getInt(XML_WATCH_FACE_METADATA)
+            packageManager
+                .getServiceInfo(ComponentName(this, javaClass), PackageManager.GET_META_DATA)
+                .metaData
+                .getInt(XML_WATCH_FACE_METADATA)
         } catch (e: Exception) {
             // If an exception occurs here, we'll ignore it and return 0 meaning it can't be fond.
             0
         }
     }
 
-    private val
-        xmlSchemaAndComplicationSlotsDefinition: XmlSchemaAndComplicationSlotsDefinition by lazy {
+    private val xmlSchemaAndComplicationSlotsDefinition:
+        XmlSchemaAndComplicationSlotsDefinition by lazy {
         val resourceId = getXmlWatchFaceResourceId()
         if (resourceId == 0) {
             XmlSchemaAndComplicationSlotsDefinition(
@@ -473,10 +465,7 @@
                 flavors = null
             )
         } else {
-            XmlSchemaAndComplicationSlotsDefinition.inflate(
-                resources,
-                resources.getXml(resourceId)
-            )
+            XmlSchemaAndComplicationSlotsDefinition.inflate(resources, resources.getXml(resourceId))
         }
     }
 
@@ -488,7 +477,7 @@
      * [createUserStyleFlavors] and [createWatchFace]. This is called on a background thread.
      *
      * @return The [UserStyleSchema] to create a [CurrentUserStyleRepository] with, which is passed
-     * to [createComplicationSlotsManager] and [createWatchFace].
+     *   to [createComplicationSlotsManager] and [createWatchFace].
      */
     @WorkerThread
     @Suppress("Deprecation") // userStyleSettings
@@ -501,12 +490,12 @@
      * If the WatchFaceService's manifest doesn't define a
      * androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition meta data tag then override
      * this factory method to create a non-empty [ComplicationSlotsManager]. This manager will be
-     * passed to [createUserStyleFlavors] and [createWatchFace].
-     * This will be called from a background thread but the ComplicationSlotsManager should be
-     * accessed exclusively from the UiThread afterwards.
+     * passed to [createUserStyleFlavors] and [createWatchFace]. This will be called from a
+     * background thread but the ComplicationSlotsManager should be accessed exclusively from the
+     * UiThread afterwards.
      *
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
-     * [UserStyleSchema] returned by [createUserStyleSchema].
+     *   [UserStyleSchema] returned by [createUserStyleSchema].
      * @return The [ComplicationSlotsManager] to pass into [createWatchFace].
      */
     @WorkerThread
@@ -553,7 +542,7 @@
      * must override this method. A [NotImplementedError] exception will be thrown if you don't.
      *
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
-     * [UserStyleSchema] returned by [createUserStyleSchema].
+     *   [UserStyleSchema] returned by [createUserStyleSchema].
      */
     @Suppress("DEPRECATION")
     @WorkerThread
@@ -569,24 +558,22 @@
     /**
      * If the WatchFaceService's manifest doesn't define a
      * androidx.wear.watchface.XmlSchemaAndComplicationSlotsDefinition meta data tag then override
-     * this factory method to create non-empty [UserStyleFlavors].
-     * This is called on a background thread. The system reads the flavors once and changes may be
-     * ignored until the APK is updated.
-     * Metadata tag "androidx.wear.watchface.FLAVORS_SUPPORTED" should be added to let the system
-     * know the service supports flavors.
+     * this factory method to create non-empty [UserStyleFlavors]. This is called on a background
+     * thread. The system reads the flavors once and changes may be ignored until the APK is
+     * updated. Metadata tag "androidx.wear.watchface.FLAVORS_SUPPORTED" should be added to let the
+     * system know the service supports flavors.
      *
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
-     * [UserStyleSchema] returned by [createUserStyleSchema].
+     *   [UserStyleSchema] returned by [createUserStyleSchema].
      * @param complicationSlotsManager The [ComplicationSlotsManager] returned by
-     * [createComplicationSlotsManager]
+     *   [createComplicationSlotsManager]
      * @return The [UserStyleFlavors], which is exposed to the system.
      */
     @WorkerThread
     protected open fun createUserStyleFlavors(
         currentUserStyleRepository: CurrentUserStyleRepository,
         complicationSlotsManager: ComplicationSlotsManager
-    ): UserStyleFlavors =
-        xmlSchemaAndComplicationSlotsDefinition.flavors ?: UserStyleFlavors()
+    ): UserStyleFlavors = xmlSchemaAndComplicationSlotsDefinition.flavors ?: UserStyleFlavors()
 
     /**
      * Override this factory method to create your WatchFaceImpl. This method will be called by the
@@ -601,9 +588,9 @@
      * @param surfaceHolder The [SurfaceHolder] to pass to the [Renderer]'s constructor.
      * @param watchState The [WatchState] for the watch face.
      * @param complicationSlotsManager The [ComplicationSlotsManager] returned by
-     * [createComplicationSlotsManager].
+     *   [createComplicationSlotsManager].
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
-     * [UserStyleSchema] returned by [createUserStyleSchema].
+     *   [UserStyleSchema] returned by [createUserStyleSchema].
      * @return A [WatchFace] whose [Renderer] uses the provided [surfaceHolder].
      */
     @WorkerThread
@@ -634,8 +621,7 @@
      *
      * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    open fun forceIsVisibleForTesting() = false
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) open fun forceIsVisibleForTesting() = false
 
     /* Interface for setting the main thread priority. This exists for testing. */
     internal interface MainThreadPriorityDelegate {
@@ -644,16 +630,17 @@
         fun setInteractivePriority()
     }
 
-    internal open fun getMainThreadPriorityDelegate() = object : MainThreadPriorityDelegate {
-        override fun setNormalPriority() {
-            // NB pID is the same as the main thread tID.
-            Process.setThreadPriority(Process.myPid(), Process.THREAD_PRIORITY_DEFAULT)
-        }
+    internal open fun getMainThreadPriorityDelegate() =
+        object : MainThreadPriorityDelegate {
+            override fun setNormalPriority() {
+                // NB pID is the same as the main thread tID.
+                Process.setThreadPriority(Process.myPid(), Process.THREAD_PRIORITY_DEFAULT)
+            }
 
-        override fun setInteractivePriority() {
-            Process.setThreadPriority(Process.myPid(), Process.THREAD_PRIORITY_DISPLAY)
+            override fun setInteractivePriority() {
+                Process.setThreadPriority(Process.myPid(), Process.THREAD_PRIORITY_DISPLAY)
+            }
         }
-    }
 
     /** Used for testing calls to invalidate. */
     internal open fun onInvalidate() {}
@@ -669,6 +656,7 @@
 
     /**
      * Interface for getting the current system time.
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -682,25 +670,33 @@
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public open fun getSystemTimeProvider(): SystemTimeProvider = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = System.currentTimeMillis()
+    public open fun getSystemTimeProvider(): SystemTimeProvider =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = System.currentTimeMillis()
 
-        override fun getSystemTimeZoneId() = ZoneId.systemDefault()
-    }
+            override fun getSystemTimeZoneId() = ZoneId.systemDefault()
+        }
 
     /** This is open for testing. The background thread is used for watch face initialization. */
     internal open fun getBackgroundThreadHandlerImpl(): Handler {
         synchronized(this) {
             if (backgroundThread == null) {
-                backgroundThread = HandlerThread(
-                    "WatchFaceBackground",
-                    Process.THREAD_PRIORITY_FOREGROUND // The user is waiting on WF init.
-                ).apply {
-                    uncaughtExceptionHandler = Thread.UncaughtExceptionHandler { _, throwable ->
-                        Log.e(TAG, "Uncaught exception on watch face background thread", throwable)
-                    }
-                    start()
-                }
+                backgroundThread =
+                    HandlerThread(
+                            "WatchFaceBackground",
+                            Process.THREAD_PRIORITY_FOREGROUND // The user is waiting on WF init.
+                        )
+                        .apply {
+                            uncaughtExceptionHandler =
+                                Thread.UncaughtExceptionHandler { _, throwable ->
+                                    Log.e(
+                                        TAG,
+                                        "Uncaught exception on watch face background thread",
+                                        throwable
+                                    )
+                                }
+                            start()
+                        }
             }
             return Handler(backgroundThread!!.looper)
         }
@@ -721,8 +717,7 @@
      *
      * Note that this cannot override platform-dependent versioning, which means inconsistency.
      */
-    @VisibleForTesting
-    internal open val wearSdkVersion = Build.VERSION.SDK_INT
+    @VisibleForTesting internal open val wearSdkVersion = Build.VERSION.SDK_INT
 
     /** [Choreographer] isn't supposed to be mocked, so we use a thin wrapper. */
     internal interface ChoreographerWrapper {
@@ -731,28 +726,30 @@
     }
 
     /** This is open to allow mocking. */
-    internal open fun getChoreographer(): ChoreographerWrapper = object : ChoreographerWrapper {
-        private val choreographer = Choreographer.getInstance()
+    internal open fun getChoreographer(): ChoreographerWrapper =
+        object : ChoreographerWrapper {
+            private val choreographer = Choreographer.getInstance()
 
-        init {
-            require(Looper.myLooper() == Looper.getMainLooper()) {
-                "Creating choreographer not on the main thread"
+            init {
+                require(Looper.myLooper() == Looper.getMainLooper()) {
+                    "Creating choreographer not on the main thread"
+                }
+            }
+
+            override fun postFrameCallback(callback: Choreographer.FrameCallback) {
+                choreographer.postFrameCallback(callback)
+            }
+
+            override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
+                choreographer.removeFrameCallback(callback)
             }
         }
 
-        override fun postFrameCallback(callback: Choreographer.FrameCallback) {
-            choreographer.postFrameCallback(callback)
-        }
-
-        override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
-            choreographer.removeFrameCallback(callback)
-        }
-    }
-
     internal open fun cancelCoroutineScopesInOnDestroy() = true
 
     /**
      * This is open for use by tests, it allows them to inject a custom [SurfaceHolder].
+     *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -769,19 +766,18 @@
     internal open fun readDirectBootPrefs(
         context: Context,
         fileName: String
-    ): WallpaperInteractiveWatchFaceInstanceParams? = TraceEvent(
-        "WatchFaceService.readDirectBootPrefs"
-    ).use {
-        try {
-            val directBootContext = context.createDeviceProtectedStorageContext()
-            val reader = directBootContext.openFileInput(fileName)
-            reader.use {
-                ParcelUtils.fromInputStream<WallpaperInteractiveWatchFaceInstanceParams>(reader)
+    ): WallpaperInteractiveWatchFaceInstanceParams? =
+        TraceEvent("WatchFaceService.readDirectBootPrefs").use {
+            try {
+                val directBootContext = context.createDeviceProtectedStorageContext()
+                val reader = directBootContext.openFileInput(fileName)
+                reader.use {
+                    ParcelUtils.fromInputStream<WallpaperInteractiveWatchFaceInstanceParams>(reader)
+                }
+            } catch (e: Exception) {
+                null
             }
-        } catch (e: Exception) {
-            null
         }
-    }
 
     /**
      * Writes WallpaperInteractiveWatchFaceInstanceParams to a file. This is only used in the
@@ -791,30 +787,26 @@
         context: Context,
         fileName: String,
         prefs: WallpaperInteractiveWatchFaceInstanceParams
-    ): Unit = TraceEvent("WatchFaceService.writeDirectBootPrefs").use {
-        val directBootContext = context.createDeviceProtectedStorageContext()
-        val writer = directBootContext.openFileOutput(fileName, Context.MODE_PRIVATE)
-        writer.use {
-            ParcelUtils.toOutputStream(prefs, writer)
+    ): Unit =
+        TraceEvent("WatchFaceService.writeDirectBootPrefs").use {
+            val directBootContext = context.createDeviceProtectedStorageContext()
+            val writer = directBootContext.openFileOutput(fileName, Context.MODE_PRIVATE)
+            writer.use { ParcelUtils.toOutputStream(prefs, writer) }
         }
-    }
 
     internal open fun readComplicationDataCacheByteArray(
         context: Context,
         fileName: String
-    ): ByteArray? = TraceEvent(
-        "WatchFaceService.readComplicationCache"
-    ).use {
-        try {
-            val directBootContext = context.createDeviceProtectedStorageContext()
-            val reader = directBootContext.openFileInput(fileName)
-            reader.use {
-                it.readBytes()
+    ): ByteArray? =
+        TraceEvent("WatchFaceService.readComplicationCache").use {
+            try {
+                val directBootContext = context.createDeviceProtectedStorageContext()
+                val reader = directBootContext.openFileInput(fileName)
+                reader.use { it.readBytes() }
+            } catch (e: Exception) {
+                null
             }
-        } catch (e: Exception) {
-            null
         }
-    }
 
     internal open fun writeComplicationDataCacheByteArray(
         context: Context,
@@ -823,79 +815,78 @@
     ) {
         val directBootContext = context.createDeviceProtectedStorageContext()
         val writer = directBootContext.openFileOutput(fileName, Context.MODE_PRIVATE)
-        writer.use {
-            writer.write(byteArray)
-        }
+        writer.use { writer.write(byteArray) }
     }
 
     internal fun periodicallyWriteComplicationDataCache(
         context: Context,
         fileName: String,
         complicationsFlow: MutableStateFlow<List<IdAndComplicationDataWireFormat>>
-    ) = TraceEvent(
-        "WatchFaceService.writeComplicationCache"
-    ).use {
-        val backgroundThreadCoroutineScope =
-            CoroutineScope(getBackgroundThreadHandler().asCoroutineDispatcher().immediate)
-        backgroundThreadCoroutineScope.launch {
-            complicationsFlow.collect { complicationDataWireFormats ->
-                try {
-                    // The combination of 'collect' which conflates the updates and adding a delay
-                    // here ensures that we write updates at least 1 second apart. The delay is at
-                    // the beginning to delay writes during WF init.
-                    delay(1000)
-                    val stream = ByteArrayOutputStream()
-                    val objectOutputStream = ObjectOutputStream(stream)
-                    objectOutputStream.writeInt(complicationDataWireFormats.size)
-                    for (wireData in complicationDataWireFormats) {
-                        objectOutputStream.writeInt(wireData.id)
-                        objectOutputStream.writeObject(
-                            if ((wireData.complicationData.persistencePolicy and
-                                    ComplicationPersistencePolicies.DO_NOT_PERSIST) != 0
-                            ) {
-                                NoDataComplicationData().asWireComplicationData()
-                            } else {
-                                wireData.complicationData
-                            }
-                        )
+    ) =
+        TraceEvent("WatchFaceService.writeComplicationCache").use {
+            val backgroundThreadCoroutineScope =
+                CoroutineScope(getBackgroundThreadHandler().asCoroutineDispatcher().immediate)
+            backgroundThreadCoroutineScope.launch {
+                complicationsFlow.collect { complicationDataWireFormats ->
+                    try {
+                        // The combination of 'collect' which conflates the updates and adding a
+                        // delay
+                        // here ensures that we write updates at least 1 second apart. The delay is
+                        // at
+                        // the beginning to delay writes during WF init.
+                        delay(1000)
+                        val stream = ByteArrayOutputStream()
+                        val objectOutputStream = ObjectOutputStream(stream)
+                        objectOutputStream.writeInt(complicationDataWireFormats.size)
+                        for (wireData in complicationDataWireFormats) {
+                            objectOutputStream.writeInt(wireData.id)
+                            objectOutputStream.writeObject(
+                                if (
+                                    (wireData.complicationData.persistencePolicy and
+                                        ComplicationPersistencePolicies.DO_NOT_PERSIST) != 0
+                                ) {
+                                    NoDataComplicationData().asWireComplicationData()
+                                } else {
+                                    wireData.complicationData
+                                }
+                            )
+                        }
+                        objectOutputStream.close()
+                        val byteArray = stream.toByteArray()
+                        writeComplicationDataCacheByteArray(context, fileName, byteArray)
+                    } catch (e: Exception) {
+                        Log.w(TAG, "Failed to write to complication cache due to exception", e)
                     }
-                    objectOutputStream.close()
-                    val byteArray = stream.toByteArray()
-                    writeComplicationDataCacheByteArray(context, fileName, byteArray)
-                } catch (e: Exception) {
-                    Log.w(TAG, "Failed to write to complication cache due to exception", e)
                 }
             }
         }
-    }
 
     internal fun readComplicationDataCache(
         context: Context,
         fileName: String
-    ): List<IdAndComplicationDataWireFormat>? = TraceEvent(
-        "WatchFaceService.readComplicationCache"
-    ).use {
-        return readComplicationDataCacheByteArray(context, fileName)?.let {
-            try {
-                val objectInputStream = ObjectInputStream(ByteArrayInputStream(it))
-                val complicationData = ArrayList<IdAndComplicationDataWireFormat>()
-                val numComplications = objectInputStream.readInt()
-                for (i in 0 until numComplications) {
-                    complicationData.add(
-                        IdAndComplicationDataWireFormat(
-                            objectInputStream.readInt(),
-                            (objectInputStream.readObject() as WireComplicationData)
+    ): List<IdAndComplicationDataWireFormat>? =
+        TraceEvent("WatchFaceService.readComplicationCache").use {
+            return readComplicationDataCacheByteArray(context, fileName)?.let {
+                try {
+                    val objectInputStream = ObjectInputStream(ByteArrayInputStream(it))
+                    val complicationData = ArrayList<IdAndComplicationDataWireFormat>()
+                    val numComplications = objectInputStream.readInt()
+                    for (i in 0 until numComplications) {
+                        complicationData.add(
+                            IdAndComplicationDataWireFormat(
+                                objectInputStream.readInt(),
+                                (objectInputStream.readObject() as WireComplicationData)
+                            )
                         )
-                    )
+                    }
+                    objectInputStream.close()
+                    complicationData
+                } catch (e: Exception) {
+                    Log.w(TAG, "Failed to read to complication cache due to exception", e)
+                    null
                 }
-                objectInputStream.close()
-                complicationData
-            } catch (e: Exception) {
-                Log.w(TAG, "Failed to read to complication cache due to exception", e)
-                null
             }
         }
-    }
 
     /** Reads user style from a file. This is only used in the pre-android R flow. */
     internal fun readPrefs(context: Context, fileName: String): UserStyleWireFormat {
@@ -997,7 +988,9 @@
                 // setDefaultComplicationProviderWithFallbacks albeit with more calls.
                 if (fallbackSystemDataSource != WatchFaceImpl.NO_DEFAULT_DATA_SOURCE) {
                     iWatchFaceService.setDefaultSystemComplicationProvider(
-                        complicationSlotId, fallbackSystemDataSource, type
+                        complicationSlotId,
+                        fallbackSystemDataSource,
+                        type
                     )
                 }
 
@@ -1006,7 +999,9 @@
                     // and the list is probably an ArrayList so it's probably O(n) in practice.
                     for (i in dataSources.size - 1 downTo 0) {
                         iWatchFaceService.setDefaultComplicationProvider(
-                            complicationSlotId, dataSources[i], type
+                            complicationSlotId,
+                            dataSources[i],
+                            type
                         )
                     }
                 }
@@ -1023,7 +1018,8 @@
 
             try {
                 iWatchFaceService.setActiveComplications(
-                    complicationSlotIds, /* updateAll= */ !complicationsActivated
+                    complicationSlotIds,
+                    /* updateAll= */ !complicationsActivated
                 )
                 complicationsActivated = true
             } catch (e: RemoteException) {
@@ -1117,44 +1113,44 @@
             )
         }
 
-        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
+        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
+                    // Apply immutable properties to mutableWatchState before creating the watch
+                    // face.
+                    onPropertiesChanged(pendingProperties!!)
+                    pendingProperties = null
 
-                val watchState = engineWrapper.mutableWatchState.asWatchState()
-                engineWrapper.createWatchFaceInternal(
-                    watchState, null, "maybeCreateWatchFace"
-                )
+                    val watchState = engineWrapper.mutableWatchState.asWatchState()
+                    engineWrapper.createWatchFaceInternal(watchState, null, "maybeCreateWatchFace")
 
-                // Wait for watchface init to complete.
-                val watchFaceImpl = engineWrapper.deferredWatchFaceImpl.await()
+                    // Wait for watchface init to complete.
+                    val watchFaceImpl = engineWrapper.deferredWatchFaceImpl.await()
 
-                val backgroundAction = pendingBackgroundAction
-                if (backgroundAction != null) {
-                    onBackgroundAction(backgroundAction)
-                    pendingBackgroundAction = null
+                    val backgroundAction = pendingBackgroundAction
+                    if (backgroundAction != null) {
+                        onBackgroundAction(backgroundAction)
+                        pendingBackgroundAction = null
+                    }
+                    if (pendingSetWatchFaceStyle) {
+                        onRequestStyle()
+                    }
+                    val visibility = pendingVisibilityChanged
+                    if (visibility != null) {
+                        engineWrapper.onVisibilityChanged(visibility)
+                        pendingVisibilityChanged = null
+                    }
+                    watchFaceImpl.complicationSlotsManager.onComplicationsUpdated()
                 }
-                if (pendingSetWatchFaceStyle) {
-                    onRequestStyle()
-                }
-                val visibility = pendingVisibilityChanged
-                if (visibility != null) {
-                    engineWrapper.onVisibilityChanged(visibility)
-                    pendingVisibilityChanged = null
-                }
-                watchFaceImpl.complicationSlotsManager.onComplicationsUpdated()
             }
-        }
     }
 
     internal class EarlyInitDetails(
@@ -1170,7 +1166,8 @@
         private val uiThreadHandler: Handler,
         private val backgroundThreadHandler: Handler,
         headless: Boolean
-    ) : WallpaperService.Engine(),
+    ) :
+        WallpaperService.Engine(),
         WatchFaceHostApi,
         AccessibilityManager.AccessibilityStateChangeListener {
         internal val backgroundThreadCoroutineScope =
@@ -1197,33 +1194,33 @@
         @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public val deferredWatchFaceImpl = CompletableDeferred<WatchFaceImpl>()
 
-        @VisibleForTesting
-        public var deferredValidation = CompletableDeferred<Unit>()
+        @VisibleForTesting public var deferredValidation = CompletableDeferred<Unit>()
 
         /**
-         * [deferredSurfaceHolder] will complete after [onSurfaceChanged], before then it's not
-         * safe to create a UiThread OpenGL context.
+         * [deferredSurfaceHolder] will complete after [onSurfaceChanged], before then it's not safe
+         * to create a UiThread OpenGL context.
          */
         private var deferredSurfaceHolder = CompletableDeferred<SurfaceHolder>()
 
         private val pendingUpdateTime: CancellableUniqueTask =
             CancellableUniqueTask(getUiThreadHandler())
 
-        internal val mutableWatchState = getMutableWatchState().apply {
-            isVisible.value = this@EngineWrapper.isVisible || forceIsVisibleForTesting()
-            // Watch faces with the old [onSetBinder] init flow don't know whether the system
-            // is ambient until they have received a background action wallpaper command.
-            // That's supposed to get sent very quickly, but in case it doesn't we initially
-            // assume we're not in ambient mode which should be correct most of the time.
-            isAmbient.value = false
-            isHeadless = headless
-            isLocked.value =
-                (getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).isDeviceLocked
-        }
+        internal val mutableWatchState =
+            getMutableWatchState().apply {
+                isVisible.value = this@EngineWrapper.isVisible || forceIsVisibleForTesting()
+                // Watch faces with the old [onSetBinder] init flow don't know whether the system
+                // is ambient until they have received a background action wallpaper command.
+                // That's supposed to get sent very quickly, but in case it doesn't we initially
+                // assume we're not in ambient mode which should be correct most of the time.
+                isAmbient.value = false
+                isHeadless = headless
+                isLocked.value =
+                    (getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).isDeviceLocked
+            }
 
         /**
-         * Whether or not we allow watch faces to animate. In some tests or for headless
-         * rendering (for remote config) we don't want this.
+         * Whether or not we allow watch faces to animate. In some tests or for headless rendering
+         * (for remote config) we don't want this.
          */
         internal var allowWatchfaceToAnimate = allowWatchFaceToAnimate()
 
@@ -1243,28 +1240,29 @@
          */
         private var frameCallbackPending = false
 
-        private val frameCallback = object : Choreographer.FrameCallback {
-            @SuppressWarnings("SyntheticAccessor")
-            override fun doFrame(frameTimeNs: Long) {
-                if (destroyed) {
-                    return
-                }
-                require(allowWatchfaceToAnimate) {
-                    "Choreographer doFrame called but allowWatchfaceToAnimate is false"
-                }
-                frameCallbackPending = false
+        private val frameCallback =
+            object : Choreographer.FrameCallback {
+                @SuppressWarnings("SyntheticAccessor")
+                override fun doFrame(frameTimeNs: Long) {
+                    if (destroyed) {
+                        return
+                    }
+                    require(allowWatchfaceToAnimate) {
+                        "Choreographer doFrame called but allowWatchfaceToAnimate is false"
+                    }
+                    frameCallbackPending = false
 
-                val watchFaceImpl: WatchFaceImpl? = getWatchFaceImplOrNull()
+                    val watchFaceImpl: WatchFaceImpl? = getWatchFaceImplOrNull()
 
-                /**
-                 * It's possible we went ambient by the time our callback occurred in which case
-                 * there's no point drawing.
-                 */
-                if (watchFaceImpl?.renderer?.shouldAnimate() != false) {
-                    draw(watchFaceImpl)
+                    /**
+                     * It's possible we went ambient by the time our callback occurred in which case
+                     * there's no point drawing.
+                     */
+                    if (watchFaceImpl?.renderer?.shouldAnimate() != false) {
+                        draw(watchFaceImpl)
+                    }
                 }
             }
-        }
 
         private val invalidateRunnable = Runnable(this::invalidate)
 
@@ -1323,9 +1321,7 @@
             }
 
             return if (deferredWatchFaceImpl.isCompleted) {
-                runBlocking {
-                    deferredWatchFaceImpl.await()
-                }
+                runBlocking { deferredWatchFaceImpl.await() }
             } else {
                 null
             }
@@ -1337,9 +1333,7 @@
          */
         internal fun getEarlyInitDetailsOrNull(): EarlyInitDetails? {
             return if (deferredEarlyInitDetails.isCompleted) {
-                runBlocking {
-                    deferredEarlyInitDetails.await()
-                }
+                runBlocking { deferredEarlyInitDetails.await() }
             } else {
                 null
             }
@@ -1352,125 +1346,134 @@
         /** Note this function should only be called once. */
         @SuppressWarnings("NewApi")
         @UiThread
-        private fun maybeCreateWCSApi(): Unit = TraceEvent(
-            "EngineWrapper.maybeCreateWCSApi"
-        ).use {
-            // If this is a headless instance then we don't want to create a WCS instance.
-            if (mutableWatchState.isHeadless) {
-                return
-            }
+        private fun maybeCreateWCSApi(): Unit =
+            TraceEvent("EngineWrapper.maybeCreateWCSApi").use {
+                // If this is a headless instance then we don't want to create a WCS instance.
+                if (mutableWatchState.isHeadless) {
+                    return
+                }
 
-            val pendingWallpaperInstance =
-                InteractiveInstanceManager.takePendingWallpaperInteractiveWatchFaceInstance()
+                val pendingWallpaperInstance =
+                    InteractiveInstanceManager.takePendingWallpaperInteractiveWatchFaceInstance()
 
-            // In a direct boot scenario attempt to load the previously serialized parameters.
-            if (pendingWallpaperInstance == null && wearSdkVersion >= Build.VERSION_CODES.R) {
-                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")
-                    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
+                // In a direct boot scenario attempt to load the previously serialized parameters.
+                if (pendingWallpaperInstance == null && wearSdkVersion >= Build.VERSION_CODES.R) {
+                    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")
+                        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)
                                 }
-                                it.callback.onInteractiveWatchFaceCreated(instance)
-                            }
-                    } catch (e: Exception) {
-                        InteractiveInstanceManager
-                            .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
-                                Log.e(
-                                    TAG,
-                                    "takePendingWallpaperInteractiveWatchFaceInstance failed"
+                        } catch (e: Exception) {
+                            InteractiveInstanceManager
+                                .takePendingWallpaperInteractiveWatchFaceInstance()
+                                ?.let {
+                                    Log.e(
+                                        TAG,
+                                        "takePendingWallpaperInteractiveWatchFaceInstance failed"
+                                    )
+                                    it.callback.onInteractiveWatchFaceCrashed(CrashInfoParcel(e))
+                                }
+                        } finally {
+                            asyncTraceEvent.close()
+                        }
+                    }
+                }
+
+                // If there's a pending WallpaperInteractiveWatchFaceInstance then create it.
+                if (pendingWallpaperInstance != null) {
+                    val asyncTraceEvent =
+                        AsyncTraceEvent("Create PendingWallpaperInteractiveWatchFaceInstance")
+                    val instance: InteractiveWatchFaceImpl? =
+                        try {
+                            val instance =
+                                createInteractiveInstance(
+                                    pendingWallpaperInstance.params,
+                                    "Boot with pendingWallpaperInstance"
                                 )
-                                it.callback.onInteractiveWatchFaceCrashed(
-                                    CrashInfoParcel(e)
-                                )
-                            }
-                    } finally {
-                        asyncTraceEvent.close()
+                            pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
+                                instance
+                            )
+                            instance
+                        } catch (e: Exception) {
+                            Log.e(TAG, "createInteractiveInstance failed")
+                            pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
+                                CrashInfoParcel(e)
+                            )
+                            null
+                        }
+                    asyncTraceEvent.close()
+                    val params = pendingWallpaperInstance.params
+                    directBootParams = params
+
+                    // Writing even small amounts of data to storage is quite slow and if we did
+                    // that immediately, we'd delay the first frame which is rendered via
+                    // onSurfaceRedrawNeeded. By posting this task we expedite first frame
+                    // rendering. There is a small window where the direct boot could be stale if
+                    // the watchface crashed but this seems unlikely in practice.
+                    backgroundThreadCoroutineScope.launch {
+                        // Wait for init to complete before writing the direct boot prefs, or we
+                        // might
+                        // sneak in before higher priority init tasks.
+                        instance?.engine?.deferredWatchFaceImpl?.await()
+
+                        // We don't want to display complications in direct boot mode so replace
+                        // with an
+                        // empty list. NB we can't actually serialise complications anyway so that's
+                        // just as well...
+                        params.idAndComplicationDataWireFormats = emptyList()
+
+                        writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
                     }
                 }
             }
 
-            // If there's a pending WallpaperInteractiveWatchFaceInstance then create it.
-            if (pendingWallpaperInstance != null) {
-                val asyncTraceEvent =
-                    AsyncTraceEvent("Create PendingWallpaperInteractiveWatchFaceInstance")
-                val instance: InteractiveWatchFaceImpl? = try {
-                    val instance = createInteractiveInstance(
-                        pendingWallpaperInstance.params,
-                        "Boot with pendingWallpaperInstance"
-                    )
-                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(instance)
-                    instance
-                } catch (e: Exception) {
-                    Log.e(TAG, "createInteractiveInstance failed")
-                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
-                        CrashInfoParcel(e)
-                    )
-                    null
-                }
-                asyncTraceEvent.close()
-                val params = pendingWallpaperInstance.params
-                directBootParams = params
-
-                // Writing even small amounts of data to storage is quite slow and if we did
-                // that immediately, we'd delay the first frame which is rendered via
-                // onSurfaceRedrawNeeded. By posting this task we expedite first frame
-                // rendering. There is a small window where the direct boot could be stale if
-                // the watchface crashed but this seems unlikely in practice.
-                backgroundThreadCoroutineScope.launch {
-                    // Wait for init to complete before writing the direct boot prefs, or we might
-                    // sneak in before higher priority init tasks.
-                    instance?.engine?.deferredWatchFaceImpl?.await()
-
-                    // We don't want to display complications in direct boot mode so replace with an
-                    // empty list. NB we can't actually serialise complications anyway so that's
-                    // just as well...
-                    params.idAndComplicationDataWireFormats = emptyList()
-
-                    writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
-                }
-            }
-        }
-
         @UiThread
-        internal fun ambientTickUpdate(): Unit = TraceEvent("EngineWrapper.ambientTickUpdate").use {
-            if (mutableWatchState.isAmbient.value!!) {
-                ambientUpdateWakelock.acquire(SURFACE_DRAW_TIMEOUT_MS)
-                try {
-                    // It's unlikely an ambient tick would be sent to a watch face that hasn't
-                    // loaded yet (if that did happen then draw would be a NOP). The watch face will
-                    // render at least once upon loading so we don't need to do anything special
-                    // here.
-                    val watchFaceImpl: WatchFaceImpl? = getWatchFaceImplOrNull()
-                    draw(watchFaceImpl)
-                } catch (t: Throwable) {
-                    Log.e(TAG, "ambientTickUpdate failed", t)
-                } finally {
-                    ambientUpdateWakelock.release()
+        internal fun ambientTickUpdate(): Unit =
+            TraceEvent("EngineWrapper.ambientTickUpdate").use {
+                if (mutableWatchState.isAmbient.value!!) {
+                    ambientUpdateWakelock.acquire(SURFACE_DRAW_TIMEOUT_MS)
+                    try {
+                        // It's unlikely an ambient tick would be sent to a watch face that hasn't
+                        // loaded yet (if that did happen then draw would be a NOP). The watch face
+                        // will
+                        // render at least once upon loading so we don't need to do anything special
+                        // here.
+                        val watchFaceImpl: WatchFaceImpl? = getWatchFaceImplOrNull()
+                        draw(watchFaceImpl)
+                    } catch (t: Throwable) {
+                        Log.e(TAG, "ambientTickUpdate failed", t)
+                    } finally {
+                        ambientUpdateWakelock.release()
+                    }
                 }
             }
-        }
 
         @UiThread
         internal fun setWatchUiState(watchUiState: WatchUiState, fromSysUi: Boolean) {
-            if (firstSetWatchUiState ||
-                watchUiState.inAmbientMode != mutableWatchState.isAmbient.value
+            if (
+                firstSetWatchUiState ||
+                    watchUiState.inAmbientMode != mutableWatchState.isAmbient.value
             ) {
                 mutableWatchState.isAmbient.value = watchUiState.inAmbientMode
             }
 
-            if (firstSetWatchUiState ||
-                watchUiState.interruptionFilter != mutableWatchState.interruptionFilter.value
+            if (
+                firstSetWatchUiState ||
+                    watchUiState.interruptionFilter != mutableWatchState.interruptionFilter.value
             ) {
                 mutableWatchState.interruptionFilter.value = watchUiState.interruptionFilter
             }
@@ -1483,21 +1486,20 @@
             }
         }
 
-        fun setUserStyle(userStyle: UserStyleWireFormat): Unit = TraceEvent(
-            "EngineWrapper.setUserStyle"
-        ).use {
-            uiThreadCoroutineScope.launch {
-                try {
-                    setUserStyleImpl(
-                        deferredEarlyInitDetails.await().userStyleRepository,
-                        userStyle
-                    )
-                } catch (e: Exception) {
-                    Log.e(TAG, "setUserStyle failed", e)
-                    throw e
+        fun setUserStyle(userStyle: UserStyleWireFormat): Unit =
+            TraceEvent("EngineWrapper.setUserStyle").use {
+                uiThreadCoroutineScope.launch {
+                    try {
+                        setUserStyleImpl(
+                            deferredEarlyInitDetails.await().userStyleRepository,
+                            userStyle
+                        )
+                    } catch (e: Exception) {
+                        Log.e(TAG, "setUserStyle failed", e)
+                        throw e
+                    }
                 }
             }
-        }
 
         @UiThread
         private fun setUserStyleImpl(
@@ -1541,8 +1543,7 @@
             // These properties never change so set them once only.
             if (!immutableSystemStateDone) {
                 mutableWatchState.hasLowBitAmbient = deviceConfig.hasLowBitAmbient
-                mutableWatchState.hasBurnInProtection =
-                    deviceConfig.hasBurnInProtection
+                mutableWatchState.hasBurnInProtection = deviceConfig.hasBurnInProtection
                 mutableWatchState.analogPreviewReferenceTimeMillis =
                     deviceConfig.analogPreviewReferenceTimeMillis
                 mutableWatchState.digitalPreviewReferenceTimeMillis =
@@ -1555,20 +1556,18 @@
         @AnyThread
         internal fun setComplicationDataList(
             complicationDataWireFormats: List<IdAndComplicationDataWireFormat>
-        ): Unit = TraceEvent("EngineWrapper.setComplicationDataList").use {
-            complicationsFlow.update { base ->
-                // We need to merge the updates.
-                val complicationUpdateMap = base.associate {
-                    Pair(it.id, it.complicationData)
-                }.toMutableMap()
-                for (data in complicationDataWireFormats) {
-                    complicationUpdateMap[data.id] = data.complicationData
-                }
-                complicationUpdateMap.map {
-                    IdAndComplicationDataWireFormat(it.key, it.value)
+        ): Unit =
+            TraceEvent("EngineWrapper.setComplicationDataList").use {
+                complicationsFlow.update { base ->
+                    // We need to merge the updates.
+                    val complicationUpdateMap =
+                        base.associate { Pair(it.id, it.complicationData) }.toMutableMap()
+                    for (data in complicationDataWireFormats) {
+                        complicationUpdateMap[data.id] = data.complicationData
+                    }
+                    complicationUpdateMap.map { IdAndComplicationDataWireFormat(it.key, it.value) }
                 }
             }
-        }
 
         @WorkerThread
         private fun listenForComplicationChanges(
@@ -1622,76 +1621,78 @@
 
         override fun getBackgroundThreadHandler(): Handler = backgroundThreadHandler
 
-        override fun onCreate(
-            holder: SurfaceHolder
-        ): Unit = TraceEvent("EngineWrapper.onCreate").use {
-            super.onCreate(holder)
-            ambientUpdateWakelock =
-                (getSystemService(Context.POWER_SERVICE) as PowerManager)
-                    .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$TAG:[AmbientUpdate]")
-            // Disable reference counting for our wake lock so that we can use the same wake lock
-            // for user code in invalidate() and after that for having canvas drawn.
-            ambientUpdateWakelock.setReferenceCounted(false)
+        override fun onCreate(holder: SurfaceHolder): Unit =
+            TraceEvent("EngineWrapper.onCreate").use {
+                super.onCreate(holder)
+                ambientUpdateWakelock =
+                    (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(
+                        PowerManager.PARTIAL_WAKE_LOCK,
+                        "$TAG:[AmbientUpdate]"
+                    )
+                // Disable reference counting for our wake lock so that we can use the same wake
+                // lock
+                // for user code in invalidate() and after that for having canvas drawn.
+                ambientUpdateWakelock.setReferenceCounted(false)
 
-            // Rerender watch face if the surface changes.
-            holder.addCallback(
-                object : SurfaceHolder.Callback {
-                    override fun surfaceChanged(
-                        holder: SurfaceHolder,
-                        format: Int,
-                        width: Int,
-                        height: Int
-                    ) {
-                        // We can sometimes get this callback before the watchface has been created
-                        // in which case it's safe to drop it.
-                        if (deferredWatchFaceImpl.isCompleted) {
-                            invalidate()
+                // Rerender watch face if the surface changes.
+                holder.addCallback(
+                    object : SurfaceHolder.Callback {
+                        override fun surfaceChanged(
+                            holder: SurfaceHolder,
+                            format: Int,
+                            width: Int,
+                            height: Int
+                        ) {
+                            // We can sometimes get this callback before the watchface has been
+                            // created
+                            // in which case it's safe to drop it.
+                            if (deferredWatchFaceImpl.isCompleted) {
+                                invalidate()
+                            }
                         }
-                    }
 
-                    override fun surfaceDestroyed(holder: SurfaceHolder) {
-                    }
+                        override fun surfaceDestroyed(holder: SurfaceHolder) {}
 
-                    override fun surfaceCreated(holder: SurfaceHolder) {
+                        override fun surfaceCreated(holder: SurfaceHolder) {}
                     }
-                }
-            )
-        }
+                )
+            }
 
         override fun onSurfaceChanged(
             holder: SurfaceHolder,
             format: Int,
             width: Int,
             height: Int
-        ): Unit = TraceEvent("EngineWrapper.onSurfaceChanged").use {
-            super.onSurfaceChanged(holder, format, width, height)
-            deferredSurfaceHolder.complete(holder)
-        }
-
-        override fun onApplyWindowInsets(
-            insets: WindowInsets?
-        ): Unit = TraceEvent("EngineWrapper.onApplyWindowInsets").use {
-            super.onApplyWindowInsets(insets)
-            @Px val chinHeight =
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-                    ChinHeightApi30.extractFromWindowInsets(insets)
-                } else {
-                    ChinHeightApi25.extractFromWindowInsets(insets)
-                }
-            if (immutableChinHeightDone) {
-                // The chin size cannot change so this should be called only once.
-                if (mutableWatchState.chinHeight != chinHeight) {
-                    Log.w(
-                        TAG,
-                        "unexpected chin size change ignored: " +
-                            "${mutableWatchState.chinHeight} != $chinHeight"
-                    )
-                }
-                return
+        ): Unit =
+            TraceEvent("EngineWrapper.onSurfaceChanged").use {
+                super.onSurfaceChanged(holder, format, width, height)
+                deferredSurfaceHolder.complete(holder)
             }
-            mutableWatchState.chinHeight = chinHeight
-            immutableChinHeightDone = true
-        }
+
+        override fun onApplyWindowInsets(insets: WindowInsets?): Unit =
+            TraceEvent("EngineWrapper.onApplyWindowInsets").use {
+                super.onApplyWindowInsets(insets)
+                @Px
+                val chinHeight =
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+                        ChinHeightApi30.extractFromWindowInsets(insets)
+                    } else {
+                        ChinHeightApi25.extractFromWindowInsets(insets)
+                    }
+                if (immutableChinHeightDone) {
+                    // The chin size cannot change so this should be called only once.
+                    if (mutableWatchState.chinHeight != chinHeight) {
+                        Log.w(
+                            TAG,
+                            "unexpected chin size change ignored: " +
+                                "${mutableWatchState.chinHeight} != $chinHeight"
+                        )
+                    }
+                    return
+                }
+                mutableWatchState.chinHeight = chinHeight
+                immutableChinHeightDone = true
+            }
 
         private fun quitBackgroundThreadIfCreated() {
             synchronized(this) {
@@ -1701,59 +1702,63 @@
         }
 
         @UiThread
-        override fun onDestroy(): Unit = TraceEvent("EngineWrapper.onDestroy").use {
-            super.onDestroy()
-            pendingUpdateTime.cancel()
-            if (!mutableWatchState.isHeadless) {
-                mainThreadPriorityDelegate.setNormalPriority()
-            }
+        override fun onDestroy(): Unit =
+            TraceEvent("EngineWrapper.onDestroy").use {
+                super.onDestroy()
+                pendingUpdateTime.cancel()
+                if (!mutableWatchState.isHeadless) {
+                    mainThreadPriorityDelegate.setNormalPriority()
+                }
 
-            destroyed = true
-            backgroundThreadCoroutineScope.cancel()
-            quitBackgroundThreadIfCreated()
-            uiThreadHandler.removeCallbacks(invalidateRunnable)
-            if (this::choreographer.isInitialized) {
-                choreographer.removeFrameCallback(frameCallback)
-            }
-            if (this::interactiveInstanceId.isInitialized) {
-                InteractiveInstanceManager.deleteInstance(interactiveInstanceId)
-            }
-            stopListeningForAccessibilityStateChanges()
+                destroyed = true
+                backgroundThreadCoroutineScope.cancel()
+                quitBackgroundThreadIfCreated()
+                uiThreadHandler.removeCallbacks(invalidateRunnable)
+                if (this::choreographer.isInitialized) {
+                    choreographer.removeFrameCallback(frameCallback)
+                }
+                if (this::interactiveInstanceId.isInitialized) {
+                    InteractiveInstanceManager.deleteInstance(interactiveInstanceId)
+                }
+                stopListeningForAccessibilityStateChanges()
 
-            // NB user code could throw an exception so do this last.
-            try {
-                runBlocking {
-                    // The WatchFaceImpl is created on the UiThread so if we get here and it's not
-                    // created we can be sure it'll never be created hence we don't need to destroy
-                    // it.
-                    if (deferredWatchFaceImpl.isCompleted) {
-                        deferredWatchFaceImpl.await().onDestroy()
-                    } else if (deferredWatchFace.isCompleted) {
-                        // However we should destroy the renderer if its been created.
-                        deferredWatchFace.await().renderer.onDestroy()
+                // NB user code could throw an exception so do this last.
+                try {
+                    runBlocking {
+                        // The WatchFaceImpl is created on the UiThread so if we get here and it's
+                        // not
+                        // created we can be sure it'll never be created hence we don't need to
+                        // destroy
+                        // it.
+                        if (deferredWatchFaceImpl.isCompleted) {
+                            deferredWatchFaceImpl.await().onDestroy()
+                        } else if (deferredWatchFace.isCompleted) {
+                            // However we should destroy the renderer if its been created.
+                            deferredWatchFace.await().renderer.onDestroy()
+                        }
+                    }
+                } catch (e: Exception) {
+                    // Throwing an exception here leads to a cascade of errors, log instead.
+                    Log.e(
+                        TAG,
+                        "WatchFace exception observed in onDestroy (may have occurred during init)",
+                        e
+                    )
+                } finally {
+                    if (this@EngineWrapper::ambientUpdateWakelock.isInitialized) {
+                        // Make sure the WakeLock doesn't retain the WatchFaceService.
+                        ambientUpdateWakelock.release()
+                    }
+
+                    // StateFlows may retain WatchFaceService via the coroutineScope. Call cancel to
+                    // ensure resources are released. Headless watch faces call
+                    // cancelCoroutineScopes
+                    // themselves since they call onDestroy from a coroutine context.
+                    if (cancelCoroutineScopesInOnDestroy() && !mutableWatchState.isHeadless) {
+                        cancelCoroutineScopes()
                     }
                 }
-            } catch (e: Exception) {
-                // Throwing an exception here leads to a cascade of errors, log instead.
-                Log.e(
-                    TAG,
-                    "WatchFace exception observed in onDestroy (may have occurred during init)",
-                    e
-                )
-            } finally {
-                if (this@EngineWrapper::ambientUpdateWakelock.isInitialized) {
-                    // Make sure the WakeLock doesn't retain the WatchFaceService.
-                    ambientUpdateWakelock.release()
-                }
-
-                // StateFlows may retain WatchFaceService via the coroutineScope. Call cancel to
-                // ensure resources are released. Headless watch faces call cancelCoroutineScopes
-                // themselves since they call onDestroy from a coroutine context.
-                if (cancelCoroutineScopesInOnDestroy() && !mutableWatchState.isHeadless) {
-                    cancelCoroutineScopes()
-                }
             }
-        }
 
         internal fun cancelCoroutineScopes() {
             uiThreadCoroutineScope.cancel()
@@ -1783,32 +1788,26 @@
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_AMBIENT_UPDATE") {
                         ambientTickUpdate()
                     }
-
                 Constants.COMMAND_BACKGROUND_ACTION ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_BACKGROUND_ACTION") {
                         wslFlow.onBackgroundAction(extras!!)
                     }
-
                 Constants.COMMAND_COMPLICATION_DATA ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_COMPLICATION_DATA") {
                         wslFlow.onComplicationSlotDataUpdate(extras!!)
                     }
-
                 Constants.COMMAND_REQUEST_STYLE ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_REQUEST_STYLE") {
                         wslFlow.onRequestStyle()
                     }
-
                 Constants.COMMAND_SET_BINDER ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_SET_BINDER") {
                         wslFlow.onSetBinder(extras!!)
                     }
-
                 Constants.COMMAND_SET_PROPERTIES ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_SET_PROPERTIES") {
                         wslFlow.onPropertiesChanged(extras!!)
                     }
-
                 Constants.COMMAND_TAP ->
                     uiThreadCoroutineScope.runBlockingWithTracing("onCommand COMMAND_TAP") {
                         val watchFaceImpl = deferredWatchFaceImpl.await()
@@ -1817,13 +1816,10 @@
                             TapEvent(
                                 x,
                                 y,
-                                Instant.ofEpochMilli(
-                                    systemTimeProvider.getSystemTimeMillis()
-                                )
+                                Instant.ofEpochMilli(systemTimeProvider.getSystemTimeMillis())
                             )
                         )
                     }
-
                 Constants.COMMAND_TOUCH ->
                     uiThreadCoroutineScope.runBlockingWithTracing("onCommand COMMAND_TOUCH") {
                         val watchFaceImpl = deferredWatchFaceImpl.await()
@@ -1832,13 +1828,10 @@
                             TapEvent(
                                 x,
                                 y,
-                                Instant.ofEpochMilli(
-                                    systemTimeProvider.getSystemTimeMillis()
-                                )
+                                Instant.ofEpochMilli(systemTimeProvider.getSystemTimeMillis())
                             )
                         )
                     }
-
                 Constants.COMMAND_TOUCH_CANCEL ->
                     uiThreadCoroutineScope.runBlockingWithTracing(
                         "onCommand COMMAND_TOUCH_CANCEL"
@@ -1849,15 +1842,11 @@
                             TapEvent(
                                 x,
                                 y,
-                                Instant.ofEpochMilli(
-                                    systemTimeProvider.getSystemTimeMillis()
-                                )
+                                Instant.ofEpochMilli(systemTimeProvider.getSystemTimeMillis())
                             )
                         )
                     }
-
-                else -> {
-                }
+                else -> {}
             }
             return null
         }
@@ -1868,8 +1857,9 @@
         @WorkerThread
         internal fun getDefaultProviderPolicies(): Array<IdTypeAndDefaultProviderPolicyWireFormat> {
             return createComplicationSlotsManager(
-                CurrentUserStyleRepository(createUserStyleSchema())
-            ).getDefaultProviderPolicies()
+                    CurrentUserStyleRepository(createUserStyleSchema())
+                )
+                .getDefaultProviderPolicies()
         }
 
         /** This will be called from a binder thread. */
@@ -1881,172 +1871,169 @@
         internal fun getUserStyleFlavorsWireFormat(): UserStyleFlavorsWireFormat {
             val currentUserStyleRepository = CurrentUserStyleRepository(createUserStyleSchema())
             return createUserStyleFlavors(
-                currentUserStyleRepository,
-                createComplicationSlotsManager(currentUserStyleRepository)
-            ).toWireFormat()
+                    currentUserStyleRepository,
+                    createComplicationSlotsManager(currentUserStyleRepository)
+                )
+                .toWireFormat()
         }
 
         /** This will be called from a binder thread. */
         @OptIn(ComplicationExperimental::class)
         @WorkerThread
         internal fun getComplicationSlotMetadataWireFormats() =
-            createComplicationSlotsManager(
-                CurrentUserStyleRepository(createUserStyleSchema())
-            ).complicationSlots.map {
-                val systemDataSourceFallbackDefaultType =
-                    it.value.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
-                        .toWireComplicationType()
-                ComplicationSlotMetadataWireFormat(
-                    it.key,
-                    it.value.complicationSlotBounds.perComplicationTypeBounds.keys.map {
-                        it.toWireComplicationType()
-                    }.toIntArray(),
-                    it.value.complicationSlotBounds.perComplicationTypeBounds
-                        .values.toTypedArray(),
-                    it.value.complicationSlotBounds.perComplicationTypeMargins
-                        .values.toList(),
-                    it.value.boundsType,
-                    it.value.supportedTypes.toWireTypes(),
-                    it.value.defaultDataSourcePolicy.dataSourcesAsList(),
-                    it.value.defaultDataSourcePolicy.systemDataSourceFallback,
-                    systemDataSourceFallbackDefaultType,
-                    it.value.defaultDataSourcePolicy.primaryDataSourceDefaultType
-                        ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType,
-                    it.value.defaultDataSourcePolicy.secondaryDataSourceDefaultType
-                        ?.toWireComplicationType() ?: systemDataSourceFallbackDefaultType,
-                    it.value.initiallyEnabled,
-                    it.value.fixedComplicationDataSource,
-                    it.value.configExtras,
-                    it.value.boundingArc?.toWireFormat()
-                )
-            }.toTypedArray()
+            createComplicationSlotsManager(CurrentUserStyleRepository(createUserStyleSchema()))
+                .complicationSlots
+                .map {
+                    val systemDataSourceFallbackDefaultType =
+                        it.value.defaultDataSourcePolicy.systemDataSourceFallbackDefaultType
+                            .toWireComplicationType()
+                    ComplicationSlotMetadataWireFormat(
+                        it.key,
+                        it.value.complicationSlotBounds.perComplicationTypeBounds.keys
+                            .map { it.toWireComplicationType() }
+                            .toIntArray(),
+                        it.value.complicationSlotBounds.perComplicationTypeBounds.values
+                            .toTypedArray(),
+                        it.value.complicationSlotBounds.perComplicationTypeMargins.values.toList(),
+                        it.value.boundsType,
+                        it.value.supportedTypes.toWireTypes(),
+                        it.value.defaultDataSourcePolicy.dataSourcesAsList(),
+                        it.value.defaultDataSourcePolicy.systemDataSourceFallback,
+                        systemDataSourceFallbackDefaultType,
+                        it.value.defaultDataSourcePolicy.primaryDataSourceDefaultType
+                            ?.toWireComplicationType()
+                            ?: systemDataSourceFallbackDefaultType,
+                        it.value.defaultDataSourcePolicy.secondaryDataSourceDefaultType
+                            ?.toWireComplicationType()
+                            ?: systemDataSourceFallbackDefaultType,
+                        it.value.initiallyEnabled,
+                        it.value.fixedComplicationDataSource,
+                        it.value.configExtras,
+                        it.value.boundingArc?.toWireFormat()
+                    )
+                }
+                .toTypedArray()
 
         @RequiresApi(27)
         internal fun createHeadlessInstance(
             params: HeadlessWatchFaceInstanceParams
-        ): HeadlessWatchFaceImpl = TraceEvent("EngineWrapper.createHeadlessInstance").use {
-            require(!watchFaceCreatedOrPending()) {
-                "WatchFace already exists! Created by $createdBy"
+        ): HeadlessWatchFaceImpl =
+            TraceEvent("EngineWrapper.createHeadlessInstance").use {
+                require(!watchFaceCreatedOrPending()) {
+                    "WatchFace already exists! Created by $createdBy"
+                }
+                setImmutableSystemState(params.deviceConfig)
+
+                // Fake SurfaceHolder with just enough methods implemented for headless rendering.
+                val fakeSurfaceHolder =
+                    object : SurfaceHolder {
+                        val callbacks = HashSet<SurfaceHolder.Callback>()
+
+                        @Deprecated(
+                            message =
+                                "this is ignored, this value is set automatically when needed."
+                        )
+                        override fun setType(type: Int) {
+                            throw NotImplementedError()
+                        }
+
+                        override fun getSurface(): Surface {
+                            throw NotImplementedError()
+                        }
+
+                        override fun setSizeFromLayout() {
+                            throw NotImplementedError()
+                        }
+
+                        override fun lockCanvas(): Canvas {
+                            throw NotImplementedError()
+                        }
+
+                        override fun lockCanvas(dirty: Rect?): Canvas {
+                            throw NotImplementedError()
+                        }
+
+                        override fun getSurfaceFrame() = Rect(0, 0, params.width, params.height)
+
+                        override fun setFixedSize(width: Int, height: Int) {
+                            throw NotImplementedError()
+                        }
+
+                        override fun removeCallback(callback: SurfaceHolder.Callback) {
+                            callbacks.remove(callback)
+                        }
+
+                        override fun isCreating(): Boolean {
+                            throw NotImplementedError()
+                        }
+
+                        override fun addCallback(callback: SurfaceHolder.Callback) {
+                            callbacks.add(callback)
+                        }
+
+                        override fun setFormat(format: Int) {
+                            throw NotImplementedError()
+                        }
+
+                        override fun setKeepScreenOn(screenOn: Boolean) {
+                            throw NotImplementedError()
+                        }
+
+                        override fun unlockCanvasAndPost(canvas: Canvas?) {
+                            throw NotImplementedError()
+                        }
+                    }
+
+                allowWatchfaceToAnimate = false
+                require(mutableWatchState.isHeadless)
+                mutableWatchState.watchFaceInstanceId.value = sanitizeWatchFaceId(params.instanceId)
+                val watchState = mutableWatchState.asWatchState()
+
+                createWatchFaceInternal(watchState, fakeSurfaceHolder, "createHeadlessInstance")
+
+                mutableWatchState.isVisible.value = true
+                mutableWatchState.isAmbient.value = false
+                return HeadlessWatchFaceImpl(this, this@WatchFaceService)
             }
-            setImmutableSystemState(params.deviceConfig)
-
-            // Fake SurfaceHolder with just enough methods implemented for headless rendering.
-            val fakeSurfaceHolder = object : SurfaceHolder {
-                val callbacks = HashSet<SurfaceHolder.Callback>()
-
-                @Deprecated(
-                    message = "this is ignored, this value is set automatically when needed."
-                )
-                override fun setType(type: Int) {
-                    throw NotImplementedError()
-                }
-
-                override fun getSurface(): Surface {
-                    throw NotImplementedError()
-                }
-
-                override fun setSizeFromLayout() {
-                    throw NotImplementedError()
-                }
-
-                override fun lockCanvas(): Canvas {
-                    throw NotImplementedError()
-                }
-
-                override fun lockCanvas(dirty: Rect?): Canvas {
-                    throw NotImplementedError()
-                }
-
-                override fun getSurfaceFrame() = Rect(0, 0, params.width, params.height)
-
-                override fun setFixedSize(width: Int, height: Int) {
-                    throw NotImplementedError()
-                }
-
-                override fun removeCallback(callback: SurfaceHolder.Callback) {
-                    callbacks.remove(callback)
-                }
-
-                override fun isCreating(): Boolean {
-                    throw NotImplementedError()
-                }
-
-                override fun addCallback(callback: SurfaceHolder.Callback) {
-                    callbacks.add(callback)
-                }
-
-                override fun setFormat(format: Int) {
-                    throw NotImplementedError()
-                }
-
-                override fun setKeepScreenOn(screenOn: Boolean) {
-                    throw NotImplementedError()
-                }
-
-                override fun unlockCanvasAndPost(canvas: Canvas?) {
-                    throw NotImplementedError()
-                }
-            }
-
-            allowWatchfaceToAnimate = false
-            require(mutableWatchState.isHeadless)
-            mutableWatchState.watchFaceInstanceId.value = sanitizeWatchFaceId(params.instanceId)
-            val watchState = mutableWatchState.asWatchState()
-
-            createWatchFaceInternal(
-                watchState,
-                fakeSurfaceHolder,
-                "createHeadlessInstance"
-            )
-
-            mutableWatchState.isVisible.value = true
-            mutableWatchState.isAmbient.value = false
-            return HeadlessWatchFaceImpl(this, this@WatchFaceService)
-        }
 
         @UiThread
         @RequiresApi(27)
         internal fun createInteractiveInstance(
             params: WallpaperInteractiveWatchFaceInstanceParams,
             _createdBy: String
-        ): InteractiveWatchFaceImpl = TraceEvent(
-            "EngineWrapper.createInteractiveInstance"
-        ).use {
-            mainThreadPriorityDelegate.setInteractivePriority()
+        ): InteractiveWatchFaceImpl =
+            TraceEvent("EngineWrapper.createInteractiveInstance").use {
+                mainThreadPriorityDelegate.setInteractivePriority()
 
-            require(!watchFaceCreatedOrPending()) {
-                "WatchFace already exists! Created by $createdBy"
+                require(!watchFaceCreatedOrPending()) {
+                    "WatchFace already exists! Created by $createdBy"
+                }
+                require(!mutableWatchState.isHeadless)
+
+                setImmutableSystemState(params.deviceConfig)
+                setWatchUiState(params.watchUiState, fromSysUi = false)
+                initialUserStyle = params.userStyle
+
+                mutableWatchState.watchFaceInstanceId.value = sanitizeWatchFaceId(params.instanceId)
+                val watchState = mutableWatchState.asWatchState()
+
+                // Store the initial complications, this could be modified by new data before being
+                // applied.
+                var initialComplications = params.idAndComplicationDataWireFormats
+                if (initialComplications.isNullOrEmpty()) {
+                    initialComplications = readComplicationDataCache(_context, params.instanceId)
+                }
+                if (!initialComplications.isNullOrEmpty()) {
+                    setComplicationDataList(initialComplications)
+                }
+
+                createWatchFaceInternal(watchState, getWallpaperSurfaceHolderOverride(), _createdBy)
+
+                val instance = InteractiveWatchFaceImpl(this, params.instanceId)
+                InteractiveInstanceManager.addInstance(instance)
+                interactiveInstanceId = params.instanceId
+                return instance
             }
-            require(!mutableWatchState.isHeadless)
-
-            setImmutableSystemState(params.deviceConfig)
-            setWatchUiState(params.watchUiState, fromSysUi = false)
-            initialUserStyle = params.userStyle
-
-            mutableWatchState.watchFaceInstanceId.value = sanitizeWatchFaceId(params.instanceId)
-            val watchState = mutableWatchState.asWatchState()
-
-            // Store the initial complications, this could be modified by new data before being
-            // applied.
-            var initialComplications = params.idAndComplicationDataWireFormats
-            if (initialComplications.isNullOrEmpty()) {
-                initialComplications = readComplicationDataCache(_context, params.instanceId)
-            }
-            if (!initialComplications.isNullOrEmpty()) {
-                setComplicationDataList(initialComplications)
-            }
-
-            createWatchFaceInternal(
-                watchState,
-                getWallpaperSurfaceHolderOverride(),
-                _createdBy
-            )
-
-            val instance = InteractiveWatchFaceImpl(this, params.instanceId)
-            InteractiveInstanceManager.addInstance(instance)
-            interactiveInstanceId = params.instanceId
-            return instance
-        }
 
         override fun onSurfaceRedrawNeeded(holder: SurfaceHolder) {
             if (TRACE_DRAW) {
@@ -2071,12 +2058,13 @@
 
             // In case of overrideSurfaceHolder provided (tests) return its size instead of real
             // metrics.
-            screenBounds = if (overrideSurfaceHolder != null) {
-                overrideSurfaceHolder.surfaceFrame
-            } else {
-                val displayMetrics = resources.displayMetrics
-                Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
-            }
+            screenBounds =
+                if (overrideSurfaceHolder != null) {
+                    overrideSurfaceHolder.surfaceFrame
+                } else {
+                    val displayMetrics = resources.displayMetrics
+                    Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
+                }
 
             backgroundThreadCoroutineScope.launch {
                 val timeBefore = System.currentTimeMillis()
@@ -2134,17 +2122,19 @@
                 try {
                     val surfaceHolder = overrideSurfaceHolder ?: deferredSurfaceHolder.await()
 
-                    val watchFace = TraceEvent("WatchFaceService.createWatchFace").use {
-                        // Note by awaiting deferredSurfaceHolder we ensure onSurfaceChanged has
-                        // been called and we're passing the correct updated surface holder. This is
-                        // important for GL rendering.
-                        createWatchFace(
-                            surfaceHolder,
-                            watchState,
-                            complicationSlotsManager,
-                            currentUserStyleRepository
-                        )
-                    }
+                    val watchFace =
+                        TraceEvent("WatchFaceService.createWatchFace").use {
+                            // Note by awaiting deferredSurfaceHolder we ensure onSurfaceChanged has
+                            // been called and we're passing the correct updated surface holder.
+                            // This is
+                            // important for GL rendering.
+                            createWatchFace(
+                                surfaceHolder,
+                                watchState,
+                                complicationSlotsManager,
+                                currentUserStyleRepository
+                            )
+                        }
                     this@EngineWrapper.deferredWatchFace.complete(watchFace)
 
                     watchFace.renderer.backgroundThreadInitInternal()
@@ -2160,7 +2150,8 @@
                             TAG,
                             "createUserStyleSchema, createComplicationSlotsManager and " +
                                 "createWatchFace should complete in less than " +
-                                MAX_CREATE_WATCHFACE_TIME_MILLIS + " milliseconds."
+                                MAX_CREATE_WATCHFACE_TIME_MILLIS +
+                                " milliseconds."
                         )
                     }
 
@@ -2198,43 +2189,46 @@
             initStyleAndComplicationsDone: CompletableDeferred<Unit>,
             watchState: WatchState
         ) {
-            val broadcastsObserver = BroadcastsObserver(
-                watchState,
-                this,
-                deferredWatchFaceImpl,
-                uiThreadCoroutineScope,
-                _context.contentResolver,
-                wearSdkVersion >= Build.VERSION_CODES.R
-            )
+            val broadcastsObserver =
+                BroadcastsObserver(
+                    watchState,
+                    this,
+                    deferredWatchFaceImpl,
+                    uiThreadCoroutineScope,
+                    _context.contentResolver,
+                    wearSdkVersion >= Build.VERSION_CODES.R
+                )
 
             // There's no point creating BroadcastsReceiver or listening for Accessibility state
             // changes if this is a headless instance.
-            val broadcastsReceiver = TraceEvent("create BroadcastsReceiver").use {
-                if (watchState.isHeadless) {
-                    null
-                } else {
-                    startListeningForAccessibilityStateChanges()
-                    BroadcastsReceiver(_context, broadcastsObserver).apply {
-                        processBatteryStatus(
-                            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
-                                _context.registerReceiver(null, iFilter)
-                            }
-                        )
+            val broadcastsReceiver =
+                TraceEvent("create BroadcastsReceiver").use {
+                    if (watchState.isHeadless) {
+                        null
+                    } else {
+                        startListeningForAccessibilityStateChanges()
+                        BroadcastsReceiver(_context, broadcastsObserver).apply {
+                            processBatteryStatus(
+                                IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
+                                    _context.registerReceiver(null, iFilter)
+                                }
+                            )
+                        }
                     }
                 }
-            }
 
             val watchFace = deferredWatchFace.await()
             TraceEvent("WatchFaceImpl.init").use {
-                val watchFaceImpl = WatchFaceImpl(
-                    watchFace,
-                    this@EngineWrapper,
-                    watchState,
-                    currentUserStyleRepository,
-                    complicationSlotsManager,
-                    broadcastsObserver,
-                    broadcastsReceiver
-                )
+                val watchFaceImpl =
+                    WatchFaceImpl(
+                        watchFace,
+                        this@EngineWrapper,
+                        watchState,
+                        currentUserStyleRepository,
+                        complicationSlotsManager,
+                        broadcastsObserver,
+                        broadcastsReceiver
+                    )
 
                 // Perform UI thread render init.
                 if (!surfaceDestroyed) {
@@ -2267,37 +2261,40 @@
 
         /** No UI thread rendering can be done until after this has completed. */
         @WorkerThread
-        internal fun initStyle(
-            currentUserStyleRepository: CurrentUserStyleRepository
-        ) = TraceEvent("initStyle").use {
-            // 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 = getInitialUserStyle()
-            if (storedUserStyle != null) {
-                TraceEvent("WatchFaceImpl.init apply userStyle").use {
-                    currentUserStyleRepository.updateUserStyle(
-                        UserStyle(UserStyleData(storedUserStyle), currentUserStyleRepository.schema)
-                    )
-                }
-            } else {
-                TraceEvent("WatchFaceImpl.init apply userStyle from prefs").use {
-                    // The system doesn't support preference persistence we need to do it ourselves.
-                    val preferencesFile = "watchface_prefs_${_context.javaClass.name}.txt"
-                    currentUserStyleRepository.updateUserStyle(
-                        UserStyle(
-                            UserStyleData(readPrefs(_context, preferencesFile)),
-                            currentUserStyleRepository.schema
+        internal fun initStyle(currentUserStyleRepository: CurrentUserStyleRepository) =
+            TraceEvent("initStyle").use {
+                // 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 = getInitialUserStyle()
+                if (storedUserStyle != null) {
+                    TraceEvent("WatchFaceImpl.init apply userStyle").use {
+                        currentUserStyleRepository.updateUserStyle(
+                            UserStyle(
+                                UserStyleData(storedUserStyle),
+                                currentUserStyleRepository.schema
+                            )
                         )
-                    )
+                    }
+                } else {
+                    TraceEvent("WatchFaceImpl.init apply userStyle from prefs").use {
+                        // The system doesn't support preference persistence we need to do it
+                        // ourselves.
+                        val preferencesFile = "watchface_prefs_${_context.javaClass.name}.txt"
+                        currentUserStyleRepository.updateUserStyle(
+                            UserStyle(
+                                UserStyleData(readPrefs(_context, preferencesFile)),
+                                currentUserStyleRepository.schema
+                            )
+                        )
 
-                    backgroundThreadCoroutineScope.launch {
-                        currentUserStyleRepository.userStyle.collect {
-                            writePrefs(_context, preferencesFile, it)
+                        backgroundThreadCoroutineScope.launch {
+                            currentUserStyleRepository.userStyle.collect {
+                                writePrefs(_context, preferencesFile, it)
+                            }
                         }
                     }
                 }
             }
-        }
 
         /**
          * It is OK to call this from a worker thread because we carefully ensure there's no
@@ -2308,74 +2305,79 @@
         internal fun initComplications(
             complicationSlotsManager: ComplicationSlotsManager,
             renderer: Renderer
-        ) = TraceEvent("initStyleAndComplications").use {
+        ) =
+            TraceEvent("initStyleAndComplications").use {
 
-            // 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 soon anyway.
-            var initFinished = false
-            complicationSlotsManager.init(
-                renderer,
-                object : ComplicationSlot.InvalidateListener {
-                    @SuppressWarnings("SyntheticAccessor")
-                    override fun onInvalidate() {
-                        // This could be called on any thread.
-                        uiThreadHandler.runOnHandlerWithTracing("onInvalidate") {
-                            if (initFinished) {
-                                getWatchFaceImplOrNull()?.invalidateIfNotAnimating()
+                // 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 soon anyway.
+                var initFinished = false
+                complicationSlotsManager.init(
+                    renderer,
+                    object : ComplicationSlot.InvalidateListener {
+                        @SuppressWarnings("SyntheticAccessor")
+                        override fun onInvalidate() {
+                            // This could be called on any thread.
+                            uiThreadHandler.runOnHandlerWithTracing("onInvalidate") {
+                                if (initFinished) {
+                                    getWatchFaceImplOrNull()?.invalidateIfNotAnimating()
+                                }
                             }
                         }
                     }
-                }
-            )
-            initFinished = true
-        }
-
-        override fun onVisibilityChanged(visible: Boolean): Unit = TraceEvent(
-            "onVisibilityChanged"
-        ).use {
-            super.onVisibilityChanged(visible)
-
-            // In the WSL flow Home doesn't know when WallpaperService has actually launched a
-            // watchface after requesting a change. It used [Constants.ACTION_REQUEST_STATE] as a
-            // signal to trigger the old boot flow (sending the binder etc). This is no longer
-            // required from android R onwards. See (b/181965946).
-            if (wearSdkVersion < Build.VERSION_CODES.R) {
-                // We are requesting state every time the watch face changes its visibility because
-                // wallpaper commands have a tendency to be dropped. By requesting it on every
-                // visibility change, we ensure that we don't become a victim of some race
-                // condition.
-                sendBroadcast(
-                    Intent(Constants.ACTION_REQUEST_STATE).apply {
-                        putExtra(Constants.EXTRA_WATCH_FACE_VISIBLE, visible)
-                    }
                 )
-
-                // We can't guarantee the binder has been set and onSurfaceChanged called before
-                // this command.
-                if (!watchFaceCreated()) {
-                    wslFlow.pendingVisibilityChanged = visible
-                    return
-                }
+                initFinished = true
             }
 
-            // During WF init the watch face is initially not visible but we want to keep UI thread
-            // priority high.  Once init has completed we only want the WF UI thread to have high
-            // priority when visible.
-            if (deferredWatchFaceImpl.isCompleted && !mutableWatchState.isHeadless) {
-                if (visible) {
-                    mainThreadPriorityDelegate.setInteractivePriority()
-                } else {
-                    mainThreadPriorityDelegate.setNormalPriority()
+        override fun onVisibilityChanged(visible: Boolean): Unit =
+            TraceEvent("onVisibilityChanged").use {
+                super.onVisibilityChanged(visible)
+
+                // In the WSL flow Home doesn't know when WallpaperService has actually launched a
+                // watchface after requesting a change. It used [Constants.ACTION_REQUEST_STATE] as
+                // a
+                // signal to trigger the old boot flow (sending the binder etc). This is no longer
+                // required from android R onwards. See (b/181965946).
+                if (wearSdkVersion < Build.VERSION_CODES.R) {
+                    // We are requesting state every time the watch face changes its visibility
+                    // because
+                    // wallpaper commands have a tendency to be dropped. By requesting it on every
+                    // visibility change, we ensure that we don't become a victim of some race
+                    // condition.
+                    sendBroadcast(
+                        Intent(Constants.ACTION_REQUEST_STATE).apply {
+                            putExtra(Constants.EXTRA_WATCH_FACE_VISIBLE, visible)
+                        }
+                    )
+
+                    // We can't guarantee the binder has been set and onSurfaceChanged called before
+                    // this command.
+                    if (!watchFaceCreated()) {
+                        wslFlow.pendingVisibilityChanged = visible
+                        return
+                    }
                 }
+
+                // During WF init the watch face is initially not visible but we want to keep UI
+                // thread
+                // priority high.  Once init has completed we only want the WF UI thread to have
+                // high
+                // priority when visible.
+                if (deferredWatchFaceImpl.isCompleted && !mutableWatchState.isHeadless) {
+                    if (visible) {
+                        mainThreadPriorityDelegate.setInteractivePriority()
+                    } else {
+                        mainThreadPriorityDelegate.setNormalPriority()
+                    }
+                }
+
+                mutableWatchState.isVisible.value = visible || forceIsVisibleForTesting()
+                wslFlow.pendingVisibilityChanged = null
+
+                getWatchFaceImplOrNull()?.onVisibility(visible)
             }
 
-            mutableWatchState.isVisible.value = visible || forceIsVisibleForTesting()
-            wslFlow.pendingVisibilityChanged = null
-
-            getWatchFaceImplOrNull()?.onVisibility(visible)
-        }
-
         override fun invalidate() {
             this@WatchFaceService.onInvalidate()
             if (!allowWatchfaceToAnimate) {
@@ -2500,25 +2502,26 @@
             }
         }
 
-        internal fun validateSchemaWireSize(schema: UserStyleSchema) = TraceEvent(
-            "WatchFaceService.validateSchemaWireSize"
-        ).use {
-            var estimatedBytes = 0
-            @Suppress("Deprecation") // userStyleSettings
-            for (styleSetting in schema.userStyleSettings) {
-                estimatedBytes += styleSetting.estimateWireSizeInBytesAndValidateIconDimensions(
-                    resourcesContext,
-                    MAX_REASONABLE_SCHEMA_ICON_WIDTH,
-                    MAX_REASONABLE_SCHEMA_ICON_HEIGHT,
-                )
+        internal fun validateSchemaWireSize(schema: UserStyleSchema) =
+            TraceEvent("WatchFaceService.validateSchemaWireSize").use {
+                var estimatedBytes = 0
+                @Suppress("Deprecation") // userStyleSettings
+                for (styleSetting in schema.userStyleSettings) {
+                    estimatedBytes +=
+                        styleSetting.estimateWireSizeInBytesAndValidateIconDimensions(
+                            resourcesContext,
+                            MAX_REASONABLE_SCHEMA_ICON_WIDTH,
+                            MAX_REASONABLE_SCHEMA_ICON_HEIGHT,
+                        )
+                }
+                require(estimatedBytes < MAX_REASONABLE_SCHEMA_WIRE_SIZE_BYTES) {
+                    "The estimated wire size of the supplied UserStyleSchemas for watch face " +
+                        "$packageName is too big at $estimatedBytes bytes. " +
+                        "UserStyleSchemas get sent to the companion over bluetooth and should be " +
+                        "as small as possible for this to be performant. The maximum size is " +
+                        MAX_REASONABLE_SCHEMA_WIRE_SIZE_BYTES
+                }
             }
-            require(estimatedBytes < MAX_REASONABLE_SCHEMA_WIRE_SIZE_BYTES) {
-                "The estimated wire size of the supplied UserStyleSchemas for watch face " +
-                    "$packageName is too big at $estimatedBytes bytes. UserStyleSchemas get sent " +
-                    "to the companion over bluetooth and should be as small as possible for this " +
-                    "to be performant. The maximum size is " + MAX_REASONABLE_SCHEMA_WIRE_SIZE_BYTES
-            }
-        }
 
         internal fun watchFaceCreated() = deferredWatchFaceImpl.isCompleted
 
@@ -2539,11 +2542,10 @@
             )
         }
 
-        override fun setActiveComplicationSlots(complicationSlotIds: IntArray): Unit = TraceEvent(
-            "WatchFaceService.setActiveComplications"
-        ).use {
-            wslFlow.setActiveComplications(complicationSlotIds)
-        }
+        override fun setActiveComplicationSlots(complicationSlotIds: IntArray): Unit =
+            TraceEvent("WatchFaceService.setActiveComplications").use {
+                wslFlow.setActiveComplications(complicationSlotIds)
+            }
 
         internal fun startListeningForAccessibilityStateChanges() {
             val accessibilityManager =
@@ -2568,15 +2570,11 @@
             val labels = mutableListOf<Pair<Int, ContentDescriptionLabel>>()
 
             uiThreadCoroutineScope.launch {
-                TraceEvent(
-                    "WatchFaceService.updateContentDescriptionLabels A"
-                ).close()
+                TraceEvent("WatchFaceService.updateContentDescriptionLabels A").close()
                 val watchFace = deferredWatchFace.await()
                 val earlyInitDetails = deferredEarlyInitDetails.await()
 
-                TraceEvent(
-                    "WatchFaceService.updateContentDescriptionLabels"
-                ).use {
+                TraceEvent("WatchFaceService.updateContentDescriptionLabels").use {
                     // The side effects of this need to be applied before deferredWatchFaceImpl is
                     // completed.
                     val renderer = watchFace.renderer
@@ -2597,12 +2595,13 @@
                     // or no data.
                     val screenBounds = renderer.screenBounds
                     for ((_, complication) in complicationSlotsManager.complicationSlots) {
-                        if (complication.enabled &&
-                            when (complication.complicationData.value.type) {
-                                ComplicationType.EMPTY -> false
-                                ComplicationType.NO_DATA -> false
-                                else -> true
-                            }
+                        if (
+                            complication.enabled &&
+                                when (complication.complicationData.value.type) {
+                                    ComplicationType.EMPTY -> false
+                                    ComplicationType.NO_DATA -> false
+                                    else -> true
+                                }
                         ) {
                             if (complication.boundsType == ComplicationSlotBoundsType.BACKGROUND) {
                                 ComplicationSlotBoundsType.BACKGROUND
@@ -2628,11 +2627,10 @@
                             Pair(
                                 labelPair.first,
                                 ContentDescriptionLabel(
-                                    labelPair.second.bounds,
-                                    labelPair.second.text.toWireComplicationText()
-                                ).apply {
-                                    tapAction = labelPair.second.tapAction
-                                }
+                                        labelPair.second.bounds,
+                                        labelPair.second.text.toWireComplicationText()
+                                    )
+                                    .apply { tapAction = labelPair.second.tapAction }
                             )
                         )
                     }
@@ -2651,13 +2649,9 @@
          * enabled.
          */
         private fun maybeSendContentDescriptionLabelsBroadcast() {
-            if (
-                wearSdkVersion >= Build.VERSION_CODES.R && getAccessibilityManager().isEnabled
-            ) {
+            if (wearSdkVersion >= 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)
-                )
+                _context.sendBroadcast(Intent(Constants.ACTION_WATCH_FACE_REFRESH_A11Y_LABELS))
                 systemViewOfContentDescriptionLabelsIsStale = false
             }
         }
@@ -2716,11 +2710,8 @@
                     writer.println("WSL style init flow")
                     writer.println("watchFaceInitStarted=${wslFlow.watchFaceInitStarted}")
                 }
-
                 this.watchFaceCreatedOrPending() -> writer.println("Androidx style init flow")
-                wearSdkVersion < Build.VERSION_CODES.R ->
-                    writer.println("Expecting WSL style init")
-
+                wearSdkVersion < Build.VERSION_CODES.R -> writer.println("Expecting WSL style init")
                 else -> writer.println("Expecting androidx style style init")
             }
 
@@ -2753,9 +2744,7 @@
             writer.println("pendingUpdateTime=${pendingUpdateTime.isPending()}")
 
             synchronized(lock) {
-                forEachListener("dump") {
-                    writer.println("listener = ${it.asBinder()}")
-                }
+                forEachListener("dump") { writer.println("listener = ${it.asBinder()}") }
             }
 
             if (!destroyed) {
@@ -2781,8 +2770,7 @@
     private object ChinHeightApi25 {
         @Suppress("DEPRECATION")
         @Px
-        fun extractFromWindowInsets(insets: WindowInsets?) =
-            insets?.systemWindowInsetBottom ?: 0
+        fun extractFromWindowInsets(insets: WindowInsets?) = insets?.systemWindowInsetBottom ?: 0
     }
 
     @RequiresApi(30)
@@ -2807,18 +2795,14 @@
  * @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() }
+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() } }
         }
     }
-}
 
 /**
  * Runs a task in the [CoroutineScope] and blocks until it has completed.
@@ -2829,20 +2813,17 @@
 internal fun <R> CoroutineScope.runBlockingWithTracing(
     traceEventName: String,
     task: suspend () -> R
-): R = TraceEvent(traceEventName).use {
-    try {
-        // Inside runBlocking, coroutineContext has a different value.
-        val desiredContext = coroutineContext
-        return runBlocking {
-            withContext(desiredContext) {
-                task()
-            }
+): R =
+    TraceEvent(traceEventName).use {
+        try {
+            // Inside runBlocking, coroutineContext has a different value.
+            val desiredContext = coroutineContext
+            return runBlocking { withContext(desiredContext) { task() } }
+        } catch (e: Exception) {
+            Log.e("CoroutineScope", "Exception in traceEventName", e)
+            throw e
         }
-    } catch (e: Exception) {
-        Log.e("CoroutineScope", "Exception in traceEventName", e)
-        throw e
     }
-}
 
 /**
  * If the instance ID for [MutableWatchState.watchFaceInstanceId] begin with this prefix, then the
@@ -2856,21 +2837,20 @@
 /**
  * Instance ID to use when either there's no system id or it doesn't start with
  * [SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX].
+ *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-const val DEFAULT_INSTANCE_ID = "defaultInstance"
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) const val DEFAULT_INSTANCE_ID = "defaultInstance"
 
 /**
- * This is needed to make the instance id consistent between Interactive, Headless and
- * EditorSession for old versions of the system.
+ * This is needed to make the instance id consistent between Interactive, Headless and EditorSession
+ * for old versions of the system.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 fun sanitizeWatchFaceId(instanceId: String?) =
-    if (instanceId == null || !instanceId.startsWith(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX)
-    ) {
+    if (instanceId == null || !instanceId.startsWith(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX)) {
         DEFAULT_INSTANCE_ID
     } else {
         instanceId
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
index 4068678..ff82759 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
@@ -27,52 +27,50 @@
  * Describes the current state of the wearable including some hardware details such as whether or
  * not it supports burn in prevention and low-bit ambient.
  *
- * @param interruptionFilter The current user interruption settings. See [NotificationManager].
- * This is initially `null` because the watch face is created before the system has sent the state.
- * 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 interruptionFilter The current user interruption settings. See [NotificationManager]. This
+ *   is initially `null` because the watch face is created before the system has sent the state.
+ *   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. This is initially `null` because
- * the watch face is created before the system has sent the state. The order in which ambient vs
- * style changes are reported is not guaranteed. Likewise the order of isAmbient flow callbacks and
- * [Renderer.CanvasRenderer.render] or [Renderer.GlesRenderer.render] calls is not defined. For
- * rendering please refer to [RenderParameters.drawMode] instead of isAmbient because you might
- * receive requests for rendering non-ambient frames while the watch is ambient (e.g. editing from
- * the companion phone).
+ *   the watch face is created before the system has sent the state. The order in which ambient vs
+ *   style changes are reported is not guaranteed. Likewise the order of isAmbient flow callbacks
+ *   and [Renderer.CanvasRenderer.render] or [Renderer.GlesRenderer.render] calls is not defined.
+ *   For rendering please refer to [RenderParameters.drawMode] instead of isAmbient because you
+ *   might receive requests for rendering non-ambient frames while the watch is ambient (e.g.
+ *   editing from the companion phone).
  * @param isBatteryLowAndNotCharging Whether or not we should conserve power due to a low battery
- * which isn't charging. This is initially `null` because the watch face is created before the
- * system has sent the state. Only valid if
- * [android.support.wearable.watchface.WatchFaceStyle.hideNotificationIndicator] is true.
+ *   which isn't charging. This is initially `null` because the watch face is created before the
+ *   system has sent the state. Only valid if
+ *   [android.support.wearable.watchface.WatchFaceStyle.hideNotificationIndicator] is true.
  * @param isVisible Whether or not the watch face is visible. This is initially `null` because the
- * watch face is created before the system has sent the state.
+ *   watch face is created before the system has sent the state.
  * @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.
- * @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.
+ *   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.
  * @param isHeadless Whether or not this is a headless watchface.
- * @param watchFaceInstanceId The ID associated with the watch face instance. Note there may be
- * more than one instance associated with a [WatchFaceService]. See
- * [androidx.wear.watchface.client.WatchFaceId] for more details.
+ * @param watchFaceInstanceId The ID associated with the watch face instance. Note there may be more
+ *   than one instance associated with a [WatchFaceService]. See
+ *   [androidx.wear.watchface.client.WatchFaceId] for more details.
  */
 public class WatchState(
     public val interruptionFilter: StateFlow<Int?>,
     public val isAmbient: StateFlow<Boolean?>,
     public val isBatteryLowAndNotCharging: StateFlow<Boolean?>,
     public val isVisible: StateFlow<Boolean?>,
-    @get:JvmName("hasLowBitAmbient")
-    public val hasLowBitAmbient: Boolean,
-    @get:JvmName("hasBurnInProtection")
-    public val hasBurnInProtection: Boolean,
+    @get:JvmName("hasLowBitAmbient") public val hasLowBitAmbient: Boolean,
+    @get:JvmName("hasBurnInProtection") public val hasBurnInProtection: Boolean,
     public val analogPreviewReferenceTimeMillis: Long,
     public val digitalPreviewReferenceTimeMillis: Long,
     @Px @get:Px public val chinHeight: Int,
@@ -160,9 +158,8 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class MutableWatchState() {
-    public val interruptionFilter: MutableStateFlow<Int> = MutableStateFlow(
-        NotificationManager.INTERRUPTION_FILTER_UNKNOWN
-    )
+    public val interruptionFilter: MutableStateFlow<Int> =
+        MutableStateFlow(NotificationManager.INTERRUPTION_FILTER_UNKNOWN)
     public val isAmbient: MutableStateFlow<Boolean?> = MutableStateFlow(null)
     public val isBatteryLowAndNotCharging: MutableStateFlow<Boolean?> = MutableStateFlow(null)
     public val isVisible: MutableStateFlow<Boolean?> = MutableStateFlow(null)
@@ -181,18 +178,19 @@
         }
     public var isHeadless: Boolean = false
 
-    public fun asWatchState(): WatchState = WatchState(
-        interruptionFilter = interruptionFilter,
-        isAmbient = isAmbient,
-        isBatteryLowAndNotCharging = isBatteryLowAndNotCharging,
-        isVisible = isVisible,
-        hasLowBitAmbient = hasLowBitAmbient,
-        hasBurnInProtection = hasBurnInProtection,
-        analogPreviewReferenceTimeMillis = analogPreviewReferenceTimeMillis,
-        digitalPreviewReferenceTimeMillis = digitalPreviewReferenceTimeMillis,
-        chinHeight = chinHeight,
-        isHeadless = isHeadless,
-        watchFaceInstanceId = watchFaceInstanceId,
-        isLocked = isLocked
-    )
+    public fun asWatchState(): WatchState =
+        WatchState(
+            interruptionFilter = interruptionFilter,
+            isAmbient = isAmbient,
+            isBatteryLowAndNotCharging = isBatteryLowAndNotCharging,
+            isVisible = isVisible,
+            hasLowBitAmbient = hasLowBitAmbient,
+            hasBurnInProtection = hasBurnInProtection,
+            analogPreviewReferenceTimeMillis = analogPreviewReferenceTimeMillis,
+            digitalPreviewReferenceTimeMillis = digitalPreviewReferenceTimeMillis,
+            chinHeight = chinHeight,
+            isHeadless = isHeadless,
+            watchFaceInstanceId = watchFaceInstanceId,
+            isLocked = isLocked
+        )
 }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
index 7005988..556e9c5 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/XmlSchemaAndComplicationSlotsDefinition.kt
@@ -33,8 +33,8 @@
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleFlavors
 import androidx.wear.watchface.style.UserStyleSchema
-import org.xmlpull.v1.XmlPullParser
 import kotlin.jvm.Throws
+import org.xmlpull.v1.XmlPullParser
 
 /** @hide */
 @OptIn(ComplicationExperimental::class)
@@ -72,12 +72,13 @@
                 if (type == XmlPullParser.START_TAG) {
                     when (parser.name) {
                         "UserStyleSchema" -> {
-                            schema = UserStyleSchema.inflate(
-                                resources,
-                                parser,
-                                complicationScaleX,
-                                complicationScaleY
-                            )
+                            schema =
+                                UserStyleSchema.inflate(
+                                    resources,
+                                    parser,
+                                    complicationScaleX,
+                                    complicationScaleY
+                                )
                         }
                         "ComplicationSlot" -> {
                             complicationSlots.add(
@@ -95,9 +96,10 @@
                             }
                             flavors = UserStyleFlavors.inflate(resources, parser, schema)
                         }
-                        else -> throw IllegalArgumentException(
-                            "Unexpected node ${parser.name} at line ${parser.lineNumber}"
-                        )
+                        else ->
+                            throw IllegalArgumentException(
+                                "Unexpected node ${parser.name} at line ${parser.lineNumber}"
+                            )
                     }
                 }
                 type = parser.next()
@@ -124,18 +126,19 @@
     ) {
         companion object {
             @Suppress("NewApi")
-            private val typesMap by lazy(LazyThreadSafetyMode.NONE) {
-                mapOf(
-                    "SHORT_TEXT" to ComplicationType.SHORT_TEXT,
-                    "LONG_TEXT" to ComplicationType.LONG_TEXT,
-                    "RANGED_VALUE" to ComplicationType.RANGED_VALUE,
-                    "MONOCHROMATIC_IMAGE" to ComplicationType.MONOCHROMATIC_IMAGE,
-                    "SMALL_IMAGE" to ComplicationType.SMALL_IMAGE,
-                    "PHOTO_IMAGE" to ComplicationType.PHOTO_IMAGE,
-                    "GOAL_PROGRESS" to ComplicationType.GOAL_PROGRESS,
-                    "WEIGHTED_ELEMENTS" to ComplicationType.WEIGHTED_ELEMENTS
-                )
-            }
+            private val typesMap by
+                lazy(LazyThreadSafetyMode.NONE) {
+                    mapOf(
+                        "SHORT_TEXT" to ComplicationType.SHORT_TEXT,
+                        "LONG_TEXT" to ComplicationType.LONG_TEXT,
+                        "RANGED_VALUE" to ComplicationType.RANGED_VALUE,
+                        "MONOCHROMATIC_IMAGE" to ComplicationType.MONOCHROMATIC_IMAGE,
+                        "SMALL_IMAGE" to ComplicationType.SMALL_IMAGE,
+                        "PHOTO_IMAGE" to ComplicationType.PHOTO_IMAGE,
+                        "GOAL_PROGRESS" to ComplicationType.GOAL_PROGRESS,
+                        "WEIGHTED_ELEMENTS" to ComplicationType.WEIGHTED_ELEMENTS
+                    )
+                }
 
             fun inflate(
                 resources: Resources,
@@ -143,63 +146,57 @@
                 complicationScaleX: Float,
                 complicationScaleY: Float
             ): ComplicationSlotStaticData {
-                require(parser.name == "ComplicationSlot") {
-                    "Expected a UserStyleSchema node"
-                }
+                require(parser.name == "ComplicationSlot") { "Expected a UserStyleSchema node" }
                 val slotId = getIntRefAttribute(resources, parser, "slotId")
-                require(slotId != null) {
-                    "A ComplicationSlot must have a slotId attribute"
-                }
-                val accessibilityTraversalIndex = if (
-                    parser.hasValue("accessibilityTraversalIndex")
-                ) {
-                    parser.getAttributeIntValue(
-                        NAMESPACE_APP,
-                        "accessibilityTraversalIndex",
-                        0
-                    )
-                } else {
-                    null
-                }
+                require(slotId != null) { "A ComplicationSlot must have a slotId attribute" }
+                val accessibilityTraversalIndex =
+                    if (parser.hasValue("accessibilityTraversalIndex")) {
+                        parser.getAttributeIntValue(NAMESPACE_APP, "accessibilityTraversalIndex", 0)
+                    } else {
+                        null
+                    }
                 require(parser.hasValue("boundsType")) {
                     "A ComplicationSlot must have a boundsType attribute"
                 }
-                val boundsType = when (
-                    parser.getAttributeIntValue(NAMESPACE_APP, "boundsType", 0)
-                ) {
-                    0 -> ComplicationSlotBoundsType.ROUND_RECT
-                    1 -> ComplicationSlotBoundsType.BACKGROUND
-                    2 -> ComplicationSlotBoundsType.EDGE
-                    else -> throw IllegalArgumentException("Unknown boundsType")
-                }
+                val boundsType =
+                    when (parser.getAttributeIntValue(NAMESPACE_APP, "boundsType", 0)) {
+                        0 -> ComplicationSlotBoundsType.ROUND_RECT
+                        1 -> ComplicationSlotBoundsType.BACKGROUND
+                        2 -> ComplicationSlotBoundsType.EDGE
+                        else -> throw IllegalArgumentException("Unknown boundsType")
+                    }
 
                 require(parser.hasValue("supportedTypes")) {
                     "A ComplicationSlot must have a supportedTypes attribute"
                 }
                 val supportedTypes =
-                    getStringRefAttribute(resources, parser, "supportedTypes")
-                        ?.split('|') ?: throw IllegalArgumentException(
-                        "Unable to extract the supported type(s) for ComplicationSlot $slotId"
-                    )
-                val supportedTypesList = supportedTypes.map {
-                    typesMap[it] ?: throw IllegalArgumentException(
-                        "Unrecognised type $it for ComplicationSlot $slotId"
-                    )
-                }
+                    getStringRefAttribute(resources, parser, "supportedTypes")?.split('|')
+                        ?: throw IllegalArgumentException(
+                            "Unable to extract the supported type(s) for ComplicationSlot $slotId"
+                        )
+                val supportedTypesList =
+                    supportedTypes.map {
+                        typesMap[it]
+                            ?: throw IllegalArgumentException(
+                                "Unrecognised type $it for ComplicationSlot $slotId"
+                            )
+                    }
 
-                val defaultComplicationDataSourcePolicy = DefaultComplicationDataSourcePolicy
-                    .inflate(resources, parser, "ComplicationSlot")
+                val defaultComplicationDataSourcePolicy =
+                    DefaultComplicationDataSourcePolicy.inflate(
+                        resources,
+                        parser,
+                        "ComplicationSlot"
+                    )
 
-                val initiallyEnabled = parser.getAttributeBooleanValue(
-                    NAMESPACE_APP,
-                    "initiallyEnabled",
-                    true
-                )
-                val fixedComplicationDataSource = parser.getAttributeBooleanValue(
-                    NAMESPACE_APP,
-                    "fixedComplicationDataSource",
-                    false
-                )
+                val initiallyEnabled =
+                    parser.getAttributeBooleanValue(NAMESPACE_APP, "initiallyEnabled", true)
+                val fixedComplicationDataSource =
+                    parser.getAttributeBooleanValue(
+                        NAMESPACE_APP,
+                        "fixedComplicationDataSource",
+                        false
+                    )
                 val nameResourceId =
                     if (parser.hasValue("name")) {
                         parser.getAttributeResourceValue(NAMESPACE_APP, "name", 0)
@@ -212,21 +209,23 @@
                     } else {
                         null
                     }
-                val boundingArc = if (parser.hasValue("startArcAngle")) {
-                    BoundingArc(
-                        parser.getAttributeFloatValue(NAMESPACE_APP, "startArcAngle", 0f),
-                        parser.getAttributeFloatValue(NAMESPACE_APP, "totalArcAngle", 0f),
-                        parser.getAttributeFloatValue(NAMESPACE_APP, "arcThickness", 0f)
+                val boundingArc =
+                    if (parser.hasValue("startArcAngle")) {
+                        BoundingArc(
+                            parser.getAttributeFloatValue(NAMESPACE_APP, "startArcAngle", 0f),
+                            parser.getAttributeFloatValue(NAMESPACE_APP, "totalArcAngle", 0f),
+                            parser.getAttributeFloatValue(NAMESPACE_APP, "arcThickness", 0f)
+                        )
+                    } else {
+                        null
+                    }
+                val bounds =
+                    ComplicationSlotBounds.inflate(
+                        resources,
+                        parser,
+                        complicationScaleX,
+                        complicationScaleY
                     )
-                } else {
-                    null
-                }
-                val bounds = ComplicationSlotBounds.inflate(
-                    resources,
-                    parser,
-                    complicationScaleX,
-                    complicationScaleY
-                )
                 require(bounds != null) {
                     "ComplicationSlot must have either one ComplicationSlotBounds child node or " +
                         "one per ComplicationType."
@@ -271,9 +270,10 @@
                         ComplicationSlotBoundsType.BACKGROUND -> BackgroundComplicationTapFilter()
                         ComplicationSlotBoundsType.EDGE ->
                             complicationSlotInflationFactory.getEdgeComplicationTapFilter(it.slotId)
-                        else -> throw UnsupportedOperationException(
-                            "Unknown boundsType ${it.boundsType}"
-                        )
+                        else ->
+                            throw UnsupportedOperationException(
+                                "Unknown boundsType ${it.boundsType}"
+                            )
                     },
                     it.nameResourceId,
                     it.screenReaderNameResourceId,
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
index 2c2540b..5c0e535 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
@@ -18,11 +18,11 @@
 
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
+import androidx.wear.watchface.utility.TraceEvent
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
 
@@ -61,12 +61,9 @@
     init {
         TraceEvent("HeadlessWatchFaceImpl.init").use {
             runBlocking {
-                val coroutineContext = synchronized(this) {
-                    engine!!.uiThreadCoroutineScope.coroutineContext
-                }
-                withContext(coroutineContext) {
-                    headlessInstances.add(this@HeadlessWatchFaceImpl)
-                }
+                val coroutineContext =
+                    synchronized(this) { engine!!.uiThreadCoroutineScope.coroutineContext }
+                withContext(coroutineContext) { headlessInstances.add(this@HeadlessWatchFaceImpl) }
             }
         }
     }
@@ -77,13 +74,18 @@
         WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "HeadlessWatchFaceImpl.renderWatchFaceToBitmap"
-        ) { it.renderWatchFaceToBitmap(params) }
+        ) {
+            it.renderWatchFaceToBitmap(params)
+        }
 
     override fun getPreviewReferenceTimeMillis() =
         WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "HeadlessWatchFaceImpl.getPreviewReferenceTimeMillis"
-        ) { it.previewReferenceInstant.toEpochMilli() } ?: 0
+        ) {
+            it.previewReferenceInstant.toEpochMilli()
+        }
+            ?: 0
 
     override fun getComplicationState() = run {
         val engineCopy = engine
@@ -91,52 +93,63 @@
             engineCopy,
             "HeadlessWatchFaceImpl.getComplicationState",
             WatchFaceService.Companion.ExecutionThread.UI
-        ) { it.complicationSlotsManager.getComplicationsState(engineCopy!!.screenBounds) }
+        ) {
+            it.complicationSlotsManager.getComplicationsState(engineCopy!!.screenBounds)
+        }
     }
 
     override fun renderComplicationToBitmap(params: ComplicationRenderParams) =
         WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "HeadlessWatchFaceImpl.renderComplicationToBitmap"
-        ) { it.renderComplicationToBitmap(params) }
+        ) {
+            it.renderComplicationToBitmap(params)
+        }
 
     override fun getUserStyleSchema() =
         WatchFaceService.awaitDeferredEarlyInitDetailsThenRunOnThread(
             engine,
             "HeadlessWatchFaceImpl.getUserStyleSchema",
             WatchFaceService.Companion.ExecutionThread.CURRENT
-        ) { it.userStyleRepository.schema.toWireFormat() }
+        ) {
+            it.userStyleRepository.schema.toWireFormat()
+        }
 
     override fun computeUserStyleSchemaDigestHash() =
         WatchFaceService.awaitDeferredEarlyInitDetailsThenRunOnThread(
             engine,
             "HeadlessWatchFaceImpl.computeUserStyleSchemaDigestHash",
             WatchFaceService.Companion.ExecutionThread.CURRENT
-        ) { it.userStyleRepository.schema.getDigestHash() }
+        ) {
+            it.userStyleRepository.schema.getDigestHash()
+        }
 
     override fun getUserStyleFlavors() =
         WatchFaceService.awaitDeferredEarlyInitDetailsThenRunOnThread(
             engine,
             "HeadlessWatchFaceImpl.getUserStyleFlavors",
             WatchFaceService.Companion.ExecutionThread.CURRENT
-        ) { it.userStyleFlavors.toWireFormat() }
+        ) {
+            it.userStyleFlavors.toWireFormat()
+        }
 
     override fun release() {
         TraceEvent("HeadlessWatchFaceImpl.release").use {
             runBlocking {
-                val engineCopy = synchronized(this) { engine!! }
-                withContext(engineCopy.uiThreadCoroutineScope.coroutineContext) {
-                    headlessInstances.remove(this@HeadlessWatchFaceImpl)
-                    synchronized(this@HeadlessWatchFaceImpl) {
-                        engine!!.onDestroy()
-                        engine = null
+                    val engineCopy = synchronized(this) { engine!! }
+                    withContext(engineCopy.uiThreadCoroutineScope.coroutineContext) {
+                        headlessInstances.remove(this@HeadlessWatchFaceImpl)
+                        synchronized(this@HeadlessWatchFaceImpl) {
+                            engine!!.onDestroy()
+                            engine = null
 
-                        watchFaceService!!.onDestroy()
-                        watchFaceService = null
+                            watchFaceService!!.onDestroy()
+                            watchFaceService = null
+                        }
                     }
+                    engineCopy
                 }
-                engineCopy
-            }.cancelCoroutineScopes()
+                .cancelCoroutineScopes()
         }
     }
 }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
index 2191dd3..bcbafd1 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
@@ -19,9 +19,9 @@
 import android.annotation.SuppressLint
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
+import androidx.wear.watchface.utility.TraceEvent
 
 /** Keeps track of [InteractiveWatchFaceImpl]s. */
 internal class InteractiveInstanceManager {
@@ -51,12 +51,14 @@
         private val instances = HashMap<String, RefCountedInteractiveWatchFaceInstance>()
         private val pendingWallpaperInteractiveWatchFaceInstanceLock = Any()
         private var pendingWallpaperInteractiveWatchFaceInstance:
-            PendingWallpaperInteractiveWatchFaceInstance? = null
+            PendingWallpaperInteractiveWatchFaceInstance? =
+            null
 
         @VisibleForTesting
-        fun getInstances() = synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
-            instances.map { it.key }
-        }
+        fun getInstances() =
+            synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
+                instances.map { it.key }
+            }
 
         @SuppressLint("SyntheticAccessor")
         fun addInstance(impl: InteractiveWatchFaceImpl) {
@@ -116,16 +118,17 @@
         fun getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
             value: PendingWallpaperInteractiveWatchFaceInstance
         ): IInteractiveWatchFace? {
-            val impl = synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
-                val instance = instances[value.params.instanceId]
-                if (instance == null) {
-                    TraceEvent("Set pendingWallpaperInteractiveWatchFaceInstance").use {
-                        pendingWallpaperInteractiveWatchFaceInstance = value
+            val impl =
+                synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
+                    val instance = instances[value.params.instanceId]
+                    if (instance == null) {
+                        TraceEvent("Set pendingWallpaperInteractiveWatchFaceInstance").use {
+                            pendingWallpaperInteractiveWatchFaceInstance = value
+                        }
+                        return null
                     }
-                    return null
+                    instance.impl
                 }
-                instance.impl
-            }
 
             // The system on reboot will use this to connect to an existing watch face, we need to
             // ensure there isn't a skew between the style the watch face actually has and what the
@@ -139,12 +142,12 @@
         @SuppressLint("SyntheticAccessor")
         fun takePendingWallpaperInteractiveWatchFaceInstance():
             PendingWallpaperInteractiveWatchFaceInstance? {
-                synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
-                    val returnValue = pendingWallpaperInteractiveWatchFaceInstance
-                    pendingWallpaperInteractiveWatchFaceInstance = null
-                    return returnValue
-                }
+            synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
+                val returnValue = pendingWallpaperInteractiveWatchFaceInstance
+                pendingWallpaperInteractiveWatchFaceInstance = null
+                return returnValue
             }
+        }
 
         @UiThread
         fun dump(writer: IndentingPrintWriter) {
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index a9cb267..92da54c 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -21,7 +21,6 @@
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
 import android.util.Log
 import androidx.annotation.RequiresApi
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.TapEvent
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
@@ -32,12 +31,13 @@
 import androidx.wear.watchface.runBlockingWithTracing
 import androidx.wear.watchface.style.data.UserStyleSchemaWireFormat
 import androidx.wear.watchface.style.data.UserStyleWireFormat
-import kotlinx.coroutines.launch
+import androidx.wear.watchface.utility.TraceEvent
 import java.time.Instant
+import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
 
-/** An interactive watch face instance with SysUI and WCS facing interfaces.*/
+/** An interactive watch face instance with SysUI and WCS facing interfaces. */
 internal class InteractiveWatchFaceImpl(
     internal var engine: WatchFaceService.EngineWrapper?,
     internal var instanceId: String
@@ -59,11 +59,7 @@
         ) { watchFaceImpl ->
             watchFaceImpl.onTapCommand(
                 tapType,
-                TapEvent(
-                    xPos,
-                    yPos,
-                    Instant.ofEpochMilli(systemTimeProvider.getSystemTimeMillis())
-                )
+                TapEvent(xPos, yPos, Instant.ofEpochMilli(systemTimeProvider.getSystemTimeMillis()))
             )
         }
     }
@@ -73,24 +69,21 @@
     override fun unused20() {}
 
     override fun addWatchFaceListener(listener: IWatchfaceListener) {
-        engine?.addWatchFaceListener(listener) ?: Log.w(
-            TAG,
-            "addWatchFaceListener ignored due to null engine"
-        )
+        engine?.addWatchFaceListener(listener)
+            ?: Log.w(TAG, "addWatchFaceListener ignored due to null engine")
     }
 
     override fun removeWatchFaceListener(listener: IWatchfaceListener) {
-        engine?.removeWatchFaceListener(listener) ?: Log.w(
-            TAG,
-            "removeWatchFaceListener ignored due to null engine"
-        )
+        engine?.removeWatchFaceListener(listener)
+            ?: Log.w(TAG, "removeWatchFaceListener ignored due to null engine")
     }
 
     override fun getWatchFaceOverlayStyle(): WatchFaceOverlayStyleWireFormat? =
         WatchFaceService.awaitDeferredWatchFaceThenRunOnUiThread(
             engine,
             "InteractiveWatchFaceImpl.getWatchFaceOverlayStyle"
-        ) { WatchFaceOverlayStyleWireFormat(
+        ) {
+            WatchFaceOverlayStyleWireFormat(
                 it.overlayStyle.backgroundColor,
                 it.overlayStyle.foregroundColor
             )
@@ -100,7 +93,9 @@
         return WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "InteractiveWatchFaceImpl.getContentDescriptionLabels"
-        ) { engine?.contentDescriptionLabels }
+        ) {
+            engine?.contentDescriptionLabels
+        }
     }
 
     @RequiresApi(Build.VERSION_CODES.O_MR1)
@@ -108,14 +103,19 @@
         return WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "InteractiveWatchFaceImpl.renderWatchFaceToBitmap"
-        ) { watchFaceImpl -> watchFaceImpl.renderWatchFaceToBitmap(params) }
+        ) { watchFaceImpl ->
+            watchFaceImpl.renderWatchFaceToBitmap(params)
+        }
     }
 
     override fun getPreviewReferenceTimeMillis(): Long {
         return WatchFaceService.awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             engine,
             "InteractiveWatchFaceImpl.getPreviewReferenceTimeMillis"
-        ) { watchFaceImpl -> watchFaceImpl.previewReferenceInstant.toEpochMilli() } ?: 0
+        ) { watchFaceImpl ->
+            watchFaceImpl.previewReferenceInstant.toEpochMilli()
+        }
+            ?: 0
     }
 
     override fun setWatchUiState(watchUiState: WatchUiState) {
@@ -123,9 +123,8 @@
             engine,
             "InteractiveWatchFaceImpl.setWatchUiState"
         ) {
-            engine?.let {
-                it.setWatchUiState(watchUiState, fromSysUi = true)
-            } ?: Log.d(TAG, "setWatchUiState ignored due to null engine id $instanceId")
+            engine?.let { it.setWatchUiState(watchUiState, fromSysUi = true) }
+                ?: Log.d(TAG, "setWatchUiState ignored due to null engine id $instanceId")
         }
     }
 
@@ -140,39 +139,36 @@
         }
     }
 
-    override fun release(): Unit = TraceEvent("InteractiveWatchFaceImpl.release").use {
-        // Note this is a one way method called on a binder thread, so it shouldn't matter if we
-        // block.
-        runBlocking {
-            try {
-                withContext(uiThreadCoroutineScope.coroutineContext) {
-                    engine?.let {
-                        it.deferredWatchFaceImpl.await()
+    override fun release(): Unit =
+        TraceEvent("InteractiveWatchFaceImpl.release").use {
+            // Note this is a one way method called on a binder thread, so it shouldn't matter if we
+            // block.
+            runBlocking {
+                try {
+                    withContext(uiThreadCoroutineScope.coroutineContext) {
+                        engine?.let { it.deferredWatchFaceImpl.await() }
+                        InteractiveInstanceManager.releaseInstance(instanceId)
                     }
-                    InteractiveInstanceManager.releaseInstance(instanceId)
+                } catch (e: Exception) {
+                    // deferredWatchFaceImpl may have completed with an exception. This will
+                    // have already been reported so we can ignore it.
                 }
-            } catch (e: Exception) {
-                // deferredWatchFaceImpl may have completed with an exception. This will
-                // have already been reported so we can ignore it.
             }
         }
-    }
 
     override fun updateComplicationData(
         complicationDatumWireFormats: MutableList<IdAndComplicationDataWireFormat>
-    ): Unit = TraceEvent("InteractiveWatchFaceImpl.updateComplicationData").use {
-        if ("user" != Build.TYPE) {
-            Log.d(TAG, "updateComplicationData " + complicationDatumWireFormats.joinToString())
+    ): Unit =
+        TraceEvent("InteractiveWatchFaceImpl.updateComplicationData").use {
+            if ("user" != Build.TYPE) {
+                Log.d(TAG, "updateComplicationData " + complicationDatumWireFormats.joinToString())
+            }
+
+            engine?.setComplicationDataList(complicationDatumWireFormats)
+                ?: Log.d(TAG, "updateComplicationData ignored due to null engine id $instanceId")
         }
 
-        engine?.setComplicationDataList(complicationDatumWireFormats)
-            ?: Log.d(TAG, "updateComplicationData ignored due to null engine id $instanceId")
-    }
-
-    override fun updateWatchfaceInstance(
-        newInstanceId: String,
-        userStyle: UserStyleWireFormat
-    ) {
+    override fun updateWatchfaceInstance(newInstanceId: String, userStyle: UserStyleWireFormat) {
         /**
          * This is blocking to ensure ordering with respect to any subsequent [getInstanceId] and
          * [getPreviewReferenceTimeMillis] calls.
@@ -194,7 +190,9 @@
             engineCopy,
             "InteractiveWatchFaceImpl.getComplicationDetails",
             WatchFaceService.Companion.ExecutionThread.UI
-        ) { it.complicationSlotsManager.getComplicationsState(engineCopy!!.screenBounds) }
+        ) {
+            it.complicationSlotsManager.getComplicationsState(engineCopy!!.screenBounds)
+        }
     }
 
     override fun getUserStyleSchema(): UserStyleSchemaWireFormat? {
@@ -202,7 +200,9 @@
             engine,
             "InteractiveWatchFaceImpl.getUserStyleSchema",
             WatchFaceService.Companion.ExecutionThread.CURRENT
-        ) { it.userStyleRepository.schema.toWireFormat() }
+        ) {
+            it.userStyleRepository.schema.toWireFormat()
+        }
     }
 
     override fun bringAttentionToComplication(id: Int) {
@@ -222,7 +222,8 @@
             "InteractiveWatchFaceImpl.getComplicationIdAt"
         ) {
             it.complicationSlotsManager.getComplicationSlotAt(xPos, yPos)?.id?.toLong()
-        } ?: Long.MIN_VALUE
+        }
+            ?: Long.MIN_VALUE
     }
 
     fun onDestroy() {
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
index 7c4b22e..58dc948 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
@@ -27,8 +27,6 @@
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
-import androidx.wear.watchface.utility.AsyncTraceEvent
-import androidx.wear.watchface.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.CrashInfoParcel
@@ -44,6 +42,8 @@
 import androidx.wear.watchface.runBlockingWithTracing
 import androidx.wear.watchface.style.data.UserStyleFlavorsWireFormat
 import androidx.wear.watchface.style.data.UserStyleSchemaWireFormat
+import androidx.wear.watchface.utility.AsyncTraceEvent
+import androidx.wear.watchface.utility.TraceEvent
 import java.io.FileDescriptor
 import java.io.PrintWriter
 import kotlinx.coroutines.CoroutineScope
@@ -138,18 +138,17 @@
 
     override fun createHeadlessWatchFaceInstance(
         params: HeadlessWatchFaceInstanceParams
-    ): IHeadlessWatchFace? = TraceEvent(
-        "IWatchFaceInstanceServiceStub.createHeadlessWatchFaceInstance"
-    ).use {
-        createServiceAndHeadlessEngine(params.watchFaceName)?.let { serviceAndEngine ->
-            // This is serviced on a background thread so it should be fine to block.
-            uiThreadCoroutineScope.runBlockingWithTracing("createHeadlessInstance") {
-                // However the WatchFaceService.createWatchFace method needs to be run on the UI
-                // thread.
-                serviceAndEngine.engine.createHeadlessInstance(params)
+    ): IHeadlessWatchFace? =
+        TraceEvent("IWatchFaceInstanceServiceStub.createHeadlessWatchFaceInstance").use {
+            createServiceAndHeadlessEngine(params.watchFaceName)?.let { serviceAndEngine ->
+                // This is serviced on a background thread so it should be fine to block.
+                uiThreadCoroutineScope.runBlockingWithTracing("createHeadlessInstance") {
+                    // However the WatchFaceService.createWatchFace method needs to be run on the UI
+                    // thread.
+                    serviceAndEngine.engine.createHeadlessInstance(params)
+                }
             }
         }
-    }
 
     private class ServiceAndEngine(
         val service: WatchFaceService,
@@ -160,55 +159,50 @@
                 engine.onDestroy()
                 service.onDestroy()
             } catch (e: Exception) {
-                Log.e(
-                    TAG,
-                    "ServiceAndEngine.destroy failed due to exception",
-                    e
-                )
+                Log.e(TAG, "ServiceAndEngine.destroy failed due to exception", e)
                 throw e
             }
         }
     }
 
     @SuppressLint("BanUncheckedReflection")
-    private fun createServiceAndHeadlessEngine(
-        watchFaceName: ComponentName
-    ) = TraceEvent("IWatchFaceInstanceServiceStub.createEngine").use {
-        // Attempt to construct the class for the specified watchFaceName, failing if it either
-        // doesn't exist or isn't a [WatchFaceService].
-        val watchFaceService = service?.createWatchFaceService(watchFaceName)
+    private fun createServiceAndHeadlessEngine(watchFaceName: ComponentName) =
+        TraceEvent("IWatchFaceInstanceServiceStub.createEngine").use {
+            // Attempt to construct the class for the specified watchFaceName, failing if it either
+            // doesn't exist or isn't a [WatchFaceService].
+            val watchFaceService = service?.createWatchFaceService(watchFaceName)
 
-        if (watchFaceService != null) {
-            // Set the context and if possible the application for watchFaceService.
-            try {
-                val method = Service::class.java.declaredMethods.find { it.name == "attach" }
-                method!!.isAccessible = true
-                method.invoke(
-                    watchFaceService,
-                    service as Context,
-                    null,
-                    watchFaceService::class.qualifiedName,
-                    null,
-                    service!!.application,
-                    null
-                )
-            } catch (e: Exception) {
-                Log.w(
-                    TAG,
-                    "createServiceAndHeadlessEngine can't call attach by reflection, " +
-                        "falling back to setContext",
-                    e
-                )
-                watchFaceService.setContext(watchFaceService)
+            if (watchFaceService != null) {
+                // Set the context and if possible the application for watchFaceService.
+                try {
+                    val method = Service::class.java.declaredMethods.find { it.name == "attach" }
+                    method!!.isAccessible = true
+                    method.invoke(
+                        watchFaceService,
+                        service as Context,
+                        null,
+                        watchFaceService::class.qualifiedName,
+                        null,
+                        service!!.application,
+                        null
+                    )
+                } catch (e: Exception) {
+                    Log.w(
+                        TAG,
+                        "createServiceAndHeadlessEngine can't call attach by reflection, " +
+                            "falling back to setContext",
+                        e
+                    )
+                    watchFaceService.setContext(watchFaceService)
+                }
+                watchFaceService.onCreate()
+                val engine =
+                    watchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
+                ServiceAndEngine(watchFaceService, engine)
+            } else {
+                null
             }
-            watchFaceService.onCreate()
-            val engine =
-                watchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
-            ServiceAndEngine(watchFaceService, engine)
-        } else {
-            null
         }
-    }
 
     override fun getOrCreateInteractiveWatchFace(
         params: WallpaperInteractiveWatchFaceInstanceParams,
@@ -249,52 +243,63 @@
 
     override fun getDefaultProviderPolicies(
         params: DefaultProviderPoliciesParams
-    ): Array<IdTypeAndDefaultProviderPolicyWireFormat>? = createServiceAndHeadlessEngineAndEvaluate(
-        params.watchFaceName,
-        "IWatchFaceInstanceServiceStub.getDefaultProviderPolicies"
-    ) { it.engine.getDefaultProviderPolicies() }
+    ): Array<IdTypeAndDefaultProviderPolicyWireFormat>? =
+        createServiceAndHeadlessEngineAndEvaluate(
+            params.watchFaceName,
+            "IWatchFaceInstanceServiceStub.getDefaultProviderPolicies"
+        ) {
+            it.engine.getDefaultProviderPolicies()
+        }
 
-    override fun getUserStyleSchema(
-        params: GetUserStyleSchemaParams
-    ): UserStyleSchemaWireFormat? = createServiceAndHeadlessEngineAndEvaluate(
-        params.watchFaceName,
-        "IWatchFaceInstanceServiceStub.getUserStyleSchema"
-    ) { it.engine.getUserStyleSchemaWireFormat() }
+    override fun getUserStyleSchema(params: GetUserStyleSchemaParams): UserStyleSchemaWireFormat? =
+        createServiceAndHeadlessEngineAndEvaluate(
+            params.watchFaceName,
+            "IWatchFaceInstanceServiceStub.getUserStyleSchema"
+        ) {
+            it.engine.getUserStyleSchemaWireFormat()
+        }
 
     override fun getComplicationSlotMetadata(
         params: GetComplicationSlotMetadataParams
-    ): Array<ComplicationSlotMetadataWireFormat>? = createServiceAndHeadlessEngineAndEvaluate(
-        params.watchFaceName,
-        "IWatchFaceInstanceServiceStub.getComplicationSlotMetadata"
-    ) { it.engine.getComplicationSlotMetadataWireFormats() }
+    ): Array<ComplicationSlotMetadataWireFormat>? =
+        createServiceAndHeadlessEngineAndEvaluate(
+            params.watchFaceName,
+            "IWatchFaceInstanceServiceStub.getComplicationSlotMetadata"
+        ) {
+            it.engine.getComplicationSlotMetadataWireFormats()
+        }
 
     override fun hasComplicationCache() = true
 
     override fun getUserStyleFlavors(
         params: GetUserStyleFlavorsParams
-    ): UserStyleFlavorsWireFormat? = createServiceAndHeadlessEngineAndEvaluate(
-        params.watchFaceName,
-        "IWatchFaceInstanceServiceStub.getUserStyleFlavors"
-    ) { it.engine.getUserStyleFlavorsWireFormat() }
+    ): UserStyleFlavorsWireFormat? =
+        createServiceAndHeadlessEngineAndEvaluate(
+            params.watchFaceName,
+            "IWatchFaceInstanceServiceStub.getUserStyleFlavors"
+        ) {
+            it.engine.getUserStyleFlavorsWireFormat()
+        }
 
     private fun <T> createServiceAndHeadlessEngineAndEvaluate(
         watchFaceName: ComponentName,
         functionName: String,
         function: (serviceAndEngine: ServiceAndEngine) -> T
-    ): T? = TraceEvent(functionName).use {
-        return try {
-            createServiceAndHeadlessEngine(watchFaceName)?.let { serviceAndEngine ->
-                try {
-                    function(serviceAndEngine)
-                } finally {
-                    serviceAndEngine.destroy()
+    ): T? =
+        TraceEvent(functionName).use {
+            return try {
+                createServiceAndHeadlessEngine(watchFaceName)?.let { serviceAndEngine ->
+                    try {
+                        function(serviceAndEngine)
+                    } finally {
+                        serviceAndEngine.destroy()
+                    }
                 }
+            } catch (e: Exception) {
+                Log.e(TAG, "$functionName failed due to exception", e)
+                throw e
             }
-        } catch (e: Exception) {
-            Log.e(TAG, "$functionName failed due to exception", e)
-            throw e
         }
-    }
 
     fun onDestroy() {
         service = null
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/editor/EditorService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/editor/EditorService.kt
index d613398..8221e95 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/editor/EditorService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/editor/EditorService.kt
@@ -48,14 +48,17 @@
         synchronized(lock) {
             val id = nextId++
             observers[id] = observer
-            val deathObserver = IBinder.DeathRecipient {
-                Log.w(TAG, "observer died, closing editor")
-                // If SysUI dies we should close the editor too, otherwise the watchface could get
-                // left in an inconsistent state where it has local edits that were not persisted by
-                // the system.
-                closeEditor()
-                unregisterObserver(id)
-            }
+            val deathObserver =
+                IBinder.DeathRecipient {
+                    Log.w(TAG, "observer died, closing editor")
+                    // If SysUI dies we should close the editor too, otherwise the watchface could
+                    // get
+                    // left in an inconsistent state where it has local edits that were not
+                    // persisted by
+                    // the system.
+                    closeEditor()
+                    unregisterObserver(id)
+                }
             observer.asBinder().linkToDeath(deathObserver, 0)
             deathObservers[id] = deathObserver
             return id
@@ -83,9 +86,7 @@
     }
 
     override fun closeEditor() {
-        val callbackCopy = synchronized(lock) {
-            HashSet<CloseCallback>(closeEditorCallbacks)
-        }
+        val callbackCopy = synchronized(lock) { HashSet<CloseCallback>(closeEditorCallbacks) }
         // We iterate on a copy of closeEditorCallbacks to avoid calls to removeCloseCallback
         // mutating a set we're iterating.
         for (observer in callbackCopy) {
@@ -97,27 +98,19 @@
      * Adds [closeCallback] to the set of observers to be called if the client calls [closeEditor].
      */
     public fun addCloseCallback(closeCallback: CloseCallback) {
-        synchronized(lock) {
-            closeEditorCallbacks.add(closeCallback)
-        }
+        synchronized(lock) { closeEditorCallbacks.add(closeCallback) }
     }
 
     /**
      * Removes [closeCallback] from set of observers to be called if the client calls [closeEditor].
      */
     public fun removeCloseCallback(closeCallback: CloseCallback) {
-        synchronized(lock) {
-            closeEditorCallbacks.remove(closeCallback)
-        }
+        synchronized(lock) { closeEditorCallbacks.remove(closeCallback) }
     }
 
-    /**
-     * Removes all [closeEditorCallbacks].
-     */
+    /** Removes all [closeEditorCallbacks]. */
     public fun clearCloseCallbacks() {
-        synchronized(lock) {
-            closeEditorCallbacks.clear()
-        }
+        synchronized(lock) { closeEditorCallbacks.clear() }
     }
 
     /**
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
index c09f23b..a48ba9c 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
@@ -31,14 +31,16 @@
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.WatchUiState
-import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.CurrentUserStyleRepository
+import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import com.google.common.truth.Truth.assertThat
-import org.mockito.kotlin.mock
+import java.util.ArrayDeque
+import java.util.PriorityQueue
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.launch
+import org.junit.After
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNull
 import org.junit.Assert.fail
@@ -47,10 +49,8 @@
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers
 import org.mockito.Mockito
+import org.mockito.kotlin.mock
 import org.robolectric.annotation.Config
-import java.util.ArrayDeque
-import java.util.PriorityQueue
-import org.junit.After
 
 internal class TestAsyncWatchFaceService(
     private val handler: Handler,
@@ -88,12 +88,15 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = factory.createWatchFaceAsync(
-        surfaceHolder,
-        watchState,
-        complicationSlotsManager,
-        currentUserStyleRepository
-    ).await()
+    ) =
+        factory
+            .createWatchFaceAsync(
+                surfaceHolder,
+                watchState,
+                complicationSlotsManager,
+                currentUserStyleRepository
+            )
+            .await()
 
     override fun getUiThreadHandlerImpl() = handler
 
@@ -101,17 +104,13 @@
 
     override fun getMutableWatchState() = watchState
 
-    override fun readDirectBootPrefs(
-        context: Context,
-        fileName: String
-    ) = directBootParams
+    override fun readDirectBootPrefs(context: Context, fileName: String) = directBootParams
 
     override fun writeDirectBootPrefs(
         context: Context,
         fileName: String,
         prefs: WallpaperInteractiveWatchFaceInstanceParams
-    ) {
-    }
+    ) {}
 }
 
 @Config(manifest = Config.NONE, sdk = [Build.VERSION_CODES.R])
@@ -122,20 +121,16 @@
     private val surfaceHolder = mock<SurfaceHolder>()
     private var looperTimeMillis = 0L
     private val pendingTasks = PriorityQueue<Task>()
-    private val initParams = WallpaperInteractiveWatchFaceInstanceParams(
-        "instanceId",
-        DeviceConfig(
-            false,
-            false,
-            0,
-            0
-        ),
-        WatchUiState(false, 0),
-        UserStyle(emptyMap()).toWireFormat(),
-        null,
-        null,
-        null
-    )
+    private val initParams =
+        WallpaperInteractiveWatchFaceInstanceParams(
+            "instanceId",
+            DeviceConfig(false, false, 0, 0),
+            WatchUiState(false, 0),
+            UserStyle(emptyMap()).toWireFormat(),
+            null,
+            null,
+            null
+        )
 
     private class Task(val runTimeMillis: Long, val runnable: Runnable) : Comparable<Task> {
         override fun compareTo(other: Task) = runTimeMillis.compareTo(other.runTimeMillis)
@@ -143,8 +138,8 @@
 
     private fun runPostedTasksFor(durationMillis: Long) {
         looperTimeMillis += durationMillis
-        while (pendingTasks.isNotEmpty() &&
-            pendingTasks.peek()!!.runTimeMillis <= looperTimeMillis
+        while (
+            pendingTasks.isNotEmpty() && pendingTasks.peek()!!.runTimeMillis <= looperTimeMillis
         ) {
             pendingTasks.remove().runnable.run()
         }
@@ -155,39 +150,35 @@
         Mockito.`when`(handler.getLooper()).thenReturn(Looper.myLooper())
 
         // Capture tasks posted to mHandler and insert in mPendingTasks which is under our control.
-        Mockito.doAnswer {
-            pendingTasks.add(
-                Task(
-                    looperTimeMillis,
-                    it.arguments[0] as Runnable
-                )
-            )
-        }.`when`(handler).post(ArgumentMatchers.any())
+        Mockito.doAnswer { pendingTasks.add(Task(looperTimeMillis, it.arguments[0] as Runnable)) }
+            .`when`(handler)
+            .post(ArgumentMatchers.any())
 
         Mockito.doAnswer {
-            pendingTasks.add(
-                Task(
-                    looperTimeMillis + it.arguments[1] as Long,
-                    it.arguments[0] as Runnable
+                pendingTasks.add(
+                    Task(looperTimeMillis + it.arguments[1] as Long, it.arguments[0] as Runnable)
                 )
-            )
-        }.`when`(handler).postDelayed(ArgumentMatchers.any(), ArgumentMatchers.anyLong())
+            }
+            .`when`(handler)
+            .postDelayed(ArgumentMatchers.any(), ArgumentMatchers.anyLong())
 
         Mockito.doAnswer {
-            // Remove task from the priority queue.  There's no good way of doing this quickly.
-            val queue = ArrayDeque<Task>()
-            while (pendingTasks.isNotEmpty()) {
-                val task = pendingTasks.remove()
-                if (task.runnable != it.arguments[0]) {
-                    queue.add(task)
+                // Remove task from the priority queue.  There's no good way of doing this quickly.
+                val queue = ArrayDeque<Task>()
+                while (pendingTasks.isNotEmpty()) {
+                    val task = pendingTasks.remove()
+                    if (task.runnable != it.arguments[0]) {
+                        queue.add(task)
+                    }
+                }
+
+                // Push filtered tasks back on the queue.
+                while (queue.isNotEmpty()) {
+                    pendingTasks.add(queue.remove())
                 }
             }
-
-            // Push filtered tasks back on the queue.
-            while (queue.isNotEmpty()) {
-                pendingTasks.add(queue.remove())
-            }
-        }.`when`(handler).removeCallbacks(ArgumentMatchers.any())
+            .`when`(handler)
+            .removeCallbacks(ArgumentMatchers.any())
     }
 
     @After
@@ -199,25 +190,26 @@
     @Test
     public fun createInteractiveInstanceFailsIfDirectBootWatchFaceCreationIsInProgress() {
         val completableWatchFace = CompletableDeferred<WatchFace>()
-        val service = TestAsyncWatchFaceService(
-            handler,
-            object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
-                override fun createUserStyleSchema() = UserStyleSchema(emptyList())
+        val service =
+            TestAsyncWatchFaceService(
+                handler,
+                object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
+                    override fun createUserStyleSchema() = UserStyleSchema(emptyList())
 
-                override fun createComplicationsManager(
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ) = ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
+                    override fun createComplicationsManager(
+                        currentUserStyleRepository: CurrentUserStyleRepository
+                    ) = ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
 
-                override fun createWatchFaceAsync(
-                    surfaceHolder: SurfaceHolder,
-                    watchState: WatchState,
-                    complicationSlotsManager: ComplicationSlotsManager,
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ) = completableWatchFace
-            },
-            MutableWatchState(),
-            initParams
-        )
+                    override fun createWatchFaceAsync(
+                        surfaceHolder: SurfaceHolder,
+                        watchState: WatchState,
+                        complicationSlotsManager: ComplicationSlotsManager,
+                        currentUserStyleRepository: CurrentUserStyleRepository
+                    ) = completableWatchFace
+                },
+                MutableWatchState(),
+                initParams
+            )
 
         val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
 
@@ -253,8 +245,7 @@
                     InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                         initParams,
                         object : IPendingInteractiveWatchFace.Stub() {
-                            override fun getApiVersion() =
-                                IPendingInteractiveWatchFace.API_VERSION
+                            override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                             override fun onInteractiveWatchFaceCreated(
                                 iInteractiveWatchFaceWcs: IInteractiveWatchFace?
@@ -272,30 +263,31 @@
                 )
         )
 
-        val service = TestAsyncWatchFaceService(
-            handler,
-            object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
-                override fun createUserStyleSchema() = UserStyleSchema(emptyList())
+        val service =
+            TestAsyncWatchFaceService(
+                handler,
+                object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
+                    override fun createUserStyleSchema() = UserStyleSchema(emptyList())
 
-                override fun createComplicationsManager(
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ) = ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
+                    override fun createComplicationsManager(
+                        currentUserStyleRepository: CurrentUserStyleRepository
+                    ) = ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
 
-                override fun createWatchFaceAsync(
-                    surfaceHolder: SurfaceHolder,
-                    watchState: WatchState,
-                    complicationSlotsManager: ComplicationSlotsManager,
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ): Deferred<WatchFace> {
-                    pendingSurfaceHolder = surfaceHolder
-                    pendingWatchState = watchState
-                    pendingCurrentUserStyleRepository = currentUserStyleRepository
-                    return completableDirectBootWatchFace
-                }
-            },
-            MutableWatchState(),
-            initParams
-        )
+                    override fun createWatchFaceAsync(
+                        surfaceHolder: SurfaceHolder,
+                        watchState: WatchState,
+                        complicationSlotsManager: ComplicationSlotsManager,
+                        currentUserStyleRepository: CurrentUserStyleRepository
+                    ): Deferred<WatchFace> {
+                        pendingSurfaceHolder = surfaceHolder
+                        pendingWatchState = watchState
+                        pendingCurrentUserStyleRepository = currentUserStyleRepository
+                        return completableDirectBootWatchFace
+                    }
+                },
+                MutableWatchState(),
+                initParams
+            )
 
         val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
         Mockito.`when`(surfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 100, 100))
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/JavaCompatTest.java b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/JavaCompatTest.java
index 32c6b89..955a3f7 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/JavaCompatTest.java
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/JavaCompatTest.java
@@ -29,8 +29,11 @@
 public class JavaCompatTest {
     class ComplicationTapFilterImpl implements ComplicationTapFilter {
         @SuppressWarnings("deprecation")
-        public boolean hitTest(@NonNull ComplicationSlot complicationSlot,
-                @NonNull Rect screenBounds, @Px int x, @Px int y) {
+        public boolean hitTest(
+                @NonNull ComplicationSlot complicationSlot,
+                @NonNull Rect screenBounds,
+                @Px int x,
+                @Px int y) {
             return true;
         }
     }
@@ -42,15 +45,20 @@
         }
 
         @Override
-        public void render(@NonNull Canvas canvas, @NonNull Rect bounds,
-                @NonNull ZonedDateTime zonedDateTime, @NonNull RenderParameters renderParameters,
-                int slotId) {
-        }
+        public void render(
+                @NonNull Canvas canvas,
+                @NonNull Rect bounds,
+                @NonNull ZonedDateTime zonedDateTime,
+                @NonNull RenderParameters renderParameters,
+                int slotId) {}
 
         @Override
-        public void drawHighlight(@NonNull Canvas canvas, @NonNull Rect bounds, int boundsType,
-                @NonNull ZonedDateTime zonedDateTime, int color) {
-        }
+        public void drawHighlight(
+                @NonNull Canvas canvas,
+                @NonNull Rect bounds,
+                int boundsType,
+                @NonNull ZonedDateTime zonedDateTime,
+                int color) {}
 
         @NonNull
         @Override
@@ -59,9 +67,7 @@
         }
 
         @Override
-        public void loadData(@NonNull ComplicationData complicationData,
-                boolean loadDrawablesAsynchronous) {
-
-        }
+        public void loadData(
+                @NonNull ComplicationData complicationData, boolean loadDrawablesAsynchronous) {}
     }
 }
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt
index bc881a2..f49f16b 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt
@@ -17,8 +17,8 @@
 package androidx.wear.watchface
 
 import android.graphics.Color
-import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyleSetting
+import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -27,9 +27,10 @@
 public class RenderParametersTest {
     @Test
     public fun interactive_base_toWireFormatRoundTrip() {
-        val renderParameters = RenderParameters(
-            RenderParameters(DrawMode.INTERACTIVE, setOf(WatchFaceLayer.BASE)).toWireFormat()
-        )
+        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()
@@ -37,83 +38,124 @@
 
     @Test
     public fun ambient_twoLayers_toWireFormatRoundTrip() {
-        val renderParameters = RenderParameters(
+        val renderParameters =
             RenderParameters(
-                DrawMode.AMBIENT,
-                setOf(
-                    WatchFaceLayer.COMPLICATIONS,
-                    WatchFaceLayer.COMPLICATIONS_OVERLAY
-                )
-            ).toWireFormat()
-        )
+                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.watchFaceLayers)
+            .containsExactly(WatchFaceLayer.COMPLICATIONS, WatchFaceLayer.COMPLICATIONS_OVERLAY)
         assertThat(renderParameters.highlightLayer).isNull()
     }
 
     @Test
     public fun highlightLayer_AllComplications_toWireFormatRoundTrip() {
-        val renderParameters = RenderParameters(
+        val renderParameters =
             RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                RenderParameters.HighlightLayer(
-                    RenderParameters.HighlightedElement.AllComplicationSlots,
-                    Color.RED,
-                    Color.BLACK
-                )
-            ).toWireFormat()
-        )
+                RenderParameters(
+                        DrawMode.INTERACTIVE,
+                        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                        RenderParameters.HighlightLayer(
+                            RenderParameters.HighlightedElement.AllComplicationSlots,
+                            Color.RED,
+                            Color.BLACK
+                        )
+                    )
+                    .toWireFormat()
+            )
         assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
-        assertThat(renderParameters.watchFaceLayers).containsExactly(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        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.AllComplicationSlots::class.java
-        )
+        assertThat(highlightLayer.highlightedElement)
+            .isInstanceOf(RenderParameters.HighlightedElement.AllComplicationSlots::class.java)
     }
 
     @Test
     public fun highlightLayer_Complication_toWireFormatRoundTrip() {
-        val renderParameters = RenderParameters(
+        val renderParameters =
             RenderParameters(
-                DrawMode.INTERACTIVE,
-                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-                RenderParameters.HighlightLayer(
-                    RenderParameters.HighlightedElement.ComplicationSlot(123),
-                    Color.RED,
-                    Color.BLACK
-                )
-            ).toWireFormat()
-        )
+                RenderParameters(
+                        DrawMode.INTERACTIVE,
+                        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                        RenderParameters.HighlightLayer(
+                            RenderParameters.HighlightedElement.ComplicationSlot(123),
+                            Color.RED,
+                            Color.BLACK
+                        )
+                    )
+                    .toWireFormat()
+            )
         assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
-        assertThat(renderParameters.watchFaceLayers).containsExactly(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
-        )
+        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.ComplicationSlot::class.java
-        )
-        val complication = highlightLayer.highlightedElement as
-            RenderParameters.HighlightedElement.ComplicationSlot
+        assertThat(highlightLayer.highlightedElement)
+            .isInstanceOf(RenderParameters.HighlightedElement.ComplicationSlot::class.java)
+        val complication =
+            highlightLayer.highlightedElement
+                as RenderParameters.HighlightedElement.ComplicationSlot
         assertThat(complication.id).isEqualTo(123)
     }
 
     @Test
     public fun highlightLayer_UserStyle_toWireFormatRoundTrip() {
-        val renderParameters = RenderParameters(
+        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,
@@ -122,112 +164,79 @@
                     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")
-    }
+            )
+        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
+                )
+            )
 
-    @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 renderParameters3a =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.ComplicationSlot(1),
+                    Color.RED,
+                    Color.BLUE
+                )
+            )
+        val renderParameters3b =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.ComplicationSlot(1),
+                    Color.RED,
+                    Color.BLUE
+                )
+            )
+        val renderParameters3c =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.ComplicationSlot(2),
+                    Color.RED,
+                    Color.BLUE
+                )
+            )
 
-        val renderParameters2a = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-1")),
-                Color.RED,
-                Color.BLACK
+        val renderParameters4a =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplicationSlots,
+                    Color.RED,
+                    Color.BLUE
+                )
             )
-        )
-        val renderParameters2b = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-1")),
-                Color.RED,
-                Color.BLACK
+        val renderParameters4b =
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplicationSlots,
+                    Color.RED,
+                    Color.BLUE
+                )
             )
-        )
-        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.ComplicationSlot(1),
-                Color.RED,
-                Color.BLUE
-            )
-        )
-        val renderParameters3b = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.ComplicationSlot(1),
-                Color.RED,
-                Color.BLUE
-            )
-        )
-        val renderParameters3c = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.ComplicationSlot(2),
-                Color.RED,
-                Color.BLUE
-            )
-        )
-
-        val renderParameters4a = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.AllComplicationSlots,
-                Color.RED,
-                Color.BLUE
-            )
-        )
-        val renderParameters4b = RenderParameters(
-            DrawMode.INTERACTIVE,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            RenderParameters.HighlightLayer(
-                RenderParameters.HighlightedElement.AllComplicationSlots,
-                Color.RED,
-                Color.BLUE
-            )
-        )
 
         assertThat(renderParameters1a).isEqualTo(renderParameters1a)
         assertThat(renderParameters1a).isEqualTo(renderParameters1b)
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
index 5ab6d6e..fa8a2c8 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
@@ -37,20 +37,21 @@
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
+import java.time.ZoneId
+import java.time.ZonedDateTime
 import org.junit.runners.model.FrameworkMethod
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.internal.bytecode.InstrumentationConfiguration
-import java.time.ZoneId
-import java.time.ZonedDateTime
 
 internal class TestWatchFaceService(
     @WatchFaceType private val watchFaceType: Int,
     private val complicationSlots: List<ComplicationSlot>,
-    private val rendererFactory: suspend (
-        surfaceHolder: SurfaceHolder,
-        currentUserStyleRepository: CurrentUserStyleRepository,
-        watchState: WatchState,
-    ) -> Renderer,
+    private val rendererFactory:
+        suspend (
+            surfaceHolder: SurfaceHolder,
+            currentUserStyleRepository: CurrentUserStyleRepository,
+            watchState: WatchState,
+        ) -> Renderer,
     private val userStyleSchema: UserStyleSchema,
     private val watchState: MutableWatchState?,
     private val handler: Handler,
@@ -130,9 +131,7 @@
     ): WatchFace {
         renderer = rendererFactory(surfaceHolder, currentUserStyleRepository, watchState)
         val watchFace = WatchFace(watchFaceType, renderer!!)
-        tapListener?.let {
-            watchFace.setTapListener(it)
-        }
+        tapListener?.let { watchFace.setTapListener(it) }
         return watchFace
     }
 
@@ -146,10 +145,7 @@
 
     override fun getChoreographer() = choreographer
 
-    override fun readDirectBootPrefs(
-        context: Context,
-        fileName: String
-    ) = directBootParams
+    override fun readDirectBootPrefs(context: Context, fileName: String) = directBootParams
 
     override fun writeDirectBootPrefs(
         context: Context,
@@ -170,11 +166,12 @@
         complicationCache?.set(fileName, byteArray)
     }
 
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = mockSystemTimeMillis
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = mockSystemTimeMillis
 
-        override fun getSystemTimeZoneId() = mockZoneId
-    }
+            override fun getSystemTimeZoneId() = mockZoneId
+        }
 }
 
 /**
@@ -198,9 +195,7 @@
         provider: ComponentName,
         type: Int
     ) {
-        iWatchFaceService.setDefaultComplicationProvider(
-            watchFaceComplicationId, provider, type
-        )
+        iWatchFaceService.setDefaultComplicationProvider(watchFaceComplicationId, provider, type)
     }
 
     override fun setDefaultSystemComplicationProvider(
@@ -209,7 +204,9 @@
         type: Int
     ) {
         iWatchFaceService.setDefaultSystemComplicationProvider(
-            watchFaceComplicationId, systemProvider, type
+            watchFaceComplicationId,
+            systemProvider,
+            type
         )
     }
 
@@ -228,7 +225,10 @@
         type: Int
     ) {
         iWatchFaceService.setDefaultComplicationProviderWithFallbacks(
-            watchFaceComplicationId, providers, fallbackSystemProvider, type
+            watchFaceComplicationId,
+            providers,
+            fallbackSystemProvider,
+            type
         )
     }
 
@@ -243,28 +243,24 @@
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
     interactiveFrameRateMs: Long
-) : Renderer.CanvasRenderer(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    CanvasType.HARDWARE,
-    interactiveFrameRateMs
-) {
+) :
+    Renderer.CanvasRenderer(
+        surfaceHolder,
+        currentUserStyleRepository,
+        watchState,
+        CanvasType.HARDWARE,
+        interactiveFrameRateMs
+    ) {
     public var lastOnDrawZonedDateTime: ZonedDateTime? = null
     public var lastRenderWasForScreenshot: Boolean? = null
     public val renderParametersScreenshotFlags = mutableListOf<Boolean>()
 
-    override fun render(
-        canvas: Canvas,
-        bounds: Rect,
-        zonedDateTime: ZonedDateTime
-    ) {
+    override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
         lastOnDrawZonedDateTime = zonedDateTime
         lastRenderWasForScreenshot = renderParameters.isForScreenshot
     }
 
-    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-    }
+    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {}
 
     public override fun onRenderParametersChanged(renderParameters: RenderParameters) {
         renderParametersScreenshotFlags.add(renderParameters.isForScreenshot)
@@ -278,12 +274,7 @@
     watchState: WatchState,
     interactiveFrameRateMs: Long,
     public var animate: Boolean = true
-) : TestRenderer(
-    surfaceHolder,
-    currentUserStyleRepository,
-    watchState,
-    interactiveFrameRateMs
-) {
+) : TestRenderer(surfaceHolder, currentUserStyleRepository, watchState, interactiveFrameRateMs) {
     override fun shouldAnimate(): Boolean = animate
 }
 
@@ -297,11 +288,11 @@
                 Intent("Fake intent"),
                 PendingIntent.FLAG_IMMUTABLE
             )
-        ).build().toApiComplicationData()
+        )
+        .build()
+        .toApiComplicationData()
 
-/**
- * We need to prevent roboloetric from instrumenting our classes or things break...
- */
+/** We need to prevent roboloetric from instrumenting our classes or things break... */
 public class WatchFaceTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration =
         InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index a90f3c4..60f2a91 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -16,9 +16,8 @@
 
 package androidx.wear.watchface
 
-import android.support.wearable.complications.ComplicationData as WireComplicationData
-import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.annotation.SuppressLint
+import android.app.KeyguardManager
 import android.app.NotificationManager
 import android.app.PendingIntent
 import android.content.ComponentName
@@ -38,6 +37,8 @@
 import android.os.Looper
 import android.os.Parcel
 import android.provider.Settings
+import android.support.wearable.complications.ComplicationData as WireComplicationData
+import android.support.wearable.complications.ComplicationText as WireComplicationText
 import android.support.wearable.watchface.Constants
 import android.support.wearable.watchface.IWatchFaceService
 import android.support.wearable.watchface.WatchFaceStyle
@@ -166,17 +167,18 @@
     private val surfaceHolder = mock<SurfaceHolder>()
     private val surface = mock<Surface>()
     private val tapListener = mock<WatchFace.TapListener>()
-    private val mainThreadPriorityDelegate = object : WatchFaceService.MainThreadPriorityDelegate {
-        var priority = Priority.Unset
+    private val mainThreadPriorityDelegate =
+        object : WatchFaceService.MainThreadPriorityDelegate {
+            var priority = Priority.Unset
 
-        override fun setNormalPriority() {
-            priority = Priority.Normal
-        }
+            override fun setNormalPriority() {
+                priority = Priority.Normal
+            }
 
-        override fun setInteractivePriority() {
-            priority = Priority.Interactive
+            override fun setInteractivePriority() {
+                priority = Priority.Interactive
+            }
         }
-    }
 
     private val watchState = MutableWatchState()
 
@@ -208,47 +210,42 @@
 
     private val colorStyleList = listOf(redStyleOption, greenStyleOption, blueStyleOption)
 
-    private val colorStyleSetting = ListUserStyleSetting(
-        UserStyleSetting.Id("color_style_setting"),
-        "Colors",
-        "Watchface colorization", /* icon = */
-        null,
-        colorStyleList,
-        listOf(WatchFaceLayer.BASE)
-    )
+    private val colorStyleSetting =
+        ListUserStyleSetting(
+            UserStyleSetting.Id("color_style_setting"),
+            "Colors",
+            "Watchface colorization",
+            /* icon = */ null,
+            colorStyleList,
+            listOf(WatchFaceLayer.BASE)
+        )
 
-    private val classicStyleOption = ListUserStyleSetting.ListOption(
-        Option.Id("classic_style"),
-        "Classic",
-        "Classic",
-        icon = null
-    )
+    private val classicStyleOption =
+        ListUserStyleSetting.ListOption(
+            Option.Id("classic_style"),
+            "Classic",
+            "Classic",
+            icon = null
+        )
 
-    private val modernStyleOption = ListUserStyleSetting.ListOption(
-        Option.Id("modern_style"),
-        "Modern",
-        "Modern",
-        icon = null
-    )
+    private val modernStyleOption =
+        ListUserStyleSetting.ListOption(Option.Id("modern_style"), "Modern", "Modern", icon = null)
 
-    private val gothicStyleOption = ListUserStyleSetting.ListOption(
-        Option.Id("gothic_style"),
-        "Gothic",
-        "Gothic",
-        icon = null
-    )
+    private val gothicStyleOption =
+        ListUserStyleSetting.ListOption(Option.Id("gothic_style"), "Gothic", "Gothic", icon = null)
 
     private val watchHandStyleList =
         listOf(classicStyleOption, modernStyleOption, gothicStyleOption)
 
-    private val watchHandStyleSetting = ListUserStyleSetting(
-        UserStyleSetting.Id("hand_style_setting"),
-        "Hand Style",
-        "Hand visual look", /* icon = */
-        null,
-        watchHandStyleList,
-        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
-    )
+    private val watchHandStyleSetting =
+        ListUserStyleSetting(
+            UserStyleSetting.Id("hand_style_setting"),
+            "Hand Style",
+            "Hand visual look",
+            /* icon = */ null,
+            watchHandStyleList,
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+        )
 
     private val badStyleOption =
         ListUserStyleSetting.ListOption(Option.Id("bad_option"), "Bad", "Bad", icon = null)
@@ -256,53 +253,47 @@
     @Suppress("DEPRECATION") // setDefaultDataSourceType
     private val leftComplication =
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            LEFT_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(
-                    complicationDrawableLeft,
-                    watchState,
-                    listener
+                LEFT_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
+                ComplicationSlotBounds(
+                    bounds = RectF(0.2f, 0.4f, 0.4f, 0.6f),
+                    margins = RectF(0.1f, 0.1f, 0.1f, 0.1f)
                 )
-            },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-            ComplicationSlotBounds(
-                bounds = RectF(0.2f, 0.4f, 0.4f, 0.6f),
-                margins = RectF(0.1f, 0.1f, 0.1f, 0.1f)
             )
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+            .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
     @Suppress("DEPRECATION") // setDefaultDataSourceType
     private val rightComplication =
         ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            RIGHT_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(
-                    complicationDrawableRight,
-                    watchState,
-                    listener
+                RIGHT_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(complicationDrawableRight, watchState, listener)
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
+                ComplicationSlotBounds(
+                    bounds = RectF(0.6f, 0.4f, 0.8f, 0.6f),
+                    margins = RectF(0.1f, 0.1f, 0.1f, 0.1f)
                 )
-            },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-            ComplicationSlotBounds(
-                bounds = RectF(0.6f, 0.4f, 0.8f, 0.6f),
-                margins = RectF(0.1f, 0.1f, 0.1f, 0.1f)
             )
-        ).setDefaultDataSourceType(ComplicationType.LONG_TEXT)
+            .setDefaultDataSourceType(ComplicationType.LONG_TEXT)
             .build()
 
     private val edgeComplicationHitTester = mock<ComplicationTapFilter>()
@@ -310,135 +301,123 @@
     @Suppress("DEPRECATION") // setDefaultDataSourceType
     private val edgeComplication =
         ComplicationSlot.createEdgeComplicationSlotBuilder(
-            EDGE_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(
-                    complicationDrawableEdge,
-                    watchState,
-                    listener
-                )
-            },
-            listOf(
-                ComplicationType.RANGED_VALUE,
-                ComplicationType.LONG_TEXT,
-                ComplicationType.SHORT_TEXT,
-                ComplicationType.MONOCHROMATIC_IMAGE,
-                ComplicationType.SMALL_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-            ComplicationSlotBounds(RectF(0.0f, 0.4f, 0.4f, 0.6f)),
-            edgeComplicationHitTester
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                EDGE_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(complicationDrawableEdge, watchState, listener)
+                },
+                listOf(
+                    ComplicationType.RANGED_VALUE,
+                    ComplicationType.LONG_TEXT,
+                    ComplicationType.SHORT_TEXT,
+                    ComplicationType.MONOCHROMATIC_IMAGE,
+                    ComplicationType.SMALL_IMAGE
+                ),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
+                ComplicationSlotBounds(RectF(0.0f, 0.4f, 0.4f, 0.6f)),
+                edgeComplicationHitTester
+            )
+            .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
     @OptIn(ComplicationExperimental::class)
     @Suppress("DEPRECATION") // setDefaultDataSourceType
     private val edgeComplicationWithBoundingArc =
         ComplicationSlot.createEdgeComplicationSlotBuilder(
-            EDGE_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(
-                    complicationDrawableEdge,
-                    watchState,
-                    listener
-                )
-            },
-            listOf(ComplicationType.SHORT_TEXT),
-            DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-            ComplicationSlotBounds(RectF(0.0f, 0.0f, 1f, 1f)),
-            BoundingArc(-45f, 90f, 0.1f)
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                EDGE_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(complicationDrawableEdge, watchState, listener)
+                },
+                listOf(ComplicationType.SHORT_TEXT),
+                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
+                ComplicationSlotBounds(RectF(0.0f, 0.0f, 1f, 1f)),
+                BoundingArc(-45f, 90f, 0.1f)
+            )
+            .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
     @Suppress("DEPRECATION") // setDefaultDataSourceType
     private val backgroundComplication =
         ComplicationSlot.createBackgroundComplicationSlotBuilder(
-            BACKGROUND_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(
-                    complicationDrawableBackground,
-                    watchState,
-                    listener
-                )
-            },
-            listOf(
-                ComplicationType.PHOTO_IMAGE
-            ),
-            DefaultComplicationDataSourcePolicy()
-        ).setDefaultDataSourceType(ComplicationType.PHOTO_IMAGE)
+                BACKGROUND_COMPLICATION_ID,
+                { watchState, listener ->
+                    CanvasComplicationDrawable(complicationDrawableBackground, watchState, listener)
+                },
+                listOf(ComplicationType.PHOTO_IMAGE),
+                DefaultComplicationDataSourcePolicy()
+            )
+            .setDefaultDataSourceType(ComplicationType.PHOTO_IMAGE)
             .build()
 
-    private val leftAndRightComplicationsOption = ComplicationSlotsOption(
-        Option.Id(LEFT_AND_RIGHT_COMPLICATIONS),
-        "Left and Right",
-        "Left and Right complications",
-        null,
-        // An empty list means use the initial config.
-        emptyList()
-    )
-    private val noComplicationsOption = ComplicationSlotsOption(
-        Option.Id(NO_COMPLICATIONS),
-        "None",
-        "No complications",
-        null,
-        listOf(
-            ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID)
-                .setEnabled(false).build(),
-            ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
-                .setEnabled(false).build()
+    private val leftAndRightComplicationsOption =
+        ComplicationSlotsOption(
+            Option.Id(LEFT_AND_RIGHT_COMPLICATIONS),
+            "Left and Right",
+            "Left and Right complications",
+            null,
+            // An empty list means use the initial config.
+            emptyList()
         )
-    )
-    private val leftOnlyComplicationsOption = ComplicationSlotsOption(
-        Option.Id(LEFT_COMPLICATION),
-        "Left",
-        "Left complication",
-        null,
-        listOf(
-            ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID)
-                .setEnabled(true).build(),
-            ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
-                .setEnabled(false).build()
+    private val noComplicationsOption =
+        ComplicationSlotsOption(
+            Option.Id(NO_COMPLICATIONS),
+            "None",
+            "No complications",
+            null,
+            listOf(
+                ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID).setEnabled(false).build(),
+                ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID).setEnabled(false).build()
+            )
         )
-    )
-    private val rightOnlyComplicationsOption = ComplicationSlotsOption(
-        Option.Id(RIGHT_COMPLICATION),
-        "Right",
-        "Right complication",
-        null,
-        listOf(
-            ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID)
-                .setEnabled(false).build(),
-            ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
-                .setEnabled(true)
-                .setNameResourceId(NAME_RESOURCE_ID)
-                .setScreenReaderNameResourceId(SCREEN_READER_NAME_RESOURCE_ID)
-                .build()
+    private val leftOnlyComplicationsOption =
+        ComplicationSlotsOption(
+            Option.Id(LEFT_COMPLICATION),
+            "Left",
+            "Left complication",
+            null,
+            listOf(
+                ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID).setEnabled(true).build(),
+                ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID).setEnabled(false).build()
+            )
         )
-    )
-    private val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-        UserStyleSetting.Id("complications_style_setting"),
-        "AllComplicationSlots",
-        "Number and position",
-        icon = null,
-        complicationConfig = listOf(
-            leftAndRightComplicationsOption,
-            noComplicationsOption,
-            leftOnlyComplicationsOption,
-            rightOnlyComplicationsOption
-        ),
-        affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-    )
-    private val complicationsStyleSetting2 = ComplicationSlotsUserStyleSetting(
-        UserStyleSetting.Id("complications_style_setting2"),
-        "AllComplicationSlots",
-        "Number and position",
-        icon = null,
-        complicationConfig = listOf(
-            leftOnlyComplicationsOption,
-            rightOnlyComplicationsOption
-        ),
-        affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-    )
+    private val rightOnlyComplicationsOption =
+        ComplicationSlotsOption(
+            Option.Id(RIGHT_COMPLICATION),
+            "Right",
+            "Right complication",
+            null,
+            listOf(
+                ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID).setEnabled(false).build(),
+                ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
+                    .setEnabled(true)
+                    .setNameResourceId(NAME_RESOURCE_ID)
+                    .setScreenReaderNameResourceId(SCREEN_READER_NAME_RESOURCE_ID)
+                    .build()
+            )
+        )
+    private val complicationsStyleSetting =
+        ComplicationSlotsUserStyleSetting(
+            UserStyleSetting.Id("complications_style_setting"),
+            "AllComplicationSlots",
+            "Number and position",
+            icon = null,
+            complicationConfig =
+                listOf(
+                    leftAndRightComplicationsOption,
+                    noComplicationsOption,
+                    leftOnlyComplicationsOption,
+                    rightOnlyComplicationsOption
+                ),
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+        )
+    private val complicationsStyleSetting2 =
+        ComplicationSlotsUserStyleSetting(
+            UserStyleSetting.Id("complications_style_setting2"),
+            "AllComplicationSlots",
+            "Number and position",
+            icon = null,
+            complicationConfig = listOf(leftOnlyComplicationsOption, rightOnlyComplicationsOption),
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+        )
 
     private lateinit var renderer: TestRenderer
     private lateinit var complicationSlotsManager: ComplicationSlotsManager
@@ -454,36 +433,35 @@
 
     private var looperTimeMillis = 0L
     private val pendingTasks = PriorityQueue<Task>()
-    private val choreographer = object : WatchFaceService.ChoreographerWrapper {
-        override fun postFrameCallback(callback: Choreographer.FrameCallback) {
-            // Simulate waiting for the next frame.
-            val nextFrameTimeMillis = looperTimeMillis + (16 - looperTimeMillis % 16)
-            pendingTasks.add(Task(nextFrameTimeMillis) { callback.doFrame(0) })
-        }
+    private val choreographer =
+        object : WatchFaceService.ChoreographerWrapper {
+            override fun postFrameCallback(callback: Choreographer.FrameCallback) {
+                // Simulate waiting for the next frame.
+                val nextFrameTimeMillis = looperTimeMillis + (16 - looperTimeMillis % 16)
+                pendingTasks.add(Task(nextFrameTimeMillis) { callback.doFrame(0) })
+            }
 
-        override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
-            // Remove task from the priority queue.  There's no good way of doing this quickly.
-            val queue = ArrayDeque<Task>()
-            while (pendingTasks.isNotEmpty()) {
-                val task = pendingTasks.remove()
-                if (task.runnable != callback) {
-                    queue.add(task)
+            override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
+                // Remove task from the priority queue.  There's no good way of doing this quickly.
+                val queue = ArrayDeque<Task>()
+                while (pendingTasks.isNotEmpty()) {
+                    val task = pendingTasks.remove()
+                    if (task.runnable != callback) {
+                        queue.add(task)
+                    }
+                }
+
+                // Push filtered tasks back on the queue.
+                while (queue.isNotEmpty()) {
+                    pendingTasks.add(queue.remove())
                 }
             }
-
-            // Push filtered tasks back on the queue.
-            while (queue.isNotEmpty()) {
-                pendingTasks.add(queue.remove())
-            }
         }
-    }
 
     private fun runPostedTasksFor(durationMillis: Long) {
         val stopTime = looperTimeMillis + durationMillis
 
-        while (pendingTasks.isNotEmpty() &&
-            pendingTasks.peek()!!.runTimeMillis <= stopTime
-        ) {
+        while (pendingTasks.isNotEmpty() && pendingTasks.peek()!!.runTimeMillis <= stopTime) {
             val task = pendingTasks.remove()
             testWatchFaceService.mockSystemTimeMillis = task.runTimeMillis
             looperTimeMillis = task.runTimeMillis
@@ -534,25 +512,27 @@
         tapListener: WatchFace.TapListener? = null,
         setInitialComplicationData: Boolean = true
     ) {
-        testWatchFaceService = TestWatchFaceService(
-            watchFaceType,
-            complicationSlots,
-            { _, currentUserStyleRepository, watchState ->
-                renderer = TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-                renderer
-            },
-            userStyleSchema,
-            watchState,
-            handler,
-            tapListener,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                watchFaceType,
+                complicationSlots,
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        TestRenderer(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            INTERACTIVE_UPDATE_RATE_MS
+                        )
+                    renderer
+                },
+                userStyleSchema,
+                watchState,
+                handler,
+                tapListener,
+                null,
+                choreographer
+            )
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
 
@@ -567,37 +547,41 @@
                                 .setShortText(WireComplicationText.plainText("Initial Short"))
                                 .setTapAction(
                                     PendingIntent.getActivity(
-                                        context, 0, Intent("ShortText"),
+                                        context,
+                                        0,
+                                        Intent("ShortText"),
                                         PendingIntent.FLAG_IMMUTABLE
                                     )
                                 )
                                 .build()
-
                         ComplicationType.LONG_TEXT ->
                             WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
                                 .setShortText(WireComplicationText.plainText("Initial Long"))
                                 .setTapAction(
                                     PendingIntent.getActivity(
-                                        context, 0, Intent("LongText"),
+                                        context,
+                                        0,
+                                        Intent("LongText"),
                                         PendingIntent.FLAG_IMMUTABLE
                                     )
                                 )
                                 .build()
-
                         ComplicationType.PHOTO_IMAGE ->
                             WireComplicationData.Builder(WireComplicationData.TYPE_LARGE_IMAGE)
                                 .setLargeImage(Icon.createWithContentUri("someuri"))
                                 .setTapAction(
                                     PendingIntent.getActivity(
-                                        context, 0, Intent("PhotoImage"),
+                                        context,
+                                        0,
+                                        Intent("PhotoImage"),
                                         PendingIntent.FLAG_IMMUTABLE
                                     )
                                 )
                                 .build()
-
-                        else -> throw UnsupportedOperationException(
-                            "Don't support type " + complication.defaultDataSourceType
-                        )
+                        else ->
+                            throw UnsupportedOperationException(
+                                "Don't support type " + complication.defaultDataSourceType
+                            )
                     }
                 )
             }
@@ -616,12 +600,7 @@
         wallpaperInteractiveWatchFaceInstanceParams: WallpaperInteractiveWatchFaceInstanceParams =
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -630,35 +609,36 @@
             ),
         complicationCache: MutableMap<String, ByteArray>? = null,
     ) {
-        testWatchFaceService = TestWatchFaceService(
-            watchFaceType,
-            complicationSlots,
-            { _, currentUserStyleRepository, watchState ->
-                renderer = TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-                renderer
-            },
-            userStyleSchema,
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer,
-            mockSystemTimeMillis = looperTimeMillis,
-            complicationCache = complicationCache
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                watchFaceType,
+                complicationSlots,
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        TestRenderer(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            INTERACTIVE_UPDATE_RATE_MS
+                        )
+                    renderer
+                },
+                userStyleSchema,
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer,
+                mockSystemTimeMillis = looperTimeMillis,
+                complicationCache = complicationCache
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     wallpaperInteractiveWatchFaceInstanceParams,
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -747,15 +727,17 @@
         `when`(handler.getLooper()).thenReturn(Looper.myLooper())
 
         // Capture tasks posted to mHandler and insert in mPendingTasks which is under our control.
-        doAnswer {
-            pendingTasks.add(Task(looperTimeMillis, it.arguments[0] as Runnable))
-        }.`when`(handler).post(any())
+        doAnswer { pendingTasks.add(Task(looperTimeMillis, it.arguments[0] as Runnable)) }
+            .`when`(handler)
+            .post(any())
 
         doAnswer {
-            pendingTasks.add(
-                Task(looperTimeMillis + it.arguments[1] as Long, it.arguments[0] as Runnable)
-            )
-        }.`when`(handler).postDelayed(any(), anyLong())
+                pendingTasks.add(
+                    Task(looperTimeMillis + it.arguments[1] as Long, it.arguments[0] as Runnable)
+                )
+            }
+            .`when`(handler)
+            .postDelayed(any(), anyLong())
     }
 
     @After
@@ -854,13 +836,15 @@
         watchState.isAmbient.value = false
         testWatchFaceService.mockSystemTimeMillis = 1000L
 
-        watchFaceImpl.broadcastsReceiver!!.receiver.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)
-            }
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .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)
+                }
+            )
 
         // Time should not diverge initially.
         watchFaceImpl.onDraw()
@@ -883,14 +867,16 @@
         watchState.isAmbient.value = false
         testWatchFaceService.mockSystemTimeMillis = 1000L
 
-        watchFaceImpl.broadcastsReceiver!!.receiver.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)
-                putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_WRAPPING_MAX_TIME, 2000L)
-            }
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .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)
+                    putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_WRAPPING_MAX_TIME, 2000L)
+                }
+            )
 
         // Time in millis observed by onDraw should wrap betwween 1000 and 2000.
         watchFaceImpl.onDraw()
@@ -995,29 +981,22 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun computeBounds_does_not_mutate_it() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication),
-            UserStyleSchema(emptyList())
-        )
+        initEngine(WatchFaceType.ANALOG, listOf(leftComplication), UserStyleSchema(emptyList()))
 
         val leftComplication = complicationSlotsManager[LEFT_COMPLICATION_ID]!!
-        val oldLeftBounds = RectF(
-            leftComplication.complicationSlotBounds.perComplicationTypeBounds[
-                leftComplication.complicationData.value.type
-            ]
-        )
+        val oldLeftBounds =
+            RectF(
+                leftComplication.complicationSlotBounds.perComplicationTypeBounds[
+                        leftComplication.complicationData.value.type]
+            )
 
-        leftComplication.computeBounds(
-            ONE_HUNDRED_BY_ONE_HUNDRED_RECT,
-            applyMargins = true
-        )
+        leftComplication.computeBounds(ONE_HUNDRED_BY_ONE_HUNDRED_RECT, applyMargins = true)
 
         assertThat(
-            leftComplication.complicationSlotBounds.perComplicationTypeBounds[
-                leftComplication.complicationData.value.type
-            ]
-        ).isEqualTo(oldLeftBounds)
+                leftComplication.complicationSlotBounds.perComplicationTypeBounds[
+                        leftComplication.complicationData.value.type]
+            )
+            .isEqualTo(oldLeftBounds)
     }
 
     @Test
@@ -1092,45 +1071,48 @@
     public fun lowestIdComplicationSelectedWhenMarginsOverlap() {
         val complication100 =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                100,
-                { watchState, listener ->
-                    CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-                },
-                emptyList(),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(
-                    RectF(0.1f, 0.1f, 0.2f, 0.2f),
-                    RectF(1f, 1f, 1f, 1f)
+                    100,
+                    { watchState, listener ->
+                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                    },
+                    emptyList(),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.1f, 0.1f, 0.2f, 0.2f), RectF(1f, 1f, 1f, 1f))
                 )
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT).build()
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                .build()
 
         val complication90 =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                90,
-                { watchState, listener ->
-                    CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-                },
-                emptyList(),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(
-                    RectF(0.3f, 0.1f, 0.4f, 0.2f),
-                    RectF(1f, 1f, 1f, 1f)
+                    90,
+                    { watchState, listener ->
+                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                    },
+                    emptyList(),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.3f, 0.1f, 0.4f, 0.2f), RectF(1f, 1f, 1f, 1f))
                 )
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT).build()
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                .build()
 
         val complication80 =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                80,
-                { watchState, listener ->
-                    CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-                },
-                emptyList(),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(
-                    RectF(0.4f, 0.1f, 0.5f, 0.2f),
-                    RectF(1f, 1f, 1f, 1f)
+                    80,
+                    { watchState, listener ->
+                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                    },
+                    emptyList(),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.4f, 0.1f, 0.5f, 0.2f), RectF(1f, 1f, 1f, 1f))
                 )
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT).build()
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                .build()
 
         initEngine(
             WatchFaceType.ANALOG,
@@ -1138,8 +1120,7 @@
             UserStyleSchema(emptyList())
         )
 
-        assertThat(complicationSlotsManager.getComplicationSlotAt(90, 90))
-            .isEqualTo(complication80)
+        assertThat(complicationSlotsManager.getComplicationSlotAt(90, 90)).isEqualTo(complication80)
     }
 
     @Test
@@ -1198,14 +1179,15 @@
             .isNull()
 
         `when`(
-            edgeComplicationHitTester.hitTest(
-                edgeComplication,
-                ONE_HUNDRED_BY_ONE_HUNDRED_RECT,
-                0,
-                50,
-                false
+                edgeComplicationHitTester.hitTest(
+                    edgeComplication,
+                    ONE_HUNDRED_BY_ONE_HUNDRED_RECT,
+                    0,
+                    50,
+                    false
+                )
             )
-        ).thenReturn(true)
+            .thenReturn(true)
 
         // Tap the edge complication.
         tapAt(0, 50)
@@ -1264,16 +1246,10 @@
         // Tap on nothing.
         tapAt(1, 1)
 
-        verify(tapListener).onTapEvent(
-            TapType.DOWN,
-            TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)),
-            null
-        )
-        verify(tapListener).onTapEvent(
-            TapType.UP,
-            TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)),
-            null
-        )
+        verify(tapListener)
+            .onTapEvent(TapType.DOWN, TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)), null)
+        verify(tapListener)
+            .onTapEvent(TapType.UP, TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)), null)
     }
 
     @Test
@@ -1315,16 +1291,14 @@
             false
         )
 
-        verify(tapListener).onTapEvent(
-            TapType.DOWN,
-            TapEvent(10, 200, Instant.ofEpochMilli(looperTimeMillis)),
-            null
-        )
-        verify(tapListener).onTapEvent(
-            TapType.UP,
-            TapEvent(10, 200, Instant.ofEpochMilli(looperTimeMillis)),
-            null
-        )
+        verify(tapListener)
+            .onTapEvent(
+                TapType.DOWN,
+                TapEvent(10, 200, Instant.ofEpochMilli(looperTimeMillis)),
+                null
+            )
+        verify(tapListener)
+            .onTapEvent(TapType.UP, TapEvent(10, 200, Instant.ofEpochMilli(looperTimeMillis)), null)
     }
 
     @Test
@@ -1340,16 +1314,18 @@
         // Tap right complication.
         tapAt(70, 50)
 
-        verify(tapListener).onTapEvent(
-            TapType.DOWN,
-            TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
-            rightComplication
-        )
-        verify(tapListener).onTapEvent(
-            TapType.UP,
-            TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
-            rightComplication
-        )
+        verify(tapListener)
+            .onTapEvent(
+                TapType.DOWN,
+                TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
+                rightComplication
+            )
+        verify(tapListener)
+            .onTapEvent(
+                TapType.UP,
+                TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
+                rightComplication
+            )
     }
 
     @Test
@@ -1361,27 +1337,22 @@
             UserStyleSchema(emptyList())
         )
 
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            INTERACTIVE_UPDATE_RATE_MS
-        )
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(INTERACTIVE_UPDATE_RATE_MS)
 
         // The delay should change when battery is low.
-        watchFaceImpl.broadcastsReceiver!!.receiver.onReceive(
-            context,
-            Intent(Intent.ACTION_BATTERY_LOW)
-        )
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .onReceive(context, Intent(Intent.ACTION_BATTERY_LOW))
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS)
 
         // And go back to normal when battery is OK.
-        watchFaceImpl.broadcastsReceiver!!.receiver.onReceive(
-            context,
-            Intent(Intent.ACTION_BATTERY_OKAY)
-        )
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            INTERACTIVE_UPDATE_RATE_MS
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .onReceive(context, Intent(Intent.ACTION_BATTERY_OKAY))
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(INTERACTIVE_UPDATE_RATE_MS)
     }
 
     @Test
@@ -1393,27 +1364,22 @@
             UserStyleSchema(emptyList())
         )
 
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            INTERACTIVE_UPDATE_RATE_MS
-        )
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(INTERACTIVE_UPDATE_RATE_MS)
 
         // The delay should change when battery is low.
-        watchFaceImpl.broadcastsReceiver!!.receiver.onReceive(
-            context,
-            Intent(Intent.ACTION_BATTERY_LOW)
-        )
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .onReceive(context, Intent(Intent.ACTION_BATTERY_LOW))
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS)
 
         // And go back to normal when power is connected.
-        watchFaceImpl.broadcastsReceiver!!.receiver.onReceive(
-            context,
-            Intent(Intent.ACTION_POWER_CONNECTED)
-        )
-        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH)).isEqualTo(
-            INTERACTIVE_UPDATE_RATE_MS
-        )
+        watchFaceImpl.broadcastsReceiver!!
+            .receiver
+            .onReceive(context, Intent(Intent.ACTION_POWER_CONNECTED))
+        assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0, Instant.EPOCH))
+            .isEqualTo(INTERACTIVE_UPDATE_RATE_MS)
     }
 
     @Test
@@ -1426,12 +1392,12 @@
         )
 
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = 0,
-                currentTimeMillis = 2,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = 0,
+                    currentTimeMillis = 2,
+                    Instant.EPOCH
+                )
             )
-        )
             .isEqualTo(INTERACTIVE_UPDATE_RATE_MS - 2)
     }
 
@@ -1446,12 +1412,13 @@
 
         // If the frame is very slow we'll want to post a choreographer frame immediately.
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = 2,
-                currentTimeMillis = INTERACTIVE_UPDATE_RATE_MS + 3,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = 2,
+                    currentTimeMillis = INTERACTIVE_UPDATE_RATE_MS + 3,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo(-1)
+            .isEqualTo(-1)
     }
 
     @Test
@@ -1467,12 +1434,13 @@
 
         // Simulate time going backwards between renders.
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = 20,
-                currentTimeMillis = 24,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = 20,
+                    currentTimeMillis = 24,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo(INTERACTIVE_UPDATE_RATE_MS - 4)
+            .isEqualTo(INTERACTIVE_UPDATE_RATE_MS - 4)
     }
 
     @Test
@@ -1489,12 +1457,13 @@
         // Simulate rendering 0.74s into a second, after which we expect a short delay.
         watchFaceImpl.nextDrawTimeMillis = 100740
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = 100740,
-                currentTimeMillis = 100750,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = 100740,
+                    currentTimeMillis = 100750,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo(250)
+            .isEqualTo(250)
     }
 
     @Test
@@ -1511,12 +1480,13 @@
         // Simulate rendering 0.74s into a second, after which we expect a short delay.
         watchFaceImpl.nextDrawTimeMillis = 10000
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = 10000,
-                currentTimeMillis = 10001,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = 10000,
+                    currentTimeMillis = 10001,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo(999)
+            .isEqualTo(999)
     }
 
     @Test
@@ -1533,12 +1503,13 @@
         // Simulate rendering 2s into a minute, after which we should delay till the next minute.
         watchFaceImpl.nextDrawTimeMillis = 60000 + 2000
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = watchFaceImpl.nextDrawTimeMillis,
-                currentTimeMillis = watchFaceImpl.nextDrawTimeMillis,
-                Instant.EPOCH
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = watchFaceImpl.nextDrawTimeMillis,
+                    currentTimeMillis = watchFaceImpl.nextDrawTimeMillis,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo(58000) // NB 58000 + 2000 == 60000
+            .isEqualTo(58000) // NB 58000 + 2000 == 60000
     }
 
     @Test
@@ -1555,12 +1526,16 @@
                 IdAndComplicationDataWireFormat(
                     LEFT_COMPLICATION_ID,
                     ShortTextComplicationData.Builder(
-                        TimeDifferenceComplicationText.Builder(
-                            TimeDifferenceStyle.STOPWATCH,
-                            CountUpTimeReference(Instant.parse("2022-10-30T10:15:30.001Z"))
-                        ).setMinimumTimeUnit(TimeUnit.MINUTES).build(),
-                        ComplicationText.EMPTY
-                    ).build().asWireComplicationData()
+                            TimeDifferenceComplicationText.Builder(
+                                    TimeDifferenceStyle.STOPWATCH,
+                                    CountUpTimeReference(Instant.parse("2022-10-30T10:15:30.001Z"))
+                                )
+                                .setMinimumTimeUnit(TimeUnit.MINUTES)
+                                .build(),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
+                        .asWireComplicationData()
                 )
             )
         )
@@ -1571,12 +1546,13 @@
         // but the complication needs an update in 50s so our delay is shorter.
         watchFaceImpl.nextDrawTimeMillis = 60000 + 2000
         assertThat(
-            watchFaceImpl.computeDelayTillNextFrame(
-                startTimeMillis = watchFaceImpl.nextDrawTimeMillis,
-                currentTimeMillis = watchFaceImpl.nextDrawTimeMillis,
-                Instant.EPOCH.plusSeconds(10)
+                watchFaceImpl.computeDelayTillNextFrame(
+                    startTimeMillis = watchFaceImpl.nextDrawTimeMillis,
+                    currentTimeMillis = watchFaceImpl.nextDrawTimeMillis,
+                    Instant.EPOCH.plusSeconds(10)
+                )
             )
-        ).isEqualTo(50001)
+            .isEqualTo(50001)
     }
 
     @Test
@@ -1599,12 +1575,16 @@
                 IdAndComplicationDataWireFormat(
                     LEFT_COMPLICATION_ID,
                     ShortTextComplicationData.Builder(
-                        TimeDifferenceComplicationText.Builder(
-                            TimeDifferenceStyle.STOPWATCH,
-                            CountUpTimeReference(referenceInstant)
-                        ).setMinimumTimeUnit(TimeUnit.HOURS).build(),
-                        ComplicationText.EMPTY
-                    ).build().asWireComplicationData()
+                            TimeDifferenceComplicationText.Builder(
+                                    TimeDifferenceStyle.STOPWATCH,
+                                    CountUpTimeReference(referenceInstant)
+                                )
+                                .setMinimumTimeUnit(TimeUnit.HOURS)
+                                .build(),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
+                        .asWireComplicationData()
                 )
             )
         )
@@ -1620,12 +1600,16 @@
                 IdAndComplicationDataWireFormat(
                     RIGHT_COMPLICATION_ID,
                     ShortTextComplicationData.Builder(
-                        TimeDifferenceComplicationText.Builder(
-                            TimeDifferenceStyle.STOPWATCH,
-                            CountUpTimeReference(referenceInstant)
-                        ).setMinimumTimeUnit(TimeUnit.SECONDS).build(),
-                        ComplicationText.EMPTY
-                    ).build().asWireComplicationData()
+                            TimeDifferenceComplicationText.Builder(
+                                    TimeDifferenceStyle.STOPWATCH,
+                                    CountUpTimeReference(referenceInstant)
+                                )
+                                .setMinimumTimeUnit(TimeUnit.SECONDS)
+                                .build(),
+                            ComplicationText.EMPTY
+                        )
+                        .build()
+                        .asWireComplicationData()
                 )
             )
         )
@@ -1675,9 +1659,8 @@
             listOf(leftComplication, backgroundComplication),
             UserStyleSchema(emptyList())
         )
-        assertThat(complicationSlotsManager.getBackgroundComplicationSlot()!!.id).isEqualTo(
-            BACKGROUND_COMPLICATION_ID
-        )
+        assertThat(complicationSlotsManager.getBackgroundComplicationSlot()!!.id)
+            .isEqualTo(BACKGROUND_COMPLICATION_ID)
     }
 
     @Test
@@ -1706,24 +1689,25 @@
         // Flush pending tasks posted as a result of initEngine.
         runPostedTasksFor(0)
 
-        val service2 = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        val service2 =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         // Trigger watch face creation.
         val engine2 = service2.onCreateEngine() as WatchFaceService.EngineWrapper
@@ -1734,13 +1718,9 @@
         val watchFaceImpl2 = engine2.getWatchFaceImplOrNull()!!
         val userStyleRepository2 = watchFaceImpl2.currentUserStyleRepository
         assertThat(userStyleRepository2.userStyle.value[colorStyleSetting]!!.id)
-            .isEqualTo(
-                blueStyleOption.id
-            )
+            .isEqualTo(blueStyleOption.id)
         assertThat(userStyleRepository2.userStyle.value[watchHandStyleSetting]!!.id)
-            .isEqualTo(
-                gothicStyleOption.id
-            )
+            .isEqualTo(gothicStyleOption.id)
     }
 
     @Test
@@ -1753,12 +1733,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -1783,19 +1758,15 @@
             UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(
-                    hashMapOf(
-                        colorStyleSetting to blueStyleOption,
-                        watchHandStyleSetting to gothicStyleOption
+                        hashMapOf(
+                            colorStyleSetting to blueStyleOption,
+                            watchHandStyleSetting to gothicStyleOption
+                        )
                     )
-                ).toWireFormat(),
+                    .toWireFormat(),
                 null,
                 null,
                 null
@@ -1804,13 +1775,9 @@
 
         // The style option above should get applied during watch face creation.
         assertThat(currentUserStyleRepository.userStyle.value[colorStyleSetting]!!.id)
-            .isEqualTo(
-                blueStyleOption.id
-            )
+            .isEqualTo(blueStyleOption.id)
         assertThat(currentUserStyleRepository.userStyle.value[watchHandStyleSetting]!!.id)
-            .isEqualTo(
-                gothicStyleOption.id
-            )
+            .isEqualTo(gothicStyleOption.id)
     }
 
     @Test
@@ -1822,12 +1789,7 @@
             UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(mapOf(watchHandStyleSetting to badStyleOption)).toWireFormat(),
                 null,
@@ -1843,14 +1805,7 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun wear2ImmutablePropertiesSetCorrectly() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            UserStyleSchema(emptyList()),
-            2,
-            true,
-            false
-        )
+        initEngine(WatchFaceType.ANALOG, emptyList(), UserStyleSchema(emptyList()), 2, true, false)
 
         assertTrue(watchState.hasLowBitAmbient)
         assertFalse(watchState.hasBurnInProtection)
@@ -1859,14 +1814,7 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun wear2ImmutablePropertiesSetCorrectly2() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            UserStyleSchema(emptyList()),
-            2,
-            false,
-            true
-        )
+        initEngine(WatchFaceType.ANALOG, emptyList(), UserStyleSchema(emptyList()), 2, false, true)
 
         assertFalse(watchState.hasLowBitAmbient)
         assertTrue(watchState.hasBurnInProtection)
@@ -1881,12 +1829,7 @@
             UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    true,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(true, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(mapOf(watchHandStyleSetting to badStyleOption)).toWireFormat(),
                 null,
@@ -1930,10 +1873,11 @@
             UserStyleSchema(emptyList())
         )
 
-        verify(iWatchFaceService).setActiveComplications(
-            intArrayOf(LEFT_COMPLICATION_ID, RIGHT_COMPLICATION_ID, BACKGROUND_COMPLICATION_ID),
-            true
-        )
+        verify(iWatchFaceService)
+            .setActiveComplications(
+                intArrayOf(LEFT_COMPLICATION_ID, RIGHT_COMPLICATION_ID, BACKGROUND_COMPLICATION_ID),
+                true
+            )
     }
 
     @Test
@@ -1962,11 +1906,7 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun onCreate_calls_setContentDescriptionLabels_withCorrectArgs_noComplications() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            UserStyleSchema(emptyList())
-        )
+        initEngine(WatchFaceType.ANALOG, emptyList(), UserStyleSchema(emptyList()))
 
         runPostedTasksFor(0)
 
@@ -1999,12 +1939,10 @@
         runPostedTasksFor(0)
 
         assertThat(engineWrapper.contentDescriptionLabels.size).isEqualTo(2)
-        assertThat(engineWrapper.contentDescriptionLabels[0].bounds).isEqualTo(
-            Rect(25, 25, 75, 75)
-        ) // Clock element.
-        assertThat(engineWrapper.contentDescriptionLabels[1].bounds).isEqualTo(
-            Rect(60, 40, 80, 60)
-        ) // Right complication.
+        assertThat(engineWrapper.contentDescriptionLabels[0].bounds)
+            .isEqualTo(Rect(25, 25, 75, 75)) // Clock element.
+        assertThat(engineWrapper.contentDescriptionLabels[1].bounds)
+            .isEqualTo(Rect(60, 40, 80, 60)) // Right complication.
     }
 
     @Test
@@ -2025,79 +1963,59 @@
         val complicationDetails =
             complicationSlotsManager.getComplicationsState(renderer.screenBounds)
         assertThat(complicationDetails[0].id).isEqualTo(LEFT_COMPLICATION_ID)
-        assertThat(complicationDetails[0].complicationState.boundsType).isEqualTo(
-            ComplicationSlotBoundsType.ROUND_RECT
-        )
-        assertThat(complicationDetails[0].complicationState.bounds).isEqualTo(
-            Rect(30, 30, 50, 50)
-        )
+        assertThat(complicationDetails[0].complicationState.boundsType)
+            .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        assertThat(complicationDetails[0].complicationState.bounds).isEqualTo(Rect(30, 30, 50, 50))
 
         assertThat(complicationDetails[1].id).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(complicationDetails[1].complicationState.boundsType).isEqualTo(
-            ComplicationSlotBoundsType.ROUND_RECT
-        )
-        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(
-            Rect(70, 75, 90, 95)
-        )
+        assertThat(complicationDetails[1].complicationState.boundsType)
+            .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(Rect(70, 75, 90, 95))
 
         // 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(
-                30,
-                30,
-                50,
-                50
-            )
-        ) // Left complication.
-        assertThat(contentDescriptionLabels[2].bounds).isEqualTo(
-            Rect(
-                70,
-                75,
-                90,
-                95
-            )
-        ) // Right complication.
+        assertThat(contentDescriptionLabels[0].bounds)
+            .isEqualTo(Rect(25, 25, 75, 75)) // Clock element.
+        assertThat(contentDescriptionLabels[1].bounds)
+            .isEqualTo(Rect(30, 30, 50, 50)) // Left complication.
+        assertThat(contentDescriptionLabels[2].bounds)
+            .isEqualTo(Rect(70, 75, 90, 95)) // Right complication.
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun styleChangesAccessibilityTraversalIndex() {
-        val rightAndSelectComplicationsOption = ComplicationSlotsOption(
-            Option.Id(RIGHT_AND_LEFT_COMPLICATIONS),
-            "Right and Left",
-            "Right and Left complications",
-            null,
-            listOf(
-                ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID)
-                    .setEnabled(true).setAccessibilityTraversalIndex(RIGHT_COMPLICATION_ID).build(),
-                ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
-                    .setEnabled(true).setAccessibilityTraversalIndex(LEFT_COMPLICATION_ID).build()
+        val rightAndSelectComplicationsOption =
+            ComplicationSlotsOption(
+                Option.Id(RIGHT_AND_LEFT_COMPLICATIONS),
+                "Right and Left",
+                "Right and Left complications",
+                null,
+                listOf(
+                    ComplicationSlotOverlay.Builder(LEFT_COMPLICATION_ID)
+                        .setEnabled(true)
+                        .setAccessibilityTraversalIndex(RIGHT_COMPLICATION_ID)
+                        .build(),
+                    ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
+                        .setEnabled(true)
+                        .setAccessibilityTraversalIndex(LEFT_COMPLICATION_ID)
+                        .build()
+                )
             )
-        )
 
-        val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "AllComplicationSlots",
-            "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                leftAndRightComplicationsOption,
-                rightAndSelectComplicationsOption
-            ),
-            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+        val complicationsStyleSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "AllComplicationSlots",
+                "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(leftAndRightComplicationsOption, rightAndSelectComplicationsOption),
+                affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         initEngine(
             WatchFaceType.ANALOG,
@@ -2111,74 +2029,38 @@
         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.
+        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
         watchFaceImpl.currentUserStyleRepository.updateUserStyle(
-            watchFaceImpl.currentUserStyleRepository.userStyle.value.toMutableUserStyle().apply {
-                this[complicationsStyleSetting] = rightAndSelectComplicationsOption
-            }.toUserStyle()
+            watchFaceImpl.currentUserStyleRepository.userStyle.value
+                .toMutableUserStyle()
+                .apply { this[complicationsStyleSetting] = rightAndSelectComplicationsOption }
+                .toUserStyle()
         )
         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.
+        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)).isEqualTo(redStyleOption)
-        assertThat(colorStyleSetting.getOptionForId(greenStyleOption.id)).isEqualTo(
-            greenStyleOption
-        )
+        assertThat(colorStyleSetting.getOptionForId(greenStyleOption.id))
+            .isEqualTo(greenStyleOption)
         assertThat(colorStyleSetting.getOptionForId(blueStyleOption.id)).isEqualTo(blueStyleOption)
 
         // For unknown option names the first element in the list should be returned.
@@ -2212,24 +2094,25 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun requestStyleBeforeSetBinder() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication, backgroundComplication),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                listOf(leftComplication, rightComplication, backgroundComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
         `when`(surfaceHolder.surfaceFrame).thenReturn(ONE_HUNDRED_BY_ONE_HUNDRED_RECT)
@@ -2253,30 +2136,33 @@
     public fun defaultComplicationDataSourcesWithFallbacks_newApi() {
         val dataSource1 = ComponentName("com.app1", "com.app1.App1")
         val dataSource2 = ComponentName("com.app2", "com.app2.App2")
-        val complication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            LEFT_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-            },
-            emptyList(),
-            DefaultComplicationDataSourcePolicy(
-                dataSource1,
-                dataSource2,
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
-            ),
-            ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
-            .build()
+        val complication =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    LEFT_COMPLICATION_ID,
+                    { watchState, listener ->
+                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                    },
+                    emptyList(),
+                    DefaultComplicationDataSourcePolicy(
+                        dataSource1,
+                        dataSource2,
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                .build()
         initEngine(WatchFaceType.ANALOG, listOf(complication), UserStyleSchema(emptyList()))
 
         runPostedTasksFor(0)
 
-        verify(iWatchFaceService).setDefaultComplicationProviderWithFallbacks(
-            LEFT_COMPLICATION_ID,
-            listOf(dataSource1, dataSource2),
-            SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
-            WireComplicationData.TYPE_SHORT_TEXT
-        )
+        verify(iWatchFaceService)
+            .setDefaultComplicationProviderWithFallbacks(
+                LEFT_COMPLICATION_ID,
+                listOf(dataSource1, dataSource2),
+                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                WireComplicationData.TYPE_SHORT_TEXT
+            )
     }
 
     @Suppress("DEPRECATION") // setDefaultDataSourceType
@@ -2285,20 +2171,22 @@
     public fun defaultComplicationDataSourcesWithFallbacks_oldApi() {
         val dataSource1 = ComponentName("com.app1", "com.app1.App1")
         val dataSource2 = ComponentName("com.app2", "com.app2.App2")
-        val complication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
-            LEFT_COMPLICATION_ID,
-            { watchState, listener ->
-                CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-            },
-            emptyList(),
-            DefaultComplicationDataSourcePolicy(
-                dataSource1,
-                dataSource2,
-                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
-            ),
-            ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-        ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
-            .build()
+        val complication =
+            ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                    LEFT_COMPLICATION_ID,
+                    { watchState, listener ->
+                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
+                    },
+                    emptyList(),
+                    DefaultComplicationDataSourcePolicy(
+                        dataSource1,
+                        dataSource2,
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                .build()
         initEngine(
             WatchFaceType.ANALOG,
             listOf(complication),
@@ -2308,41 +2196,50 @@
 
         runPostedTasksFor(0)
 
-        verify(iWatchFaceService).setDefaultComplicationProvider(
-            LEFT_COMPLICATION_ID, dataSource2, WireComplicationData.TYPE_SHORT_TEXT
-        )
-        verify(iWatchFaceService).setDefaultComplicationProvider(
-            LEFT_COMPLICATION_ID, dataSource1, WireComplicationData.TYPE_SHORT_TEXT
-        )
-        verify(iWatchFaceService).setDefaultSystemComplicationProvider(
-            LEFT_COMPLICATION_ID,
-            SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
-            WireComplicationData.TYPE_SHORT_TEXT
-        )
+        verify(iWatchFaceService)
+            .setDefaultComplicationProvider(
+                LEFT_COMPLICATION_ID,
+                dataSource2,
+                WireComplicationData.TYPE_SHORT_TEXT
+            )
+        verify(iWatchFaceService)
+            .setDefaultComplicationProvider(
+                LEFT_COMPLICATION_ID,
+                dataSource1,
+                WireComplicationData.TYPE_SHORT_TEXT
+            )
+        verify(iWatchFaceService)
+            .setDefaultSystemComplicationProvider(
+                LEFT_COMPLICATION_ID,
+                SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET,
+                WireComplicationData.TYPE_SHORT_TEXT
+            )
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun previewReferenceTimeMillisAnalog() {
-        val instanceParams = WallpaperInteractiveWatchFaceInstanceParams(
-            INTERACTIVE_INSTANCE_ID,
-            DeviceConfig(
-                false,
-                false,
-                1000,
-                2000,
-            ),
-            WatchUiState(false, 0),
-            UserStyle(
-                hashMapOf(
-                    colorStyleSetting to blueStyleOption,
-                    watchHandStyleSetting to gothicStyleOption
-                )
-            ).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val instanceParams =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(
+                    false,
+                    false,
+                    1000,
+                    2000,
+                ),
+                WatchUiState(false, 0),
+                UserStyle(
+                        hashMapOf(
+                            colorStyleSetting to blueStyleOption,
+                            watchHandStyleSetting to gothicStyleOption
+                        )
+                    )
+                    .toWireFormat(),
+                null,
+                null,
+                null
+            )
 
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
@@ -2357,25 +2254,27 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun previewReferenceTimeMillisDigital() {
-        val instanceParams = WallpaperInteractiveWatchFaceInstanceParams(
-            INTERACTIVE_INSTANCE_ID,
-            DeviceConfig(
-                false,
-                false,
-                1000,
-                2000,
-            ),
-            WatchUiState(false, 0),
-            UserStyle(
-                hashMapOf(
-                    colorStyleSetting to blueStyleOption,
-                    watchHandStyleSetting to gothicStyleOption
-                )
-            ).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val instanceParams =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(
+                    false,
+                    false,
+                    1000,
+                    2000,
+                ),
+                WatchUiState(false, 0),
+                UserStyle(
+                        hashMapOf(
+                            colorStyleSetting to blueStyleOption,
+                            watchHandStyleSetting to gothicStyleOption
+                        )
+                    )
+                    .toWireFormat(),
+                null,
+                null,
+                null
+            )
 
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.DIGITAL,
@@ -2400,112 +2299,106 @@
         val complicationDetails =
             complicationSlotsManager.getComplicationsState(renderer.screenBounds)
         assertThat(complicationDetails[0].id).isEqualTo(LEFT_COMPLICATION_ID)
-        assertThat(complicationDetails[0].complicationState.boundsType).isEqualTo(
-            ComplicationSlotBoundsType.ROUND_RECT
-        )
-        assertThat(complicationDetails[0].complicationState.bounds).isEqualTo(
-            Rect(20, 40, 40, 60)
-        )
-        assertThat(complicationDetails[0].complicationState.supportedTypes).isEqualTo(
-            intArrayOf(
-                WireComplicationData.TYPE_RANGED_VALUE,
-                WireComplicationData.TYPE_LONG_TEXT,
-                WireComplicationData.TYPE_SHORT_TEXT,
-                WireComplicationData.TYPE_ICON,
-                WireComplicationData.TYPE_SMALL_IMAGE
+        assertThat(complicationDetails[0].complicationState.boundsType)
+            .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        assertThat(complicationDetails[0].complicationState.bounds).isEqualTo(Rect(20, 40, 40, 60))
+        assertThat(complicationDetails[0].complicationState.supportedTypes)
+            .isEqualTo(
+                intArrayOf(
+                    WireComplicationData.TYPE_RANGED_VALUE,
+                    WireComplicationData.TYPE_LONG_TEXT,
+                    WireComplicationData.TYPE_SHORT_TEXT,
+                    WireComplicationData.TYPE_ICON,
+                    WireComplicationData.TYPE_SMALL_IMAGE
+                )
             )
-        )
 
         assertThat(complicationDetails[1].id).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(complicationDetails[1].complicationState.boundsType).isEqualTo(
-            ComplicationSlotBoundsType.ROUND_RECT
-        )
-        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(
-            Rect(60, 40, 80, 60)
-        )
-        assertThat(complicationDetails[1].complicationState.supportedTypes).isEqualTo(
-            intArrayOf(
-                WireComplicationData.TYPE_RANGED_VALUE,
-                WireComplicationData.TYPE_LONG_TEXT,
-                WireComplicationData.TYPE_SHORT_TEXT,
-                WireComplicationData.TYPE_ICON,
-                WireComplicationData.TYPE_SMALL_IMAGE
+        assertThat(complicationDetails[1].complicationState.boundsType)
+            .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
+        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(Rect(60, 40, 80, 60))
+        assertThat(complicationDetails[1].complicationState.supportedTypes)
+            .isEqualTo(
+                intArrayOf(
+                    WireComplicationData.TYPE_RANGED_VALUE,
+                    WireComplicationData.TYPE_LONG_TEXT,
+                    WireComplicationData.TYPE_SHORT_TEXT,
+                    WireComplicationData.TYPE_ICON,
+                    WireComplicationData.TYPE_SMALL_IMAGE
+                )
             )
-        )
 
         assertThat(complicationDetails[2].id).isEqualTo(BACKGROUND_COMPLICATION_ID)
-        assertThat(complicationDetails[2].complicationState.boundsType).isEqualTo(
-            ComplicationSlotBoundsType.BACKGROUND
-        )
-        assertThat(complicationDetails[2].complicationState.bounds).isEqualTo(
-            Rect(0, 0, 100, 100)
-        )
-        assertThat(complicationDetails[2].complicationState.supportedTypes).isEqualTo(
-            intArrayOf(WireComplicationData.TYPE_LARGE_IMAGE)
-        )
+        assertThat(complicationDetails[2].complicationState.boundsType)
+            .isEqualTo(ComplicationSlotBoundsType.BACKGROUND)
+        assertThat(complicationDetails[2].complicationState.bounds).isEqualTo(Rect(0, 0, 100, 100))
+        assertThat(complicationDetails[2].complicationState.supportedTypes)
+            .isEqualTo(intArrayOf(WireComplicationData.TYPE_LARGE_IMAGE))
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun getComplicationDetails_early_init_with_styleOverrides() {
-        val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "AllComplicationSlots",
-            "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                leftAndRightComplicationsOption, // The default value which should be applied.
-                leftOnlyComplicationsOption
-            ),
-            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+        val complicationsStyleSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "AllComplicationSlots",
+                "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(
+                        leftAndRightComplicationsOption, // The default value which should be
+                        // applied.
+                        leftOnlyComplicationsOption
+                    ),
+                affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         val schema = UserStyleSchema(listOf(complicationsStyleSetting))
         val initDeferred = CompletableDeferred<Unit>()
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            listOf(leftComplication, rightComplication),
-            { _, currentUserStyleRepository, watchState ->
-                // Prevent initialization until initDeferred completes.
-                initDeferred.awaitWithTimeout()
-                renderer = TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-                renderer
-            },
-            schema,
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                listOf(leftComplication, rightComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    // Prevent initialization until initDeferred completes.
+                    initDeferred.awaitWithTimeout()
+                    renderer =
+                        TestRenderer(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            INTERACTIVE_UPDATE_RATE_MS
+                        )
+                    renderer
+                },
+                schema,
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
-                        schema.getDefaultUserStyle().toMutableUserStyle().apply {
-                            set(complicationsStyleSetting, leftOnlyComplicationsOption)
-                        }.toUserStyle().toWireFormat(),
+                        schema
+                            .getDefaultUserStyle()
+                            .toMutableUserStyle()
+                            .apply { set(complicationsStyleSetting, leftOnlyComplicationsOption) }
+                            .toUserStyle()
+                            .toWireFormat(),
                         emptyList(),
                         null,
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -2524,9 +2417,11 @@
             engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
             engineWrapper.onCreate(surfaceHolder)
             engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
-            val complicationDetails = interactiveWatchFaceInstance.complicationDetails.associateBy(
-                { it.id }, { it.complicationState }
-            )
+            val complicationDetails =
+                interactiveWatchFaceInstance.complicationDetails.associateBy(
+                    { it.id },
+                    { it.complicationState }
+                )
             assertThat(complicationDetails[LEFT_COMPLICATION_ID]!!.isEnabled).isEqualTo(true)
             assertThat(complicationDetails[RIGHT_COMPLICATION_ID]!!.isEnabled).isEqualTo(false)
         } finally {
@@ -2539,25 +2434,27 @@
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun shouldAnimateOverrideControlsEnteringAmbientMode() {
         lateinit var testRenderer: TestRendererWithShouldAnimate
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                testRenderer = TestRendererWithShouldAnimate(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-                testRenderer
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    testRenderer =
+                        TestRendererWithShouldAnimate(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            INTERACTIVE_UPDATE_RATE_MS
+                        )
+                    testRenderer
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
@@ -2657,10 +2554,7 @@
         assertFalse(leftComplication.enabled)
         assertTrue(rightComplication.enabled)
         assertEquals(rightComplication.nameResourceId, NAME_RESOURCE_ID)
-        assertEquals(
-            rightComplication.screenReaderNameResourceId,
-            SCREEN_READER_NAME_RESOURCE_ID
-        )
+        assertEquals(rightComplication.screenReaderNameResourceId, SCREEN_READER_NAME_RESOURCE_ID)
 
         // Select both complicationSlots.
         val mutableUserStyleC = currentUserStyleRepository.userStyle.value.toMutableUserStyle()
@@ -2676,17 +2570,19 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun partialComplicationOverrideAppliedToInitialStyle() {
-        val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "AllComplicationSlots",
-            "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                leftOnlyComplicationsOption, // The default value which should be applied.
-                leftAndRightComplicationsOption,
-            ),
-            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+        val complicationsStyleSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "AllComplicationSlots",
+                "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(
+                        leftOnlyComplicationsOption, // The default value which should be applied.
+                        leftAndRightComplicationsOption,
+                    ),
+                affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         initEngine(
             WatchFaceType.DIGITAL,
@@ -2704,75 +2600,85 @@
         val complicationSlotId1 = 101
         val complicationSlotId2 = 102
 
-        val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("ID"),
-            "",
-            "",
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsOption(
-                    Option.Id("one"),
-                    "one",
-                    "one",
-                    null,
+        val complicationsStyleSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("ID"),
+                "",
+                "",
+                icon = null,
+                complicationConfig =
                     listOf(
-                        ComplicationSlotOverlay(
-                            complicationSlotId1,
-                            enabled = true
+                        ComplicationSlotsOption(
+                            Option.Id("one"),
+                            "one",
+                            "one",
+                            null,
+                            listOf(
+                                ComplicationSlotOverlay(complicationSlotId1, enabled = true),
+                            )
                         ),
-                    )
-                ),
-                ComplicationSlotsOption(
-                    Option.Id("two"),
-                    "two",
-                    "two",
-                    null,
-                    listOf(
-                        ComplicationSlotOverlay(
-                            complicationSlotId2,
-                            enabled = true
-                        ),
-                    )
-                )
-            ),
-            listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+                        ComplicationSlotsOption(
+                            Option.Id("two"),
+                            "two",
+                            "two",
+                            null,
+                            listOf(
+                                ComplicationSlotOverlay(complicationSlotId2, enabled = true),
+                            )
+                        )
+                    ),
+                listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         val currentUserStyleRepository =
             CurrentUserStyleRepository(UserStyleSchema(listOf(complicationsStyleSetting)))
 
-        val manager = ComplicationSlotsManager(
-            listOf(
-                ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                    complicationSlotId1,
-                    { watchState, listener ->
-                        CanvasComplicationDrawable(complicationDrawableLeft, watchState, listener)
-                    },
-                    listOf(
-                        ComplicationType.RANGED_VALUE,
-                    ),
-                    DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-                    ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
-                ).setDefaultDataSourceType(ComplicationType.RANGED_VALUE)
-                    .setEnabled(false)
-                    .build(),
-
-                ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                    complicationSlotId2,
-                    { watchState, listener ->
-                        CanvasComplicationDrawable(complicationDrawableRight, watchState, listener)
-                    },
-                    listOf(
-                        ComplicationType.LONG_TEXT,
-                    ),
-                    DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-                    ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
-                ).setDefaultDataSourceType(ComplicationType.LONG_TEXT)
-                    .setEnabled(false)
-                    .build()
-            ),
-            currentUserStyleRepository
-        )
+        val manager =
+            ComplicationSlotsManager(
+                listOf(
+                    ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                            complicationSlotId1,
+                            { watchState, listener ->
+                                CanvasComplicationDrawable(
+                                    complicationDrawableLeft,
+                                    watchState,
+                                    listener
+                                )
+                            },
+                            listOf(
+                                ComplicationType.RANGED_VALUE,
+                            ),
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK
+                            ),
+                            ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
+                        )
+                        .setDefaultDataSourceType(ComplicationType.RANGED_VALUE)
+                        .setEnabled(false)
+                        .build(),
+                    ComplicationSlot.createRoundRectComplicationSlotBuilder(
+                            complicationSlotId2,
+                            { watchState, listener ->
+                                CanvasComplicationDrawable(
+                                    complicationDrawableRight,
+                                    watchState,
+                                    listener
+                                )
+                            },
+                            listOf(
+                                ComplicationType.LONG_TEXT,
+                            ),
+                            DefaultComplicationDataSourcePolicy(
+                                SystemDataSources.DATA_SOURCE_DAY_OF_WEEK
+                            ),
+                            ComplicationSlotBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
+                        )
+                        .setDefaultDataSourceType(ComplicationType.LONG_TEXT)
+                        .setEnabled(false)
+                        .build()
+                ),
+                currentUserStyleRepository
+            )
 
         // The init function of ComplicationSlotsManager should enable complicationSlotId1.
         assertThat(manager[complicationSlotId1]!!.enabled).isTrue()
@@ -2781,34 +2687,38 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.TIRAMISU])
     fun hierarchical_complicationsStyleSetting() {
-        val option1 = ListUserStyleSetting.ListOption(
-            Option.Id("1"),
-            displayName = "1",
-            screenReaderName = "1",
-            icon = null,
-            childSettings = listOf(complicationsStyleSetting)
-        )
-        val option2 = ListUserStyleSetting.ListOption(
-            Option.Id("2"),
-            displayName = "2",
-            screenReaderName = "2",
-            icon = null,
-            childSettings = listOf(complicationsStyleSetting2)
-        )
-        val option3 = ListUserStyleSetting.ListOption(
-            Option.Id("3"),
-            displayName = "3",
-            screenReaderName = "3",
-            icon = null
-        )
-        val choice = ListUserStyleSetting(
-            UserStyleSetting.Id("123"),
-            displayName = "123",
-            description = "123",
-            icon = null,
-            listOf(option1, option2, option3),
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS
-        )
+        val option1 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("1"),
+                displayName = "1",
+                screenReaderName = "1",
+                icon = null,
+                childSettings = listOf(complicationsStyleSetting)
+            )
+        val option2 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("2"),
+                displayName = "2",
+                screenReaderName = "2",
+                icon = null,
+                childSettings = listOf(complicationsStyleSetting2)
+            )
+        val option3 =
+            ListUserStyleSetting.ListOption(
+                Option.Id("3"),
+                displayName = "3",
+                screenReaderName = "3",
+                icon = null
+            )
+        val choice =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("123"),
+                displayName = "123",
+                description = "123",
+                icon = null,
+                listOf(option1, option2, option3),
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS
+            )
 
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.DIGITAL,
@@ -2816,12 +2726,7 @@
             UserStyleSchema(listOf(choice, complicationsStyleSetting, complicationsStyleSetting2)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -2877,12 +2782,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -2913,12 +2813,14 @@
                 IdAndComplicationDataWireFormat(
                     LEFT_COMPLICATION_ID,
                     WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
-                        .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT")).build()
+                        .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT"))
+                        .build()
                 ),
                 IdAndComplicationDataWireFormat(
                     RIGHT_COMPLICATION_ID,
                     WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT")).build()
+                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT"))
+                        .build()
                 )
             )
         )
@@ -2935,15 +2837,16 @@
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun complicationCache() {
         val complicationCache = HashMap<String, ByteArray>()
-        val instanceParams = WallpaperInteractiveWatchFaceInstanceParams(
-            INTERACTIVE_INSTANCE_ID,
-            DeviceConfig(false, false, 0, 0),
-            WatchUiState(false, 0),
-            UserStyle(emptyMap()).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val instanceParams =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
             listOf(leftComplication, rightComplication),
@@ -2967,7 +2870,9 @@
                         .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT"))
                         .setTapAction(
                             PendingIntent.getActivity(
-                                context, 0, Intent("LongText"),
+                                context,
+                                0,
+                                Intent("LongText"),
                                 PendingIntent.FLAG_IMMUTABLE
                             )
                         )
@@ -2976,7 +2881,8 @@
                 IdAndComplicationDataWireFormat(
                     RIGHT_COMPLICATION_ID,
                     WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT")).build()
+                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT"))
+                        .build()
                 )
             )
         )
@@ -2989,25 +2895,26 @@
         engineWrapper.onDestroy()
         InteractiveInstanceManager.releaseInstance(INTERACTIVE_INSTANCE_ID)
 
-        val service2 = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer,
-            complicationCache = complicationCache
-        )
+        val service2 =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                listOf(leftComplication, rightComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer,
+                complicationCache = complicationCache
+            )
 
         lateinit var instance2: IInteractiveWatchFace
         InteractiveInstanceManager
@@ -3015,8 +2922,7 @@
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     instanceParams,
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -3042,13 +2948,15 @@
 
             // Check the ComplicationData was cached.
             val leftComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    LEFT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
             val rightComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    RIGHT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
 
             assertThat(leftComplicationData.type).isEqualTo(WireComplicationData.TYPE_LONG_TEXT)
             assertThat(leftComplicationData.longText?.getTextAt(context.resources, 0))
@@ -3067,15 +2975,16 @@
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun complicationCachePolicy() {
         val complicationCache = HashMap<String, ByteArray>()
-        val instanceParams = WallpaperInteractiveWatchFaceInstanceParams(
-            INTERACTIVE_INSTANCE_ID,
-            DeviceConfig(false, false, 0, 0),
-            WatchUiState(false, 0),
-            UserStyle(emptyMap()).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val instanceParams =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
             listOf(leftComplication, rightComplication),
@@ -3093,7 +3002,9 @@
                         .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT"))
                         .setTapAction(
                             PendingIntent.getActivity(
-                                context, 0, Intent("LongText"),
+                                context,
+                                0,
+                                Intent("LongText"),
                                 PendingIntent.FLAG_IMMUTABLE
                             )
                         )
@@ -3103,7 +3014,8 @@
                 IdAndComplicationDataWireFormat(
                     RIGHT_COMPLICATION_ID,
                     WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT")).build()
+                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT"))
+                        .build()
                 )
             )
         )
@@ -3116,25 +3028,26 @@
         engineWrapper.onDestroy()
         InteractiveInstanceManager.releaseInstance(INTERACTIVE_INSTANCE_ID)
 
-        val service2 = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer,
-            complicationCache = complicationCache
-        )
+        val service2 =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                listOf(leftComplication, rightComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer,
+                complicationCache = complicationCache
+            )
 
         lateinit var instance2: IInteractiveWatchFace
         InteractiveInstanceManager
@@ -3142,8 +3055,7 @@
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     instanceParams,
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -3169,13 +3081,15 @@
 
             // Check only the right ComplicationData was cached.
             val leftComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    LEFT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
             val rightComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    RIGHT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
 
             assertThat(leftComplicationData.type).isEqualTo(WireComplicationData.TYPE_NO_DATA)
             assertThat(rightComplicationData.type).isEqualTo(WireComplicationData.TYPE_SHORT_TEXT)
@@ -3191,15 +3105,16 @@
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun complicationCache_timeline() {
         val complicationCache = HashMap<String, ByteArray>()
-        val instanceParams = WallpaperInteractiveWatchFaceInstanceParams(
-            INTERACTIVE_INSTANCE_ID,
-            DeviceConfig(false, false, 0, 0),
-            WatchUiState(false, 0),
-            UserStyle(emptyMap()).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val instanceParams =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
             listOf(leftComplication),
@@ -3212,12 +3127,14 @@
         assertThat(complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value.type)
             .isEqualTo(ComplicationType.NO_DATA)
 
-        val a = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("A"))
-            .build()
-        val b = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("B"))
-            .build()
+        val a =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("A"))
+                .build()
+        val b =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("B"))
+                .build()
         b.timelineStartEpochSecond = 1000
         b.timelineEndEpochSecond = Long.MAX_VALUE
         a.setTimelineEntryCollection(listOf(b))
@@ -3234,25 +3151,26 @@
 
         interactiveWatchFaceInstance.release()
 
-        val service2 = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer,
-            complicationCache = complicationCache
-        )
+        val service2 =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                listOf(leftComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer,
+                complicationCache = complicationCache
+            )
 
         lateinit var instance2: IInteractiveWatchFace
         InteractiveInstanceManager
@@ -3260,8 +3178,7 @@
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     instanceParams,
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -3291,9 +3208,10 @@
 
             // Check the ComplicationData was cached.
             var leftComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    LEFT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
 
             assertThat(leftComplicationData.type).isEqualTo(WireComplicationData.TYPE_SHORT_TEXT)
             assertThat(leftComplicationData.shortText?.getTextAt(context.resources, 0))
@@ -3304,9 +3222,10 @@
                 Instant.ofEpochSecond(1000)
             )
             leftComplicationData =
-                watchFaceImpl2.complicationSlotsManager[
-                    LEFT_COMPLICATION_ID
-                ]!!.complicationData.value.asWireComplicationData()
+                watchFaceImpl2.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+                    .asWireComplicationData()
 
             assertThat(leftComplicationData.type).isEqualTo(WireComplicationData.TYPE_SHORT_TEXT)
             assertThat(leftComplicationData.shortText?.getTextAt(context.resources, 0))
@@ -3327,53 +3246,56 @@
         )
 
         assertThat(
-            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
-        ).isInstanceOf(NoDataComplicationData::class.java)
+                watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+            )
+            .isInstanceOf(NoDataComplicationData::class.java)
         assertThat(
-            watchFaceImpl.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!.complicationData.value
-        ).isInstanceOf(NoDataComplicationData::class.java)
+                watchFaceImpl.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+            )
+            .isInstanceOf(NoDataComplicationData::class.java)
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     @RequiresApi(Build.VERSION_CODES.O_MR1)
     public fun headless_complicationsInitialized_with_EmptyComplicationData() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            WallpaperInteractiveWatchFaceInstanceParams(
-                "Headless",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                UserStyle(
-                    hashMapOf(
-                        colorStyleSetting to blueStyleOption,
-                        watchHandStyleSetting to gothicStyleOption
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                listOf(leftComplication, rightComplication),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
                     )
-                ).toWireFormat(),
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
                 null,
-                null,
-                null
-            ),
-            choreographer
-        )
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    "Headless",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyle(
+                            hashMapOf(
+                                colorStyleSetting to blueStyleOption,
+                                watchHandStyleSetting to gothicStyleOption
+                            )
+                        )
+                        .toWireFormat(),
+                    null,
+                    null,
+                    null
+                ),
+                choreographer
+            )
 
         engineWrapper =
             testWatchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
@@ -3390,16 +3312,20 @@
 
         // [WatchFaceService.createWatchFace] Will have run by now because we're using an immediate
         // coroutine dispatcher.
-        runBlocking {
-            watchFaceImpl = engineWrapper.deferredWatchFaceImpl.awaitWithTimeout()
-        }
+        runBlocking { watchFaceImpl = engineWrapper.deferredWatchFaceImpl.awaitWithTimeout() }
 
         assertThat(
-            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
-        ).isInstanceOf(EmptyComplicationData::class.java)
+                watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+            )
+            .isInstanceOf(EmptyComplicationData::class.java)
         assertThat(
-            watchFaceImpl.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!.complicationData.value
-        ).isInstanceOf(EmptyComplicationData::class.java)
+                watchFaceImpl.complicationSlotsManager[RIGHT_COMPLICATION_ID]!!
+                    .complicationData
+                    .value
+            )
+            .isInstanceOf(EmptyComplicationData::class.java)
     }
 
     @Test
@@ -3411,12 +3337,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3480,12 +3401,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3509,12 +3425,13 @@
 
     @Test
     public fun invalidateRendererBeforeFullInit() {
-        renderer = TestRenderer(
-            surfaceHolder,
-            CurrentUserStyleRepository(UserStyleSchema(emptyList())),
-            watchState.asWatchState(),
-            INTERACTIVE_UPDATE_RATE_MS
-        )
+        renderer =
+            TestRenderer(
+                surfaceHolder,
+                CurrentUserStyleRepository(UserStyleSchema(emptyList())),
+                watchState.asWatchState(),
+                INTERACTIVE_UPDATE_RATE_MS
+            )
 
         // This should not throw an exception.
         renderer.invalidate()
@@ -3529,12 +3446,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3558,12 +3470,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3595,12 +3502,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3646,24 +3548,25 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun isAmbientInitalisedEvenWithoutPropertiesSent() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
@@ -3684,12 +3587,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(true, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3731,12 +3629,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -3772,12 +3665,7 @@
             UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 instanceId,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(hashMapOf(colorStyleSetting to blueStyleOption)).toWireFormat(),
                 null,
@@ -3807,14 +3695,15 @@
         )
 
         val complication =
-            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value as
-                ShortTextComplicationData
+            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
+                as ShortTextComplicationData
         assertThat(
-            complication.text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                complication.text.getTextAt(
+                    ApplicationProvider.getApplicationContext<Context>().resources,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo("Override")
+            .isEqualTo("Override")
     }
 
     @Test
@@ -3827,12 +3716,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 instanceId,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 listOf(
@@ -3857,56 +3741,54 @@
         )
 
         val complication =
-            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value as
-                ShortTextComplicationData
+            watchFaceImpl.complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
+                as ShortTextComplicationData
         assertThat(
-            complication.text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                Instant.EPOCH
+                complication.text.getTextAt(
+                    ApplicationProvider.getApplicationContext<Context>().resources,
+                    Instant.EPOCH
+                )
             )
-        ).isEqualTo("INITIAL_VALUE")
+            .isEqualTo("INITIAL_VALUE")
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun directBoot() {
         val instanceId = "DirectBootInstance"
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
-            watchState,
-            handler,
-            null,
-            WallpaperInteractiveWatchFaceInstanceParams(
-                instanceId,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                UserStyle(
-                    hashMapOf(
-                        colorStyleSetting to blueStyleOption,
-                        watchHandStyleSetting to gothicStyleOption
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
                     )
-                ).toWireFormat(),
+                },
+                UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
+                watchState,
+                handler,
                 null,
-                null,
-                null
-            ),
-            choreographer
-        )
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    instanceId,
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyle(
+                            hashMapOf(
+                                colorStyleSetting to blueStyleOption,
+                                watchHandStyleSetting to gothicStyleOption
+                            )
+                        )
+                        .toWireFormat(),
+                    null,
+                    null,
+                    null
+                ),
+                choreographer
+            )
 
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
@@ -3927,42 +3809,39 @@
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun headlessFlagPreventsDirectBoot() {
         val instanceId = "DirectBootInstance"
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            WallpaperInteractiveWatchFaceInstanceParams(
-                instanceId,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                UserStyle(
-                    hashMapOf(
-                        colorStyleSetting to blueStyleOption,
-                        watchHandStyleSetting to gothicStyleOption
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
                     )
-                ).toWireFormat(),
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
                 null,
-                null,
-                null
-            ),
-            choreographer
-        )
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    instanceId,
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyle(
+                            hashMapOf(
+                                colorStyleSetting to blueStyleOption,
+                                watchHandStyleSetting to gothicStyleOption
+                            )
+                        )
+                        .toWireFormat(),
+                    null,
+                    null,
+                    null
+                ),
+                choreographer
+            )
 
         testWatchFaceService.createHeadlessEngine()
 
@@ -3982,12 +3861,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 instanceId,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 listOf(
@@ -4006,9 +3880,7 @@
         var numOfCalls = 0
 
         CoroutineScope(handler.asCoroutineDispatcher().immediate).launch {
-            watchState.isVisible.collect {
-                numOfCalls++
-            }
+            watchState.isVisible.collect { numOfCalls++ }
         }
 
         // The collect call will be triggered immediately to report the current value, so make
@@ -4030,35 +3902,39 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun complicationsUserStyleSetting_with_setComplicationBounds() {
-        val rightComplicationBoundsOption = ComplicationSlotsOption(
-            Option.Id(RIGHT_COMPLICATION),
-            "Right",
-            "Right",
-            null,
-            listOf(
-                ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
-                    .setComplicationSlotBounds(
-                        ComplicationSlotBounds(RectF(0.1f, 0.1f, 0.2f, 0.2f))
-                    ).build()
+        val rightComplicationBoundsOption =
+            ComplicationSlotsOption(
+                Option.Id(RIGHT_COMPLICATION),
+                "Right",
+                "Right",
+                null,
+                listOf(
+                    ComplicationSlotOverlay.Builder(RIGHT_COMPLICATION_ID)
+                        .setComplicationSlotBounds(
+                            ComplicationSlotBounds(RectF(0.1f, 0.1f, 0.2f, 0.2f))
+                        )
+                        .build()
+                )
             )
-        )
-        val complicationsStyleSetting = ComplicationSlotsUserStyleSetting(
-            UserStyleSetting.Id("complications_style_setting"),
-            "AllComplicationSlots",
-            "Number and position",
-            icon = null,
-            complicationConfig = listOf(
-                ComplicationSlotsOption(
-                    Option.Id("Default"),
-                    "Default",
-                    "Default",
-                    null,
-                    emptyList()
-                ),
-                rightComplicationBoundsOption
-            ),
-            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
-        )
+        val complicationsStyleSetting =
+            ComplicationSlotsUserStyleSetting(
+                UserStyleSetting.Id("complications_style_setting"),
+                "AllComplicationSlots",
+                "Number and position",
+                icon = null,
+                complicationConfig =
+                    listOf(
+                        ComplicationSlotsOption(
+                            Option.Id("Default"),
+                            "Default",
+                            "Default",
+                            null,
+                            emptyList()
+                        ),
+                        rightComplicationBoundsOption
+                    ),
+                affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+            )
 
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
@@ -4066,12 +3942,7 @@
             UserStyleSchema(listOf(complicationsStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 listOf(
@@ -4090,9 +3961,7 @@
         var complicationDetails =
             complicationSlotsManager.getComplicationsState(renderer.screenBounds)
         assertThat(complicationDetails[1].id).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(
-            Rect(60, 40, 80, 60)
-        )
+        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(Rect(60, 40, 80, 60))
 
         // Select a style which changes the bounds of the right complication.
         val mutableUserStyle = currentUserStyleRepository.userStyle.value.toMutableUserStyle()
@@ -4101,9 +3970,7 @@
 
         complicationDetails = complicationSlotsManager.getComplicationsState(renderer.screenBounds)
         assertThat(complicationDetails[1].id).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(
-            Rect(10, 10, 20, 20)
-        )
+        assertThat(complicationDetails[1].complicationState.bounds).isEqualTo(Rect(10, 10, 20, 20))
     }
 
     @Suppress("DEPRECATION") // DefaultComplicationDataSourcePolicyAndType
@@ -4113,27 +3980,31 @@
         val leftCanvasComplication = mock<CanvasComplication>()
         val leftComplication =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                LEFT_COMPLICATION_ID,
-                { _, _ -> leftCanvasComplication },
-                listOf(
-                    ComplicationType.SHORT_TEXT,
-                ),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                    LEFT_COMPLICATION_ID,
+                    { _, _ -> leftCanvasComplication },
+                    listOf(
+                        ComplicationType.SHORT_TEXT,
+                    ),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
                 .build()
 
         val rightCanvasComplication = mock<CanvasComplication>()
         val rightComplication =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                RIGHT_COMPLICATION_ID,
-                { _, _ -> rightCanvasComplication },
-                listOf(
-                    ComplicationType.SHORT_TEXT,
-                ),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DATE),
-                ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                    RIGHT_COMPLICATION_ID,
+                    { _, _ -> rightCanvasComplication },
+                    listOf(
+                        ComplicationType.SHORT_TEXT,
+                    ),
+                    DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DATE),
+                    ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
                 .build()
 
         initEngine(
@@ -4153,22 +4024,26 @@
         val sameCanvasComplication = mock<CanvasComplication>()
         val leftComplication =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                LEFT_COMPLICATION_ID,
-                { _, _ -> sameCanvasComplication },
-                listOf(ComplicationType.SHORT_TEXT),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-                ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                    LEFT_COMPLICATION_ID,
+                    { _, _ -> sameCanvasComplication },
+                    listOf(ComplicationType.SHORT_TEXT),
+                    DefaultComplicationDataSourcePolicy(
+                        SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET
+                    ),
+                    ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
                 .build()
 
         val rightComplication =
             ComplicationSlot.createRoundRectComplicationSlotBuilder(
-                RIGHT_COMPLICATION_ID,
-                { _, _ -> sameCanvasComplication },
-                listOf(ComplicationType.SHORT_TEXT),
-                DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DATE),
-                ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
-            ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
+                    RIGHT_COMPLICATION_ID,
+                    { _, _ -> sameCanvasComplication },
+                    listOf(ComplicationType.SHORT_TEXT),
+                    DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DATE),
+                    ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+                )
+                .setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
                 .build()
 
         // We don't want full init as in other tests with initEngine(), since
@@ -4190,54 +4065,51 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun additionalContentDescriptionLabelsSetBeforeWatchFaceInitComplete() {
-        val pendingIntent = PendingIntent.getActivity(
-            context, 0, Intent("Example"),
-            PendingIntent.FLAG_IMMUTABLE
-        )
+        val pendingIntent =
+            PendingIntent.getActivity(context, 0, Intent("Example"), PendingIntent.FLAG_IMMUTABLE)
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                renderer = TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-                // Set additionalContentDescriptionLabels before renderer.watchFaceHostApi has been
-                // set.
-                renderer.additionalContentDescriptionLabels = listOf(
-                    Pair(
-                        0,
-                        ContentDescriptionLabel(
-                            PlainComplicationText.Builder("Example").build(),
-                            Rect(10, 10, 20, 20),
-                            pendingIntent
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        TestRenderer(
+                            surfaceHolder,
+                            currentUserStyleRepository,
+                            watchState,
+                            INTERACTIVE_UPDATE_RATE_MS
                         )
-                    )
-                )
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+                    // Set additionalContentDescriptionLabels before renderer.watchFaceHostApi has
+                    // been
+                    // set.
+                    renderer.additionalContentDescriptionLabels =
+                        listOf(
+                            Pair(
+                                0,
+                                ContentDescriptionLabel(
+                                    PlainComplicationText.Builder("Example").build(),
+                                    Rect(10, 10, 20, 20),
+                                    pendingIntent
+                                )
+                            )
+                        )
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -4245,8 +4117,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -4268,11 +4139,11 @@
         // Check the additional ContentDescriptionLabel was applied.
         assertThat(engineWrapper.contentDescriptionLabels.size).isEqualTo(2)
         assertThat(
-            engineWrapper.contentDescriptionLabels[1].text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                0
+                engineWrapper.contentDescriptionLabels[1]
+                    .text
+                    .getTextAt(ApplicationProvider.getApplicationContext<Context>().resources, 0)
             )
-        ).isEqualTo("Example")
+            .isEqualTo("Example")
 
         assertThat(engineWrapper.contentDescriptionLabels[1].tapAction).isEqualTo(pendingIntent)
         engineWrapper.onDestroy()
@@ -4287,12 +4158,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 "TestID",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 emptyList(),
@@ -4319,12 +4185,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 "TestID",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 emptyList(),
@@ -4352,12 +4213,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 "TestID",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 emptyList(),
@@ -4367,14 +4223,10 @@
         )
 
         val interactiveInstance = InteractiveInstanceManager.getAndRetainInstance("TestID")
-        val leftPendingIntent = PendingIntent.getActivity(
-            context, 0, Intent("Left"),
-            PendingIntent.FLAG_IMMUTABLE
-        )
-        val rightPendingIntent = PendingIntent.getActivity(
-            context, 0, Intent("Left"),
-            PendingIntent.FLAG_IMMUTABLE
-        )
+        val leftPendingIntent =
+            PendingIntent.getActivity(context, 0, Intent("Left"), PendingIntent.FLAG_IMMUTABLE)
+        val rightPendingIntent =
+            PendingIntent.getActivity(context, 0, Intent("Left"), PendingIntent.FLAG_IMMUTABLE)
         interactiveInstance!!.updateComplicationData(
             mutableListOf(
                 IdAndComplicationDataWireFormat(
@@ -4396,18 +4248,18 @@
 
         assertThat(engineWrapper.contentDescriptionLabels.size).isEqualTo(3)
         assertThat(
-            engineWrapper.contentDescriptionLabels[1].text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                0
+                engineWrapper.contentDescriptionLabels[1]
+                    .text
+                    .getTextAt(ApplicationProvider.getApplicationContext<Context>().resources, 0)
             )
-        ).isEqualTo("LEFT!")
+            .isEqualTo("LEFT!")
         assertThat(engineWrapper.contentDescriptionLabels[1].tapAction).isEqualTo(leftPendingIntent)
         assertThat(
-            engineWrapper.contentDescriptionLabels[2].text.getTextAt(
-                ApplicationProvider.getApplicationContext<Context>().resources,
-                0
+                engineWrapper.contentDescriptionLabels[2]
+                    .text
+                    .getTextAt(ApplicationProvider.getApplicationContext<Context>().resources, 0)
             )
-        ).isEqualTo("RIGHT!")
+            .isEqualTo("RIGHT!")
         assertThat(engineWrapper.contentDescriptionLabels[2].tapAction)
             .isEqualTo(rightPendingIntent)
         interactiveInstance.release()
@@ -4416,22 +4268,24 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun schemaWithTooLargeIcon() {
-        val tooLargeIcon = Icon.createWithBitmap(
-            Bitmap.createBitmap(
-                WatchFaceService.MAX_REASONABLE_SCHEMA_ICON_WIDTH + 1,
-                WatchFaceService.MAX_REASONABLE_SCHEMA_ICON_HEIGHT + 1,
-                Bitmap.Config.ARGB_8888
+        val tooLargeIcon =
+            Icon.createWithBitmap(
+                Bitmap.createBitmap(
+                    WatchFaceService.MAX_REASONABLE_SCHEMA_ICON_WIDTH + 1,
+                    WatchFaceService.MAX_REASONABLE_SCHEMA_ICON_HEIGHT + 1,
+                    Bitmap.Config.ARGB_8888
+                )
             )
-        )
 
-        val settingWithTooLargeIcon = ListUserStyleSetting(
-            UserStyleSetting.Id("color_style_setting"),
-            "Colors",
-            "Watchface colorization", /* icon = */
-            tooLargeIcon,
-            colorStyleList,
-            listOf(WatchFaceLayer.BASE)
-        )
+        val settingWithTooLargeIcon =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("color_style_setting"),
+                "Colors",
+                "Watchface colorization",
+                /* icon = */ tooLargeIcon,
+                colorStyleList,
+                listOf(WatchFaceLayer.BASE)
+            )
 
         try {
             initWallpaperInteractiveWatchFaceInstance(
@@ -4440,19 +4294,15 @@
                 UserStyleSchema(listOf(settingWithTooLargeIcon, watchHandStyleSetting)),
                 WallpaperInteractiveWatchFaceInstanceParams(
                     INTERACTIVE_INSTANCE_ID,
-                    DeviceConfig(
-                        false,
-                        false,
-                        0,
-                        0
-                    ),
+                    DeviceConfig(false, false, 0, 0),
                     WatchUiState(false, 0),
                     UserStyle(
-                        hashMapOf(
-                            colorStyleSetting to blueStyleOption,
-                            watchHandStyleSetting to gothicStyleOption
+                            hashMapOf(
+                                colorStyleSetting to blueStyleOption,
+                                watchHandStyleSetting to gothicStyleOption
+                            )
                         )
-                    ).toWireFormat(),
+                        .toWireFormat(),
                     null,
                     null,
                     null
@@ -4461,10 +4311,11 @@
 
             fail("Should have thrown an exception due to an Icon that's too large")
         } catch (e: Exception) {
-            assertThat(e.message).contains(
-                "UserStyleSetting id color_style_setting has a 401 x 401 icon. This is too big, " +
-                    "the maximum size is 400 x 400."
-            )
+            assertThat(e.message)
+                .contains(
+                    "UserStyleSetting id color_style_setting has a 401 x 401 icon. " +
+                        "This is too big, the maximum size is 400 x 400."
+                )
         }
     }
 
@@ -4477,14 +4328,15 @@
                 ListUserStyleSetting.ListOption(Option.Id("id$i"), "Name", "Name", icon = null)
             )
         }
-        val tooLargeList = ListUserStyleSetting(
-            UserStyleSetting.Id("too_large"),
-            "Too large!",
-            "Description", /* icon = */
-            null,
-            longOptionsList,
-            listOf(WatchFaceLayer.BASE)
-        )
+        val tooLargeList =
+            ListUserStyleSetting(
+                UserStyleSetting.Id("too_large"),
+                "Too large!",
+                "Description",
+                /* icon = */ null,
+                longOptionsList,
+                listOf(WatchFaceLayer.BASE)
+            )
 
         try {
             initWallpaperInteractiveWatchFaceInstance(
@@ -4493,12 +4345,7 @@
                 UserStyleSchema(listOf(tooLargeList, watchHandStyleSetting)),
                 WallpaperInteractiveWatchFaceInstanceParams(
                     INTERACTIVE_INSTANCE_ID,
-                    DeviceConfig(
-                        false,
-                        false,
-                        0,
-                        0
-                    ),
+                    DeviceConfig(false, false, 0, 0),
                     WatchUiState(false, 0),
                     UserStyle(hashMapOf(watchHandStyleSetting to gothicStyleOption)).toWireFormat(),
                     null,
@@ -4509,10 +4356,11 @@
 
             fail("Should have thrown an exception due to an Icon that's too large")
         } catch (e: Exception) {
-            assertThat(e.message).contains(
-                "The estimated wire size of the supplied UserStyleSchemas for watch face " +
-                    "androidx.wear.watchface.test is too big"
-            )
+            assertThat(e.message)
+                .contains(
+                    "The estimated wire size of the supplied UserStyleSchemas for watch face " +
+                        "androidx.wear.watchface.test is too big"
+                )
         }
     }
 
@@ -4525,12 +4373,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 "TestID",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 emptyList(),
@@ -4571,69 +4414,73 @@
         val eventLog = ArrayList<String>()
         var renderer: Renderer
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                @Suppress("DEPRECATION")
-                renderer = object : Renderer.GlesRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    init {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " TestRenderer created")
-                    }
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    @Suppress("DEPRECATION")
+                    renderer =
+                        object :
+                            Renderer.GlesRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            init {
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer created"
+                                )
+                            }
 
-                    override suspend fun onBackgroundThreadGlContextCreated() {
-                        eventLog.add(
-                            watchState.watchFaceInstanceId.value +
-                                " onBackgroundThreadGlContextCreated"
-                        )
-                    }
+                            override suspend fun onBackgroundThreadGlContextCreated() {
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value +
+                                        " onBackgroundThreadGlContextCreated"
+                                )
+                            }
 
-                    override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
-                        eventLog.add(
-                            watchState.watchFaceInstanceId.value + " onUiThreadGlSurfaceCreated"
-                        )
-                    }
+                            override suspend fun onUiThreadGlSurfaceCreated(
+                                width: Int,
+                                height: Int
+                            ) {
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value +
+                                        " onUiThreadGlSurfaceCreated"
+                                )
+                            }
 
-                    override fun onDestroy() {
-                        super.onDestroy()
-                        eventLog.add(
-                            watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
-                        )
-                    }
+                            override fun onDestroy() {
+                                super.onDestroy()
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
+                                )
+                            }
 
-                    override fun render(zonedDateTime: ZonedDateTime) {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " render")
-                    }
+                            override fun render(zonedDateTime: ZonedDateTime) {
+                                eventLog.add(watchState.watchFaceInstanceId.value + " render")
+                            }
 
-                    override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {}
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {}
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -4641,8 +4488,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -4677,20 +4523,22 @@
         headlessEngineWrapper.onDestroy()
         engineWrapper.onDestroy()
 
-        assertThat(eventLog).containsExactly(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX +
-                "Interactive onBackgroundThreadGlContextCreated",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive onUiThreadGlSurfaceCreated",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless onBackgroundThreadGlContextCreated",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless onUiThreadGlSurfaceCreated",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy"
-        )
+        assertThat(eventLog)
+            .containsExactly(
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX +
+                    "Interactive onBackgroundThreadGlContextCreated",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive onUiThreadGlSurfaceCreated",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX +
+                    "Headless onBackgroundThreadGlContextCreated",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless onUiThreadGlSurfaceCreated",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy"
+            )
     }
 
     @Test
@@ -4706,74 +4554,74 @@
             }
         }
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                renderer = object : Renderer.CanvasRenderer2<TestSharedAssets>(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.HARDWARE,
-                    INTERACTIVE_UPDATE_RATE_MS,
-                    clearWithBackgroundTintBeforeRenderingHighlightLayer = false
-                ) {
-                    init {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " TestRenderer created")
-                    }
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        object :
+                            Renderer.CanvasRenderer2<TestSharedAssets>(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                CanvasType.HARDWARE,
+                                INTERACTIVE_UPDATE_RATE_MS,
+                                clearWithBackgroundTintBeforeRenderingHighlightLayer = false
+                            ) {
+                            init {
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer created"
+                                )
+                            }
 
-                    override suspend fun createSharedAssets(): TestSharedAssets {
-                        eventLog.add("createAssets")
-                        return TestSharedAssets()
-                    }
+                            override suspend fun createSharedAssets(): TestSharedAssets {
+                                eventLog.add("createAssets")
+                                return TestSharedAssets()
+                            }
 
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime,
-                        sharedAssets: TestSharedAssets
-                    ) {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " render")
-                    }
+                            override fun render(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime,
+                                sharedAssets: TestSharedAssets
+                            ) {
+                                eventLog.add(watchState.watchFaceInstanceId.value + " render")
+                            }
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime,
-                        sharedAssets: TestSharedAssets
-                    ) {
-                        // NOP
-                    }
+                            override fun renderHighlightLayer(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime,
+                                sharedAssets: TestSharedAssets
+                            ) {
+                                // NOP
+                            }
 
-                    override fun onDestroy() {
-                        super.onDestroy()
-                        eventLog.add(
-                            watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
-                        )
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun onDestroy() {
+                                super.onDestroy()
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
+                                )
+                            }
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -4781,8 +4629,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -4818,17 +4665,18 @@
         interactiveWatchFaceInstance.release()
         engineWrapper.onDestroy()
 
-        assertThat(eventLog).containsExactly(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
-            "createAssets",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy",
-            "SharedAssets onDestroy"
-        )
+        assertThat(eventLog)
+            .containsExactly(
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
+                "createAssets",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy",
+                "SharedAssets onDestroy"
+            )
     }
 
     @Test
@@ -4844,68 +4692,68 @@
             }
         }
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                renderer = object : Renderer.GlesRenderer2<TestSharedAssets>(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    init {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " TestRenderer created")
-                    }
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        object :
+                            Renderer.GlesRenderer2<TestSharedAssets>(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            init {
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer created"
+                                )
+                            }
 
-                    override suspend fun createSharedAssets(): TestSharedAssets {
-                        eventLog.add("createAssets")
-                        return TestSharedAssets()
-                    }
+                            override suspend fun createSharedAssets(): TestSharedAssets {
+                                eventLog.add("createAssets")
+                                return TestSharedAssets()
+                            }
 
-                    override fun onDestroy() {
-                        super.onDestroy()
-                        eventLog.add(
-                            watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
-                        )
-                    }
+                            override fun onDestroy() {
+                                super.onDestroy()
+                                eventLog.add(
+                                    watchState.watchFaceInstanceId.value + " TestRenderer onDestroy"
+                                )
+                            }
 
-                    override fun render(
-                        zonedDateTime: ZonedDateTime,
-                        sharedAssets: TestSharedAssets
-                    ) {
-                        eventLog.add(watchState.watchFaceInstanceId.value + " render")
-                    }
+                            override fun render(
+                                zonedDateTime: ZonedDateTime,
+                                sharedAssets: TestSharedAssets
+                            ) {
+                                eventLog.add(watchState.watchFaceInstanceId.value + " render")
+                            }
 
-                    override fun renderHighlightLayer(
-                        zonedDateTime: ZonedDateTime,
-                        sharedAssets: TestSharedAssets
-                    ) {
-                        // NOP
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(
+                                zonedDateTime: ZonedDateTime,
+                                sharedAssets: TestSharedAssets
+                            ) {
+                                // NOP
+                            }
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -4913,8 +4761,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -4950,17 +4797,18 @@
         interactiveWatchFaceInstance.release()
         engineWrapper.onDestroy()
 
-        assertThat(eventLog).containsExactly(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
-            "createAssets",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy",
-            "SharedAssets onDestroy"
-        )
+        assertThat(eventLog)
+            .containsExactly(
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer created",
+                "createAssets",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer created",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless render",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Headless TestRenderer onDestroy",
+                SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive TestRenderer onDestroy",
+                "SharedAssets onDestroy"
+            )
     }
 
     @Test
@@ -4968,48 +4816,46 @@
     public fun renderer_onDestroy_called_even_if_init_not_complete() {
         val initDeferred = CompletableDeferred<Unit>()
         var onDestroyCalled = false
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                renderer = object : TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    // Prevent initialization until initDeferred completes.
-                    override suspend fun init() {
-                        super.init()
-                        initDeferred.awaitWithTimeout()
-                    }
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    renderer =
+                        object :
+                            TestRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            // Prevent initialization until initDeferred completes.
+                            override suspend fun init() {
+                                super.init()
+                                initDeferred.awaitWithTimeout()
+                            }
 
-                    override fun onDestroy() {
-                        super.onDestroy()
-                        onDestroyCalled = true
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+                            override fun onDestroy() {
+                                super.onDestroy()
+                                onDestroyCalled = true
+                            }
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5017,8 +4863,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -5056,12 +4901,7 @@
             UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
             WallpaperInteractiveWatchFaceInstanceParams(
                 "TestID",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 emptyList(),
@@ -5083,14 +4923,17 @@
         assertThat(dump).contains("lastDrawTimeMillis=1000")
         assertThat(dump).contains("nextDrawTimeMillis=1016")
         assertThat(dump).contains("isHeadless=false")
-        assertThat(dump).contains(
-            "currentUserStyleRepository.userStyle=UserStyle[color_style_setting -> red_style, " +
-                "hand_style_setting -> classic_style]"
-        )
-        assertThat(dump).contains(
-            "currentUserStyleRepository.schema=[{color_style_setting : red_style, green_style, " +
-                "blue_style}, {hand_style_setting : classic_style, modern_style, gothic_style}]"
-        )
+        assertThat(dump)
+            .contains(
+                "currentUserStyleRepository.userStyle=UserStyle[" +
+                    "color_style_setting -> red_style, hand_style_setting -> classic_style]"
+            )
+        assertThat(dump)
+            .contains(
+                "currentUserStyleRepository.schema=[" +
+                    "{color_style_setting : red_style, green_style, blue_style}, " +
+                    "{hand_style_setting : classic_style, modern_style, gothic_style}]"
+            )
         assertThat(dump).contains("ComplicationSlot 1000:")
         assertThat(dump).contains("ComplicationSlot 1001:")
         assertThat(dump).contains("screenBounds=Rect(0, 0 - 100, 100)")
@@ -5123,37 +4966,33 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun uiThreadPriority_interactive() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer,
-            mainThreadPriorityDelegate = mainThreadPriorityDelegate
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer,
+                mainThreadPriorityDelegate = mainThreadPriorityDelegate
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5161,8 +5000,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -5204,42 +5042,39 @@
     @Config(sdk = [Build.VERSION_CODES.R])
     @RequiresApi(Build.VERSION_CODES.O_MR1)
     public fun uiThreadPriority_headless() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            WallpaperInteractiveWatchFaceInstanceParams(
-                "Headless",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
-                WatchUiState(false, 0),
-                UserStyle(
-                    hashMapOf(
-                        colorStyleSetting to blueStyleOption,
-                        watchHandStyleSetting to gothicStyleOption
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
                     )
-                ).toWireFormat(),
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
                 null,
-                null,
-                null
-            ),
-            choreographer
-        )
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    "Headless",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyle(
+                            hashMapOf(
+                                colorStyleSetting to blueStyleOption,
+                                watchHandStyleSetting to gothicStyleOption
+                            )
+                        )
+                        .toWireFormat(),
+                    null,
+                    null,
+                    null
+                ),
+                choreographer
+            )
 
         engineWrapper =
             testWatchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
@@ -5281,37 +5116,33 @@
     @Config(sdk = [Build.VERSION_CODES.R])
     @RequiresApi(Build.VERSION_CODES.O_MR1)
     public fun headlessId() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.ANALOG,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            WallpaperInteractiveWatchFaceInstanceParams(
-                "wfId-Headless",
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.ANALOG,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                WallpaperInteractiveWatchFaceInstanceParams(
+                    "wfId-Headless",
+                    DeviceConfig(false, false, 0, 0),
+                    WatchUiState(false, 0),
+                    UserStyle(emptyMap()).toWireFormat(),
+                    null,
+                    null,
+                    null
                 ),
-                WatchUiState(false, 0),
-                UserStyle(emptyMap()).toWireFormat(),
-                null,
-                null,
-                null
-            ),
-            choreographer
-        )
+                choreographer
+            )
 
         engineWrapper =
             testWatchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
@@ -5331,28 +5162,27 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun selectComplicationDataForInstant_overlapping() {
-        val a = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("A"))
-            .build()
-        val b = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("B"))
-            .build()
+        val a =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("A"))
+                .build()
+        val b =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("B"))
+                .build()
         b.timelineStartEpochSecond = 1000
         b.timelineEndEpochSecond = 4000
 
-        val c = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("C"))
-            .build()
+        val c =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("C"))
+                .build()
         c.timelineStartEpochSecond = 2000
         c.timelineEndEpochSecond = 3000
 
         a.setTimelineEntryCollection(listOf(b, c))
 
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication),
-            UserStyleSchema(emptyList())
-        )
+        initEngine(WatchFaceType.ANALOG, listOf(leftComplication), UserStyleSchema(emptyList()))
 
         engineWrapper.setComplicationDataList(
             listOf(IdAndComplicationDataWireFormat(LEFT_COMPLICATION_ID, a))
@@ -5386,28 +5216,27 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun selectComplicationDataForInstant_disjoint() {
-        val a = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("A"))
-            .build()
-        val b = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("B"))
-            .build()
+        val a =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("A"))
+                .build()
+        val b =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("B"))
+                .build()
         b.timelineStartEpochSecond = 1000
         b.timelineEndEpochSecond = 2000
 
-        val c = WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-            .setShortText(WireComplicationText.plainText("C"))
-            .build()
+        val c =
+            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(WireComplicationText.plainText("C"))
+                .build()
         c.timelineStartEpochSecond = 3000
         c.timelineEndEpochSecond = 4000
 
         a.setTimelineEntryCollection(listOf(b, c))
 
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication),
-            UserStyleSchema(emptyList())
-        )
+        initEngine(WatchFaceType.ANALOG, listOf(leftComplication), UserStyleSchema(emptyList()))
 
         engineWrapper.setComplicationDataList(
             listOf(IdAndComplicationDataWireFormat(LEFT_COMPLICATION_ID, a))
@@ -5452,36 +5281,29 @@
         timelineEntry.timelineStartEpochSecond = 100
         timelineEntry.timelineEndEpochSecond = 1000
 
-        val wireLongTextComplication = WireComplicationData.Builder(
-            ComplicationType.LONG_TEXT.toWireComplicationType()
-        )
-            .setEndDateTimeMillis(1650988800000)
-            .setDataSource(ComponentName("a", "b"))
-            .setLongText(WireComplicationText.plainText("longText"))
-            .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_ICON)
-            .setContentDescription(WireComplicationText.plainText("test"))
-            .build()
+        val wireLongTextComplication =
+            WireComplicationData.Builder(ComplicationType.LONG_TEXT.toWireComplicationType())
+                .setEndDateTimeMillis(1650988800000)
+                .setDataSource(ComponentName("a", "b"))
+                .setLongText(WireComplicationText.plainText("longText"))
+                .setSmallImageStyle(WireComplicationData.IMAGE_STYLE_ICON)
+                .setContentDescription(WireComplicationText.plainText("test"))
+                .build()
         wireLongTextComplication.setTimelineEntryCollection(listOf(timelineEntry))
 
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication),
-            UserStyleSchema(emptyList())
-        )
+        initEngine(WatchFaceType.ANALOG, listOf(leftComplication), UserStyleSchema(emptyList()))
 
         engineWrapper.setComplicationDataList(
-            listOf(
-                IdAndComplicationDataWireFormat(LEFT_COMPLICATION_ID, wireLongTextComplication)
-            )
+            listOf(IdAndComplicationDataWireFormat(LEFT_COMPLICATION_ID, wireLongTextComplication))
         )
 
         complicationSlotsManager.selectComplicationDataForInstant(Instant.ofEpochSecond(0))
         assertThat(getLeftLongTextComplicationDataText()).isEqualTo("longText")
 
         complicationSlotsManager.selectComplicationDataForInstant(Instant.ofEpochSecond(100))
-        val leftComplication = complicationSlotsManager[
-            LEFT_COMPLICATION_ID
-        ]!!.complicationData.value as NoDataComplicationData
+        val leftComplication =
+            complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
+                as NoDataComplicationData
 
         val placeholder = leftComplication.placeholder as LongTextComplicationData
         assertThat(placeholder.text.isPlaceholder()).isTrue()
@@ -5491,32 +5313,36 @@
     public fun updateComplicationTimelineOnly_updatesComplication() {
         // Arrange
         initWallpaperInteractiveWatchFaceInstance(complicationSlots = listOf(leftComplication))
-        val defaultBase = WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
-            .setLongText(WireComplicationText("default"))
-            .build()
-        val timelineEntryBase = WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
-            .setLongText(WireComplicationText("timeline"))
-            .build()
-        val oldTimelineEntry = WireComplicationData.Builder(defaultBase).build().apply {
-            setTimelineEntryCollection(
-                listOf(
-                    WireComplicationData.Builder(timelineEntryBase).build().apply {
-                        timelineStartEpochSecond = 100
-                        timelineEndEpochSecond = 200
-                    }
+        val defaultBase =
+            WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
+                .setLongText(WireComplicationText("default"))
+                .build()
+        val timelineEntryBase =
+            WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
+                .setLongText(WireComplicationText("timeline"))
+                .build()
+        val oldTimelineEntry =
+            WireComplicationData.Builder(defaultBase).build().apply {
+                setTimelineEntryCollection(
+                    listOf(
+                        WireComplicationData.Builder(timelineEntryBase).build().apply {
+                            timelineStartEpochSecond = 100
+                            timelineEndEpochSecond = 200
+                        }
+                    )
                 )
-            )
-        }
-        val newTimelineEntry = WireComplicationData.Builder(defaultBase).build().apply {
-            setTimelineEntryCollection(
-                listOf(
-                    WireComplicationData.Builder(timelineEntryBase).build().apply {
-                        timelineStartEpochSecond = 200
-                        timelineEndEpochSecond = 300
-                    }
+            }
+        val newTimelineEntry =
+            WireComplicationData.Builder(defaultBase).build().apply {
+                setTimelineEntryCollection(
+                    listOf(
+                        WireComplicationData.Builder(timelineEntryBase).build().apply {
+                            timelineStartEpochSecond = 200
+                            timelineEndEpochSecond = 300
+                        }
+                    )
                 )
-            )
-        }
+            }
         engineWrapper.setComplicationDataList(
             listOf(IdAndComplicationDataWireFormat(LEFT_COMPLICATION_ID, oldTimelineEntry))
         )
@@ -5539,12 +5365,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -5553,11 +5374,8 @@
             )
         )
 
-        val screenshotParams = RenderParameters(
-            DrawMode.AMBIENT,
-            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
-            null
-        )
+        val screenshotParams =
+            RenderParameters(DrawMode.AMBIENT, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null)
 
         renderer.takeScreenshot(
             ZonedDateTime.ofInstant(Instant.EPOCH, ZoneId.of("GMT")),
@@ -5582,12 +5400,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -5605,46 +5418,46 @@
                 "testOption",
                 "testOption",
                 icon = null,
-                complicationSlotOverlays = listOf(
-                    ComplicationSlotOverlay(
-                        LEFT_COMPLICATION_ID,
-                        enabled = false,
-                        complicationSlotBounds =
-                        ComplicationSlotBounds(RectF(0.1f, 0.2f, 0.3f, 0.4f)),
-                        accessibilityTraversalIndex = 100
+                complicationSlotOverlays =
+                    listOf(
+                        ComplicationSlotOverlay(
+                            LEFT_COMPLICATION_ID,
+                            enabled = false,
+                            complicationSlotBounds =
+                                ComplicationSlotBounds(RectF(0.1f, 0.2f, 0.3f, 0.4f)),
+                            accessibilityTraversalIndex = 100
+                        ),
+                        ComplicationSlotOverlay(
+                            RIGHT_COMPLICATION_ID,
+                            enabled = true,
+                            complicationSlotBounds =
+                                ComplicationSlotBounds(RectF(0.5f, 0.6f, 0.7f, 0.8f)),
+                            accessibilityTraversalIndex = 1
+                        )
                     ),
-                    ComplicationSlotOverlay(
-                        RIGHT_COMPLICATION_ID,
-                        enabled = true,
-                        complicationSlotBounds =
-                        ComplicationSlotBounds(RectF(0.5f, 0.6f, 0.7f, 0.8f)),
-                        accessibilityTraversalIndex = 1
-                    )
-                ),
                 watchFaceEditorData = null
             )
         )
 
         // Dirty flags should lead to several WatchFaceHostApi calls.
-        verify(mockWatchFaceHostApi).setActiveComplicationSlots(
-            eq(intArrayOf(RIGHT_COMPLICATION_ID))
-        )
+        verify(mockWatchFaceHostApi)
+            .setActiveComplicationSlots(eq(intArrayOf(RIGHT_COMPLICATION_ID)))
         verify(mockWatchFaceHostApi).updateContentDescriptionLabels()
 
         assertThat(leftComplication.enabled).isFalse()
         assertThat(
-            leftComplication.complicationSlotBounds.perComplicationTypeBounds[
-                ComplicationType.SHORT_TEXT
-            ]
-        ).isEqualTo(RectF(0.1f, 0.2f, 0.3f, 0.4f))
+                leftComplication.complicationSlotBounds.perComplicationTypeBounds[
+                        ComplicationType.SHORT_TEXT]
+            )
+            .isEqualTo(RectF(0.1f, 0.2f, 0.3f, 0.4f))
         assertThat(leftComplication.accessibilityTraversalIndex).isEqualTo(100)
 
         assertThat(rightComplication.enabled).isTrue()
         assertThat(
-            rightComplication.complicationSlotBounds.perComplicationTypeBounds[
-                ComplicationType.SHORT_TEXT
-            ]
-        ).isEqualTo(RectF(0.5f, 0.6f, 0.7f, 0.8f))
+                rightComplication.complicationSlotBounds.perComplicationTypeBounds[
+                        ComplicationType.SHORT_TEXT]
+            )
+            .isEqualTo(RectF(0.5f, 0.6f, 0.7f, 0.8f))
         assertThat(rightComplication.accessibilityTraversalIndex).isEqualTo(1)
 
         reset(mockWatchFaceHostApi)
@@ -5690,42 +5503,34 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.O_MR1])
     public fun onActionScreenOff_preR() {
-        Settings.Global.putInt(
-            context.contentResolver,
-            BroadcastsObserver.AMBIENT_ENABLED_PATH,
-            1
-        )
+        Settings.Global.putInt(context.contentResolver, BroadcastsObserver.AMBIENT_ENABLED_PATH, 1)
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5733,8 +5538,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -5762,42 +5566,34 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onActionScreenOff_ambientNotEnabled() {
-        Settings.Global.putInt(
-            context.contentResolver,
-            BroadcastsObserver.AMBIENT_ENABLED_PATH,
-            0
-        )
+        Settings.Global.putInt(context.contentResolver, BroadcastsObserver.AMBIENT_ENABLED_PATH, 0)
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5805,8 +5601,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -5834,42 +5629,34 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onActionScreenOff_onActionScreenOn_ambientEnabled() {
-        Settings.Global.putInt(
-            context.contentResolver,
-            BroadcastsObserver.AMBIENT_ENABLED_PATH,
-            1
-        )
+        Settings.Global.putInt(context.contentResolver, BroadcastsObserver.AMBIENT_ENABLED_PATH, 1)
 
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5877,8 +5664,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -5919,36 +5705,32 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onActionTimeTick() {
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                TestRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    INTERACTIVE_UPDATE_RATE_MS
-                )
-            },
-            UserStyleSchema(emptyList()),
-            watchState,
-            handler,
-            null,
-            null,
-            choreographer
-        )
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    TestRenderer(
+                        surfaceHolder,
+                        currentUserStyleRepository,
+                        watchState,
+                        INTERACTIVE_UPDATE_RATE_MS
+                    )
+                },
+                UserStyleSchema(emptyList()),
+                watchState,
+                handler,
+                null,
+                null,
+                choreographer
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         "TestID",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -5956,8 +5738,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -6004,26 +5785,29 @@
             UserStyleSchema(emptyList())
         )
 
-        val left1 = IdAndComplicationDataWireFormat(
-            LEFT_COMPLICATION_ID,
-            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                .setShortText(WireComplicationText.plainText("Left1"))
-                .build()
-        )
+        val left1 =
+            IdAndComplicationDataWireFormat(
+                LEFT_COMPLICATION_ID,
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortText(WireComplicationText.plainText("Left1"))
+                    .build()
+            )
 
-        val left2 = IdAndComplicationDataWireFormat(
-            LEFT_COMPLICATION_ID,
-            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                .setShortText(WireComplicationText.plainText("Left2"))
-                .build()
-        )
+        val left2 =
+            IdAndComplicationDataWireFormat(
+                LEFT_COMPLICATION_ID,
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortText(WireComplicationText.plainText("Left2"))
+                    .build()
+            )
 
-        val right = IdAndComplicationDataWireFormat(
-            RIGHT_COMPLICATION_ID,
-            WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                .setShortText(WireComplicationText.plainText("Right"))
-                .build()
-        )
+        val right =
+            IdAndComplicationDataWireFormat(
+                RIGHT_COMPLICATION_ID,
+                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                    .setShortText(WireComplicationText.plainText("Right"))
+                    .build()
+            )
 
         engineWrapper.setComplicationDataList(listOf(left1))
         // In initEngine we fill initial complication data using
@@ -6047,12 +5831,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -6087,18 +5866,21 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun updateComplications_after_updateInstance() {
-        val complicationList = listOf(
-            IdAndComplicationDataWireFormat(
-                LEFT_COMPLICATION_ID,
-                WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
-                    .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT")).build()
-            ),
-            IdAndComplicationDataWireFormat(
-                RIGHT_COMPLICATION_ID,
-                WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
-                    .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT")).build()
+        val complicationList =
+            listOf(
+                IdAndComplicationDataWireFormat(
+                    LEFT_COMPLICATION_ID,
+                    WireComplicationData.Builder(WireComplicationData.TYPE_LONG_TEXT)
+                        .setLongText(WireComplicationText.plainText("TYPE_LONG_TEXT"))
+                        .build()
+                ),
+                IdAndComplicationDataWireFormat(
+                    RIGHT_COMPLICATION_ID,
+                    WireComplicationData.Builder(WireComplicationData.TYPE_SHORT_TEXT)
+                        .setShortText(WireComplicationText.plainText("TYPE_SHORT_TEXT"))
+                        .build()
+                )
             )
-        )
 
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
@@ -6106,12 +5888,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -6130,82 +5907,77 @@
             )
         }
 
-        assertThat(leftComplication.complicationData.value).isInstanceOf(
-            NoDataComplicationData::class.java
-        )
-        assertThat(rightComplication.complicationData.value).isInstanceOf(
-            NoDataComplicationData::class.java
-        )
+        assertThat(leftComplication.complicationData.value)
+            .isInstanceOf(NoDataComplicationData::class.java)
+        assertThat(rightComplication.complicationData.value)
+            .isInstanceOf(NoDataComplicationData::class.java)
 
         interactiveWatchFaceInstance.updateComplicationData(complicationList)
 
-        assertThat(leftComplication.complicationData.value).isInstanceOf(
-            LongTextComplicationData::class.java
-        )
-        assertThat(rightComplication.complicationData.value).isInstanceOf(
-            ShortTextComplicationData::class.java
-        )
+        assertThat(leftComplication.complicationData.value)
+            .isInstanceOf(LongTextComplicationData::class.java)
+        assertThat(rightComplication.complicationData.value)
+            .isInstanceOf(ShortTextComplicationData::class.java)
     }
 
     @OptIn(WatchFaceExperimental::class)
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onComputeColors() {
-        @Suppress("DEPRECATION")
-        lateinit var renderer: Renderer.CanvasRenderer
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                @Suppress("DEPRECATION")
-                renderer = object : Renderer.CanvasRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.HARDWARE,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    init {
-                        watchfaceColors =
-                            WatchFaceColors(Color.valueOf(1), Color.valueOf(2), Color.valueOf(3))
-                    }
+        @Suppress("DEPRECATION") lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    @Suppress("DEPRECATION")
+                    renderer =
+                        object :
+                            Renderer.CanvasRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                CanvasType.HARDWARE,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            init {
+                                watchfaceColors =
+                                    WatchFaceColors(
+                                        Color.valueOf(1),
+                                        Color.valueOf(2),
+                                        Color.valueOf(3)
+                                    )
+                            }
 
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
+                            override fun render(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -6213,8 +5985,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -6230,45 +6001,45 @@
             )
 
         var lastWatchFaceColors: WatchFaceColors? = null
-        val listener = object : IWatchfaceListener.Stub() {
-            override fun getApiVersion() = 1
+        val listener =
+            object : IWatchfaceListener.Stub() {
+                override fun getApiVersion() = 1
 
-            override fun onWatchfaceReady() {}
+                override fun onWatchfaceReady() {}
 
-            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {
-                lastWatchFaceColors = watchFaceColors?.toApiFormat()
+                override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {
+                    lastWatchFaceColors = watchFaceColors?.toApiFormat()
+                }
+
+                override fun onPreviewImageUpdateRequested(watchFaceId: String) {}
+
+                override fun onEngineDetached() {}
             }
 
-            override fun onPreviewImageUpdateRequested(watchFaceId: String) {}
-
-            override fun onEngineDetached() {}
-        }
-
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
         engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
 
         interactiveWatchFaceInstance.addWatchFaceListener(listener)
 
-        assertThat(lastWatchFaceColors).isEqualTo(
-            WatchFaceColors(Color.valueOf(1), Color.valueOf(2), Color.valueOf(3))
-        )
+        assertThat(lastWatchFaceColors)
+            .isEqualTo(WatchFaceColors(Color.valueOf(1), Color.valueOf(2), Color.valueOf(3)))
 
         renderer.watchfaceColors =
             WatchFaceColors(Color.valueOf(10), Color.valueOf(20), Color.valueOf(30))
 
-        assertThat(lastWatchFaceColors).isEqualTo(
-            WatchFaceColors(Color.valueOf(10), Color.valueOf(20), Color.valueOf(30))
-        )
+        assertThat(lastWatchFaceColors)
+            .isEqualTo(WatchFaceColors(Color.valueOf(10), Color.valueOf(20), Color.valueOf(30)))
 
         interactiveWatchFaceInstance.removeWatchFaceListener(listener)
 
         // This should be ignored.
         renderer.watchfaceColors =
             WatchFaceColors(Color.valueOf(100), Color.valueOf(200), Color.valueOf(300))
-        assertThat(lastWatchFaceColors).isNotEqualTo(
-            WatchFaceColors(Color.valueOf(100), Color.valueOf(200), Color.valueOf(300))
-        )
+        assertThat(lastWatchFaceColors)
+            .isNotEqualTo(
+                WatchFaceColors(Color.valueOf(100), Color.valueOf(200), Color.valueOf(300))
+            )
 
         engineWrapper.onDestroy()
     }
@@ -6276,56 +6047,51 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onPreviewImageUpdateRequested() {
-        @Suppress("DEPRECATION")
-        lateinit var renderer: Renderer.CanvasRenderer
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                @Suppress("DEPRECATION")
-                renderer = object : Renderer.CanvasRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.HARDWARE,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
+        @Suppress("DEPRECATION") lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    @Suppress("DEPRECATION")
+                    renderer =
+                        object :
+                            Renderer.CanvasRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                CanvasType.HARDWARE,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            override fun render(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -6333,8 +6099,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -6350,20 +6115,23 @@
             )
 
         var lastPreviewImageUpdateRequestedWatchFaceId: String? = null
-        val listener = object : IWatchfaceListener.Stub() {
-            override fun getApiVersion() = 1
+        val listener =
+            object : IWatchfaceListener.Stub() {
+                override fun getApiVersion() = 1
 
-            override fun onWatchfaceReady() {}
+                override fun onWatchfaceReady() {}
 
-            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {}
+                override fun onWatchfaceColorsChanged(
+                    watchFaceColors: WatchFaceColorsWireFormat?
+                ) {}
 
-            override fun onPreviewImageUpdateRequested(watchFaceId: String) {
-                lastPreviewImageUpdateRequestedWatchFaceId = watchFaceId
+                override fun onPreviewImageUpdateRequested(watchFaceId: String) {
+                    lastPreviewImageUpdateRequestedWatchFaceId = watchFaceId
+                }
+
+                override fun onEngineDetached() {}
             }
 
-            override fun onEngineDetached() {}
-        }
-
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
         engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
@@ -6374,9 +6142,8 @@
 
         renderer.sendPreviewImageNeedsUpdateRequest()
 
-        assertThat(lastPreviewImageUpdateRequestedWatchFaceId).isEqualTo(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive"
-        )
+        assertThat(lastPreviewImageUpdateRequestedWatchFaceId)
+            .isEqualTo(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive")
 
         interactiveWatchFaceInstance.removeWatchFaceListener(listener)
 
@@ -6386,9 +6153,8 @@
             UserStyleWireFormat(emptyMap())
         )
         renderer.sendPreviewImageNeedsUpdateRequest()
-        assertThat(lastPreviewImageUpdateRequestedWatchFaceId).isNotEqualTo(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive2"
-        )
+        assertThat(lastPreviewImageUpdateRequestedWatchFaceId)
+            .isNotEqualTo(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive2")
 
         interactiveWatchFaceInstance.release()
         engineWrapper.onDestroy()
@@ -6397,60 +6163,55 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     public fun onPreviewImageUpdateRequested_earlyCall() {
-        @Suppress("DEPRECATION")
-        lateinit var renderer: Renderer.CanvasRenderer
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                @Suppress("DEPRECATION")
-                renderer = object : Renderer.CanvasRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.HARDWARE,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    init {
-                        sendPreviewImageNeedsUpdateRequest()
-                    }
+        @Suppress("DEPRECATION") lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    @Suppress("DEPRECATION")
+                    renderer =
+                        object :
+                            Renderer.CanvasRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                CanvasType.HARDWARE,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            init {
+                                sendPreviewImageNeedsUpdateRequest()
+                            }
 
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
+                            override fun render(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         InteractiveInstanceManager
             .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
                 InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
                     WallpaperInteractiveWatchFaceInstanceParams(
                         SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
-                        DeviceConfig(
-                            false,
-                            false,
-                            0,
-                            0
-                        ),
+                        DeviceConfig(false, false, 0, 0),
                         WatchUiState(false, 0),
                         UserStyle(emptyMap()).toWireFormat(),
                         emptyList(),
@@ -6458,8 +6219,7 @@
                         null
                     ),
                     object : IPendingInteractiveWatchFace.Stub() {
-                        override fun getApiVersion() =
-                            IPendingInteractiveWatchFace.API_VERSION
+                        override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
 
                         override fun onInteractiveWatchFaceCreated(
                             iInteractiveWatchFace: IInteractiveWatchFace
@@ -6475,77 +6235,79 @@
             )
 
         var lastPreviewImageUpdateRequestedWatchFaceId: String? = null
-        val listener = object : IWatchfaceListener.Stub() {
-            override fun getApiVersion() = 1
+        val listener =
+            object : IWatchfaceListener.Stub() {
+                override fun getApiVersion() = 1
 
-            override fun onWatchfaceReady() {}
+                override fun onWatchfaceReady() {}
 
-            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {}
+                override fun onWatchfaceColorsChanged(
+                    watchFaceColors: WatchFaceColorsWireFormat?
+                ) {}
 
-            override fun onPreviewImageUpdateRequested(watchFaceId: String) {
-                lastPreviewImageUpdateRequestedWatchFaceId = watchFaceId
+                override fun onPreviewImageUpdateRequested(watchFaceId: String) {
+                    lastPreviewImageUpdateRequestedWatchFaceId = watchFaceId
+                }
+
+                override fun onEngineDetached() {}
             }
 
-            override fun onEngineDetached() {}
-        }
-
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
         engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
 
         interactiveWatchFaceInstance.addWatchFaceListener(listener)
 
-        assertThat(lastPreviewImageUpdateRequestedWatchFaceId).isEqualTo(
-            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive"
-        )
+        assertThat(lastPreviewImageUpdateRequestedWatchFaceId)
+            .isEqualTo(SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive")
     }
 
     @Test
     @Config(sdk = [Build.VERSION_CODES.R])
     @RequiresApi(Build.VERSION_CODES.O_MR1)
     public fun sendPreviewImageNeedsUpdateRequest_headlessInstance() {
-        @Suppress("DEPRECATION")
-        lateinit var renderer: Renderer.CanvasRenderer
-        testWatchFaceService = TestWatchFaceService(
-            WatchFaceType.DIGITAL,
-            emptyList(),
-            { _, currentUserStyleRepository, watchState ->
-                @Suppress("DEPRECATION")
-                renderer = object : Renderer.CanvasRenderer(
-                    surfaceHolder,
-                    currentUserStyleRepository,
-                    watchState,
-                    CanvasType.HARDWARE,
-                    INTERACTIVE_UPDATE_RATE_MS
-                ) {
-                    init {
-                        sendPreviewImageNeedsUpdateRequest()
-                    }
+        @Suppress("DEPRECATION") lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService =
+            TestWatchFaceService(
+                WatchFaceType.DIGITAL,
+                emptyList(),
+                { _, currentUserStyleRepository, watchState ->
+                    @Suppress("DEPRECATION")
+                    renderer =
+                        object :
+                            Renderer.CanvasRenderer(
+                                surfaceHolder,
+                                currentUserStyleRepository,
+                                watchState,
+                                CanvasType.HARDWARE,
+                                INTERACTIVE_UPDATE_RATE_MS
+                            ) {
+                            init {
+                                sendPreviewImageNeedsUpdateRequest()
+                            }
 
-                    override fun render(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
+                            override fun render(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
 
-                    override fun renderHighlightLayer(
-                        canvas: Canvas,
-                        bounds: Rect,
-                        zonedDateTime: ZonedDateTime
-                    ) {
-                    }
-                }
-                renderer
-            },
-            UserStyleSchema(emptyList()),
-            null,
-            handler,
-            null,
-            null,
-            choreographer,
-            forceIsVisible = true
-        )
+                            override fun renderHighlightLayer(
+                                canvas: Canvas,
+                                bounds: Rect,
+                                zonedDateTime: ZonedDateTime
+                            ) {}
+                        }
+                    renderer
+                },
+                UserStyleSchema(emptyList()),
+                null,
+                handler,
+                null,
+                null,
+                choreographer,
+                forceIsVisible = true
+            )
 
         engineWrapper =
             testWatchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
@@ -6561,9 +6323,7 @@
         )
 
         // This shouldn't crash.
-        runBlocking {
-            watchFaceImpl = engineWrapper.deferredWatchFaceImpl.awaitWithTimeout()
-        }
+        runBlocking { watchFaceImpl = engineWrapper.deferredWatchFaceImpl.awaitWithTimeout() }
 
         engineWrapper.onDestroy()
     }
@@ -6578,12 +6338,7 @@
             UserStyleSchema(emptyList()),
             WallpaperInteractiveWatchFaceInstanceParams(
                 INTERACTIVE_INSTANCE_ID,
-                DeviceConfig(
-                    false,
-                    false,
-                    0,
-                    0
-                ),
+                DeviceConfig(false, false, 0, 0),
                 WatchUiState(false, 0),
                 UserStyle(emptyMap()).toWireFormat(),
                 null,
@@ -6597,12 +6352,14 @@
                 IdAndComplicationDataWireFormat(
                     LEFT_COMPLICATION_ID,
                     ShortTextComplicationData.Builder(
-                        TimeDifferenceComplicationText.Builder(
-                            TimeDifferenceStyle.STOPWATCH,
-                            CountUpTimeReference(Instant.parse("2022-10-30T10:15:30.001Z"))
-                        ).setMinimumTimeUnit(TimeUnit.MINUTES).build(),
-                        ComplicationText.EMPTY
-                    )
+                            TimeDifferenceComplicationText.Builder(
+                                    TimeDifferenceStyle.STOPWATCH,
+                                    CountUpTimeReference(Instant.parse("2022-10-30T10:15:30.001Z"))
+                                )
+                                .setMinimumTimeUnit(TimeUnit.MINUTES)
+                                .build(),
+                            ComplicationText.EMPTY
+                        )
                         .setDisplayPolicy(
                             ComplicationDisplayPolicies.DO_NOT_SHOW_WHEN_DEVICE_LOCKED
                         )
@@ -6624,6 +6381,82 @@
             .isInstanceOf(ShortTextComplicationData::class.java)
     }
 
+    @Test
+    fun actionScreenOff_keyguardLocked() {
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication),
+            UserStyleSchema(emptyList()),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
+        )
+
+        val shadowKeyguardManager = shadowOf(context.getSystemService(KeyguardManager::class.java))
+        shadowKeyguardManager.setIsDeviceLocked(true)
+
+        watchFaceImpl.broadcastsObserver.onActionScreenOff()
+
+        assertThat(watchState.isLocked.value).isTrue()
+    }
+
+    @Test
+    fun actionScreenOff_keyguardUnlocked() {
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication),
+            UserStyleSchema(emptyList()),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
+        )
+
+        val shadowKeyguardManager = shadowOf(context.getSystemService(KeyguardManager::class.java))
+        shadowKeyguardManager.setIsDeviceLocked(false)
+
+        watchFaceImpl.broadcastsObserver.onActionScreenOff()
+
+        assertThat(watchState.isLocked.value).isFalse()
+    }
+
+    @Test
+    fun actionUserUnlocked_after_keyguardLocked() {
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication),
+            UserStyleSchema(emptyList()),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(false, false, 0, 0),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
+        )
+
+        val shadowKeyguardManager = shadowOf(context.getSystemService(KeyguardManager::class.java))
+        shadowKeyguardManager.setIsDeviceLocked(true)
+
+        watchFaceImpl.broadcastsObserver.onActionScreenOff()
+        watchFaceImpl.broadcastsObserver.onActionUserPresent()
+
+        assertThat(watchState.isLocked.value).isFalse()
+    }
+
     @SuppressLint("NewApi")
     @Test
     public fun createHeadlessSessionDelegate_onDestroy() {
@@ -6635,17 +6468,18 @@
         TestNopCanvasWatchFaceService.handler = this.handler
 
         CoroutineScope(handler.asCoroutineDispatcher().immediate).launch {
-            delegate = WatchFace.createHeadlessSessionDelegate(
-                componentName,
-                HeadlessWatchFaceInstanceParams(
+            delegate =
+                WatchFace.createHeadlessSessionDelegate(
                     componentName,
-                    DeviceConfig(false, false, 100, 200),
-                    100,
-                    100,
-                    null
-                ),
-                context
-            )
+                    HeadlessWatchFaceInstanceParams(
+                        componentName,
+                        DeviceConfig(false, false, 100, 200),
+                        100,
+                        100,
+                        null
+                    ),
+                    context
+                )
         }
 
         // Run all pending tasks.
@@ -6661,9 +6495,9 @@
     }
 
     private fun getLeftShortTextComplicationDataText(): CharSequence {
-        val complication = complicationSlotsManager[
-            LEFT_COMPLICATION_ID
-        ]!!.complicationData.value as ShortTextComplicationData
+        val complication =
+            complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
+                as ShortTextComplicationData
 
         return complication.text.getTextAt(
             ApplicationProvider.getApplicationContext<Context>().resources,
@@ -6672,9 +6506,9 @@
     }
 
     private fun getLeftLongTextComplicationDataText(): CharSequence {
-        val complication = complicationSlotsManager[
-            LEFT_COMPLICATION_ID
-        ]!!.complicationData.value as LongTextComplicationData
+        val complication =
+            complicationSlotsManager[LEFT_COMPLICATION_ID]!!.complicationData.value
+                as LongTextComplicationData
 
         return complication.text.getTextAt(
             ApplicationProvider.getApplicationContext<Context>().resources,
@@ -6684,10 +6518,12 @@
 
     @RequiresApi(Build.VERSION_CODES.R)
     private fun getChinWindowInsets(@Px chinHeight: Int): WindowInsets =
-        WindowInsets.Builder().setInsets(
-            WindowInsets.Type.systemBars(),
-            Insets.of(Rect().apply { bottom = chinHeight })
-        ).build()
+        WindowInsets.Builder()
+            .setInsets(
+                WindowInsets.Type.systemBars(),
+                Insets.of(Rect().apply { bottom = chinHeight })
+            )
+            .build()
 
     private suspend fun <T> Deferred<T>.awaitWithTimeout(): T = withTimeout(1000) { await() }
 }
@@ -6708,33 +6544,36 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ) = WatchFace(
-        WatchFaceType.DIGITAL,
-        @Suppress("deprecation")
-        object : Renderer.CanvasRenderer(
-            surfaceHolder,
-            currentUserStyleRepository,
-            watchState,
-            CanvasType.HARDWARE,
-            16
-        ) {
-            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
-                // Intentionally empty.
-            }
+    ) =
+        WatchFace(
+            WatchFaceType.DIGITAL,
+            @Suppress("deprecation")
+            object :
+                Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    16
+                ) {
+                override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                    // Intentionally empty.
+                }
 
-            override fun renderHighlightLayer(
-                canvas: Canvas,
-                bounds: Rect,
-                zonedDateTime: ZonedDateTime
-            ) {
-                // Intentionally empty.
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    zonedDateTime: ZonedDateTime
+                ) {
+                    // Intentionally empty.
+                }
             }
+        )
+
+    override fun getSystemTimeProvider() =
+        object : SystemTimeProvider {
+            override fun getSystemTimeMillis() = 123456789L
+
+            override fun getSystemTimeZoneId() = ZoneId.of("UTC")
         }
-    )
-
-    override fun getSystemTimeProvider() = object : SystemTimeProvider {
-        override fun getSystemTimeMillis() = 123456789L
-
-        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
-    }
 }
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParamsTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParamsTest.kt
index 783b044..b995a5b 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParamsTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/control/data/WallpaperInteractiveWatchFaceInstanceParamsTest.kt
@@ -25,27 +25,23 @@
 class WallpaperInteractiveWatchFaceInstanceParamsTest {
     @Test
     fun canBeWrittenToOutputStream() {
-        val params = WallpaperInteractiveWatchFaceInstanceParams(
-            "instanceId",
-            DeviceConfig(
-                false,
-                false,
-                10,
-                10
-            ),
-            WatchUiState(
-                false,
-                0,
-            ),
-            UserStyle(emptyMap()).toWireFormat(),
-            null,
-            null,
-            null
-        )
+        val params =
+            WallpaperInteractiveWatchFaceInstanceParams(
+                "instanceId",
+                DeviceConfig(false, false, 10, 10),
+                WatchUiState(
+                    false,
+                    0,
+                ),
+                UserStyle(emptyMap()).toWireFormat(),
+                null,
+                null,
+                null
+            )
 
         val dummyOutputStream = ByteArrayOutputStream()
 
         // Should not throw an exception
         ParcelUtils.toOutputStream(params, dummyOutputStream)
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear/OWNERS b/wear/wear/OWNERS
index 314e20b..afc5a30 100644
--- a/wear/wear/OWNERS
+++ b/wear/wear/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 1235285
 jgarside@google.com
 jnichol@google.com
\ No newline at end of file
diff --git a/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProxyOverrideTestAppTest.java b/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProxyOverrideTestAppTest.java
index 45deec8..18a126c 100644
--- a/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProxyOverrideTestAppTest.java
+++ b/webkit/integration-tests/testapp/src/androidTest/java/com/example/androidx/webkit/ProxyOverrideTestAppTest.java
@@ -22,6 +22,7 @@
 import androidx.webkit.WebViewFeature;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,6 +42,7 @@
         WebkitTestHelpers.assumeFeature(WebViewFeature.PROXY_OVERRIDE);
     }
 
+    @Ignore // b/267381688
     @Test
     public void testProxyOverride() {
         WebkitTestHelpers.clickMenuListItemWithString(R.string.proxy_override_activity_title);
@@ -56,6 +58,7 @@
                                 R.string.proxy_override_requests_served, 1);
     }
 
+    @Ignore // b/267381688
     @Test
     public void testReverseBypass() {
         WebkitTestHelpers.assumeFeature(WebViewFeature.PROXY_OVERRIDE_REVERSE_BYPASS);
diff --git a/webkit/webkit/build.gradle b/webkit/webkit/build.gradle
index bb84e97..0cc7c77 100644
--- a/webkit/webkit/build.gradle
+++ b/webkit/webkit/build.gradle
@@ -72,4 +72,5 @@
     publish = Publish.SNAPSHOT_AND_RELEASE
     inceptionYear = "2017"
     description = "The WebView Support Library is a static library you can add to your Android application in order to use android.webkit APIs that are not available for older platform versions."
+    additionalDeviceTestApkKeys.add("chrome")
 }
diff --git a/window/extensions/extensions/api/current.txt b/window/extensions/extensions/api/current.txt
index 8867f5f6c..f0c699b 100644
--- a/window/extensions/extensions/api/current.txt
+++ b/window/extensions/extensions/api/current.txt
@@ -16,10 +16,13 @@
 package androidx.window.extensions.embedding {
 
   public interface ActivityEmbeddingComponent {
+    method public void clearSplitAttributesCalculator();
     method public void clearSplitInfoCallback();
     method public boolean isActivityEmbedded(android.app.Activity);
     method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
-    method public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public void setSplitAttributesCalculator(androidx.window.extensions.core.util.function.Function<androidx.window.extensions.embedding.SplitAttributesCalculatorParams!,androidx.window.extensions.embedding.SplitAttributes!>);
+    method @Deprecated public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public default void setSplitInfoCallback(androidx.window.extensions.core.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
   }
 
   public class ActivityRule extends androidx.window.extensions.embedding.EmbeddingRule {
@@ -29,25 +32,76 @@
   }
 
   public static final class ActivityRule.Builder {
-    ctor public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor public ActivityRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>);
     method public androidx.window.extensions.embedding.ActivityRule build();
     method public androidx.window.extensions.embedding.ActivityRule.Builder setShouldAlwaysExpand(boolean);
+    method public androidx.window.extensions.embedding.ActivityRule.Builder setTag(String);
   }
 
   public class ActivityStack {
-    ctor public ActivityStack(java.util.List<android.app.Activity!>, boolean);
     method public java.util.List<android.app.Activity!> getActivities();
     method public boolean isEmpty();
   }
 
   public abstract class EmbeddingRule {
+    method public String? getTag();
+  }
+
+  public class SplitAttributes {
+    method @ColorInt public int getAnimationBackgroundColor();
+    method public int getLayoutDirection();
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getSplitType();
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.extensions.embedding.SplitAttributes build();
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setLayoutDirection(int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final int BOTTOM_TO_TOP = 5; // 0x5
+    field public static final int LEFT_TO_RIGHT = 0; // 0x0
+    field public static final int LOCALE = 3; // 0x3
+    field public static final int RIGHT_TO_LEFT = 1; // 0x1
+    field public static final int TOP_TO_BOTTOM = 4; // 0x4
+  }
+
+  public static class SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.ExpandContainersSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.HingeSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getFallbackSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.RatioSplitType(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float);
+    method @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) public float getRatio();
+    method public static androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public class SplitAttributesCalculatorParams {
+    method public boolean areDefaultConstraintsSatisfied();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.extensions.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public android.view.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
   }
 
   public class SplitInfo {
-    ctor public SplitInfo(androidx.window.extensions.embedding.ActivityStack, androidx.window.extensions.embedding.ActivityStack, float);
     method public androidx.window.extensions.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.extensions.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getSplitAttributes();
+    method @Deprecated public float getSplitRatio();
   }
 
   public class SplitPairRule extends androidx.window.extensions.embedding.SplitRule {
@@ -59,15 +113,18 @@
   }
 
   public static final class SplitPairRule.Builder {
-    ctor public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPairRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPairRule build();
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldClearTop(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishPrimaryWithSecondary(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishSecondaryWithPrimary(boolean);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setTag(String);
   }
 
   public class SplitPlaceholderRule extends androidx.window.extensions.embedding.SplitRule {
@@ -80,19 +137,23 @@
   }
 
   public static final class SplitPlaceholderRule.Builder {
-    ctor public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPlaceholderRule.Builder(android.content.Intent, androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule build();
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int);
     method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithSecondary(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSticky(boolean);
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setTag(String);
   }
 
   public abstract class SplitRule extends androidx.window.extensions.embedding.EmbeddingRule {
     method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean checkParentMetrics(android.view.WindowMetrics);
-    method public int getLayoutDirection();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method @Deprecated public int getLayoutDirection();
+    method @Deprecated public float getSplitRatio();
     field public static final int FINISH_ADJACENT = 2; // 0x2
     field public static final int FINISH_ALWAYS = 1; // 0x1
     field public static final int FINISH_NEVER = 0; // 0x0
@@ -118,8 +179,11 @@
   }
 
   public interface WindowLayoutComponent {
-    method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
-    method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public default void addWindowLayoutInfoListener(@UiContext android.content.Context, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void addWindowLayoutInfoListener(@UiContext android.content.Context, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void removeWindowLayoutInfoListener(androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
   public class WindowLayoutInfo {
diff --git a/window/extensions/extensions/api/public_plus_experimental_current.txt b/window/extensions/extensions/api/public_plus_experimental_current.txt
index 8867f5f6c..f0c699b 100644
--- a/window/extensions/extensions/api/public_plus_experimental_current.txt
+++ b/window/extensions/extensions/api/public_plus_experimental_current.txt
@@ -16,10 +16,13 @@
 package androidx.window.extensions.embedding {
 
   public interface ActivityEmbeddingComponent {
+    method public void clearSplitAttributesCalculator();
     method public void clearSplitInfoCallback();
     method public boolean isActivityEmbedded(android.app.Activity);
     method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
-    method public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public void setSplitAttributesCalculator(androidx.window.extensions.core.util.function.Function<androidx.window.extensions.embedding.SplitAttributesCalculatorParams!,androidx.window.extensions.embedding.SplitAttributes!>);
+    method @Deprecated public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public default void setSplitInfoCallback(androidx.window.extensions.core.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
   }
 
   public class ActivityRule extends androidx.window.extensions.embedding.EmbeddingRule {
@@ -29,25 +32,76 @@
   }
 
   public static final class ActivityRule.Builder {
-    ctor public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor public ActivityRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>);
     method public androidx.window.extensions.embedding.ActivityRule build();
     method public androidx.window.extensions.embedding.ActivityRule.Builder setShouldAlwaysExpand(boolean);
+    method public androidx.window.extensions.embedding.ActivityRule.Builder setTag(String);
   }
 
   public class ActivityStack {
-    ctor public ActivityStack(java.util.List<android.app.Activity!>, boolean);
     method public java.util.List<android.app.Activity!> getActivities();
     method public boolean isEmpty();
   }
 
   public abstract class EmbeddingRule {
+    method public String? getTag();
+  }
+
+  public class SplitAttributes {
+    method @ColorInt public int getAnimationBackgroundColor();
+    method public int getLayoutDirection();
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getSplitType();
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.extensions.embedding.SplitAttributes build();
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setLayoutDirection(int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final int BOTTOM_TO_TOP = 5; // 0x5
+    field public static final int LEFT_TO_RIGHT = 0; // 0x0
+    field public static final int LOCALE = 3; // 0x3
+    field public static final int RIGHT_TO_LEFT = 1; // 0x1
+    field public static final int TOP_TO_BOTTOM = 4; // 0x4
+  }
+
+  public static class SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.ExpandContainersSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.HingeSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getFallbackSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.RatioSplitType(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float);
+    method @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) public float getRatio();
+    method public static androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public class SplitAttributesCalculatorParams {
+    method public boolean areDefaultConstraintsSatisfied();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.extensions.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public android.view.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
   }
 
   public class SplitInfo {
-    ctor public SplitInfo(androidx.window.extensions.embedding.ActivityStack, androidx.window.extensions.embedding.ActivityStack, float);
     method public androidx.window.extensions.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.extensions.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getSplitAttributes();
+    method @Deprecated public float getSplitRatio();
   }
 
   public class SplitPairRule extends androidx.window.extensions.embedding.SplitRule {
@@ -59,15 +113,18 @@
   }
 
   public static final class SplitPairRule.Builder {
-    ctor public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPairRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPairRule build();
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldClearTop(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishPrimaryWithSecondary(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishSecondaryWithPrimary(boolean);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setTag(String);
   }
 
   public class SplitPlaceholderRule extends androidx.window.extensions.embedding.SplitRule {
@@ -80,19 +137,23 @@
   }
 
   public static final class SplitPlaceholderRule.Builder {
-    ctor public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPlaceholderRule.Builder(android.content.Intent, androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule build();
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int);
     method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithSecondary(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSticky(boolean);
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setTag(String);
   }
 
   public abstract class SplitRule extends androidx.window.extensions.embedding.EmbeddingRule {
     method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean checkParentMetrics(android.view.WindowMetrics);
-    method public int getLayoutDirection();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method @Deprecated public int getLayoutDirection();
+    method @Deprecated public float getSplitRatio();
     field public static final int FINISH_ADJACENT = 2; // 0x2
     field public static final int FINISH_ALWAYS = 1; // 0x1
     field public static final int FINISH_NEVER = 0; // 0x0
@@ -118,8 +179,11 @@
   }
 
   public interface WindowLayoutComponent {
-    method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
-    method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public default void addWindowLayoutInfoListener(@UiContext android.content.Context, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void addWindowLayoutInfoListener(@UiContext android.content.Context, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void removeWindowLayoutInfoListener(androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
   public class WindowLayoutInfo {
diff --git a/window/extensions/extensions/api/restricted_current.txt b/window/extensions/extensions/api/restricted_current.txt
index 8867f5f6c..f0c699b 100644
--- a/window/extensions/extensions/api/restricted_current.txt
+++ b/window/extensions/extensions/api/restricted_current.txt
@@ -16,10 +16,13 @@
 package androidx.window.extensions.embedding {
 
   public interface ActivityEmbeddingComponent {
+    method public void clearSplitAttributesCalculator();
     method public void clearSplitInfoCallback();
     method public boolean isActivityEmbedded(android.app.Activity);
     method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
-    method public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public void setSplitAttributesCalculator(androidx.window.extensions.core.util.function.Function<androidx.window.extensions.embedding.SplitAttributesCalculatorParams!,androidx.window.extensions.embedding.SplitAttributes!>);
+    method @Deprecated public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+    method public default void setSplitInfoCallback(androidx.window.extensions.core.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
   }
 
   public class ActivityRule extends androidx.window.extensions.embedding.EmbeddingRule {
@@ -29,25 +32,76 @@
   }
 
   public static final class ActivityRule.Builder {
-    ctor public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+    ctor public ActivityRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>);
     method public androidx.window.extensions.embedding.ActivityRule build();
     method public androidx.window.extensions.embedding.ActivityRule.Builder setShouldAlwaysExpand(boolean);
+    method public androidx.window.extensions.embedding.ActivityRule.Builder setTag(String);
   }
 
   public class ActivityStack {
-    ctor public ActivityStack(java.util.List<android.app.Activity!>, boolean);
     method public java.util.List<android.app.Activity!> getActivities();
     method public boolean isEmpty();
   }
 
   public abstract class EmbeddingRule {
+    method public String? getTag();
+  }
+
+  public class SplitAttributes {
+    method @ColorInt public int getAnimationBackgroundColor();
+    method public int getLayoutDirection();
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getSplitType();
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.extensions.embedding.SplitAttributes build();
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setLayoutDirection(int);
+    method public androidx.window.extensions.embedding.SplitAttributes.Builder setSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final int BOTTOM_TO_TOP = 5; // 0x5
+    field public static final int LEFT_TO_RIGHT = 0; // 0x0
+    field public static final int LOCALE = 3; // 0x3
+    field public static final int RIGHT_TO_LEFT = 1; // 0x1
+    field public static final int TOP_TO_BOTTOM = 4; // 0x4
+  }
+
+  public static class SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.ExpandContainersSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.HingeSplitType(androidx.window.extensions.embedding.SplitAttributes.SplitType);
+    method public androidx.window.extensions.embedding.SplitAttributes.SplitType getFallbackSplitType();
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.extensions.embedding.SplitAttributes.SplitType {
+    ctor public SplitAttributes.SplitType.RatioSplitType(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float);
+    method @FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) public float getRatio();
+    method public static androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public class SplitAttributesCalculatorParams {
+    method public boolean areDefaultConstraintsSatisfied();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.extensions.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public android.view.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
   }
 
   public class SplitInfo {
-    ctor public SplitInfo(androidx.window.extensions.embedding.ActivityStack, androidx.window.extensions.embedding.ActivityStack, float);
     method public androidx.window.extensions.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.extensions.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getSplitAttributes();
+    method @Deprecated public float getSplitRatio();
   }
 
   public class SplitPairRule extends androidx.window.extensions.embedding.SplitRule {
@@ -59,15 +113,18 @@
   }
 
   public static final class SplitPairRule.Builder {
-    ctor public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPairRule.Builder(androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, androidx.window.extensions.core.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPairRule build();
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
     method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldClearTop(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishPrimaryWithSecondary(boolean);
     method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishSecondaryWithPrimary(boolean);
-    method public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
+    method public androidx.window.extensions.embedding.SplitPairRule.Builder setTag(String);
   }
 
   public class SplitPlaceholderRule extends androidx.window.extensions.embedding.SplitRule {
@@ -80,19 +137,23 @@
   }
 
   public static final class SplitPlaceholderRule.Builder {
-    ctor public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor @Deprecated @RequiresApi(android.os.Build.VERSION_CODES.N) public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+    ctor public SplitPlaceholderRule.Builder(android.content.Intent, androidx.window.extensions.core.util.function.Predicate<android.app.Activity!>, androidx.window.extensions.core.util.function.Predicate<android.content.Intent!>, androidx.window.extensions.core.util.function.Predicate<android.view.WindowMetrics!>);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule build();
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.extensions.embedding.SplitAttributes);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int);
     method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithSecondary(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
-    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(float);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
+    method @Deprecated public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float);
     method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSticky(boolean);
+    method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setTag(String);
   }
 
   public abstract class SplitRule extends androidx.window.extensions.embedding.EmbeddingRule {
     method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean checkParentMetrics(android.view.WindowMetrics);
-    method public int getLayoutDirection();
-    method public float getSplitRatio();
+    method public androidx.window.extensions.embedding.SplitAttributes getDefaultSplitAttributes();
+    method @Deprecated public int getLayoutDirection();
+    method @Deprecated public float getSplitRatio();
     field public static final int FINISH_ADJACENT = 2; // 0x2
     field public static final int FINISH_ALWAYS = 1; // 0x1
     field public static final int FINISH_NEVER = 0; // 0x0
@@ -118,8 +179,11 @@
   }
 
   public interface WindowLayoutComponent {
-    method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
-    method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public default void addWindowLayoutInfoListener(@UiContext android.content.Context, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void addWindowLayoutInfoListener(@UiContext android.content.Context, androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method @Deprecated public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
+    method public default void removeWindowLayoutInfoListener(androidx.window.extensions.core.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
   public class WindowLayoutInfo {
diff --git a/window/extensions/extensions/build.gradle b/window/extensions/extensions/build.gradle
index f9deca6..9db659b 100644
--- a/window/extensions/extensions/build.gradle
+++ b/window/extensions/extensions/build.gradle
@@ -24,8 +24,13 @@
 
 dependencies {
     api(libs.kotlinStdlib)
-    implementation("androidx.annotation:annotation:1.1.0")
+    implementation("androidx.annotation:annotation:1.3.0")
     implementation("androidx.annotation:annotation-experimental:1.1.0")
+    implementation("androidx.window.extensions.core:core:1.0.0-alpha01")
+
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.testRules)
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testRunner)
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
index c1a9bd8..8b6281a 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
@@ -16,7 +16,10 @@
 
 package androidx.window.extensions;
 
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
 import androidx.window.extensions.layout.WindowLayoutComponent;
 
@@ -29,6 +32,53 @@
  * {@link WindowExtensions#getVendorApiLevel()}.
  */
 public interface WindowExtensions {
+    // TODO(b/241323716) Removed after we have annotation to check API level
+    /**
+     * An invalid {@link #getVendorApiLevel vendor API level}
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    int INVALID_VENDOR_API_LEVEL = -1;
+
+    // TODO(b/241323716) Removed after we have annotation to check API level
+    /**
+     * A vendor API level constant. It helps to unify the format of documenting {@code @since}
+     * block.
+     * <p>
+     * The added APIs for Vendor API level 1 are:
+     * <ul>
+     *     <li>{@link androidx.window.extensions.embedding.ActivityRule} APIs</li>
+     *     <li>{@link androidx.window.extensions.embedding.SplitPairRule} APIs</li>
+     *     <li>{@link androidx.window.extensions.embedding.SplitPlaceholderRule} APIs</li>
+     *     <li>{@link androidx.window.extensions.embedding.SplitInfo} APIs</li>
+     *     <li>{@link androidx.window.extensions.layout.DisplayFeature} APIs</li>
+     *     <li>{@link androidx.window.extensions.layout.FoldingFeature} APIs</li>
+     *     <li>{@link androidx.window.extensions.layout.WindowLayoutInfo} APIs</li>
+     *     <li>{@link androidx.window.extensions.layout.WindowLayoutComponent} APIs</li>
+     * </ul>
+     * </p>
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    int VENDOR_API_LEVEL_1 = 1;
+    // TODO(b/241323716) Removed after we have annotation to check API level
+    /**
+     * A vendor API level constant. It helps to unify the format of documenting {@code @since}
+     * block.
+     * <p>
+     * The added APIs for Vendor API level 2 are:
+     * <ul>
+     *     <li>{@link SplitPlaceholderRule.Builder#setFinishPrimaryWithPlaceholder}</li>
+     *     <li>{@link androidx.window.extensions.embedding.SplitAttributes} APIs</li>
+     *     <li>{@link ActivityEmbeddingComponent#setSplitAttributesCalculator(
+     *         androidx.window.extensions.core.util.function.Function)}</li>
+     * </ul>
+     * </p>
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    int VENDOR_API_LEVEL_2 = 2;
+
     /**
      * Returns the API level of the vendor library on the device. If the returned version is not
      * supported by the WindowManager library, then some functions may not be available or replaced
@@ -39,7 +89,7 @@
      * @return the API level supported by the library.
      */
     default int getVendorApiLevel() {
-        return 1;
+        throw new RuntimeException("Not implemented. Must override in a subclass.");
     }
 
     /**
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
index 16caa61..69bc4fe 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
@@ -17,13 +17,15 @@
 package androidx.window.extensions.embedding;
 
 import android.app.Activity;
+import android.view.WindowMetrics;
 
 import androidx.annotation.NonNull;
 import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Consumer;
+import androidx.window.extensions.core.util.function.Function;
 
 import java.util.List;
 import java.util.Set;
-import java.util.function.Consumer;
 
 /**
  * Extension component definition that is used by the WindowManager library to trigger custom
@@ -40,20 +42,36 @@
     void setEmbeddingRules(@NonNull Set<EmbeddingRule> splitRules);
 
     /**
+     * @deprecated Use {@link #setSplitInfoCallback(Consumer)} starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #setSplitInfoCallback(Consumer)} can't be called on
+     * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+     */
+    @Deprecated
+    @SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
+    void setSplitInfoCallback(@NonNull java.util.function.Consumer<List<SplitInfo>> consumer);
+
+    /**
      * Sets the callback that notifies WM Jetpack about changes in split states from the Extensions
      * Sidecar implementation. The listener should be registered for the lifetime of the process.
      * There are no threading guarantees where the events are dispatched from. All messages are
      * re-posted to the executors provided by developers.
+     *
+     * @param consumer the callback to notify {@link SplitInfo} list changes
+     * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
      */
     @SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
-    void setSplitInfoCallback(@NonNull Consumer<List<SplitInfo>> consumer);
+    default void setSplitInfoCallback(@NonNull Consumer<List<SplitInfo>> consumer) {
+        throw new UnsupportedOperationException("This method must not be called unless there is a"
+                + " corresponding override implementation on the device.");
+    }
 
     /**
      * Clears the callback that was set in
      * {@link ActivityEmbeddingComponent#setSplitInfoCallback(Consumer)}.
      * Added in {@link WindowExtensions#getVendorApiLevel()} 2, calling an earlier version will
      * throw {@link java.lang.NoSuchMethodError}.
-     * @since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+     * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
      */
     void clearSplitInfoCallback();
 
@@ -62,4 +80,27 @@
      * occupies a portion of Task bounds.
      */
     boolean isActivityEmbedded(@NonNull Activity activity);
+
+    /**
+     * Sets a callback to compute the {@link SplitAttributes} for the {@link SplitRule} and current
+     * window state provided in {@link SplitAttributesCalculatorParams}. This method can be used
+     * to dynamically configure the split layout properties when new activities are launched or
+     * window properties change. If set, {@link SplitRule#getDefaultSplitAttributes() the default
+     * split properties} and {@link SplitRule#checkParentMetrics(WindowMetrics) restrictions}
+     * will be ignored, and the callback will be invoked for every change.
+     *
+     * @param calculator the callback to set. It will replace the previously set callback if it
+     *                  exists.
+     * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    void setSplitAttributesCalculator(
+            @NonNull Function<SplitAttributesCalculatorParams, SplitAttributes> calculator);
+
+    /**
+     * Clears the previously callback set in {@link #setSplitAttributesCalculator(Function)}.
+     *
+     * @see #setSplitAttributesCalculator(Function)
+     * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    void clearSplitAttributesCalculator();
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
index 2d1fc33..ed30113 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
@@ -22,9 +22,12 @@
 import android.os.Build;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Predicate;
 
-import java.util.function.Predicate;
+import java.util.Objects;
 
 /**
  * Split configuration rule for individual activities.
@@ -37,7 +40,9 @@
     private final boolean mShouldAlwaysExpand;
 
     ActivityRule(@NonNull Predicate<Activity> activityPredicate,
-            @NonNull Predicate<Intent> intentPredicate, boolean shouldAlwaysExpand) {
+            @NonNull Predicate<Intent> intentPredicate, boolean shouldAlwaysExpand,
+            @Nullable String tag) {
+        super(tag);
         mActivityPredicate = activityPredicate;
         mIntentPredicate = intentPredicate;
         mShouldAlwaysExpand = shouldAlwaysExpand;
@@ -78,7 +83,32 @@
         @NonNull
         private final Predicate<Intent> mIntentPredicate;
         private boolean mAlwaysExpand;
+        @Nullable
+        private String mTag;
 
+        /**
+         * @deprecated Use {@link #Builder(Predicate, Predicate)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #Builder(Predicate, Predicate)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+         */
+        @Deprecated
+        @RequiresApi(Build.VERSION_CODES.N)
+        public Builder(@NonNull java.util.function.Predicate<Activity> activityPredicate,
+                @NonNull java.util.function.Predicate<Intent> intentPredicate) {
+            mActivityPredicate = activityPredicate::test;
+            mIntentPredicate = intentPredicate::test;
+        }
+
+        /**
+         * The {@link ActivityRule} Builder constructor
+         *
+         * @param activityPredicate the {@link Predicate} to verify if a given {@link Activity}
+         *                         matches the rule
+         * @param intentPredicate the {@link Predicate} to verify if a given {@link Intent}
+         *                         matches the rule
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
         public Builder(@NonNull Predicate<Activity> activityPredicate,
                 @NonNull Predicate<Intent> intentPredicate) {
             mActivityPredicate = activityPredicate;
@@ -92,10 +122,20 @@
             return this;
         }
 
+        /**
+         * @see ActivityRule#getTag()
+         * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+         */
+        @NonNull
+        public Builder setTag(@NonNull String tag) {
+            mTag = Objects.requireNonNull(tag);
+            return this;
+        }
+
         /** Builds a new instance of {@link ActivityRule}. */
         @NonNull
         public ActivityRule build() {
-            return new ActivityRule(mActivityPredicate, mIntentPredicate, mAlwaysExpand);
+            return new ActivityRule(mActivityPredicate, mIntentPredicate, mAlwaysExpand, mTag);
         }
     }
 
@@ -104,14 +144,16 @@
         if (this == o) return true;
         if (!(o instanceof ActivityRule)) return false;
         ActivityRule that = (ActivityRule) o;
-        return mShouldAlwaysExpand == that.mShouldAlwaysExpand
+        return super.equals(o)
+                && mShouldAlwaysExpand == that.mShouldAlwaysExpand
                 && mActivityPredicate.equals(that.mActivityPredicate)
                 && mIntentPredicate.equals(that.mIntentPredicate);
     }
 
     @Override
     public int hashCode() {
-        int result = mActivityPredicate.hashCode();
+        int result = super.hashCode();
+        result = 31 * result + mActivityPredicate.hashCode();
         result = 31 * result + mIntentPredicate.hashCode();
         result = 31 * result + (mShouldAlwaysExpand ? 1 : 0);
         return result;
@@ -120,6 +162,7 @@
     @NonNull
     @Override
     public String toString() {
-        return "ActivityRule{" + "mShouldAlwaysExpand=" + mShouldAlwaysExpand + '}';
+        return "ActivityRule{mTag=" + getTag()
+                + "mShouldAlwaysExpand=" + mShouldAlwaysExpand + '}';
     }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java
index db275bb..ce24bad 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java
@@ -33,7 +33,7 @@
 
     private final boolean mIsEmpty;
 
-    public ActivityStack(@NonNull List<Activity> activities, boolean isEmpty) {
+    ActivityStack(@NonNull List<Activity> activities, boolean isEmpty) {
         mActivities = new ArrayList<>(activities);
         mIsEmpty = isEmpty;
     }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
index 571eda0..71acdd9 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
@@ -16,10 +16,48 @@
 
 package androidx.window.extensions.embedding;
 
+import androidx.annotation.Nullable;
+import androidx.window.extensions.core.util.function.Function;
+
+import java.util.Objects;
+
 /**
  * Base interface for activity embedding rules. Used to group different types of rules together when
  * updating from the core library.
  */
 public abstract class EmbeddingRule {
-    EmbeddingRule() {}
+    @Nullable
+    private final String mTag;
+
+    EmbeddingRule(@Nullable String tag) {
+        mTag = tag;
+    }
+
+    /**
+     * A unique string to identify this {@link EmbeddingRule}.
+     * The suggested usage is to set the tag in the corresponding rule builder to be able to
+     * differentiate between different rules in {@link SplitAttributes} calculator function. For
+     * example, it can be used to compute the {@link SplitAttributes} for the specific
+     * {@link SplitRule} in the {@link Function} set with
+     * {@link ActivityEmbeddingComponent#setSplitAttributesCalculator(Function)}.
+     *
+     * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @Nullable
+    public String getTag() {
+        return mTag;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) return true;
+        if (!(other instanceof EmbeddingRule)) return false;
+        final EmbeddingRule otherRule = (EmbeddingRule) other;
+        return Objects.equals(mTag, otherRule.mTag);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(mTag);
+    }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
new file mode 100644
index 0000000..92a427a
--- /dev/null
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributes.java
@@ -0,0 +1,559 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.extensions.embedding;
+
+import static androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.BOTTOM_TO_TOP;
+import static androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.LEFT_TO_RIGHT;
+import static androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.LOCALE;
+import static androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.RIGHT_TO_LEFT;
+import static androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.TOP_TO_BOTTOM;
+
+import android.annotation.SuppressLint;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.extensions.core.util.function.Function;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Attributes that describe how the parent window (typically the activity task
+ * window) is split between the primary and secondary activity containers,
+ * including:
+ * <ul>
+ *     <li>Split type -- Categorizes the split and specifies the sizes of the
+ *         primary and secondary activity containers relative to the parent
+ *         bounds</li>
+ *     <li>Layout direction -- Specifies whether the parent window is split
+ *         vertically or horizontally and in which direction the primary and
+ *         secondary containers are respectively positioned (left to right,
+ *         right to left, top to bottom, and so forth)</li>
+ *     <li>Animation background color -- The color of the background during
+ *         animation of the split involving this {@code SplitAttributes} object
+ *         if the animation requires a background</li>
+ * </ul>
+ *
+ * <p>Attributes can be configured by:
+ * <ul>
+ *     <li>Setting the default {@code SplitAttributes} using
+ *         {@link SplitPairRule.Builder#setDefaultSplitAttributes} or
+ *         {@link SplitPlaceholderRule.Builder#setDefaultSplitAttributes}.</li>
+ *     <li>Using {@link ActivityEmbeddingComponent#setSplitAttributesCalculator(Function)} to set
+ *         the callback to customize the {@code SplitAttributes} for a given device and window
+ *         state.</li>
+ * </ul>
+ *
+ * @see SplitAttributes.SplitType
+ * @see SplitAttributes.LayoutDirection
+ * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+ */
+public class SplitAttributes {
+    /**
+     * The type of window split, which defines the proportion of the parent
+     * window occupied by the primary and secondary activity containers.
+     */
+    public static class SplitType {
+        @NonNull
+        private final String mDescription;
+
+        SplitType(@NonNull String description) {
+            mDescription = description;
+        }
+
+        @Override
+        public int hashCode() {
+            return mDescription.hashCode();
+        }
+
+        @Override
+        public boolean equals(@Nullable Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (!(obj instanceof SplitType)) {
+                return false;
+            }
+            final SplitType that = (SplitType) obj;
+            return mDescription.equals(that.mDescription);
+        }
+
+        @NonNull
+        @Override
+        public String toString() {
+            return mDescription;
+        }
+
+        @SuppressLint("Range") // The range is covered.
+        @NonNull
+        static SplitType createSplitTypeFromLegacySplitRatio(
+                @FloatRange(from = 0.0, to = 1.0) float splitRatio) {
+            // Treat 0.0 and 1.0 as ExpandContainerSplitType because it means the parent container
+            // is filled with secondary or primary container.
+            if (splitRatio == 0.0 || splitRatio == 1.0) {
+                return new ExpandContainersSplitType();
+            }
+            return new RatioSplitType(splitRatio);
+        }
+
+        /**
+         * A window split that's based on the ratio of the size of the primary
+         * container to the size of the parent window.
+         *
+         * <p>Values in the non-inclusive range (0.0, 1.0) define the size of
+         * the primary container relative to the size of the parent window:
+         * <ul>
+         *     <li>0.5 -- Primary container occupies half of the parent
+         *         window; secondary container, the other half</li>
+         *     <li>Greater than 0.5 -- Primary container occupies a larger
+         *         proportion of the parent window than the secondary
+         *         container</li>
+         *     <li>Less than 0.5 -- Primary container occupies a smaller
+         *         proportion of the parent window than the secondary
+         *         container</li>
+         * </ul>
+         */
+        public static final class RatioSplitType extends SplitType {
+            @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
+            private final float mRatio;
+
+            /**
+             * Creates an instance of this {@code RatioSplitType}.
+             *
+             * @param ratio The proportion of the parent window occupied by the
+             *     primary container of the split. Can be a value in the
+             *     non-inclusive range (0.0, 1.0). Use
+             *     {@link SplitType.ExpandContainersSplitType} to create a split
+             *     type that occupies the entire parent window.
+             */
+            public RatioSplitType(
+                    @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
+                    float ratio) {
+                super("ratio:" + ratio);
+                if (ratio <= 0.0f || ratio >= 1.0f) {
+                    throw new IllegalArgumentException("Ratio must be in range (0.0, 1.0). "
+                            + " Use SplitType.ExpandContainersSplitType() instead of 0 or 1.");
+                }
+                mRatio = ratio;
+            }
+
+            /**
+             * Gets the proportion of the parent window occupied by the primary
+             * activity container of the split.
+             *
+             * @return The proportion of the split occupied by the primary
+             *     container.
+             */
+            @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
+            public float getRatio() {
+                return mRatio;
+            }
+
+            /**
+             * Creates a split type in which the primary and secondary
+             * containers occupy equal portions of the parent window.
+             *
+             * Serves as the default {@link SplitType} if
+             * {@link SplitAttributes.Builder#setSplitType(SplitType)} is not
+             * specified.
+             *
+             * @return A {@code RatioSplitType} in which the activity containers
+             *     occupy equal portions of the parent window.
+             */
+            @NonNull
+            public static RatioSplitType splitEqually() {
+                return new RatioSplitType(0.5f);
+            }
+        }
+
+        /**
+         * A parent window split in which the split ratio conforms to the
+         * position of a hinge or separating fold in the device display.
+         *
+         * The split type is created only if:
+         * <ul>
+         *     <li>The host task is not in multi-window mode (e.g.,
+         *         split-screen mode or picture-in-picture mode)</li>
+         *     <li>The device has a hinge or separating fold reported by
+         *         [androidx.window.layout.FoldingFeature.isSeparating]</li>
+         *     <li>The hinge or separating fold orientation matches how the
+         *         parent bounds are split:
+         *         <ul>
+         *             <li>The hinge or fold orientation is vertical, and
+         *                 the task bounds are also split vertically
+         *                 (containers are side by side)</li>
+         *             <li>The hinge or fold orientation is horizontal, and
+         *                 the task bounds are also split horizontally
+         *                 (containers are top and bottom)</li>
+         *         </ul>
+         *     </li>
+         * </ul>
+         *
+         * Otherwise, the type falls back to the {@code SplitType} returned by
+         * {@link #getFallbackSplitType()}.
+         */
+        public static final class HingeSplitType extends SplitType {
+            @NonNull
+            private final SplitType mFallbackSplitType;
+
+            /**
+             * Creates an instance of this {@code HingeSplitType}.
+             *
+             * @param fallbackSplitType The split type to use if a split based
+             *     on the device hinge or separating fold cannot be determined.
+             *     Can be a {@link RatioSplitType} or
+             *     {@link ExpandContainersSplitType}.
+             */
+            public HingeSplitType(@NonNull SplitType fallbackSplitType) {
+                super("hinge, fallbackType=" + fallbackSplitType);
+                mFallbackSplitType = fallbackSplitType;
+            }
+
+            /**
+             * Returns the fallback {@link SplitType} if a split based on the
+             * device hinge or separating fold cannot be determined.
+             */
+            @NonNull
+            public SplitType getFallbackSplitType() {
+                return mFallbackSplitType;
+            }
+        }
+
+        /**
+         * A window split in which the primary and secondary activity containers
+         * each occupy the entire parent window.
+         *
+         * The secondary container overlays the primary container.
+         */
+        public static final class ExpandContainersSplitType extends SplitType {
+
+            /**
+             * Creates an instance of this {@code ExpandContainersSplitType}.
+             */
+            public ExpandContainersSplitType() {
+                super("expandContainers");
+            }
+        }
+    }
+
+    /**
+     * The layout direction of the primary and secondary activity containers.
+     */
+    public static final class LayoutDirection {
+
+        /**
+         * Specifies that the parent bounds are split vertically (side to side).
+         *
+         * Places the primary container in the left portion of the parent
+         * window, and the secondary container in the right portion.
+         *
+         * A possible return value of {@link SplitType#getLayoutDirection()}.
+         */
+         //
+         // -------------------------
+         // |           |           |
+         // |  Primary  | Secondary |
+         // |           |           |
+         // -------------------------
+         //
+         // Must match {@link LayoutDirection#LTR} for backwards compatibility
+         // with prior versions of Extensions.
+        public static final int LEFT_TO_RIGHT = 0;
+
+        /**
+         * Specifies that the parent bounds are split vertically (side to
+         * side).
+         *
+         * Places the primary container in the right portion of the parent
+         * window, and the secondary container in the left portion.
+         *
+         * A possible return value of {@link SplitType#getLayoutDirection()}.
+         */
+         // -------------------------
+         // |           |           |
+         // | Secondary |  Primary  |
+         // |           |           |
+         // -------------------------
+         //
+         // Must match {@link LayoutDirection#RTL} for backwards compatibility
+         // with prior versions of Extensions.
+        public static final int RIGHT_TO_LEFT = 1;
+
+        /**
+         * Specifies that the parent bounds are split vertically (side to side).
+         *
+         * The direction of the primary and secondary containers is deduced from
+         * the locale as either {@link #LEFT_TO_RIGHT} or
+         * {@link #RIGHT_TO_LEFT}.
+         *
+         * A possible return value of {@link SplitType#getLayoutDirection()}.
+         */
+         // Must match {@link LayoutDirection#LOCALE} for backwards
+         // compatibility with prior versions of Extensions.
+        public static final int LOCALE = 3;
+
+        /**
+         * Specifies that the parent bounds are split horizontally (top and
+         * bottom).
+         *
+         * Places the primary container in the top portion of the parent window,
+         * and the secondary container in the bottom portion.
+         *
+         * If the horizontal layout direction is not supported on the device,
+         * layout direction falls back to {@link #LOCALE}.
+         *
+         * A possible return value of {@link SplitType#getLayoutDirection()}.
+         */
+         // -------------
+         // |           |
+         // |  Primary  |
+         // |           |
+         // -------------
+         // |           |
+         // | Secondary |
+         // |           |
+         // -------------
+        public static final int TOP_TO_BOTTOM = 4;
+
+        /**
+         * Specifies that the parent bounds are split horizontally (top and
+         * bottom).
+         *
+         * Places the primary container in the bottom portion of the parent
+         * window, and the secondary container in the top portion.
+         *
+         * If the horizontal layout direction is not supported on the device,
+         * layout direction falls back to {@link #LOCALE}.
+         *
+         * A possible return value of {@link SplitType#getLayoutDirection()}.
+         */
+         // -------------
+         // |           |
+         // | Secondary |
+         // |           |
+         // -------------
+         // |           |
+         // |  Primary  |
+         // |           |
+         // -------------
+        public static final int BOTTOM_TO_TOP = 5;
+
+        private LayoutDirection() {}
+    }
+
+    @IntDef({LEFT_TO_RIGHT, RIGHT_TO_LEFT, LOCALE, TOP_TO_BOTTOM, BOTTOM_TO_TOP})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface ExtLayoutDirection {}
+
+    @ExtLayoutDirection
+    private final int mLayoutDirection;
+
+    private final SplitType mSplitType;
+
+    @ColorInt
+    private final int mAnimationBackgroundColor;
+
+    /**
+     * Creates an instance of this {@code SplitAttributes}.
+     *
+     * @param splitType The type of split. See
+     *     {@link SplitAttributes.SplitType}.
+     * @param layoutDirection The layout direction of the split, such as left to
+     *     right or top to bottom. See {@link SplitAttributes.LayoutDirection}.
+     * @param animationBackgroundColor The {@link ColorInt} to use for the
+     *     background color during animation of the split involving this
+     *     {@code SplitAttributes} object if the animation requires a
+     *     background.
+     */
+    SplitAttributes(@NonNull SplitType splitType, @ExtLayoutDirection int layoutDirection,
+            @ColorInt int animationBackgroundColor) {
+        mSplitType = splitType;
+        mLayoutDirection = layoutDirection;
+        mAnimationBackgroundColor = animationBackgroundColor;
+    }
+
+    /**
+     * Gets the layout direction of the split.
+     *
+     * @return The layout direction of the split.
+     */
+    @ExtLayoutDirection
+    public int getLayoutDirection() {
+        return mLayoutDirection;
+    }
+
+    /**
+     * Gets the split type.
+     *
+     * @return The split type.
+     */
+    @NonNull
+    public SplitType getSplitType() {
+        return mSplitType;
+    }
+
+    /**
+     * Gets the {@link ColorInt} to use for the background color during the
+     * animation of the split involving this {@code SplitAttributes} object.
+     *
+     * @return The animation background {@code ColorInt}.
+     */
+    @ColorInt
+    public int getAnimationBackgroundColor() {
+        return mAnimationBackgroundColor;
+    }
+
+    /**
+     * Builder for creating an instance of {@link SplitAttributes}.
+     *
+     * The default split type is an equal split between primary and secondary
+     * containers. The default layout direction is based on locale. The default
+     * animation background color is 0, which specifies the theme window
+     * background color.
+     */
+    public static final class Builder {
+        @NonNull
+        private SplitType mSplitType =  new SplitType.RatioSplitType(0.5f);
+        @ExtLayoutDirection
+        private int mLayoutDirection = LOCALE;
+
+        @ColorInt
+        private int mAnimationBackgroundColor = 0;
+
+        /**
+         * Sets the split type attribute.
+         *
+         * The default is an equal split between primary and secondary
+         * containers (see {@link SplitType.RatioSplitType#splitEqually()}).
+         *
+         * @param splitType The split type attribute.
+         * @return This {@code Builder}.
+         */
+        @NonNull
+        public Builder setSplitType(@NonNull SplitType splitType) {
+            mSplitType = splitType;
+            return this;
+        }
+
+        /**
+         * Sets the split layout direction attribute.
+         *
+         * The default is based on locale.
+         *
+         * Must be one of:
+         * <ul>
+         *     <li>{@link LayoutDirection#LOCALE}</li>
+         *     <li>{@link LayoutDirection#LEFT_TO_RIGHT}</li>
+         *     <li>{@link LayoutDirection#RIGHT_TO_LEFT}</li>
+         *     <li>{@link LayoutDirection#TOP_TO_BOTTOM}</li>
+         *     <li>{@link LayoutDirection#BOTTOM_TO_TOP}</li>
+         * </ul>
+         *
+         * @param layoutDirection The layout direction attribute.
+         * @return This {@code Builder}.
+         */
+        @SuppressLint("WrongConstant") // To be compat with android.util.LayoutDirection APIs
+        @NonNull
+        public Builder setLayoutDirection(@ExtLayoutDirection int layoutDirection) {
+            mLayoutDirection = layoutDirection;
+            return this;
+        }
+
+        /**
+         * Sets the {@link ColorInt} to use for the background during the
+         * animation of the split involving this {@code SplitAttributes} object
+         * if the animation requires a background.
+         *
+         * The default value is 0, which specifies the theme window background
+         * color.
+         *
+         * @param color A packed color int of the form {@code AARRGGBB} for the
+         *     animation background color.
+         * @return This {@code Builder}.
+         */
+        @NonNull
+        public Builder setAnimationBackgroundColor(@ColorInt int color) {
+            mAnimationBackgroundColor = color;
+            return this;
+        }
+
+        /**
+         * Builds a {@link SplitAttributes} instance with the attributes
+         * specified by {@link #setSplitType}, {@link #setLayoutDirection}, and
+         * {@link #setAnimationBackgroundColor}.
+         *
+         * @return The new {@code SplitAttributes} instance.
+         */
+        @NonNull
+        public SplitAttributes build() {
+            return new SplitAttributes(mSplitType, mLayoutDirection, mAnimationBackgroundColor);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        int result = mSplitType.hashCode();
+        result = result * 31 + mLayoutDirection;
+        result = result * 31 + mAnimationBackgroundColor;
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == this) {
+            return true;
+        }
+        if (!(other instanceof SplitAttributes)) {
+            return false;
+        }
+        final SplitAttributes otherAttributes = (SplitAttributes) other;
+        return mLayoutDirection == otherAttributes.mLayoutDirection
+                && mSplitType.equals(otherAttributes.mSplitType)
+                && mAnimationBackgroundColor == otherAttributes.mAnimationBackgroundColor;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return SplitAttributes.class.getSimpleName() + "{"
+                + "layoutDir=" + layoutDirectionToString()
+                + ", ratio=" + mSplitType
+                + ", animationBgColor=" + Integer.toHexString(mAnimationBackgroundColor)
+                + "}";
+    }
+
+    @NonNull
+    private String layoutDirectionToString() {
+        switch(mLayoutDirection) {
+            case LEFT_TO_RIGHT:
+                return "LEFT_TO_RIGHT";
+            case RIGHT_TO_LEFT:
+                return "RIGHT_TO_LEFT";
+            case LOCALE:
+                return "LOCALE";
+            case TOP_TO_BOTTOM:
+                return "TOP_TO_BOTTOM";
+            case BOTTOM_TO_TOP:
+                return "BOTTOM_TO_TOP";
+            default:
+                throw new IllegalArgumentException("Invalid layout direction:" + mLayoutDirection);
+        }
+    }
+}
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributesCalculatorParams.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributesCalculatorParams.java
new file mode 100644
index 0000000..ad7aa1b
--- /dev/null
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitAttributesCalculatorParams.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.extensions.embedding;
+
+import android.content.res.Configuration;
+import android.os.Build;
+import android.view.WindowMetrics;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.window.extensions.layout.WindowLayoutInfo;
+
+/**
+ * The parameter container used to report the current device and window state in
+ * {@link ActivityEmbeddingComponent#setSplitAttributesCalculator(
+ * androidx.window.extensions.core.util.function.Function)} and references the corresponding
+ * {@link SplitRule} by {@link #getSplitRuleTag()} if {@link SplitRule#getTag()} is specified.
+ *
+ * @see ActivityEmbeddingComponent#clearSplitAttributesCalculator()
+ * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+ */
+public class SplitAttributesCalculatorParams {
+    @NonNull
+    private final WindowMetrics mParentWindowMetrics;
+    @NonNull
+    private final Configuration mParentConfiguration;
+    @NonNull
+    private final WindowLayoutInfo mParentWindowLayoutInfo;
+    @NonNull
+    private final SplitAttributes mDefaultSplitAttributes;
+    private final boolean mAreDefaultConstraintsSatisfied;
+    @Nullable
+    private final String mSplitRuleTag;
+
+    /** Returns the parent container's {@link WindowMetrics} */
+    @NonNull
+    public WindowMetrics getParentWindowMetrics() {
+        return mParentWindowMetrics;
+    }
+
+    /** Returns the parent container's {@link Configuration} */
+    @NonNull
+    public Configuration getParentConfiguration() {
+        return new Configuration(mParentConfiguration);
+    }
+
+    /**
+     * Returns the {@link SplitRule#getDefaultSplitAttributes()}. It could be from
+     * {@link SplitRule} Builder APIs
+     * ({@link SplitPairRule.Builder#setDefaultSplitAttributes(SplitAttributes)} or
+     * {@link SplitPlaceholderRule.Builder#setDefaultSplitAttributes(SplitAttributes)}) or from
+     * the {@code splitRatio} and {@code splitLayoutDirection} attributes from static rule
+     * definitions.
+     */
+    @NonNull
+    public SplitAttributes getDefaultSplitAttributes() {
+        return mDefaultSplitAttributes;
+    }
+
+    /**
+     * Returns whether the {@link #getParentWindowMetrics()} satisfies the dimensions and aspect
+     * ratios requirements specified in the {@link androidx.window.embedding.SplitRule}, which
+     * are:
+     *  - {@link androidx.window.embedding.SplitRule#minWidthDp}
+     *  - {@link androidx.window.embedding.SplitRule#minHeightDp}
+     *  - {@link androidx.window.embedding.SplitRule#minSmallestWidthDp}
+     *  - {@link androidx.window.embedding.SplitRule#maxAspectRatioInPortrait}
+     *  - {@link androidx.window.embedding.SplitRule#maxAspectRatioInLandscape}
+     */
+    public boolean areDefaultConstraintsSatisfied() {
+        return mAreDefaultConstraintsSatisfied;
+    }
+
+    /** Returns the parent container's {@link WindowLayoutInfo} */
+    @NonNull
+    public WindowLayoutInfo getParentWindowLayoutInfo() {
+        return mParentWindowLayoutInfo;
+    }
+
+    /**
+     * Returns {@link SplitRule#getTag()} to apply the {@link SplitAttributes} result if it was
+     * set.
+     */
+    @Nullable
+    public String getSplitRuleTag() {
+        return mSplitRuleTag;
+    }
+
+    SplitAttributesCalculatorParams(
+            @NonNull WindowMetrics parentWindowMetrics,
+            @NonNull Configuration parentConfiguration,
+            @NonNull WindowLayoutInfo parentWindowLayoutInfo,
+            @NonNull SplitAttributes defaultSplitAttributes,
+            boolean areDefaultConstraintsSatisfied,
+            @Nullable String splitRuleTag
+    ) {
+        mParentWindowMetrics = parentWindowMetrics;
+        mParentConfiguration = parentConfiguration;
+        mParentWindowLayoutInfo = parentWindowLayoutInfo;
+        mDefaultSplitAttributes = defaultSplitAttributes;
+        mAreDefaultConstraintsSatisfied = areDefaultConstraintsSatisfied;
+        mSplitRuleTag = splitRuleTag;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + ":{"
+                + "windowMetrics=" + windowMetricsToString(mParentWindowMetrics)
+                + ", configuration=" + mParentConfiguration
+                + ", windowLayoutInfo=" + mParentWindowLayoutInfo
+                + ", defaultSplitAttributes=" + mDefaultSplitAttributes
+                + ", areDefaultConstraintsSatisfied=" + mAreDefaultConstraintsSatisfied
+                + ", tag=" + mSplitRuleTag + "}";
+    }
+
+    private static String windowMetricsToString(@NonNull WindowMetrics windowMetrics) {
+        // TODO(b/187712731): Use WindowMetrics#toString after it's implemented in U.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            return Api30Impl.windowMetricsToString(windowMetrics);
+        }
+        throw new UnsupportedOperationException("WindowMetrics didn't exist in R.");
+    }
+
+    @RequiresApi(30)
+    private static final class Api30Impl {
+        static String windowMetricsToString(@NonNull WindowMetrics windowMetrics) {
+            return WindowMetrics.class.getSimpleName() + ":{"
+                    + "bounds=" + windowMetrics.getBounds()
+                    + ", windowInsets=" + windowMetrics.getWindowInsets()
+                    + "}";
+        }
+    }
+}
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java
index cfd8b1a..9b1b24f 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java
@@ -17,6 +17,8 @@
 package androidx.window.extensions.embedding;
 
 import androidx.annotation.NonNull;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.embedding.SplitAttributes.SplitType;
 
 /** Describes a split of two containers with activities. */
 public class SplitInfo {
@@ -24,13 +26,15 @@
     private final ActivityStack mPrimaryActivityStack;
     @NonNull
     private final ActivityStack mSecondaryActivityStack;
-    private final float mSplitRatio;
+    @NonNull
+    private final SplitAttributes mSplitAttributes;
 
-    public SplitInfo(@NonNull ActivityStack primaryActivityStack,
-            @NonNull ActivityStack secondaryActivityStack, float splitRatio) {
+    SplitInfo(@NonNull ActivityStack primaryActivityStack,
+            @NonNull ActivityStack secondaryActivityStack,
+            @NonNull SplitAttributes splitAttributes) {
         mPrimaryActivityStack = primaryActivityStack;
         mSecondaryActivityStack = secondaryActivityStack;
-        mSplitRatio = splitRatio;
+        mSplitAttributes = splitAttributes;
     }
 
     @NonNull
@@ -43,8 +47,28 @@
         return mSecondaryActivityStack;
     }
 
+    /**
+     * @deprecated Use {@link #getSplitAttributes()} starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if {@link #getSplitAttributes()}
+     * can't be called on {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+     */
+    @Deprecated
     public float getSplitRatio() {
-        return mSplitRatio;
+        final SplitType splitType = mSplitAttributes.getSplitType();
+        if (splitType instanceof SplitType.RatioSplitType) {
+            return ((SplitType.RatioSplitType) splitType).getRatio();
+        } else { // Fallback to use 0.0 because the WM Jetpack may not support HingeSplitType.
+            return 0.0f;
+        }
+    }
+
+    /**
+     * Returns the {@link SplitAttributes} of this split.
+     * since {@link androidx.window.extensions.WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @NonNull
+    public SplitAttributes getSplitAttributes() {
+        return mSplitAttributes;
     }
 
     @Override
@@ -52,7 +76,7 @@
         if (this == o) return true;
         if (!(o instanceof SplitInfo)) return false;
         SplitInfo that = (SplitInfo) o;
-        return Float.compare(that.mSplitRatio, mSplitRatio) == 0 && mPrimaryActivityStack.equals(
+        return mSplitAttributes.equals(that.mSplitAttributes) && mPrimaryActivityStack.equals(
                 that.mPrimaryActivityStack) && mSecondaryActivityStack.equals(
                 that.mSecondaryActivityStack);
     }
@@ -61,7 +85,7 @@
     public int hashCode() {
         int result = mPrimaryActivityStack.hashCode();
         result = result * 31 + mSecondaryActivityStack.hashCode();
-        result = result * 31 + (int) (mSplitRatio * 17);
+        result = result * 31 + mSplitAttributes.hashCode();
         return result;
     }
 
@@ -71,7 +95,7 @@
         return "SplitInfo{"
                 + "mPrimaryActivityStack=" + mPrimaryActivityStack
                 + ", mSecondaryActivityStack=" + mSecondaryActivityStack
-                + ", mSplitRatio=" + mSplitRatio
+                + ", mSplitAttributes=" + mSplitAttributes
                 + '}';
     }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java
index d2e5209..1140790 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java
@@ -16,6 +16,8 @@
 
 package androidx.window.extensions.embedding;
 
+import static androidx.window.extensions.embedding.SplitAttributes.SplitType.createSplitTypeFromLegacySplitRatio;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Intent;
@@ -23,10 +25,14 @@
 import android.util.Pair;
 import android.view.WindowMetrics;
 
+import androidx.annotation.FloatRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Predicate;
 
-import java.util.function.Predicate;
+import java.util.Objects;
 
 /**
  * Split configuration rules for activity pairs.
@@ -42,13 +48,14 @@
     private final int mFinishSecondaryWithPrimary;
     private final boolean mClearTop;
 
-    SplitPairRule(float splitRatio, @LayoutDirection int layoutDirection,
+    SplitPairRule(@NonNull SplitAttributes defaultSplitAttributes,
             @SplitFinishBehavior int finishPrimaryWithSecondary,
             @SplitFinishBehavior int finishSecondaryWithPrimary, boolean clearTop,
             @NonNull Predicate<Pair<Activity, Activity>> activityPairPredicate,
             @NonNull Predicate<Pair<Activity, Intent>> activityIntentPredicate,
-            @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
-        super(parentWindowMetricsPredicate, splitRatio, layoutDirection);
+            @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate,
+            @Nullable String tag) {
+        super(parentWindowMetricsPredicate, defaultSplitAttributes, tag);
         mActivityPairPredicate = activityPairPredicate;
         mActivityIntentPredicate = activityIntentPredicate;
         mFinishPrimaryWithSecondary = finishPrimaryWithSecondary;
@@ -114,15 +121,52 @@
         private final Predicate<Pair<Activity, Intent>> mActivityIntentPredicate;
         @NonNull
         private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
+        // Keep for backward compatibility
+        @FloatRange(from = 0.0, to = 1.0)
         private float mSplitRatio;
-        @LayoutDirection
+        // Keep for backward compatibility
+        @SplitAttributes.ExtLayoutDirection
         private int mLayoutDirection;
+        private SplitAttributes mDefaultSplitAttributes;
         private boolean mClearTop;
         @SplitFinishBehavior
         private int mFinishPrimaryWithSecondary;
         @SplitFinishBehavior
         private int mFinishSecondaryWithPrimary;
+        @Nullable
+        private String mTag;
 
+        /**
+         * @deprecated Use {@link #Builder(Predicate, Predicate, Predicate)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #Builder(Predicate, Predicate, Predicate)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+         */
+        @Deprecated
+        @RequiresApi(Build.VERSION_CODES.N)
+        public Builder(@NonNull java.util.function.Predicate<Pair<Activity, Activity>>
+                        activityPairPredicate,
+                @NonNull java.util.function.Predicate<Pair<Activity, Intent>>
+                        activityIntentPredicate,
+                @NonNull java.util.function.Predicate<WindowMetrics>
+                        parentWindowMetricsPredicate) {
+            mActivityPairPredicate = activityPairPredicate::test;
+            mActivityIntentPredicate = activityIntentPredicate::test;
+            mParentWindowMetricsPredicate = parentWindowMetricsPredicate::test;
+        }
+
+        /**
+         * The {@link SplitPairRule} builder constructor
+         *
+         * @param activityPairPredicate the {@link Predicate} to verify if an {@link Activity} pair
+         *                              matches this rule
+         * @param activityIntentPredicate the {@link Predicate} to verify if an ({@link Activity},
+         *                              {@link Intent}) pair matches this rule
+         * @param parentWindowMetricsPredicate the {@link Predicate} to verify if the matched split
+         *                               pair is allowed to show adjacent to each other with the
+         *                               given parent {@link WindowMetrics}
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
         public Builder(@NonNull Predicate<Pair<Activity, Activity>> activityPairPredicate,
                 @NonNull Predicate<Pair<Activity, Intent>> activityIntentPredicate,
                 @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
@@ -131,20 +175,48 @@
             mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
         }
 
-        /** @see SplitRule#getSplitRatio() */
+        /**
+         * @deprecated Use {@link #setDefaultSplitAttributes(SplitAttributes)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #setDefaultSplitAttributes(SplitAttributes)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}. {@code splitRatio} will be translated to
+         * {@link SplitAttributes.SplitType.ExpandContainersSplitType} for value {@code 0.0} and
+         * {@code 1.0}, and {@link SplitAttributes.SplitType.RatioSplitType} for value with range
+         * (0.0, 1.0).
+         */
+        @Deprecated
         @NonNull
-        public Builder setSplitRatio(float splitRatio) {
+        public Builder setSplitRatio(@FloatRange(from = 0.0, to = 1.0) float splitRatio) {
             mSplitRatio = splitRatio;
             return this;
         }
 
-        /** @see SplitRule#getLayoutDirection() */
+        /**
+         * @deprecated Use {@link #setDefaultSplitAttributes(SplitAttributes)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #setDefaultSplitAttributes(SplitAttributes)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+         */
+        @Deprecated
         @NonNull
-        public Builder setLayoutDirection(@LayoutDirection int layoutDirection) {
+        public Builder setLayoutDirection(@SplitAttributes.ExtLayoutDirection int layoutDirection) {
             mLayoutDirection = layoutDirection;
             return this;
         }
 
+        /**
+         * See {@link SplitPairRule#getDefaultSplitAttributes()} for reference.
+         * Overrides values if set in {@link #setSplitRatio(float)} and
+         * {@link #setLayoutDirection(int)}
+         *
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
+        @NonNull
+        public Builder setDefaultSplitAttributes(@NonNull SplitAttributes attrs) {
+            mDefaultSplitAttributes = attrs;
+            return this;
+        }
+
         /** @deprecated To be removed with next developer preview. */
         @Deprecated
         @NonNull
@@ -181,13 +253,31 @@
             return this;
         }
 
+        /**
+         * @see SplitPairRule#getTag()
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
+        @NonNull
+        public Builder setTag(@NonNull String tag) {
+            mTag = Objects.requireNonNull(tag);
+            return this;
+        }
+
         /** Builds a new instance of {@link SplitPairRule}. */
         @NonNull
         public SplitPairRule build() {
-            return new SplitPairRule(mSplitRatio, mLayoutDirection,
+            // To provide compatibility with prior version of WM Jetpack library, where
+            // #setDefaultAttributes hasn't yet been supported and thus would not be set.
+            mDefaultSplitAttributes = (mDefaultSplitAttributes != null)
+                    ? mDefaultSplitAttributes
+                    : new SplitAttributes.Builder()
+                            .setSplitType(createSplitTypeFromLegacySplitRatio(mSplitRatio))
+                            .setLayoutDirection(mLayoutDirection)
+                            .build();
+            return new SplitPairRule(mDefaultSplitAttributes,
                     mFinishPrimaryWithSecondary, mFinishSecondaryWithPrimary,
                     mClearTop, mActivityPairPredicate, mActivityIntentPredicate,
-                    mParentWindowMetricsPredicate);
+                    mParentWindowMetricsPredicate, mTag);
         }
     }
 
@@ -219,7 +309,9 @@
     @Override
     public String toString() {
         return "SplitPairRule{"
-                + "mFinishPrimaryWithSecondary=" + mFinishPrimaryWithSecondary
+                + "mTag=" + getTag()
+                + ", mDefaultSplitAttributes=" + getDefaultSplitAttributes()
+                + ", mFinishPrimaryWithSecondary=" + mFinishPrimaryWithSecondary
                 + ", mFinishSecondaryWithPrimary=" + mFinishSecondaryWithPrimary
                 + ", mClearTop=" + mClearTop
                 + '}';
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java
index 7b30849..e6cfed8 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java
@@ -16,19 +16,25 @@
 
 package androidx.window.extensions.embedding;
 
+import static androidx.window.extensions.embedding.SplitAttributes.SplitType.createSplitTypeFromLegacySplitRatio;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Build;
 import android.view.WindowMetrics;
 
+import androidx.annotation.FloatRange;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Predicate;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.function.Predicate;
+import java.util.Objects;
 
 /**
  * Split configuration rules for split placeholders - activities used to occupy additional
@@ -58,12 +64,14 @@
     private final int mFinishPrimaryWithPlaceholder;
 
     SplitPlaceholderRule(@NonNull Intent placeholderIntent,
-            float splitRatio, @LayoutDirection int layoutDirection, boolean isSticky,
+            @NonNull SplitAttributes defaultSplitAttributes,
+            boolean isSticky,
             @SplitPlaceholderFinishBehavior int finishPrimaryWithPlaceholder,
             @NonNull Predicate<Activity> activityPredicate,
             @NonNull Predicate<Intent> intentPredicate,
-            @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
-        super(parentWindowMetricsPredicate, splitRatio, layoutDirection);
+            @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate,
+            @Nullable String tag) {
+        super(parentWindowMetricsPredicate, defaultSplitAttributes, tag);
         mIsSticky = isSticky;
         mFinishPrimaryWithPlaceholder = finishPrimaryWithPlaceholder;
         mActivityPredicate = activityPredicate;
@@ -106,7 +114,10 @@
     }
 
     /**
-     * @deprecated Use {@link #getFinishPrimaryWithPlaceholder()} instead.
+     * @deprecated Use {@link #getFinishPrimaryWithPlaceholder()} instead starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #getFinishPrimaryWithPlaceholder()} can't be called on
+     * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
      */
     @Deprecated
     @SplitPlaceholderFinishBehavior
@@ -117,8 +128,10 @@
     /**
      * Determines what happens with the primary container when all activities are finished in the
      * associated secondary/placeholder container.
-     * TODO(b/238905747): Add api guard for extensions.
+     *
+     * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
      */
+    // TODO(b/238905747): Add api guard for extensions.
     @SplitPlaceholderFinishBehavior
     public int getFinishPrimaryWithPlaceholder() {
         return mFinishPrimaryWithPlaceholder;
@@ -136,13 +149,51 @@
         private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
         @NonNull
         private final Intent mPlaceholderIntent;
+        // Keep for backward compatibility
+        @FloatRange(from = 0.0, to = 1.0)
         private float mSplitRatio;
-        @LayoutDirection
+        // Keep for backward compatibility
+        @SplitAttributes.ExtLayoutDirection
         private int mLayoutDirection;
+        private SplitAttributes mDefaultSplitAttributes;
         private boolean mIsSticky = false;
         @SplitPlaceholderFinishBehavior
         private int mFinishPrimaryWithPlaceholder = FINISH_ALWAYS;
+        @Nullable
+        private String mTag;
 
+        /**
+         * @deprecated Use {@link #Builder(Intent, Predicate, Predicate, Predicate)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #Builder(Intent, Predicate, Predicate, Predicate)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+         */
+        @Deprecated
+        @RequiresApi(Build.VERSION_CODES.N)
+        public Builder(@NonNull Intent placeholderIntent,
+                @NonNull java.util.function.Predicate<Activity> activityPredicate,
+                @NonNull java.util.function.Predicate<Intent> intentPredicate,
+                @NonNull java.util.function.Predicate<WindowMetrics> parentWindowMetricsPredicate) {
+            mActivityPredicate = activityPredicate::test;
+            mIntentPredicate = intentPredicate::test;
+            mPlaceholderIntent = placeholderIntent;
+            mParentWindowMetricsPredicate = parentWindowMetricsPredicate::test;
+        }
+
+        /**
+         * The {@link SplitPlaceholderRule} Builder constructor
+         * @param placeholderIntent the placeholder activity to launch if
+         *                         {@link SplitPlaceholderRule#checkParentMetrics(WindowMetrics)}
+         *                         is satisfied
+         * @param activityPredicate the {@link Predicate} to verify if a given {@link Activity}
+         *                         matches the rule
+         * @param intentPredicate the {@link Predicate} to verify if a given {@link Intent}
+         *                         matches the rule
+         * @param parentWindowMetricsPredicate the {@link Predicate} to verify if the placeholder
+         *                                     {@link Activity} should be launched with the given
+         *                                     {@link WindowMetrics}
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
         public Builder(@NonNull Intent placeholderIntent,
                 @NonNull Predicate<Activity> activityPredicate,
                 @NonNull Predicate<Intent> intentPredicate,
@@ -153,20 +204,48 @@
             mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
         }
 
-        /** @see SplitRule#getSplitRatio() */
+        /**
+         * @deprecated Use {@link #setDefaultSplitAttributes(SplitAttributes)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #setDefaultSplitAttributes(SplitAttributes)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}. {@code splitRatio} will be translated to
+         * @link SplitAttributes.SplitType.ExpandContainersSplitType} for value
+         * {@code 0.0} and {@code 1.0}, and {@link SplitAttributes.SplitType.RatioSplitType} for
+         * value with range (0.0, 1.0).
+         */
+        @Deprecated
         @NonNull
-        public Builder setSplitRatio(float splitRatio) {
+        public Builder setSplitRatio(@FloatRange(from = 0.0, to = 1.0) float splitRatio) {
             mSplitRatio = splitRatio;
             return this;
         }
 
-        /** @see SplitRule#getLayoutDirection() */
+        /**
+         * @deprecated Use {@link #setDefaultSplitAttributes(SplitAttributes)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+         * {@link #setDefaultSplitAttributes(SplitAttributes)} can't be called on
+         * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+         */
+        @Deprecated
         @NonNull
-        public Builder setLayoutDirection(@LayoutDirection int layoutDirection) {
+        public Builder setLayoutDirection(@SplitAttributes.ExtLayoutDirection int layoutDirection) {
             mLayoutDirection = layoutDirection;
             return this;
         }
 
+        /**
+         * See {@link SplitPlaceholderRule#getDefaultSplitAttributes()} for reference.
+         * Overrides values if set in {@link #setSplitRatio(float)} and
+         * {@link #setLayoutDirection(int)}
+         *
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
+        @NonNull
+        public Builder setDefaultSplitAttributes(@NonNull SplitAttributes attrs) {
+            mDefaultSplitAttributes = attrs;
+            return this;
+        }
+
         /** @see SplitPlaceholderRule#isSticky() */
         @NonNull
         public Builder setSticky(boolean sticky) {
@@ -175,7 +254,8 @@
         }
 
         /**
-         * @deprecated Use SplitPlaceholderRule#setFinishPrimaryWithPlaceholder(int)} instead.
+         * @deprecated Use SplitPlaceholderRule#setFinishPrimaryWithPlaceholder(int)} starting with
+         * {@link WindowExtensions#VENDOR_API_LEVEL_2}.
          */
         @Deprecated
         @NonNull
@@ -189,8 +269,9 @@
 
         /**
          * @see SplitPlaceholderRule#getFinishPrimaryWithPlaceholder()
-         * TODO(b/238905747): Add api guard for extensions.
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
          */
+        // TODO(b/238905747): Add api guard for extensions.
         @NonNull
         public Builder setFinishPrimaryWithPlaceholder(
                 @SplitPlaceholderFinishBehavior int finishBehavior) {
@@ -198,12 +279,30 @@
             return this;
         }
 
+        /**
+         * @see SplitPlaceholderRule#getTag()
+         * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+         */
+        @NonNull
+        public Builder setTag(@NonNull String tag) {
+            mTag = Objects.requireNonNull(tag);
+            return this;
+        }
+
         /** Builds a new instance of {@link SplitPlaceholderRule}. */
         @NonNull
         public SplitPlaceholderRule build() {
-            return new SplitPlaceholderRule(mPlaceholderIntent, mSplitRatio,
-                    mLayoutDirection, mIsSticky, mFinishPrimaryWithPlaceholder, mActivityPredicate,
-                    mIntentPredicate, mParentWindowMetricsPredicate);
+            // To provide compatibility with prior version of WM Jetpack library, where
+            // #setDefaultAttributes hasn't yet been supported and thus would not be set.
+            mDefaultSplitAttributes = (mDefaultSplitAttributes != null)
+                    ? mDefaultSplitAttributes
+                    : new SplitAttributes.Builder()
+                            .setSplitType(createSplitTypeFromLegacySplitRatio(mSplitRatio))
+                            .setLayoutDirection(mLayoutDirection)
+                            .build();
+            return new SplitPlaceholderRule(mPlaceholderIntent, mDefaultSplitAttributes, mIsSticky,
+                    mFinishPrimaryWithPlaceholder, mActivityPredicate,
+                    mIntentPredicate, mParentWindowMetricsPredicate, mTag);
         }
     }
 
@@ -237,7 +336,9 @@
     @Override
     public String toString() {
         return "SplitPlaceholderRule{"
-                + "mActivityPredicate=" + mActivityPredicate
+                + "mTag=" + getTag()
+                + ", mDefaultSplitAttributes=" + getDefaultSplitAttributes()
+                + ", mActivityPredicate=" + mActivityPredicate
                 + ", mIsSticky=" + mIsSticky
                 + ", mFinishPrimaryWithPlaceholder=" + mFinishPrimaryWithPlaceholder
                 + '}';
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java
index bb24318..171df7b 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java
@@ -16,39 +16,36 @@
 
 package androidx.window.extensions.embedding;
 
-import static android.util.LayoutDirection.LOCALE;
-import static android.util.LayoutDirection.LTR;
-import static android.util.LayoutDirection.RTL;
-
 import android.annotation.SuppressLint;
 import android.os.Build;
 import android.view.WindowMetrics;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.window.extensions.WindowExtensions;
+import androidx.window.extensions.core.util.function.Predicate;
+import androidx.window.extensions.embedding.SplitAttributes.SplitType;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.function.Predicate;
+import java.util.Objects;
 
 /**
  * Split configuration rules for activities that are launched to side in a split. Define when an
  * activity that was launched in a side container from another activity should be shown
- * side-by-side or on top of it, as well as the visual properties of the split. Can be applied to
+ * adjacent or on top of it, as well as the visual properties of the split. Can be applied to
  * new activities started from the same process automatically by the embedding implementation on
  * the device.
  */
 public abstract class SplitRule extends EmbeddingRule {
     @NonNull
     private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
-    private final float mSplitRatio;
-    @LayoutDirection
-    private final int mLayoutDirection;
 
-    @IntDef({LTR, RTL, LOCALE})
-    @Retention(RetentionPolicy.SOURCE)
-    @interface LayoutDirection {}
+    @NonNull
+    private final SplitAttributes mDefaultSplitAttributes;
+
     /**
      * Never finish the associated container.
      * @see SplitFinishBehavior
@@ -60,9 +57,8 @@
      */
     public static final int FINISH_ALWAYS = 1;
     /**
-     * Only finish the associated container when displayed side-by-side/adjacent to the one
-     * being finished. Does not finish the associated one when containers are stacked on top of
-     * each other.
+     * Only finish the associated container when displayed adjacent to the one being finished. Does
+     * not finish the associated one when containers are stacked on top of each other.
      * @see SplitFinishBehavior
      */
     public static final int FINISH_ADJACENT = 2;
@@ -73,7 +69,7 @@
      * <p>
      * For example, given that {@link SplitPairRule#getFinishPrimaryWithSecondary()} is
      * {@link #FINISH_ADJACENT} and secondary container finishes. The primary associated
-     * container is finished if it's side-by-side with secondary container. The primary
+     * container is finished if it's shown adjacent to the secondary container. The primary
      * associated container is not finished if it occupies entire task bounds.</p>
      *
      * @see SplitPairRule#getFinishPrimaryWithSecondary()
@@ -88,15 +84,24 @@
     @Retention(RetentionPolicy.SOURCE)
     @interface SplitFinishBehavior {}
 
-    SplitRule(@NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate, float splitRatio,
-            @LayoutDirection int layoutDirection) {
+    SplitRule(@NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate,
+            @NonNull SplitAttributes defaultSplitAttributes, @Nullable String tag) {
+        super(tag);
         mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
-        mSplitRatio = splitRatio;
-        mLayoutDirection = layoutDirection;
+        mDefaultSplitAttributes = defaultSplitAttributes;
     }
 
     /**
-     * Verifies if the provided parent bounds allow to show the split containers side by side.
+     * Checks whether the parent window satisfied the dimensions and aspect ratios requirements
+     * specified in the {@link androidx.window.embedding.SplitRule}, which are
+     * {@link androidx.window.embedding.SplitRule#minWidthDp},
+     * {@link androidx.window.embedding.SplitRule#minHeightDp},
+     * {@link androidx.window.embedding.SplitRule#minSmallestWidthDp},
+     * {@link androidx.window.embedding.SplitRule#maxAspectRatioInPortrait} and
+     * {@link androidx.window.embedding.SplitRule#maxAspectRatioInLandscape}.
+     *
+     * @param parentMetrics the {@link WindowMetrics} of the parent window.
+     * @return whether the parent window satisfied the {@link SplitRule} requirements.
      */
     @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
     @RequiresApi(api = Build.VERSION_CODES.N)
@@ -104,13 +109,43 @@
         return mParentWindowMetricsPredicate.test(parentMetrics);
     }
 
+    /**
+     * @deprecated Use {@link #getDefaultSplitAttributes()} instead starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #getDefaultSplitAttributes()} can't be called on
+     * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+     */
+    @Deprecated
     public float getSplitRatio() {
-        return mSplitRatio;
+        final SplitType splitType = mDefaultSplitAttributes.getSplitType();
+        if (splitType instanceof SplitType.RatioSplitType) {
+            return ((SplitType.RatioSplitType) splitType).getRatio();
+        } else { // Fallback to use 0.0 because the WM Jetpack may not support HingeSplitType.
+            return 0.0f;
+        }
     }
 
-    @LayoutDirection
+    /**
+     * @deprecated Use {@link #getDefaultSplitAttributes()} instead starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #getDefaultSplitAttributes()} can't be called on
+     * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+     */
+    @Deprecated
+    @SplitAttributes.ExtLayoutDirection
     public int getLayoutDirection() {
-        return mLayoutDirection;
+        return mDefaultSplitAttributes.getLayoutDirection();
+    }
+
+    /**
+     * Returns the default {@link SplitAttributes} which is applied if
+     * {@link #checkParentMetrics(WindowMetrics)} is {@code true}.
+     *
+     * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @NonNull
+    public SplitAttributes getDefaultSplitAttributes() {
+        return mDefaultSplitAttributes;
     }
 
     @Override
@@ -118,16 +153,16 @@
         if (this == o) return true;
         if (!(o instanceof SplitRule)) return false;
         SplitRule that = (SplitRule) o;
-        return Float.compare(that.mSplitRatio, mSplitRatio) == 0
-                && mParentWindowMetricsPredicate.equals(that.mParentWindowMetricsPredicate)
-                && mLayoutDirection == that.mLayoutDirection;
+        return super.equals(that)
+                && mDefaultSplitAttributes.equals(that.mDefaultSplitAttributes)
+                && mParentWindowMetricsPredicate.equals(that.mParentWindowMetricsPredicate);
     }
 
     @Override
     public int hashCode() {
-        int result = (int) (mSplitRatio * 17);
+        int result = super.hashCode();
         result = 31 * result + mParentWindowMetricsPredicate.hashCode();
-        result = 31 * result + mLayoutDirection;
+        result = 31 * result + Objects.hashCode(mDefaultSplitAttributes);
         return result;
     }
 
@@ -135,8 +170,8 @@
     @Override
     public String toString() {
         return "SplitRule{"
-                + "mSplitRatio=" + mSplitRatio
-                + ", mLayoutDirection=" + mLayoutDirection
+                + "mTag=" + getTag()
+                + ", mDefaultSplitAttributes=" + mDefaultSplitAttributes
                 + '}';
     }
 }
diff --git a/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java b/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
index 3b6dd1a..d24f981 100644
--- a/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
+++ b/window/extensions/extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
@@ -17,18 +17,19 @@
 package androidx.window.extensions.layout;
 
 import android.app.Activity;
+import android.content.Context;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.UiContext;
 import androidx.window.extensions.WindowExtensions;
-
-import java.util.function.Consumer;
+import androidx.window.extensions.core.util.function.Consumer;
 
 /**
  * The interface definition that will be used by the WindowManager library to get custom
  * OEM-provided information about the window that isn't covered by platform APIs. Exposes methods
  * to listen to changes in the {@link WindowLayoutInfo}. A {@link WindowLayoutInfo} contains a list
  * of {@link DisplayFeature}s.
- *
+ * <p>
  * Currently {@link FoldingFeature} is the only {@link DisplayFeature}. A {@link FoldingFeature}
  * exposes the state of a hinge and the relative bounds within the window. Developers can
  * optimize their UI to support a {@link FoldingFeature} by avoiding it and placing content in
@@ -38,19 +39,70 @@
  * @see WindowExtensions#getWindowLayoutComponent()
  */
 public interface WindowLayoutComponent {
+    /**
+     * @deprecated Use {@link #addWindowLayoutInfoListener(Context,Consumer)}
+     * starting with {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #addWindowLayoutInfoListener(Context, Consumer)} can't be
+     * called on {@link WindowExtensions#VENDOR_API_LEVEL_1}.
+     */
+    @Deprecated
+    void addWindowLayoutInfoListener(@NonNull Activity activity,
+            @NonNull java.util.function.Consumer<WindowLayoutInfo> consumer);
 
     /**
-     * Adds a listener interested in receiving updates to {@link WindowLayoutInfo}
-     * @param activity hosting a {@link android.view.Window}
-     * @param consumer interested in receiving updates to {@link WindowLayoutInfo}
+     * @deprecated Use {@link #removeWindowLayoutInfoListener(Consumer)} starting with
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}. Only used if
+     * {@link #removeWindowLayoutInfoListener(Consumer)} can't be called on
+     * {@link WindowExtensions#VENDOR_API_LEVEL_1}.
      */
-    void addWindowLayoutInfoListener(@NonNull Activity activity,
-            @NonNull Consumer<WindowLayoutInfo> consumer);
+    @Deprecated
+    void removeWindowLayoutInfoListener(
+            @NonNull java.util.function.Consumer<WindowLayoutInfo> consumer);
+
+    // TODO(b/264546746): Remove addWindowLayoutInfoListener(Context, java.util.function.Consumer)
+    //  after apps update to the latest WM Jetpack library.
+    /** @deprecated Use {@link #addWindowLayoutInfoListener(Context, Consumer)} instead */
+    @SuppressWarnings("PairedRegistration")
+    // The paired method for unregistering is also removeWindowLayoutInfoListener.
+    @Deprecated
+    default void addWindowLayoutInfoListener(@NonNull @UiContext Context context,
+            @NonNull java.util.function.Consumer<WindowLayoutInfo> consumer) {
+        throw new UnsupportedOperationException("This method must not be called unless there is a"
+                + " corresponding override implementation on the device.");
+    }
+
+    /**
+     * Adds a listener interested in receiving updates to {@link WindowLayoutInfo}.
+     * Use {@link WindowLayoutComponent#removeWindowLayoutInfoListener} to remove listener.
+     * <p>
+     * A {@link Context} or a Consumer instance can only be registered once.
+     * Registering the same {@link Context} or Consumer more than once will result in
+     * a noop.
+     *
+     * @param context a {@link UiContext} that corresponds to a window or an area on the
+     *                      screen - an {@link Activity}, a {@link Context} created with
+     *                      {@link Context#createWindowContext(Display, int , Bundle)}, or
+     *                      {@link android.inputmethodservice.InputMethodService}.
+     * @param consumer interested in receiving updates to {@link WindowLayoutInfo}
+     * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    // TODO(b/238905747): Add api guard for extensions.
+    @SuppressWarnings("PairedRegistration")
+    // The paired method for unregistering is also removeWindowLayoutInfoListener.
+    default void addWindowLayoutInfoListener(@NonNull @UiContext Context context,
+            @NonNull Consumer<WindowLayoutInfo> consumer) {
+        throw new UnsupportedOperationException("This method must not be called unless there is a"
+                + " corresponding override implementation on the device.");
+    }
 
     /**
      * Removes a listener no longer interested in receiving updates.
+     *
      * @param consumer no longer interested in receiving updates to {@link WindowLayoutInfo}
+     * since {@link WindowExtensions#VENDOR_API_LEVEL_2}
      */
-    void removeWindowLayoutInfoListener(
-            @NonNull Consumer<WindowLayoutInfo> consumer);
+    default void removeWindowLayoutInfoListener(@NonNull Consumer<WindowLayoutInfo> consumer) {
+        throw new UnsupportedOperationException("This method must not be called unless there is a"
+                + " corresponding override implementation on the device.");
+    }
 }
diff --git a/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java
new file mode 100644
index 0000000..76a1107
--- /dev/null
+++ b/window/extensions/extensions/src/test/java/androidx/window/extensions/embedding/SplitAttributesTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.extensions.embedding;
+
+import static androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType.splitEqually;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.graphics.Color;
+
+import androidx.test.filters.SmallTest;
+import androidx.window.extensions.embedding.SplitAttributes.LayoutDirection;
+
+import org.junit.Test;
+
+/** Test for {@link SplitAttributes} */
+@SmallTest
+public class SplitAttributesTest {
+    @Test
+    public void testSplitAttributesEquals() {
+        final SplitAttributes layout1 = new SplitAttributes.Builder()
+                .setSplitType(splitEqually())
+                .setLayoutDirection(LayoutDirection.LOCALE)
+                .setAnimationBackgroundColor(0)
+                .build();
+        final SplitAttributes layout2 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.LOCALE)
+                .setAnimationBackgroundColor(0)
+                .build();
+        final SplitAttributes layout3 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(0)
+                .build();
+        final SplitAttributes layout4 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(Color.BLUE)
+                .build();
+        final SplitAttributes layout5 = new SplitAttributes.Builder()
+                .setSplitType(new SplitAttributes.SplitType.HingeSplitType(splitEqually()))
+                .setLayoutDirection(LayoutDirection.TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(Color.BLUE)
+                .build();
+
+        assertNotEquals(layout1, layout2);
+        assertNotEquals(layout1.hashCode(), layout2.hashCode());
+
+        assertNotEquals(layout2, layout3);
+        assertNotEquals(layout2.hashCode(), layout3.hashCode());
+
+        assertNotEquals(layout3, layout1);
+        assertNotEquals(layout3.hashCode(), layout1.hashCode());
+
+        assertNotEquals(layout4, layout3);
+        assertNotEquals(layout4.hashCode(), layout3.hashCode());
+
+        assertEquals(layout4, layout5);
+        assertEquals(layout4.hashCode(), layout5.hashCode());
+    }
+
+    @Test
+    public void testSplitTypeEquals() {
+        final SplitAttributes.SplitType[] splitTypes = new SplitAttributes.SplitType[]{
+                new SplitAttributes.SplitType.ExpandContainersSplitType(),
+                new SplitAttributes.SplitType.RatioSplitType(0.3f),
+                splitEqually(),
+                new SplitAttributes.SplitType.HingeSplitType(splitEqually()),
+                new SplitAttributes.SplitType.HingeSplitType(
+                        new SplitAttributes.SplitType.ExpandContainersSplitType()
+                ),
+        };
+
+        for (int i = 0; i < splitTypes.length; i++) {
+            for (int j = 0; j < splitTypes.length; j++) {
+                final SplitAttributes.SplitType splitType0 = splitTypes[i];
+                final SplitAttributes.SplitType splitType1 = splitTypes[j];
+                if (i == j) {
+                    assertEquals(splitType0, splitType1);
+                    assertEquals(splitType0.hashCode(), splitType1.hashCode());
+                } else {
+                    assertNotEquals(splitType0, splitType1);
+                    assertNotEquals(splitType0.hashCode(), splitType1.hashCode());
+                }
+            }
+        }
+    }
+}
diff --git a/window/window-demos/demo-common/build.gradle b/window/window-demos/demo-common/build.gradle
new file mode 100644
index 0000000..fd30ac1
--- /dev/null
+++ b/window/window-demos/demo-common/build.gradle
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 23
+    }
+    buildFeatures {
+        viewBinding true
+    }
+    namespace "androidx.window.demo.common"
+}
+
+dependencies {
+    implementation("androidx.appcompat:appcompat:1.2.0")
+    implementation("androidx.core:core-ktx:1.3.2")
+    implementation("androidx.activity:activity:1.2.0")
+    implementation "androidx.recyclerview:recyclerview:1.2.1"
+    api(libs.constraintLayout)
+    // TODO(b/152245564) Conflicting dependencies cause IDE errors.
+    implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha02")
+    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02")
+    implementation "androidx.browser:browser:1.3.0"
+    implementation("androidx.startup:startup-runtime:1.1.0")
+
+    implementation(project(":window:window-java"))
+    debugImplementation(libs.leakcanary)
+}
diff --git a/window/window-demos/demo-common/src/main/AndroidManifest.xml b/window/window-demos/demo-common/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..134b96c
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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">
+    <application
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+        <activity
+            android:name=".DisplayFeaturesActivity"
+            android:exported="true"
+            android:supportsPictureInPicture="true"
+            android:configChanges=
+                "orientation|screenSize|screenLayout|screenSize|layoutDirection|smallestScreenSize"
+            android:allowUntrustedActivityEmbedding="true"
+            android:label="@string/display_features_config_change" />
+    </application>
+</manifest>
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/DisplayFeaturesActivity.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/DisplayFeaturesActivity.kt
new file mode 100644
index 0000000..1126232
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/DisplayFeaturesActivity.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.common.databinding.ActivityDisplayFeaturesConfigChangeBinding
+import androidx.window.demo.common.infolog.InfoLogAdapter
+import androidx.window.demo.common.util.PictureInPictureUtil.appendPictureInPictureMenu
+import androidx.window.demo.common.util.PictureInPictureUtil.handlePictureInPictureMenuItem
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowInfoTracker
+import androidx.window.layout.WindowLayoutInfo
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.Locale
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+/** Demo activity that shows all display features and current device state on the screen. */
+open class DisplayFeaturesActivity : AppCompatActivity() {
+
+    private val infoLogAdapter = InfoLogAdapter()
+    private val displayFeatureViews = ArrayList<View>()
+    private lateinit var binding: ActivityDisplayFeaturesConfigChangeBinding
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityDisplayFeaturesConfigChangeBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        val recyclerView = findViewById<RecyclerView>(R.id.infoLogRecyclerView)
+        recyclerView.adapter = infoLogAdapter
+
+        lifecycleScope.launch(Dispatchers.Main) {
+            // The block passed to repeatOnLifecycle is executed when the lifecycle
+            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
+            // It automatically restarts the block when the lifecycle is STARTED again.
+            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
+                // Safely collect from windowInfoRepo when the lifecycle is STARTED
+                // and stops collection when the lifecycle is STOPPED
+                WindowInfoTracker.getOrCreate(this@DisplayFeaturesActivity)
+                    .windowLayoutInfo(this@DisplayFeaturesActivity)
+                    .collect { newLayoutInfo ->
+                        // New posture information
+                        updateStateLog(newLayoutInfo)
+                        updateCurrentState(newLayoutInfo)
+                    }
+            }
+        }
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu): Boolean {
+        appendPictureInPictureMenu(menuInflater, menu)
+        return true
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        return when {
+            handlePictureInPictureMenuItem(this, item) -> true
+            else -> super.onOptionsItemSelected(item)
+        }
+    }
+
+    /** Updates the device state and display feature positions. */
+    private fun updateCurrentState(windowLayoutInfo: WindowLayoutInfo) {
+        // Cleanup previously added feature views
+        val rootLayout = binding.featureContainerLayout
+        for (featureView in displayFeatureViews) {
+            rootLayout.removeView(featureView)
+        }
+        displayFeatureViews.clear()
+
+        // Update the UI with the current state
+        val stateStringBuilder = StringBuilder()
+        stateStringBuilder.append(getString(R.string.window_layout))
+            .append(": ")
+
+        // Add views that represent display features
+        for (displayFeature in windowLayoutInfo.displayFeatures) {
+            val lp = getLayoutParamsForFeatureInFrameLayout(displayFeature, rootLayout)
+
+            // Make sure that zero-wide and zero-high features are still shown
+            if (lp.width == 0) {
+                lp.width = 1
+            }
+            if (lp.height == 0) {
+                lp.height = 1
+            }
+
+            val featureView = View(this)
+            val foldFeature = displayFeature as? FoldingFeature
+            val color = getColor(R.color.colorFeatureFold)
+
+            featureView.foreground = ColorDrawable(color)
+
+            foldFeature?.let { feature ->
+                if (feature.isSeparating) {
+                    stateStringBuilder.append(getString(R.string.screens_are_separated))
+                } else {
+                    stateStringBuilder.append(getString(R.string.screens_are_not_separated))
+                }
+                stateStringBuilder
+                    .append(" - ")
+                    .append(
+                        if (feature.orientation == FoldingFeature.Orientation.HORIZONTAL) {
+                            getString(R.string.screen_is_horizontal)
+                        } else {
+                            getString(R.string.screen_is_vertical)
+                        }
+                    )
+                    .append(" - ")
+                    .append(
+                        if (feature.occlusionType == FoldingFeature.OcclusionType.FULL) {
+                            getString(R.string.occlusion_is_full)
+                        } else {
+                            getString(R.string.occlusion_is_none)
+                        }
+                    )
+            }
+
+            rootLayout.addView(featureView, lp)
+            featureView.id = View.generateViewId()
+
+            displayFeatureViews.add(featureView)
+        }
+        binding.currentState.text = stateStringBuilder.toString()
+    }
+
+    /** Adds the current state to the text log of changes on screen. */
+    private fun updateStateLog(info: Any) {
+        infoLogAdapter.append(getCurrentTimeString(), info.toString())
+        infoLogAdapter.notifyDataSetChanged()
+    }
+
+    private fun getCurrentTimeString(): String {
+        val sdf = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
+        val currentDate = sdf.format(Date())
+        return currentDate.toString()
+    }
+}
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/SampleTools.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/SampleTools.kt
new file mode 100644
index 0000000..ff88b99
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/SampleTools.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common
+
+import android.graphics.Rect
+import android.view.View
+import android.widget.FrameLayout
+import androidx.window.layout.DisplayFeature
+
+/**
+ * Offset the [DisplayFeature]'s bounds to match its respective
+ * location in the view's coordinate space.
+ */
+fun adjustFeaturePositionOffset(displayFeature: DisplayFeature, view: View): Rect {
+    // Get the location of the view in window to be in the same coordinate space as the feature.
+    val viewLocationInWindow = IntArray(2)
+    view.getLocationInWindow(viewLocationInWindow)
+
+    // Offset the feature coordinates to view coordinate space start point
+    val featureRectInView = Rect(displayFeature.bounds)
+    featureRectInView.offset(-viewLocationInWindow[0], -viewLocationInWindow[1])
+
+    return featureRectInView
+}
+
+/**
+ * Gets the layout params for placing a rectangle indicating a
+ * [DisplayFeature] inside a [FrameLayout].
+ */
+fun getLayoutParamsForFeatureInFrameLayout(displayFeature: DisplayFeature, view: FrameLayout):
+    FrameLayout.LayoutParams {
+    val featureRectInView = adjustFeaturePositionOffset(displayFeature, view)
+    val lp = FrameLayout.LayoutParams(featureRectInView.width(), featureRectInView.height())
+    lp.leftMargin = featureRectInView.left
+    lp.topMargin = featureRectInView.top
+    return lp
+}
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLog.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLog.kt
new file mode 100644
index 0000000..3ab4096
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLog.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common.infolog
+
+/**
+ * A data class to hold a title and a detail or subtitle that can be shown using [InfoLogAdapter]
+ * . This can be used to create samples with an ordered timeline of events.
+ */
+data class InfoLog(val title: String, val detail: String, val id: Int)
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogAdapter.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogAdapter.kt
new file mode 100644
index 0000000..81df057
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogAdapter.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common.infolog
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.common.R
+
+class InfoLogAdapter : RecyclerView.Adapter<InfoLogVH>() {
+
+    private var id = 0
+    private val items = mutableListOf<InfoLog>()
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InfoLogVH {
+        val root = LayoutInflater.from(parent.context)
+            .inflate(R.layout.view_holder_info_log, parent, false)
+        return InfoLogVH(root)
+    }
+
+    override fun onBindViewHolder(holder: InfoLogVH, position: Int) {
+        val item = items[position]
+        holder.titleView.text = "[ID${item.id}] ${item.title}"
+        holder.detailView.text = item.detail
+    }
+
+    override fun getItemCount(): Int {
+        return items.size
+    }
+
+    fun clear() {
+        items.clear()
+        id = 0
+    }
+
+    fun append(title: String, message: String) {
+        append(InfoLog(title, message, id))
+        ++id
+    }
+
+    private fun append(item: InfoLog) {
+        items.add(0, item)
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogVH.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogVH.kt
new file mode 100644
index 0000000..1bf7dfe
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/infolog/InfoLogVH.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common.infolog
+
+import android.view.View
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.common.R
+
+class InfoLogVH(view: View) : RecyclerView.ViewHolder(view) {
+    val titleView: TextView = view.findViewById(R.id.title_view)
+    val detailView: TextView = view.findViewById(R.id.detail_view)
+}
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/util/PictureInPictureUtil.kt b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/util/PictureInPictureUtil.kt
new file mode 100644
index 0000000..70eedab
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/java/androidx/window/demo/common/util/PictureInPictureUtil.kt
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.common.util
+
+import android.app.Activity
+import android.app.PictureInPictureParams
+import android.os.Build
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import android.widget.Toast
+import androidx.annotation.RequiresApi
+import androidx.window.demo.common.R
+
+@RequiresApi(Build.VERSION_CODES.O)
+private object PictureInPictureLauncherO {
+    fun startPictureInPicture(activity: Activity) {
+        activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())
+    }
+
+    fun setPictureInPictureParams(activity: Activity) {
+        activity.setPictureInPictureParams(PictureInPictureParams.Builder().build())
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+private object PictureInPictureLauncherS {
+    fun startPictureInPicture(activity: Activity, autoEnterPip: Boolean = false) {
+        activity.enterPictureInPictureMode(PictureInPictureParams.Builder()
+            .setAutoEnterEnabled(autoEnterPip)
+            .build())
+    }
+
+    fun setPictureInPictureParams(activity: Activity, autoEnterPip: Boolean = false) {
+        activity.setPictureInPictureParams(PictureInPictureParams.Builder()
+            .setAutoEnterEnabled(autoEnterPip)
+            .build())
+    }
+}
+
+object PictureInPictureUtil {
+    /**
+     * Appends the start picture in picture [MenuItem] to the given [Menu] if picture in picture
+     * is supported.
+     * @param inflater a [MenuInflater] to load the [Menu] from a resource.
+     * @param menu the menu to contain the inflated resource.
+     */
+    fun appendPictureInPictureMenu(inflater: MenuInflater, menu: Menu) {
+        if (Build.VERSION.SDK_INT > 26) {
+            inflater.inflate(R.menu.picture_in_picture_menu, menu)
+        }
+    }
+
+    /**
+     * Requests that the [Activity] enters picture in picture mode if the [MenuItem] matches the
+     * resource loaded in [appendPictureInPictureMenu]. If the [Activity] does not support picture
+     * in picture then nothing happens.
+     * @return true if the [MenuItem] has the same id as the start pip [MenuItem], false otherwise
+     */
+    fun handlePictureInPictureMenuItem(activity: Activity, item: MenuItem): Boolean {
+        return when (item.itemId) {
+            R.id.menu_item_enter_pip -> {
+                startPictureInPicture(activity)
+                true
+            }
+            else -> false
+        }
+    }
+
+    fun startPictureInPicture(activity: Activity, autoEnterPip: Boolean = false) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            PictureInPictureLauncherS.startPictureInPicture(activity, autoEnterPip)
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            PictureInPictureLauncherO.startPictureInPicture(activity)
+        } else {
+            Toast.makeText(activity, "PiP not supported", Toast.LENGTH_LONG).show()
+        }
+    }
+
+    fun setPictureInPictureParams(activity: Activity, autoEnterPip: Boolean = false) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            PictureInPictureLauncherS.setPictureInPictureParams(activity, autoEnterPip)
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            PictureInPictureLauncherO.setPictureInPictureParams(activity)
+            if (autoEnterPip) {
+                Toast.makeText(activity, "Auto enter PIP not supported", Toast.LENGTH_LONG)
+                    .show()
+            }
+        } else {
+            Toast.makeText(activity, "PiP not supported", Toast.LENGTH_LONG).show()
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/res/layout/activity_display_features_config_change.xml b/window/window-demos/demo-common/src/main/res/layout/activity_display_features_config_change.xml
new file mode 100644
index 0000000..419ab11
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/res/layout/activity_display_features_config_change.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/rootLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="androidx.window.demo.common.DisplayFeaturesActivity">
+
+    <FrameLayout
+        android:id="@+id/feature_container_layout"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+    <TextView
+        android:id="@+id/current_state"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:text="@string/current_state"
+        android:textAppearance="@style/TextAppearance.AppCompat"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/legendLayout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <TextView
+            android:id="@+id/legendTextView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/legend" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:id="@+id/foldColorImageView"
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:foreground="@color/colorFeatureFold" />
+
+            <TextView
+                android:id="@+id/foldColorTextView"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/fold" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/infoLogRecyclerView"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/current_state"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/res/layout/view_holder_info_log.xml b/window/window-demos/demo-common/src/main/res/layout/view_holder_info_log.xml
new file mode 100644
index 0000000..e7e20c1
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/res/layout/view_holder_info_log.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_marginTop="16dp"
+    android:layout_marginBottom="16dp"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/title_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textStyle="bold"/>
+
+    <TextView
+        android:id="@+id/detail_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/menu/picture_in_picture_menu.xml b/window/window-demos/demo-common/src/main/res/menu/picture_in_picture_menu.xml
similarity index 100%
copy from window/window-samples/src/main/res/menu/picture_in_picture_menu.xml
copy to window/window-demos/demo-common/src/main/res/menu/picture_in_picture_menu.xml
diff --git a/window/window-demos/demo-common/src/main/res/values/colors.xml b/window/window-demos/demo-common/src/main/res/values/colors.xml
new file mode 100644
index 0000000..be90b3a
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/res/values/colors.xml
@@ -0,0 +1,27 @@
+<?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>
+    <color name="colorPrimary">#03A9F4</color>
+    <color name="colorPrimaryDark">#354395</color>
+    <color name="colorAccent">#009688</color>
+
+    <color name="colorFeatureFold">#7700FF00</color>
+
+    <color name="colorSplitContentBackground">#3B6BDB4C</color>
+    <color name="colorSplitControlsBackground">#475ABFF3</color>
+</resources>
diff --git a/window/window-demos/demo-common/src/main/res/values/strings.xml b/window/window-demos/demo-common/src/main/res/values/strings.xml
new file mode 100644
index 0000000..aeb9f83
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/res/values/strings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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="trusted_embedding_activity">Trusted Embedding Activity</string>
+    <string name="trusted_embedding_activity_detail">Activity allows embedding in trusted mode via a
+        known certificate.</string>
+    <string name="untrusted_embedding_activity">Untrusted Embedding Activity</string>
+    <string name="untrusted_embedding_activity_detail">Activity allows embedding in untrusted mode
+        via opt-in.</string>
+    <string name="display_features_config_change">Display features handle config change</string>
+    <string name="fold">Fold</string>
+    <string name="legend">Legend:</string>
+    <string name="current_state">Current state</string>
+    <string name="window_layout">Window layout</string>
+    <string name="screens_are_separated">"Screens are separated"</string>
+    <string name="screens_are_not_separated">"Screen is not separated"</string>
+    <string name="screen_is_horizontal">"Hinge is horizontal"</string>
+    <string name="screen_is_vertical">"Hinge is vertical"</string>
+    <string name="occlusion_is_full">Full occlusion</string>
+    <string name="occlusion_is_none">No occlusion</string>
+</resources>
\ No newline at end of file
diff --git a/window/window-demos/demo-common/src/main/res/values/styles.xml b/window/window-demos/demo-common/src/main/res/values/styles.xml
new file mode 100644
index 0000000..6f9733b
--- /dev/null
+++ b/window/window-demos/demo-common/src/main/res/values/styles.xml
@@ -0,0 +1,27 @@
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+</resources>
diff --git a/window/window-demos/demo-second-app/build.gradle b/window/window-demos/demo-second-app/build.gradle
new file mode 100644
index 0000000..6af138b
--- /dev/null
+++ b/window/window-demos/demo-second-app/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    defaultConfig {
+        applicationId "androidx.window.demo2"
+        minSdkVersion 23
+    }
+    buildFeatures {
+        viewBinding true
+    }
+    namespace "androidx.window.demo2"
+}
+
+dependencies {
+    implementation("androidx.activity:activity:1.2.0")
+    implementation("androidx.appcompat:appcompat:1.2.0")
+    api(libs.constraintLayout)
+    implementation("androidx.core:core-ktx:1.8.0")
+    // TODO(b/152245564) Conflicting dependencies cause IDE errors.
+    implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha02")
+    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02")
+    implementation("androidx.recyclerview:recyclerview:1.2.1")
+    implementation(project(":window:window-java"))
+    implementation(project(":window:window-demos:demo-common"))
+}
diff --git a/window/window-demos/demo-second-app/src/main/AndroidManifest.xml b/window/window-demos/demo-second-app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4d9f6c1
--- /dev/null
+++ b/window/window-demos/demo-second-app/src/main/AndroidManifest.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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">
+    <application
+        android:label="Activity Embedding Sample"
+        android:supportsRtl="true">
+        <activity
+            android:name=".embedding.TrustedEmbeddingActivity"
+            android:exported="true"
+            android:label="@string/trusted_embedding_activity"
+            android:configChanges=
+                "orientation|screenSize|screenLayout|screenSize|layoutDirection|smallestScreenSize"
+            android:knownActivityEmbeddingCerts=
+                "6a8b96e278e58f62cfe3584022cec1d0527fcb85a9e5d2e1694eb0405be5b599">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.UntrustedEmbeddingActivity"
+            android:exported="true"
+            android:label="@string/untrusted_embedding_activity"
+            android:configChanges=
+                "orientation|screenSize|screenLayout|screenSize|layoutDirection|smallestScreenSize"
+            android:allowUntrustedActivityEmbedding="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity-alias
+            android:name="androidx.window.demo2.DisplayFeaturesActivity"
+            android:targetActivity="androidx.window.demo.common.DisplayFeaturesActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity-alias>
+    </application>
+</manifest>
diff --git a/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/TrustedEmbeddingActivity.kt b/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/TrustedEmbeddingActivity.kt
new file mode 100644
index 0000000..bc2e7cd
--- /dev/null
+++ b/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/TrustedEmbeddingActivity.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo2.embedding
+
+import android.app.Activity
+import android.os.Bundle
+import android.widget.TextView
+import androidx.window.demo2.R
+
+/**
+ * Activity that can be embedded by a process with a known certificate. See
+ * `android:allowUntrustedActivityEmbedding` in AndroidManifest. Activity can be launched from the
+ * split demos in window-samples/demos.
+ */
+class TrustedEmbeddingActivity : Activity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_embedded)
+        findViewById<TextView>(R.id.detail_text_view).text =
+            getString(R.string.trusted_embedding_activity_detail)
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/UntrustedEmbeddingActivity.kt b/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/UntrustedEmbeddingActivity.kt
new file mode 100644
index 0000000..f26aeee
--- /dev/null
+++ b/window/window-demos/demo-second-app/src/main/java/androidx/window/demo2/embedding/UntrustedEmbeddingActivity.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo2.embedding
+
+import android.app.Activity
+import android.os.Bundle
+import android.widget.TextView
+import androidx.window.demo2.R
+
+/**
+ * Activity that can be embedded in untrusted mode. See
+ * `android:allowUntrustedActivityEmbedding` in AndroidManifest. Activity can be launched from
+ * the split demos in window-samples/demos.
+ */
+class UntrustedEmbeddingActivity : Activity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_embedded)
+        findViewById<TextView>(R.id.detail_text_view).text =
+            getString(R.string.untrusted_embedding_activity_detail)
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo-second-app/src/main/res/layout/activity_embedded.xml b/window/window-demos/demo-second-app/src/main/res/layout/activity_embedded.xml
new file mode 100644
index 0000000..fbd572c
--- /dev/null
+++ b/window/window-demos/demo-second-app/src/main/res/layout/activity_embedded.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:layout_gravity="center"
+        android:id="@+id/detail_text_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/window/window-demos/demo-second-app/src/main/res/values/strings.xml b/window/window-demos/demo-second-app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..de4172b
--- /dev/null
+++ b/window/window-demos/demo-second-app/src/main/res/values/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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="trusted_embedding_activity">Trusted Embedding Activity</string>
+    <string name="trusted_embedding_activity_detail">Activity allows embedding in trusted mode via a
+        known certificate.</string>
+    <string name="untrusted_embedding_activity">Untrusted Embedding Activity</string>
+    <string name="untrusted_embedding_activity_detail">Activity allows embedding in untrusted mode
+        via opt-in.</string>
+</resources>
\ No newline at end of file
diff --git a/window/window-demos/demo/README.md b/window/window-demos/demo/README.md
new file mode 100644
index 0000000..f5f7378
--- /dev/null
+++ b/window/window-demos/demo/README.md
@@ -0,0 +1,6 @@
+# WindowManager Jetpack Demos
+
+The `keystore.jks` was generated using sample keys and certificates from Android AOSP. It is used to
+sign the demo app with a known key and showcase the usage of ActivityEmbedding APIs across apps
+for known certificates. See `build.gradle` for signing and
+`window-samples/demo-second-app` for the usage of the known certificate digest.
diff --git a/window/window-demos/demo/build.gradle b/window/window-demos/demo/build.gradle
new file mode 100644
index 0000000..e579b7f
--- /dev/null
+++ b/window/window-demos/demo/build.gradle
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+
+import androidx.build.LibraryType
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    defaultConfig {
+        applicationId "androidx.window.demo"
+        minSdkVersion 23
+    }
+    buildFeatures {
+        viewBinding true
+    }
+    namespace "androidx.window.demo"
+    signingConfigs {
+        config {
+            keyAlias 'alias'
+            keyPassword 'password'
+            storeFile file('keystore.jks')
+            storePassword 'password'
+        }
+    }
+    buildTypes {
+        release {
+            signingConfig signingConfigs.config
+        }
+        debug {
+            signingConfig signingConfigs.config
+        }
+    }
+}
+
+dependencies {
+    implementation("androidx.appcompat:appcompat:1.5.1")
+    implementation("androidx.core:core-ktx:1.3.2")
+    implementation("androidx.activity:activity:1.2.0")
+    implementation "androidx.recyclerview:recyclerview:1.2.1"
+    api(libs.constraintLayout)
+    // TODO(b/152245564) Conflicting dependencies cause IDE errors.
+    implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha02")
+    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02")
+    implementation "androidx.browser:browser:1.3.0"
+    implementation("androidx.startup:startup-runtime:1.1.0")
+
+    implementation(project(":window:window-java"))
+    implementation(project(":window:window-demos:demo-common"))
+    debugImplementation(libs.leakcanary)
+
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(project(":window:window-testing"))
+    androidTestImplementation(project(":window:window-demos:demo-common"))
+}
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
+    }
+}
+
+androidx {
+    name = "WM Jetpack Samples"
+    type = LibraryType.SAMPLES
+    inceptionYear = "2023"
+    description = "Samples for the WM Jetpack Library"
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/keystore.jks b/window/window-demos/demo/keystore.jks
new file mode 100644
index 0000000..35e18c9
--- /dev/null
+++ b/window/window-demos/demo/keystore.jks
Binary files differ
diff --git a/window/window-demos/demo/src/androidTest/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivityTest.kt b/window/window-demos/demo/src/androidTest/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivityTest.kt
new file mode 100644
index 0000000..53f1c78
--- /dev/null
+++ b/window/window-demos/demo/src/androidTest/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivityTest.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.window.demo
+
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withSubstring
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.window.layout.FoldingFeature.Orientation.Companion.HORIZONTAL
+import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL
+import androidx.window.layout.FoldingFeature.State.Companion.FLAT
+import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
+import androidx.window.testing.layout.FoldingFeature
+import androidx.window.testing.layout.TestWindowLayoutInfo
+import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TestRule
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class DisplayFeaturesNoConfigChangeActivityTest {
+    private val activityRule =
+        ActivityScenarioRule(DisplayFeaturesNoConfigChangeActivity::class.java)
+    private val publisherRule = WindowLayoutInfoPublisherRule()
+
+    @get:Rule
+    val testRule: TestRule
+
+    init {
+        testRule = RuleChain.outerRule(publisherRule).around(activityRule)
+    }
+
+    @Test
+    fun testDeviceOpen_Flat() {
+        activityRule.scenario.onActivity { activity ->
+            val feature =
+                FoldingFeature(activity = activity, state = FLAT, orientation = HORIZONTAL)
+            val expected = TestWindowLayoutInfo(listOf(feature))
+
+            publisherRule.overrideWindowLayoutInfo(expected)
+        }
+        onView(withSubstring("state = FLAT")).check(matches(isDisplayed()))
+        onView(withSubstring("is not separated")).check(matches(isDisplayed()))
+        onView(withSubstring("Hinge is horizontal")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun testDeviceOpen_TableTop() {
+        activityRule.scenario.onActivity { activity ->
+            val feature =
+                FoldingFeature(activity = activity, state = HALF_OPENED, orientation = HORIZONTAL)
+            val expected = TestWindowLayoutInfo(listOf(feature))
+
+            publisherRule.overrideWindowLayoutInfo(expected)
+        }
+        onView(withSubstring("state = HALF_OPENED")).check(matches(isDisplayed()))
+        onView(withSubstring("are separated")).check(matches(isDisplayed()))
+        onView(withSubstring("Hinge is horizontal")).check(matches(isDisplayed()))
+    }
+
+    @Test
+    fun testDeviceOpen_Book() {
+        activityRule.scenario.onActivity { activity ->
+            val feature =
+                FoldingFeature(activity = activity, state = HALF_OPENED, orientation = VERTICAL)
+            val expected = TestWindowLayoutInfo(listOf(feature))
+
+            publisherRule.overrideWindowLayoutInfo(expected)
+        }
+        onView(withSubstring("state = HALF_OPENED")).check(matches(isDisplayed()))
+        onView(withSubstring("are separated")).check(matches(isDisplayed()))
+        onView(withSubstring("Hinge is vertical")).check(matches(isDisplayed()))
+    }
+}
diff --git a/window/window-demos/demo/src/androidTest/java/androidx/window/demo/SplitLayoutActivityTest.kt b/window/window-demos/demo/src/androidTest/java/androidx/window/demo/SplitLayoutActivityTest.kt
new file mode 100644
index 0000000..d3aa678d
--- /dev/null
+++ b/window/window-demos/demo/src/androidTest/java/androidx/window/demo/SplitLayoutActivityTest.kt
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo
+
+import android.graphics.Rect
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.LinearLayout
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.PositionAssertions.isBottomAlignedWith
+import androidx.test.espresso.assertion.PositionAssertions.isCompletelyAbove
+import androidx.test.espresso.assertion.PositionAssertions.isCompletelyLeftOf
+import androidx.test.espresso.assertion.PositionAssertions.isLeftAlignedWith
+import androidx.test.espresso.assertion.PositionAssertions.isRightAlignedWith
+import androidx.test.espresso.assertion.PositionAssertions.isTopAlignedWith
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.window.demo.common.adjustFeaturePositionOffset
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.FoldingFeature.Orientation.Companion.HORIZONTAL
+import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL
+import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
+import androidx.window.testing.layout.FoldingFeature
+import androidx.window.testing.layout.TestWindowLayoutInfo
+import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TestRule
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class SplitLayoutActivityTest {
+    private val activityRule = ActivityScenarioRule(SplitLayoutActivity::class.java)
+    private val publisherRule = WindowLayoutInfoPublisherRule()
+
+    @get:Rule
+    val testRule: TestRule
+
+    init {
+        testRule = RuleChain.outerRule(publisherRule).around(activityRule)
+    }
+
+    @Test
+    fun testDeviceOpen_Flat() {
+        activityRule.scenario.onActivity {
+            val expected = TestWindowLayoutInfo(listOf())
+            publisherRule.overrideWindowLayoutInfo(expected)
+        }
+
+        // Checks that the two views are overlapped if there's no FoldingFeature.
+        onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
+        onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
+        onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
+        onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
+    }
+
+    @Test
+    fun testDeviceOpen_Vertical() {
+        var isWindowBigEnoughForTest = false
+        activityRule.scenario.onActivity { activity ->
+            val feature = FoldingFeature(
+                activity = activity,
+                orientation = VERTICAL,
+                state = HALF_OPENED
+            )
+            val expected = TestWindowLayoutInfo(listOf(feature))
+            publisherRule.overrideWindowLayoutInfo(expected)
+
+            val layout = activity.findViewById<LinearLayout>(R.id.rootLayout)
+            val startView = activity.findViewById<View>(R.id.start_layout)
+            val endView = activity.findViewById<View>(R.id.end_layout)
+
+            isWindowBigEnoughForTest = isWindowBigEnough(feature, layout, startView, endView)
+        }
+
+        if (isWindowBigEnoughForTest) {
+            // Checks that start_layout is on the left of end_layout with a vertical folding feature.
+            // This requires to run the test on a big enough screen to fit both views on screen
+            onView(withId(R.id.start_layout)).check(isCompletelyLeftOf(withId(R.id.end_layout)))
+        } else {
+            // Checks that the two views are overlapped if the test is running in a Window not
+            // big enough to allow having the two views side by side.
+            onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
+        }
+    }
+
+    @Test
+    fun testDeviceOpen_Horizontal() {
+        var isWindowBigEnoughForTest = false
+
+        activityRule.scenario.onActivity { activity ->
+            val feature = FoldingFeature(
+                activity = activity,
+                orientation = HORIZONTAL,
+                state = HALF_OPENED
+            )
+            val expected = TestWindowLayoutInfo(listOf(feature))
+            publisherRule.overrideWindowLayoutInfo(expected)
+
+            val layout = activity.findViewById<LinearLayout>(R.id.rootLayout)
+            val startView = activity.findViewById<View>(R.id.start_layout)
+            val endView = activity.findViewById<View>(R.id.end_layout)
+
+            isWindowBigEnoughForTest = isWindowBigEnough(feature, layout, startView, endView)
+        }
+
+        if (isWindowBigEnoughForTest) {
+            // Checks that start_layout is above of end_layout with a horizontal folding feature.
+            // This requires to run the test on a big enough screen to fit both views on screen
+            onView(withId(R.id.start_layout)).check(isCompletelyAbove(withId(R.id.end_layout)))
+        } else {
+            // Checks that the two views are overlapped if the test is running in a Window not
+            // big enough to allow having the two views side by side.
+            onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
+            onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
+        }
+    }
+
+    /**
+     * Check if the Window is big enough to fit {@code startView} and {@code endView} in the two
+     * display areas defined by the {@code feature} in the {@code layout}.
+     * @return A Boolean that defines if the window is big enough.
+     */
+    private fun isWindowBigEnough(
+        feature: FoldingFeature?,
+        layout: ViewGroup?,
+        startView: View?,
+        endView: View?
+    ): Boolean {
+        if (feature == null || layout == null || startView == null || endView == null) {
+            return false
+        }
+
+        // Calculate the area for view's content with padding
+        with(layout) {
+            val paddedWidth = width - paddingLeft - paddingRight
+            val paddedHeight = height - paddingTop - paddingBottom
+
+            val featureBounds = adjustFeaturePositionOffset(feature, this)
+            if (feature.orientation == HORIZONTAL) { // Horizontal layout
+                val topRect = Rect(
+                    paddingLeft, paddingTop,
+                    paddingLeft + paddedWidth, featureBounds.top
+                )
+                val bottomRect = Rect(
+                    paddingLeft, featureBounds.bottom,
+                    paddingLeft + paddedWidth, paddingTop + paddedHeight
+                )
+
+                if (measureAndCheckMinSize(topRect, startView) &&
+                    measureAndCheckMinSize(bottomRect, endView)
+                ) {
+                    return true
+                }
+            } else if (feature.orientation == VERTICAL) { // Vertical layout
+                val leftRect = Rect(
+                    paddingLeft, paddingTop,
+                    featureBounds.left, paddingTop + paddedHeight
+                )
+                val rightRect = Rect(
+                    featureBounds.right, paddingTop,
+                    paddingLeft + paddedWidth, paddingTop + paddedHeight
+                )
+
+                if (measureAndCheckMinSize(leftRect, startView) &&
+                    measureAndCheckMinSize(rightRect, endView)
+                ) {
+                    return true
+                }
+            }
+        }
+        return false
+    }
+
+    /**
+     * Measures a child view and sees if it will fit in the provided rect.
+     * <p>Note: This method calls [View.measure] on the child view, which updates
+     * its stored values for measured with and height. If the view will end up with different
+     * values, it should be measured again.
+     */
+    private fun measureAndCheckMinSize(rect: Rect, childView: View): Boolean {
+        val widthSpec =
+            View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.AT_MOST)
+        val heightSpec = View.MeasureSpec.makeMeasureSpec(
+            rect.height(),
+            View.MeasureSpec.AT_MOST
+        )
+        childView.measure(widthSpec, heightSpec)
+        return childView.measuredWidthAndState and FrameLayout.MEASURED_STATE_TOO_SMALL == 0 &&
+            childView.measuredHeightAndState and FrameLayout.MEASURED_STATE_TOO_SMALL == 0
+    }
+}
diff --git a/window/window-demos/demo/src/main/AndroidManifest.xml b/window/window-demos/demo/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..36b547be
--- /dev/null
+++ b/window/window-demos/demo/src/main/AndroidManifest.xml
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020 The Android Open Source Project
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <property
+            android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED"
+            android:value="true" />
+
+        <service android:name=".TestIme"
+            android:label="@string/test_ime"
+            android:permission="android.permission.BIND_INPUT_METHOD"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.view.InputMethod"/>
+            </intent-filter>
+            <meta-data android:name="android.view.im"
+                android:resource="@xml/method"/>
+        </service>
+
+        <activity android:name=".demos.WindowDemosActivity"
+            android:exported="true"
+            android:label="@string/windowManagerDemos">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".PresentationActivity"
+            android:exported="false"
+            android:label="@string/presentation" />
+        <activity
+            android:name=".DisplayFeaturesNoConfigChangeActivity"
+            android:exported="false"
+            android:supportsPictureInPicture="true"
+            android:label="@string/display_features_no_config_change" />
+        <activity
+            android:name=".SplitLayoutActivity"
+            android:exported="false"
+            android:label="@string/split_layout" />
+        <activity android:name=".WindowMetricsActivity"
+            android:exported="false"
+            android:configChanges="orientation|screenSize|screenLayout|screenSize"
+            android:label="@string/window_metrics"/>
+        <activity
+            android:name=".embedding.SplitActivityA"
+            android:exported="true"
+            android:label="Split Main"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitActivityB"
+            android:exported="false"
+            android:label="B"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityC"
+            android:exported="false"
+            android:label="C"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityD"
+            android:exported="false"
+            android:label="D"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityE"
+            android:exported="false"
+            android:label="E"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityF"
+            android:exported="false"
+            android:label="F"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityPlaceholder"
+            android:exported="false"
+            android:label="Placeholder"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.ExpandedDialogActivity"
+            android:theme="@style/ExpandedDialogTheme"
+            android:exported="false"
+            android:label="Dialog Activity"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityTrampoline"
+            android:exported="true"
+            android:label="Split Trampoline"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.trampoline_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity-alias
+            android:name=".embedding.SplitActivityTrampolineTarget"
+            android:targetActivity=".embedding.SplitActivityA"/>
+        <activity
+            android:name=".embedding.SplitActivityList"
+            android:exported="true"
+            android:label="Split List"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.list_detail_split_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitActivityDetail"
+            android:exported="false"
+            android:label="Item detail"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:launchMode="singleTop"
+            android:taskAffinity="androidx.window.demo.list_detail_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityListPlaceholder"
+            android:exported="false"
+            android:label="Placeholder"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.list_detail_split_affinity" />
+
+        <!-- Split PiP App -->
+
+        <activity
+            android:name=".embedding.SplitPipActivityA"
+            android:exported="true"
+            android:label="Split and PiP"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:supportsPictureInPicture="true"
+            android:taskAffinity="androidx.window.demo.split_pip">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitPipActivityB"
+            android:exported="false"
+            android:label="PiP B"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:supportsPictureInPicture="true"
+            android:taskAffinity="androidx.window.demo.split_pip">
+        </activity>
+        <activity
+            android:name=".embedding.SplitPipActivityNoPip"
+            android:exported="false"
+            android:label="No PiP support"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.split_pip">
+        </activity>
+        <activity
+            android:name=".embedding.SplitPipActivityPlaceholder"
+            android:exported="false"
+            android:label="PiP Placeholder"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.split_pip">
+        </activity>
+
+        <!-- The demo App to show how to change the current split layout with the current device and
+         window states -->
+
+        <activity
+            android:name=".embedding.SplitDeviceStateActivityA"
+            android:exported="true"
+            android:label="Split on Device State"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.split_device_state_activity_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitDeviceStateActivityB"
+            android:exported="true"
+            android:label="Split on Device State B"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.demo.split_device_state_activity_affinity">
+        </activity>
+
+        <!-- The demo app that shows various IME-related use cases -->
+
+        <activity android:name=".ImeActivity"
+            android:exported="false"
+            android:configChanges="orientation|screenSize|screenLayout|screenSize"
+            android:label="@string/ime"/>
+
+        <!-- Activity embedding initializer -->
+
+        <provider android:name="androidx.startup.InitializationProvider"
+            android:authorities="${applicationId}.androidx-startup"
+            android:exported="false"
+            tools:node="merge">
+            <!-- This entry makes ExampleWindowInitializer discoverable. -->
+            <meta-data  android:name="androidx.window.demo.embedding.ExampleWindowInitializer"
+                android:value="androidx.startup" />
+        </provider>
+
+        <!-- The app itself supports activity embedding, so a system override is not needed. -->
+        <property
+            android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE"
+            android:value="false" />
+
+    </application>
+</manifest>
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivity.kt
new file mode 100644
index 0000000..bd77218
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/DisplayFeaturesNoConfigChangeActivity.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 androidx.window.demo
+
+import androidx.window.demo.common.DisplayFeaturesActivity
+
+class DisplayFeaturesNoConfigChangeActivity : DisplayFeaturesActivity()
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/ImeActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/ImeActivity.kt
new file mode 100644
index 0000000..a31144d
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/ImeActivity.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo
+
+import android.content.Intent
+import android.os.Bundle
+import android.provider.Settings
+import android.view.inputmethod.InputMethodManager
+import android.widget.Button
+import androidx.appcompat.app.AppCompatActivity
+
+/**
+ * Demo app that shows various IME-related features.
+ */
+class ImeActivity : AppCompatActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_ime)
+
+        findViewById<Button>(R.id.ime_button_settings).apply {
+            setOnClickListener {
+                val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
+                startActivity(intent)
+            }
+        }
+
+        findViewById<Button>(R.id.ime_button_switch_default).apply {
+            setOnClickListener {
+                val imm = getSystemService(InputMethodManager::class.java)
+                imm.showInputMethodPicker()
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/PresentationActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/PresentationActivity.kt
new file mode 100644
index 0000000..5b4cb9c
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/PresentationActivity.kt
@@ -0,0 +1,162 @@
+/*
+ * 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.demo
+
+import android.app.Presentation
+import android.content.Context
+import android.hardware.display.DisplayManager
+import android.os.Build
+import android.os.Bundle
+import android.util.Log
+import android.view.Display
+import android.view.Display.DEFAULT_DISPLAY
+import android.view.View
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowInfoTracker
+import androidx.window.layout.WindowLayoutInfo
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+/**
+ * Demo activity that reacts to foldable device state change and shows content on the outside
+ * display when the device is folded.
+ */
+class PresentationActivity : AppCompatActivity() {
+    private val TAG = "FoldablePresentation"
+
+    private var presentation: DemoPresentation? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_foldin)
+
+        lifecycleScope.launch(Dispatchers.Main) {
+            // The block passed to repeatOnLifecycle is executed when the lifecycle
+            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
+            // It automatically restarts the block when the lifecycle is STARTED again.
+            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
+                // Safely collect from windowInfoRepo when the lifecycle is STARTED
+                // and stops collection when the lifecycle is STOPPED
+                WindowInfoTracker.getOrCreate(this@PresentationActivity)
+                    .windowLayoutInfo(this@PresentationActivity)
+                    .collect { newLayoutInfo ->
+                        // New posture information
+                        updateCurrentState(newLayoutInfo)
+                    }
+            }
+        }
+    }
+
+    private fun startPresentation(context: Context) {
+        if (presentation != null) {
+            val message = "Trying to show presentation that's already showing"
+            Toast.makeText(context, message, Toast.LENGTH_LONG).show()
+            Log.w(TAG, message)
+            return
+        }
+
+        // Look for a built-in display on the outer side of the foldable device to show our
+        // Presentation. Unfortunately, there are no direct methods to get the right one, but it's
+        // possible to make a pretty good guess by filtering out obviously invalid candidates.
+        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
+        val presentationDisplays = displayManager.displays
+        for (display in presentationDisplays) {
+            if (display.displayId == DEFAULT_DISPLAY) {
+                // This is the primary device display, but we're looking for a secondary one
+                continue
+            }
+            if (display.flags and Display.FLAG_PRESENTATION != Display.FLAG_PRESENTATION) {
+                // This display doesn't support showing Presentation
+                continue
+            }
+            if (display.flags and Display.FLAG_PRIVATE != 0) {
+                // Valid system-owned displays will be public
+                continue
+            }
+            if (display.state != Display.STATE_ON) {
+                // This display is not ready to show app content right now
+                continue
+            }
+
+            // This display seems like a good match!
+            presentation = DemoPresentation(context, display)
+            // Make sure that the window is marked to show on top of lock screen, since we're
+            // targeting  the screen on the other side when the device may be closed/locked.
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
+                presentation!!.window?.attributes?.flags =
+                    presentation!!.window?.attributes?.flags?.or(
+                        android.R.attr.showWhenLocked or android.R.attr.turnScreenOn
+                    )
+            }
+            presentation!!.show()
+            break
+        }
+
+        if (presentation == null) {
+            val message = "No matching display found, Presentation not shown"
+            Toast.makeText(context, message, Toast.LENGTH_LONG).show()
+            Log.w(TAG, message)
+        }
+    }
+
+    /**
+     * Method to be called from layout XML definition.
+     */
+    fun startPresentation(view: View) {
+        startPresentation(view.context)
+    }
+
+    @Suppress("UNUSED_PARAMETER") // Callback defined in xml
+    fun stopPresentation(view: View?) {
+        presentation?.hide()
+        presentation = null
+    }
+
+    /**
+     * The presentation to show on the secondary display.
+     */
+    private class DemoPresentation(context: Context?, display: Display?) :
+        Presentation(context, display) {
+
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+            setContentView(R.layout.presentation_second_display)
+        }
+    }
+
+    /**
+     * Updates the display of the current fold feature state.
+     */
+    private fun updateCurrentState(info: WindowLayoutInfo) {
+        val stateStringBuilder = StringBuilder()
+
+        stateStringBuilder.append(getString(R.string.deviceState))
+            .append(": ")
+
+        info.displayFeatures
+            .mapNotNull { it as? FoldingFeature }
+            .joinToString(separator = "\n") { feature -> feature.state.toString() }
+
+        findViewById<TextView>(R.id.currentState).text = stateStringBuilder.toString()
+    }
+}
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayout.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayout.kt
new file mode 100644
index 0000000..06ba0be
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayout.kt
@@ -0,0 +1,197 @@
+/*
+ * 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.demo
+
+import android.content.Context
+import android.graphics.Rect
+import android.util.AttributeSet
+import android.view.View
+import android.view.View.MeasureSpec.AT_MOST
+import android.view.View.MeasureSpec.EXACTLY
+import android.widget.FrameLayout
+import androidx.window.demo.common.adjustFeaturePositionOffset
+import androidx.window.layout.DisplayFeature
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowLayoutInfo
+
+/**
+ * An example of split-layout for two views, separated by a display feature that goes across the
+ * window. When both start and end views are added, it checks if there are display features that
+ * separate the area in two (e.g. fold or hinge) and places them side-by-side or top-bottom.
+ */
+class SplitLayout : FrameLayout {
+    private var windowLayoutInfo: WindowLayoutInfo? = null
+    private var startViewId = 0
+    private var endViewId = 0
+
+    private var lastWidthMeasureSpec: Int = 0
+    private var lastHeightMeasureSpec: Int = 0
+
+    constructor(context: Context) : super(context)
+
+    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+        setAttributes(attrs)
+    }
+
+    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
+        context,
+        attrs,
+        defStyleAttr
+    ) {
+        setAttributes(attrs)
+    }
+
+    fun updateWindowLayout(windowLayoutInfo: WindowLayoutInfo) {
+        this.windowLayoutInfo = windowLayoutInfo
+        requestLayout()
+    }
+
+    private fun setAttributes(attrs: AttributeSet?) {
+        context.theme.obtainStyledAttributes(attrs, R.styleable.SplitLayout, 0, 0).apply {
+            try {
+                startViewId = getResourceId(R.styleable.SplitLayout_startViewId, 0)
+                endViewId = getResourceId(R.styleable.SplitLayout_endViewId, 0)
+            } finally {
+                recycle()
+            }
+        }
+    }
+
+    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+        val startView = findStartView()
+        val endView = findEndView()
+        val splitPositions = splitViewPositions(startView, endView)
+
+        if (startView != null && endView != null && splitPositions != null) {
+            val startPosition = splitPositions[0]
+            val startWidthSpec = MeasureSpec.makeMeasureSpec(startPosition.width(), EXACTLY)
+            val startHeightSpec = MeasureSpec.makeMeasureSpec(startPosition.height(), EXACTLY)
+            startView.measure(startWidthSpec, startHeightSpec)
+            startView.layout(
+                startPosition.left, startPosition.top, startPosition.right,
+                startPosition.bottom
+            )
+
+            val endPosition = splitPositions[1]
+            val endWidthSpec = MeasureSpec.makeMeasureSpec(endPosition.width(), EXACTLY)
+            val endHeightSpec = MeasureSpec.makeMeasureSpec(endPosition.height(), EXACTLY)
+            endView.measure(endWidthSpec, endHeightSpec)
+            endView.layout(
+                endPosition.left, endPosition.top, endPosition.right,
+                endPosition.bottom
+            )
+        } else {
+            super.onLayout(changed, left, top, right, bottom)
+        }
+    }
+
+    private fun findStartView(): View? {
+        var startView = findViewById<View>(startViewId)
+        if (startView == null && childCount > 0) {
+            startView = getChildAt(0)
+        }
+        return startView
+    }
+
+    private fun findEndView(): View? {
+        var endView = findViewById<View>(endViewId)
+        if (endView == null && childCount > 1) {
+            endView = getChildAt(1)
+        }
+        return endView
+    }
+
+    /**
+     * Gets the position of the split for this view.
+     * @return A rect that defines of split, or {@code null} if there is no split.
+     */
+    private fun splitViewPositions(startView: View?, endView: View?): Array<Rect>? {
+        if (windowLayoutInfo == null || startView == null || endView == null) {
+            return null
+        }
+
+        // Calculate the area for view's content with padding
+        val paddedWidth = width - paddingLeft - paddingRight
+        val paddedHeight = height - paddingTop - paddingBottom
+
+        windowLayoutInfo?.displayFeatures
+            ?.firstOrNull { feature -> isValidFoldFeature(feature) }
+            ?.let { feature ->
+                val featureBounds = adjustFeaturePositionOffset(feature, this)
+                if (feature.bounds.left == 0) { // Horizontal layout
+                    val topRect = Rect(
+                        paddingLeft, paddingTop,
+                        paddingLeft + paddedWidth, featureBounds.top
+                    )
+                    val bottomRect = Rect(
+                        paddingLeft, featureBounds.bottom,
+                        paddingLeft + paddedWidth, paddingTop + paddedHeight
+                    )
+
+                    if (measureAndCheckMinSize(topRect, startView) &&
+                        measureAndCheckMinSize(bottomRect, endView)
+                    ) {
+                        return arrayOf(topRect, bottomRect)
+                    }
+                } else if (feature.bounds.top == 0) { // Vertical layout
+                    val leftRect = Rect(
+                        paddingLeft, paddingTop,
+                        featureBounds.left, paddingTop + paddedHeight
+                    )
+                    val rightRect = Rect(
+                        featureBounds.right, paddingTop,
+                        paddingLeft + paddedWidth, paddingTop + paddedHeight
+                    )
+
+                    if (measureAndCheckMinSize(leftRect, startView) &&
+                        measureAndCheckMinSize(rightRect, endView)
+                    ) {
+                        return arrayOf(leftRect, rightRect)
+                    }
+                }
+            }
+
+        // We have tried to fit the children and measured them previously. Since they didn't fit,
+        // we need to measure again to update the stored values.
+        measure(lastWidthMeasureSpec, lastHeightMeasureSpec)
+        return null
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
+        lastWidthMeasureSpec = widthMeasureSpec
+        lastHeightMeasureSpec = heightMeasureSpec
+    }
+
+    /**
+     * Measures a child view and sees if it will fit in the provided rect.
+     * <p>Note: This method calls [View.measure] on the child view, which updates
+     * its stored values for measured with and height. If the view will end up with different
+     * values, it should be measured again.
+     */
+    private fun measureAndCheckMinSize(rect: Rect, childView: View): Boolean {
+        val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), AT_MOST)
+        val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), AT_MOST)
+        childView.measure(widthSpec, heightSpec)
+        return childView.measuredWidthAndState and MEASURED_STATE_TOO_SMALL == 0 &&
+            childView.measuredHeightAndState and MEASURED_STATE_TOO_SMALL == 0
+    }
+
+    private fun isValidFoldFeature(displayFeature: DisplayFeature): Boolean {
+        return displayFeature is FoldingFeature
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayoutActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayoutActivity.kt
new file mode 100644
index 0000000..89290a9e
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/SplitLayoutActivity.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.demo
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import androidx.window.layout.WindowInfoTracker
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+/** Demo of [SplitLayout]. */
+class SplitLayoutActivity : AppCompatActivity() {
+
+    private lateinit var splitLayout: SplitLayout
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_layout)
+        splitLayout = findViewById(R.id.split_layout)
+
+        // Create a new coroutine since repeatOnLifecycle is a suspend function
+        lifecycleScope.launch(Dispatchers.Main) {
+            // The block passed to repeatOnLifecycle is executed when the lifecycle
+            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
+            // It automatically restarts the block when the lifecycle is STARTED again.
+            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
+                // Safely collect from windowInfoRepo when the lifecycle is STARTED
+                // and stops collection when the lifecycle is STOPPED
+                WindowInfoTracker.getOrCreate(this@SplitLayoutActivity)
+                    .windowLayoutInfo(this@SplitLayoutActivity)
+                    .collect { newLayoutInfo ->
+                        splitLayout.updateWindowLayout(newLayoutInfo)
+                    }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/TestIme.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/TestIme.kt
new file mode 100644
index 0000000..a63b171
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/TestIme.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo
+
+import android.inputmethodservice.InputMethodService
+import android.os.Build
+import android.view.View
+import android.view.inputmethod.InputMethodManager
+import android.widget.Button
+import androidx.core.view.WindowInsetsCompat.Type
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.demo.common.infolog.InfoLogAdapter
+import androidx.window.layout.WindowMetrics
+import androidx.window.layout.WindowMetricsCalculator
+
+/**
+ * A test IME that currently provides a minimal UI containing a "Close" button. To use this, go to
+ * "Settings > System > Languages & Input > On-screen keyboard" and enable "Test IME". Remember you
+ * may still need to switch to this IME after the default on-screen keyboard pops up.
+ */
+internal class TestIme : InputMethodService() {
+
+    private val adapter = InfoLogAdapter()
+
+    override fun onCreateInputView(): View {
+        return layoutInflater.inflate(R.layout.test_ime, null).apply {
+            findViewById<RecyclerView>(R.id.recycler_view).adapter = adapter
+
+            findViewById<Button>(R.id.button_clear).setOnClickListener {
+                adapter.clear()
+                adapter.notifyDataSetChanged()
+            }
+
+            findViewById<Button>(R.id.button_close).setOnClickListener {
+                requestHideSelf(InputMethodManager.HIDE_NOT_ALWAYS)
+            }
+
+            displayCurrentWindowMetrics()
+            displayMaximumWindowMetrics()
+        }
+    }
+
+    private fun displayCurrentWindowMetrics() {
+        val windowMetrics = WindowMetricsCalculator.getOrCreate()
+            .computeCurrentWindowMetrics(this@TestIme)
+        displayWindowMetrics("CurrentWindowMetrics update", windowMetrics)
+    }
+
+    private fun displayMaximumWindowMetrics() {
+        val windowMetrics = WindowMetricsCalculator.getOrCreate()
+            .computeMaximumWindowMetrics(this@TestIme)
+        displayWindowMetrics("MaximumWindowMetrics update", windowMetrics)
+    }
+
+    @OptIn(ExperimentalWindowApi::class)
+    private fun displayWindowMetrics(title: String, windowMetrics: WindowMetrics) {
+
+        val width = windowMetrics.bounds.width()
+        val height = windowMetrics.bounds.height()
+
+        val logBuilder = StringBuilder().append("Width: $width, Height: $height\n" +
+            "Top: ${windowMetrics.bounds.top}, Bottom: ${windowMetrics.bounds.bottom}, " +
+            "Left: ${windowMetrics.bounds.left}, Right: ${windowMetrics.bounds.right}")
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            val windowInsets = windowMetrics.getWindowInsets()
+            logBuilder.append("\nimeInset: ${windowInsets.getInsets(Type.ime())}")
+            logBuilder.append("\nnavInset: ${windowInsets.getInsets(Type.navigationBars())}")
+            logBuilder.append("\nstatusBarInset: ${windowInsets.getInsets(Type.statusBars())}")
+        }
+        adapter.append(title, logBuilder.toString())
+        adapter.notifyDataSetChanged()
+    }
+
+    override fun onEvaluateFullscreenMode(): Boolean {
+        return false
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/WindowMetricsActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/WindowMetricsActivity.kt
new file mode 100644
index 0000000..4b0faa7
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/WindowMetricsActivity.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.window.demo
+
+import android.content.res.Configuration
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.demo.common.infolog.InfoLogAdapter
+
+class WindowMetricsActivity : AppCompatActivity() {
+
+    private val adapter = InfoLogAdapter()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_window_metrics)
+        findViewById<RecyclerView>(R.id.recycler_view).adapter = adapter
+        adapter.append("onCreate", "triggered")
+
+        updateMetrics()
+    }
+
+    override fun onConfigurationChanged(newConfig: Configuration) {
+        super.onConfigurationChanged(newConfig)
+        updateMetrics()
+    }
+
+    private fun updateMetrics() {
+        val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this)
+        val width = windowMetrics.bounds.width()
+        val height = windowMetrics.bounds.height()
+        adapter.append("WindowMetrics update", "width: $width, height: $height")
+        adapter.notifyDataSetChanged()
+    }
+}
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoAdapter.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoAdapter.kt
new file mode 100644
index 0000000..5bc46ae
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoAdapter.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.demos
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.R
+
+class DemoAdapter(private val demoItems: List<DemoItem>) : RecyclerView.Adapter<DemoVH>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DemoVH {
+        val inflater = LayoutInflater.from(parent.context)
+        val root = inflater.inflate(R.layout.view_holder_demo_item, parent, false)
+        return DemoVH(root)
+    }
+
+    override fun onBindViewHolder(holder: DemoVH, position: Int) {
+        holder.bind(demoItems[position])
+    }
+
+    override fun getItemCount(): Int {
+        return demoItems.size
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoItem.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoItem.kt
new file mode 100644
index 0000000..88f3c65
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoItem.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.demos
+
+import android.app.Activity
+
+class DemoItem(val description: String, val buttonTitle: String, val clazz: Class<out Activity>)
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoVH.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoVH.kt
new file mode 100644
index 0000000..d986288
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/DemoVH.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.demos
+
+import android.content.Intent
+import android.view.View
+import android.widget.Button
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.R
+
+class DemoVH(view: View) : RecyclerView.ViewHolder(view) {
+    private val description = view.findViewById<TextView>(R.id.demo_description)
+    private val launchButton = view.findViewById<Button>(R.id.start_demo_button)
+
+    fun bind(item: DemoItem) {
+        description.text = item.description
+        launchButton.text = item.buttonTitle
+        launchButton.setOnClickListener { view ->
+            val context = view.context
+            val intent = Intent(context, item.clazz)
+            view.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/demos/WindowDemosActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/WindowDemosActivity.kt
new file mode 100644
index 0000000..19c0156
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/demos/WindowDemosActivity.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.demos
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.RecyclerView
+import androidx.window.demo.DisplayFeaturesNoConfigChangeActivity
+import androidx.window.demo.ImeActivity
+import androidx.window.demo.PresentationActivity
+import androidx.window.demo.R
+import androidx.window.demo.R.string.display_features_config_change
+import androidx.window.demo.R.string.display_features_no_config_change
+import androidx.window.demo.R.string.show_all_display_features_config_change_description
+import androidx.window.demo.R.string.show_all_display_features_no_config_change_description
+import androidx.window.demo.SplitLayoutActivity
+import androidx.window.demo.WindowMetricsActivity
+import androidx.window.demo.common.DisplayFeaturesActivity
+
+/**
+ * Main activity that launches WindowManager demos.
+*/
+class WindowDemosActivity : AppCompatActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_window_demos)
+        val demoItems = listOf(
+            DemoItem(
+                buttonTitle = getString(display_features_config_change),
+                description = getString(show_all_display_features_config_change_description),
+                clazz = DisplayFeaturesActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(display_features_no_config_change),
+                description = getString(show_all_display_features_no_config_change_description),
+                clazz = DisplayFeaturesNoConfigChangeActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(R.string.window_metrics),
+                description = getString(R.string.window_metrics_description),
+                clazz = WindowMetricsActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(R.string.split_layout),
+                description = getString(R.string.split_layout_demo_description),
+                clazz = SplitLayoutActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(R.string.presentation),
+                description = getString(R.string.presentation_demo_description),
+                clazz = PresentationActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(R.string.ime),
+                description = getString(R.string.ime_demo_description),
+                clazz = ImeActivity::class.java
+            )
+        )
+        val recyclerView = findViewById<RecyclerView>(R.id.demo_recycler_view)
+
+        recyclerView.adapter = DemoAdapter(demoItems)
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
new file mode 100644
index 0000000..0d3771e
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/DemoActivityEmbeddingController.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import androidx.annotation.ColorInt
+import androidx.annotation.GuardedBy
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/** A singleton controller to manage the global config. */
+class DemoActivityEmbeddingController private constructor() {
+
+    private val lock = Object()
+
+    @GuardedBy("lock")
+    @ColorInt
+    private var _animationBackgroundColor = 0
+
+    /** Animation background color to use when the animation requires a background. */
+    var animationBackgroundColor: Int
+        @ColorInt
+        get() = synchronized(lock) {
+            _animationBackgroundColor
+        }
+        set(@ColorInt value) = synchronized(lock) {
+            _animationBackgroundColor = value
+        }
+
+    companion object {
+        @Volatile
+        private var globalInstance: DemoActivityEmbeddingController? = null
+        private val globalLock = ReentrantLock()
+
+        /**
+         * Obtains the singleton instance of [DemoActivityEmbeddingController].
+         */
+        @JvmStatic
+        fun getInstance(): DemoActivityEmbeddingController {
+            if (globalInstance == null) {
+                globalLock.withLock {
+                    if (globalInstance == null) {
+                        globalInstance = DemoActivityEmbeddingController()
+                    }
+                }
+            }
+            return globalInstance!!
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
new file mode 100644
index 0000000..1886454
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.content.Context
+import androidx.startup.Initializer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.demo.R
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.SUFFIX_REVERSED
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_SHOW_FULLSCREEN_IN_PORTRAIT
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING
+import androidx.window.demo.embedding.SplitDeviceStateActivityBase.Companion.TAG_USE_DEFAULT_SPLIT_ATTRIBUTES
+import androidx.window.embedding.RuleController
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.BOTTOM_TO_TOP
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
+import androidx.window.embedding.SplitAttributesCalculatorParams
+import androidx.window.embedding.SplitController
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
+
+/**
+ * Initializes SplitController with a set of statically defined rules.
+ */
+@OptIn(ExperimentalWindowApi::class)
+class ExampleWindowInitializer : Initializer<RuleController> {
+    private val mDemoActivityEmbeddingController = DemoActivityEmbeddingController.getInstance()
+
+    override fun create(context: Context): RuleController {
+        SplitController.getInstance(context).apply {
+            if (isSplitAttributesCalculatorSupported()) {
+                setSplitAttributesCalculator(::sampleSplitAttributesCalculator)
+            }
+        }
+        return RuleController.getInstance(context).apply {
+            if (SplitController.getInstance(context).isSplitSupported()) {
+                setRules(RuleController.parseRules(context, R.xml.main_split_config))
+            }
+        }
+    }
+
+    /**
+     * A sample callback set in [SplitController.setSplitAttributesCalculator] to demonstrate how to
+     * change the [SplitAttributes] with the current device and window state and
+     * [SplitAttributesCalculatorParams.splitRuleTag].
+     */
+    private fun sampleSplitAttributesCalculator(
+        params: SplitAttributesCalculatorParams
+    ): SplitAttributes {
+        val isPortrait = params.parentWindowMetrics.isPortrait()
+        val windowLayoutInfo = params.parentWindowLayoutInfo
+        val isTabletop = windowLayoutInfo.isTabletop()
+        val isBookMode = windowLayoutInfo.isBookMode()
+        val config = params.parentConfiguration
+        // The SplitAttributes to occupy the whole task bounds
+        val expandContainersAttrs = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .build()
+        val tag = params.splitRuleTag
+        val shouldReversed = tag?.contains(SUFFIX_REVERSED) ?: false
+        // Make a copy of the default splitAttributes, but replace the animation background
+        // color to what is configured in the Demo app.
+        val backgroundColor = mDemoActivityEmbeddingController.animationBackgroundColor
+        val defaultSplitAttributes = SplitAttributes.Builder()
+            .setLayoutDirection(params.defaultSplitAttributes.layoutDirection)
+            .setSplitType(params.defaultSplitAttributes.splitType)
+            .setAnimationBackgroundColor(backgroundColor)
+            .build()
+        when (tag?.substringBefore(SUFFIX_REVERSED)) {
+            TAG_USE_DEFAULT_SPLIT_ATTRIBUTES, null -> {
+                return if (params.areDefaultConstraintsSatisfied) {
+                    defaultSplitAttributes
+                } else {
+                    expandContainersAttrs
+                }
+            }
+            TAG_SHOW_FULLSCREEN_IN_PORTRAIT -> {
+                if (isPortrait) {
+                    return expandContainersAttrs
+                }
+            }
+            TAG_SHOW_FULLSCREEN_IN_PORTRAIT + SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
+                if (isTabletop) {
+                    return SplitAttributes.Builder()
+                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setLayoutDirection(
+                            if (shouldReversed) {
+                                BOTTOM_TO_TOP
+                            } else {
+                                TOP_TO_BOTTOM
+                            }
+                        )
+                        .setAnimationBackgroundColor(backgroundColor)
+                        .build()
+                } else if (isPortrait) {
+                    return expandContainersAttrs
+                }
+            }
+            TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
+                if (isTabletop) {
+                    return SplitAttributes.Builder()
+                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setLayoutDirection(
+                            if (shouldReversed) {
+                                BOTTOM_TO_TOP
+                            } else {
+                                TOP_TO_BOTTOM
+                            }
+                        )
+                        .setAnimationBackgroundColor(backgroundColor)
+                        .build()
+                }
+            }
+            TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE -> {
+                return SplitAttributes.Builder()
+                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setLayoutDirection(
+                        if (shouldReversed) {
+                            BOTTOM_TO_TOP
+                        } else {
+                            TOP_TO_BOTTOM
+                        }
+                    ).build()
+            }
+            TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE + SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE -> {
+                return if (isBookMode) {
+                    expandContainersAttrs
+                } else if (config.screenWidthDp <= 600) {
+                    SplitAttributes.Builder()
+                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setLayoutDirection(
+                            if (shouldReversed) {
+                                BOTTOM_TO_TOP
+                            } else {
+                                TOP_TO_BOTTOM
+                            }
+                        )
+                        .setAnimationBackgroundColor(backgroundColor)
+                        .build()
+                } else {
+                    SplitAttributes.Builder()
+                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setLayoutDirection(
+                            if (shouldReversed) {
+                                RIGHT_TO_LEFT
+                            } else {
+                                LEFT_TO_RIGHT
+                            }
+                        )
+                        .setAnimationBackgroundColor(backgroundColor)
+                        .build()
+                }
+            }
+            TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING -> {
+                val foldingState = windowLayoutInfo.getFoldingFeature()
+                if (foldingState != null) {
+                    return SplitAttributes.Builder()
+                        .setSplitType(
+                            if (foldingState.isSeparating) {
+                                SplitAttributes.SplitType.splitByHinge()
+                            } else {
+                                SplitAttributes.SplitType.ratio(0.3f)
+                            }
+                        ).setLayoutDirection(
+                            if (
+                                foldingState.orientation
+                                    == FoldingFeature.Orientation.HORIZONTAL
+                            ) {
+                                if (shouldReversed) BOTTOM_TO_TOP else TOP_TO_BOTTOM
+                            } else {
+                                if (shouldReversed) RIGHT_TO_LEFT else LEFT_TO_RIGHT
+                            }
+                        )
+                        .setAnimationBackgroundColor(backgroundColor)
+                        .build()
+                }
+            }
+        }
+        return defaultSplitAttributes
+    }
+
+    private fun WindowMetrics.isPortrait(): Boolean =
+        bounds.height() > bounds.width()
+
+    private fun WindowLayoutInfo.isTabletop(): Boolean {
+        val foldingFeature = getFoldingFeature()
+        return foldingFeature?.state == FoldingFeature.State.HALF_OPENED &&
+            foldingFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
+    }
+
+    private fun WindowLayoutInfo.isBookMode(): Boolean {
+        val foldingFeature = getFoldingFeature()
+        return foldingFeature?.state == FoldingFeature.State.HALF_OPENED &&
+            foldingFeature.orientation == FoldingFeature.Orientation.VERTICAL
+    }
+
+    /**
+     * Returns the [FoldingFeature] if it is exactly the only [FoldingFeature] in
+     * [WindowLayoutInfo]. Otherwise, returns `null`.
+     */
+    private fun WindowLayoutInfo.getFoldingFeature(): FoldingFeature? {
+        val foldingFeatures = displayFeatures.filterIsInstance<FoldingFeature>()
+        return if (foldingFeatures.size == 1) foldingFeatures[0] else null
+    }
+
+    override fun dependencies(): List<Class<out Initializer<*>>> {
+        return emptyList()
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExpandedDialogActivity.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExpandedDialogActivity.kt
new file mode 100644
index 0000000..3419fcb
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExpandedDialogActivity.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.os.Bundle
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+
+/** Activity to show a dialog. */
+class ExpandedDialogActivity : AppCompatActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        showDialog()
+    }
+
+    private fun showDialog() {
+        val dialog = AlertDialog.Builder(this)
+            .setTitle("Dialog in expanded activity")
+            .setMessage("To demo showing dialog that can expand over a split")
+            .setNeutralButton("Close") { _, _ ->
+                finish()
+            }
+            .setOnDismissListener {
+                finish()
+            }
+
+        dialog.show()
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityA.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityA.kt
new file mode 100644
index 0000000..94757d6
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityA.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.demo.embedding
+
+open class SplitActivityA : SplitActivityBase()
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityB.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityB.kt
new file mode 100644
index 0000000..90a67dd
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityB.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+open class SplitActivityB : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#fff3e0"))
+
+        if (intent.getBooleanExtra(EXTRA_LAUNCH_C_TO_SIDE, false)) {
+            startActivity(Intent(this, SplitActivityC::class.java))
+            // Make sure that the side activity is only launched once, as the activity may be
+            // recreated when the split bounds change and we need to avoid launching another
+            // instance.
+            intent.removeExtra(EXTRA_LAUNCH_C_TO_SIDE)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java
new file mode 100644
index 0000000..59ca4ac
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityBase.java
@@ -0,0 +1,433 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding;
+
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+
+import static androidx.window.embedding.SplitRule.FinishBehavior.ADJACENT;
+import static androidx.window.embedding.SplitRule.FinishBehavior.ALWAYS;
+import static androidx.window.embedding.SplitRule.FinishBehavior.NEVER;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.util.Consumer;
+import androidx.window.demo.R;
+import androidx.window.demo.databinding.ActivitySplitActivityLayoutBinding;
+import androidx.window.embedding.ActivityEmbeddingController;
+import androidx.window.embedding.ActivityFilter;
+import androidx.window.embedding.ActivityRule;
+import androidx.window.embedding.EmbeddingRule;
+import androidx.window.embedding.RuleController;
+import androidx.window.embedding.SplitAttributes;
+import androidx.window.embedding.SplitController;
+import androidx.window.embedding.SplitInfo;
+import androidx.window.embedding.SplitPairFilter;
+import androidx.window.embedding.SplitPairRule;
+import androidx.window.embedding.SplitPlaceholderRule;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Sample showcase of split activity rules. Allows the user to select some split configuration
+ * options with checkboxes and launch activities with those options applied.
+ */
+public class SplitActivityBase extends AppCompatActivity
+        implements CompoundButton.OnCheckedChangeListener {
+
+    private static final String TAG = "SplitActivityTest";
+    static final int MIN_SPLIT_WIDTH_DP = 600;
+    static final float SPLIT_RATIO = 0.3f;
+    static final String EXTRA_LAUNCH_C_TO_SIDE = "launch_c_to_side";
+
+    private SplitController mSplitController;
+    private RuleController mRuleController;
+    private SplitInfoCallback mCallback;
+
+    private ActivitySplitActivityLayoutBinding mViewBinding;
+
+    /** In the process of updating checkboxes based on split rule. */
+    private boolean mUpdatingConfigs;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mViewBinding = ActivitySplitActivityLayoutBinding.inflate(getLayoutInflater());
+        setContentView(mViewBinding.getRoot());
+
+        // Setup activity launch buttons and config options.
+        mViewBinding.launchB.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityB.class)));
+        mViewBinding.launchBAndC.setOnClickListener((View v) -> {
+            Intent bStartIntent = new Intent(this, SplitActivityB.class);
+            bStartIntent.putExtra(EXTRA_LAUNCH_C_TO_SIDE, true);
+            startActivity(bStartIntent);
+        });
+        mViewBinding.launchE.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityE.class)));
+        mViewBinding.launchF.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityF.class)));
+        mViewBinding.launchFPendingIntent.setOnClickListener((View v) -> {
+            try {
+                PendingIntent.getActivity(this, 0, new Intent(this, SplitActivityF.class),
+                        FLAG_IMMUTABLE).send();
+            } catch (PendingIntent.CanceledException e) {
+                Log.e(TAG, e.getMessage());
+            }
+        });
+        mViewBinding.launchUid2Trusted.setOnClickListener((View v) -> {
+            final Intent intent = new Intent();
+            // Use an explicit package and class name to start an Activity from a different
+            // package/UID.
+            intent.setClassName(
+                    "androidx.window.demo2",
+                    "androidx.window.demo2.embedding.TrustedEmbeddingActivity"
+            );
+            try {
+                startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                Toast.makeText(this, R.string.install_samples_2, Toast.LENGTH_LONG).show();
+            }
+        });
+        mViewBinding.launchUid2Untrusted.setOnClickListener((View v) -> {
+            final Intent intent = new Intent();
+            // Use an explicit package and class name to start an Activity from a different
+            // package/UID.
+            intent.setClassName(
+                    "androidx.window.demo2",
+                    "androidx.window.demo2.embedding.UntrustedEmbeddingActivity"
+            );
+            try {
+                startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                Toast.makeText(this, R.string.install_samples_2, Toast.LENGTH_LONG).show();
+            }
+        });
+        mViewBinding.launchUid2UntrustedDisplayFeatures.setOnClickListener((View v) -> {
+            final Intent intent = new Intent();
+            // Use an explicit package and class name to start an Activity from a different
+            // package/UID.
+            intent.setClassName(
+                    "androidx.window.demo2",
+                    "androidx.window.demo.common.DisplayFeaturesActivity"
+            );
+            try {
+                startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                Toast.makeText(this, R.string.install_samples_2, Toast.LENGTH_LONG).show();
+            }
+        });
+        mViewBinding.launchExpandedDialogButton.setOnClickListener((View v) ->
+                startActivity(new Intent(this, ExpandedDialogActivity.class)));
+
+        // Listen for split configuration checkboxes to update the rules before launching
+        // activities.
+        mViewBinding.splitMainCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.usePlaceholderCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.useStickyPlaceholderCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.splitBCCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.finishBCCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.fullscreenECheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.splitWithFCheckBox.setOnCheckedChangeListener(this);
+
+        mSplitController = SplitController.getInstance(this);
+        if (!mSplitController.isSplitSupported()) {
+            Toast.makeText(this, R.string.toast_split_not_support,
+                    Toast.LENGTH_SHORT).show();
+            finish();
+            return;
+        }
+        mRuleController = RuleController.getInstance(this);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mCallback = new SplitInfoCallback();
+        mSplitController.addSplitListener(this, Runnable::run, mCallback);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mSplitController.removeSplitListener(mCallback);
+        mCallback = null;
+    }
+
+    /** Updates the embedding status when receives callback from the extension. */
+    class SplitInfoCallback implements Consumer<List<SplitInfo>> {
+        @Override
+        public void accept(List<SplitInfo> splitInfoList) {
+            runOnUiThread(() -> {
+                updateEmbeddedStatus();
+                updateCheckboxesFromCurrentConfig();
+            });
+        }
+    }
+
+    /** Called on checkbox changed. */
+    @Override
+    public void onCheckedChanged(@NonNull CompoundButton c, boolean isChecked) {
+        if (c.getId() == mViewBinding.splitBCCheckBox.getId()) {
+            if (isChecked) {
+                mViewBinding.finishBCCheckBox.setEnabled(true);
+            } else {
+                mViewBinding.finishBCCheckBox.setEnabled(false);
+                mViewBinding.finishBCCheckBox.setChecked(false);
+            }
+        } else if (c.getId() == mViewBinding.usePlaceholderCheckBox.getId()) {
+            if (isChecked) {
+                mViewBinding.useStickyPlaceholderCheckBox.setEnabled(true);
+            } else {
+                mViewBinding.useStickyPlaceholderCheckBox.setEnabled(false);
+                mViewBinding.useStickyPlaceholderCheckBox.setChecked(false);
+            }
+        }
+        if (!mUpdatingConfigs) {
+            updateRulesFromCheckboxes();
+        }
+    }
+
+    /** Updates the checkboxes states after the split rules are changed by other activity. */
+    void updateCheckboxesFromCurrentConfig() {
+        mUpdatingConfigs = true;
+
+        SplitPairRule splitMainConfig = getRuleFor(SplitActivityA.class, null);
+        mViewBinding.splitMainCheckBox.setChecked(splitMainConfig != null);
+
+        SplitPlaceholderRule placeholderForBConfig = getPlaceholderRule(SplitActivityB.class);
+        mViewBinding.usePlaceholderCheckBox.setChecked(placeholderForBConfig != null);
+        mViewBinding.useStickyPlaceholderCheckBox.setEnabled(placeholderForBConfig != null);
+        mViewBinding.useStickyPlaceholderCheckBox.setChecked(placeholderForBConfig != null
+                && placeholderForBConfig.isSticky());
+
+        SplitPairRule bAndCPairConfig = getRuleFor(SplitActivityB.class,
+                SplitActivityC.class);
+        mViewBinding.splitBCCheckBox.setChecked(bAndCPairConfig != null);
+        mViewBinding.finishBCCheckBox.setEnabled(bAndCPairConfig != null);
+        mViewBinding.finishBCCheckBox.setChecked(bAndCPairConfig != null
+                && bAndCPairConfig.getFinishPrimaryWithSecondary() == ALWAYS
+                && bAndCPairConfig.getFinishSecondaryWithPrimary() == ALWAYS);
+
+        SplitPairRule fConfig = getRuleFor(null, SplitActivityF.class);
+        mViewBinding.splitWithFCheckBox.setChecked(fConfig != null);
+
+        ActivityRule configE = getRuleFor(SplitActivityE.class);
+        mViewBinding.fullscreenECheckBox.setChecked(configE != null && configE.getAlwaysExpand());
+
+        mUpdatingConfigs = false;
+    }
+
+    /** Gets the split rule for the given activity pair. */
+    private SplitPairRule getRuleFor(Class<? extends Activity> a, Class<? extends Activity> b) {
+        Set<EmbeddingRule> currentRules = mRuleController.getRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof SplitPairRule && isRuleFor(a, b, (SplitPairRule) rule)) {
+                return (SplitPairRule) rule;
+            }
+        }
+        return null;
+    }
+
+    /** Gets the placeholder rule for the given activity. */
+    SplitPlaceholderRule getPlaceholderRule(@NonNull Class<? extends Activity> a) {
+        Set<EmbeddingRule> currentRules = mRuleController.getRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof SplitPlaceholderRule) {
+                for (ActivityFilter filter : ((SplitPlaceholderRule) rule).getFilters()) {
+                    if (filter.getComponentName().getClassName().equals(a.getName())) {
+                        return (SplitPlaceholderRule) rule;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /** Gets the split rule for the given activity. */
+    private ActivityRule getRuleFor(Class<? extends Activity> a) {
+        Set<EmbeddingRule> currentRules = mRuleController.getRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof ActivityRule && isRuleFor(a, (ActivityRule) rule)) {
+                return (ActivityRule) rule;
+            }
+        }
+        return null;
+    }
+
+    /** Whether the given rule is for splitting the given activity pair. */
+    private boolean isRuleFor(Class<? extends Activity> a, Class<? extends Activity> b,
+            SplitPairRule pairConfig) {
+        return isRuleFor(a != null ? a.getName() : "*", b != null ? b.getName() : "*",
+                pairConfig);
+    }
+
+    /** Whether the given rule is for splitting the given activity pair. */
+    private boolean isRuleFor(String primaryActivityName, String secondaryActivityName,
+            SplitPairRule pairConfig) {
+        for (SplitPairFilter filter : pairConfig.getFilters()) {
+            if (filter.getPrimaryActivityName().getClassName().contains(primaryActivityName)
+                    && filter.getSecondaryActivityName().getClassName()
+                    .contains(secondaryActivityName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Whether the given rule is for splitting the given activity with another. */
+    private boolean isRuleFor(@NonNull Class<? extends Activity> a, @NonNull ActivityRule config) {
+        for (ActivityFilter filter : config.getFilters()) {
+            if (filter.getComponentName().getClassName().equals(a.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Updates the split rules based on the current selection on checkboxes. */
+    private void updateRulesFromCheckboxes() {
+        mRuleController.clearRules();
+        final SplitAttributes defaultSplitAttributes = new SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.ratio(SPLIT_RATIO))
+                .build();
+
+        if (mViewBinding.splitMainCheckBox.isChecked()) {
+            // Split main with any activity.
+            final Set<SplitPairFilter> pairFilters = new HashSet<>();
+            pairFilters.add(new SplitPairFilter(componentName(SplitActivityA.class),
+                    new ComponentName("*", "*"), null));
+            final SplitPairRule rule = new SplitPairRule.Builder(pairFilters)
+                    .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
+                    .setMinHeightDp(0)
+                    .setMinSmallestWidthDp(0)
+                    .setFinishPrimaryWithSecondary(NEVER)
+                    .setFinishSecondaryWithPrimary(NEVER)
+                    .setClearTop(true)
+                    .setDefaultSplitAttributes(defaultSplitAttributes)
+                    .build();
+            mRuleController.addRule(rule);
+        }
+
+        if (mViewBinding.usePlaceholderCheckBox.isChecked()) {
+            // Split B with placeholder.
+            final Set<ActivityFilter> activityFilters = new HashSet<>();
+            activityFilters.add(new ActivityFilter(componentName(SplitActivityB.class), null));
+            final Intent intent = new Intent();
+            intent.setComponent(componentName(SplitActivityPlaceholder.class));
+            final SplitPlaceholderRule rule = new SplitPlaceholderRule.Builder(
+                    activityFilters,
+                    intent
+            )
+                    .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
+                    .setMinHeightDp(0)
+                    .setMinSmallestWidthDp(0)
+                    .setSticky(mViewBinding.useStickyPlaceholderCheckBox.isChecked())
+                    .setFinishPrimaryWithPlaceholder(ADJACENT)
+                    .setDefaultSplitAttributes(defaultSplitAttributes)
+                    .build();
+            mRuleController.addRule(rule);
+        }
+
+        if (mViewBinding.splitBCCheckBox.isChecked()) {
+            // Split B with C.
+            final Set<SplitPairFilter> pairFilters = new HashSet<>();
+            pairFilters.add(new SplitPairFilter(componentName(SplitActivityB.class),
+                    componentName(SplitActivityC.class), null));
+            final SplitPairRule rule = new SplitPairRule.Builder(pairFilters)
+                    .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
+                    .setMinHeightDp(0)
+                    .setMinSmallestWidthDp(0)
+                    .setFinishPrimaryWithSecondary(
+                            mViewBinding.finishBCCheckBox.isChecked() ? ALWAYS : NEVER
+                    )
+                    .setFinishSecondaryWithPrimary(
+                            mViewBinding.finishBCCheckBox.isChecked() ? ALWAYS : NEVER
+                    )
+                    .setClearTop(true)
+                    .setDefaultSplitAttributes(defaultSplitAttributes)
+                    .build();
+            mRuleController.addRule(rule);
+        }
+
+        if (mViewBinding.splitWithFCheckBox.isChecked()) {
+            // Split any activity with F.
+            final Set<SplitPairFilter> pairFilters = new HashSet<>();
+            pairFilters.add(new SplitPairFilter(new ComponentName("*", "*"),
+                    componentName(SplitActivityF.class), null));
+            final SplitPairRule rule = new SplitPairRule.Builder(pairFilters)
+                    .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
+                    .setMinHeightDp(0)
+                    .setMinSmallestWidthDp(0)
+                    .setFinishPrimaryWithSecondary(NEVER)
+                    .setFinishSecondaryWithPrimary(NEVER)
+                    .setClearTop(true)
+                    .setDefaultSplitAttributes(defaultSplitAttributes)
+                    .build();
+            mRuleController.addRule(rule);
+        }
+
+        if (mViewBinding.fullscreenECheckBox.isChecked()) {
+            // Launch E in fullscreen.
+            final Set<ActivityFilter> activityFilters = new HashSet<>();
+            activityFilters.add(new ActivityFilter(componentName(SplitActivityE.class), null));
+            final ActivityRule activityRule = new ActivityRule.Builder(activityFilters)
+                    .setAlwaysExpand(true)
+                    .build();
+            mRuleController.addRule(activityRule);
+        }
+
+        // Always expand the dialog activity.
+        final Set<ActivityFilter> dialogActivityFilters = new HashSet<>();
+        dialogActivityFilters.add(new ActivityFilter(componentName(
+                ExpandedDialogActivity.class), null));
+        mRuleController.addRule(new ActivityRule.Builder(dialogActivityFilters)
+                .setAlwaysExpand(true)
+                .build());
+    }
+
+    ComponentName componentName(Class<? extends Activity> activityClass) {
+        return new ComponentName(getPackageName(),
+                activityClass != null ? activityClass.getName() : "*");
+    }
+
+    ComponentName componentName(String className) {
+        return new ComponentName(getPackageName(), className);
+    }
+
+    /** Updates the status label that says when an activity is embedded. */
+    void updateEmbeddedStatus() {
+        if (ActivityEmbeddingController.getInstance(this).isActivityEmbedded(this)) {
+            mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.VISIBLE);
+        } else {
+            mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.GONE);
+        }
+    }
+}
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityC.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityC.kt
new file mode 100644
index 0000000..dcbbb3b
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityC.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+open class SplitActivityC : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#e8f5e9"))
+    }
+}
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityD.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityD.kt
new file mode 100644
index 0000000..a9ec11a
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityD.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+open class SplitActivityD : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#eeeeee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt
new file mode 100644
index 0000000..5db4314
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityDetail.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.window.demo.R
+
+open class SplitActivityDetail : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_activity_list_detail_layout)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#fff3e0"))
+
+        findViewById<TextView>(R.id.item_detail_text)
+            .setText(intent.getStringExtra(EXTRA_SELECTED_ITEM))
+    }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+
+        findViewById<TextView>(R.id.item_detail_text)
+            .setText(intent?.getStringExtra(EXTRA_SELECTED_ITEM))
+    }
+
+    companion object {
+        const val EXTRA_SELECTED_ITEM = "selected_item"
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityE.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityE.kt
new file mode 100644
index 0000000..17c43b1
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityE.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+open class SplitActivityE : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#ede7f6"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityF.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityF.kt
new file mode 100644
index 0000000..325524e
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityF.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+open class SplitActivityF : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#ffebee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt
new file mode 100644
index 0000000..49e119a
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityList.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitInfo
+import androidx.window.demo.R
+import androidx.window.demo.embedding.SplitActivityDetail.Companion.EXTRA_SELECTED_ITEM
+
+open class SplitActivityList : AppCompatActivity() {
+    lateinit var splitController: SplitController
+    val splitChangeListener = SplitStateChangeListener()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_activity_list_layout)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#e0f7fa"))
+
+        splitController = SplitController.getInstance(this)
+    }
+
+    open fun onItemClick(view: View) {
+        val text = (view as TextView).text ?: throw IllegalArgumentException()
+        val startIntent = Intent(this, SplitActivityDetail::class.java)
+        startIntent.putExtra(EXTRA_SELECTED_ITEM, text)
+        startActivity(startIntent)
+    }
+
+    override fun onStart() {
+        super.onStart()
+        splitController.addSplitListener(
+            this,
+            ContextCompat.getMainExecutor(this),
+            splitChangeListener
+        )
+    }
+
+    override fun onStop() {
+        super.onStop()
+        splitController.removeSplitListener(
+            splitChangeListener
+        )
+    }
+
+    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
+        override fun accept(newSplitInfos: List<SplitInfo>) {
+            runOnUiThread {
+                findViewById<View>(R.id.infoButton).visibility =
+                    if (newSplitInfos.isEmpty()) View.VISIBLE else View.GONE
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityListPlaceholder.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityListPlaceholder.kt
new file mode 100644
index 0000000..ab08fe7
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityListPlaceholder.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.demo.embedding
+
+open class SplitActivityListPlaceholder : SplitActivityPlaceholder()
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityPlaceholder.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityPlaceholder.kt
new file mode 100644
index 0000000..380b5b7
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityPlaceholder.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.window.demo.databinding.ActivitySplitActivityPlaceholderLayoutBinding
+
+open class SplitActivityPlaceholder : AppCompatActivity() {
+
+    lateinit var viewBinding: ActivitySplitActivityPlaceholderLayoutBinding
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewBinding = ActivitySplitActivityPlaceholderLayoutBinding.inflate(layoutInflater)
+        setContentView(viewBinding.root)
+
+        viewBinding.rootSplitActivityLayout.setBackgroundColor(Color.parseColor("#eeeeee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityTrampoline.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityTrampoline.kt
new file mode 100644
index 0000000..3732156
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitActivityTrampoline.kt
@@ -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.
+ */
+
+package androidx.window.demo.embedding
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.window.embedding.ActivityFilter
+import androidx.window.embedding.RuleController
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitPlaceholderRule
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ADJACENT
+
+/**
+ * Example trampoline activity that launches a split and finishes itself.
+ */
+class SplitActivityTrampoline : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        val activityFilters = setOf(ActivityFilter(componentName(
+            "androidx.window.demo.embedding.SplitActivityTrampolineTarget"), null))
+        val placeholderIntent = Intent()
+        placeholderIntent.component =
+            componentName("androidx.window.demo.embedding.SplitActivityPlaceholder")
+        val defaultSplitAttributes = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(SPLIT_RATIO))
+            .build()
+        val placeholderRule = SplitPlaceholderRule.Builder(activityFilters, placeholderIntent)
+            .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
+            .setMinHeightDp(0)
+            .setMinSmallestWidthDp(0)
+            .setFinishPrimaryWithPlaceholder(ADJACENT)
+            .setDefaultSplitAttributes(defaultSplitAttributes)
+            .build()
+        RuleController.getInstance(this).addRule(placeholderRule)
+        val activityIntent = Intent()
+        activityIntent.component = componentName(
+            "androidx.window.demo.embedding.SplitActivityTrampolineTarget")
+        startActivity(activityIntent)
+
+        finish()
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityA.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityA.kt
new file mode 100644
index 0000000..9ba2ac3
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityA.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+class SplitDeviceStateActivityA : SplitDeviceStateActivityBase()
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityB.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityB.kt
new file mode 100644
index 0000000..6711d76
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityB.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.demo.R
+
+class SplitDeviceStateActivityB : SplitDeviceStateActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#fff3e0"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
new file mode 100644
index 0000000..5f686b2
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
@@ -0,0 +1,430 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.content.ComponentName
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.CompoundButton
+import android.widget.RadioGroup
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.EmbeddingRule
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitInfo
+import androidx.window.embedding.SplitPairFilter
+import androidx.window.embedding.SplitPairRule
+import androidx.window.demo.R
+import androidx.window.demo.databinding.ActivitySplitDeviceStateLayoutBinding
+import androidx.window.embedding.RuleController
+
+open class SplitDeviceStateActivityBase : AppCompatActivity(), View.OnClickListener,
+    RadioGroup.OnCheckedChangeListener, CompoundButton.OnCheckedChangeListener,
+    AdapterView.OnItemSelectedListener {
+
+    private lateinit var splitController: SplitController
+    private lateinit var ruleController: RuleController
+
+    private val splitStateChangeListener = SplitStateChangeListener()
+
+    private lateinit var splitPairRule: SplitPairRule
+    private var shouldReverseContainerPosition = false
+    private var shouldShowHorizontalInTabletop = false
+    private var shouldShowFullscreenInBookMode = false
+
+    private lateinit var viewBinding: ActivitySplitDeviceStateLayoutBinding
+    private lateinit var activityA: ComponentName
+    private lateinit var activityB: ComponentName
+
+    /** Controller to manage the global configuration. */
+    private val demoActivityEmbeddingController = DemoActivityEmbeddingController.getInstance()
+
+    /** The last selected split rule id. */
+    private var lastCheckedRuleId = 0
+
+    @OptIn(ExperimentalWindowApi::class)
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewBinding = ActivitySplitDeviceStateLayoutBinding.inflate(layoutInflater)
+        splitController = SplitController.getInstance(this)
+        if (!splitController.isSplitSupported()) {
+            Toast.makeText(
+                this, R.string.toast_split_not_support,
+                Toast.LENGTH_SHORT
+            ).show()
+            finish()
+            return
+        }
+        ruleController = RuleController.getInstance(this)
+
+        setContentView(viewBinding.root)
+
+        activityA = ComponentName(this, SplitDeviceStateActivityA::class.java.name)
+        activityB = ComponentName(this, SplitDeviceStateActivityB::class.java.name)
+
+        val radioGroup = viewBinding.splitAttributesOptionsRadioGroup
+        val animationBgColorDropdown = viewBinding.animationBackgroundColorDropdown
+        if (componentName == activityA) {
+            // Set to the first option
+            demoActivityEmbeddingController.animationBackgroundColor =
+                ANIMATION_BACKGROUND_COLORS_VALUE[0]
+            radioGroup.check(R.id.use_default_split_attributes)
+            onCheckedChanged(radioGroup, radioGroup.checkedRadioButtonId)
+            radioGroup.setOnCheckedChangeListener(this)
+            animationBgColorDropdown.adapter = ArrayAdapter(
+                this,
+                android.R.layout.simple_spinner_dropdown_item,
+                ANIMATION_BACKGROUND_COLORS_TEXT
+            )
+            animationBgColorDropdown.onItemSelectedListener = this
+        } else {
+            // Only update split pair rule on the primary Activity. The secondary Activity can only
+            // finish itself to prevent confusing users. We only apply the rule when the Activity is
+            // launched from the primary.
+            viewBinding.chooseLayoutTextView.visibility = View.GONE
+            radioGroup.visibility = View.GONE
+            animationBgColorDropdown.visibility = View.GONE
+            viewBinding.launchActivityToSide.text = "Finish this Activity"
+        }
+
+        viewBinding.showHorizontalLayoutInTabletopCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.showFullscreenInBookModeCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.swapPrimarySecondaryPositionCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.launchActivityToSide.setOnClickListener(this)
+
+        val isCallbackSupported = splitController.isSplitAttributesCalculatorSupported()
+        if (!isCallbackSupported) {
+            // Disable the radioButtons that use SplitAttributesCalculator
+            viewBinding.showFullscreenInPortraitRadioButton.isEnabled = false
+            viewBinding.showHorizontalLayoutInTabletopRadioButton.isEnabled = false
+            viewBinding.showDifferentLayoutWithSizeRadioButton.isEnabled = false
+            viewBinding.splitByHingeWhenSeparatingRadioButton.isEnabled = false
+            hideAllSubCheckBoxes()
+            // Add the error message to notify the SplitAttributesCalculator is not available.
+            viewBinding.errorMessageTextView.text = "SplitAttributesCalculator is not supported!"
+            animationBgColorDropdown.isEnabled = false
+        }
+    }
+
+    override fun onStart() {
+        super.onStart()
+        splitController.addSplitListener(
+            this,
+            ContextCompat.getMainExecutor(this),
+            splitStateChangeListener
+        )
+    }
+
+    override fun onStop() {
+        super.onStop()
+        splitController.removeSplitListener(splitStateChangeListener)
+    }
+
+    override fun onClick(button: View) {
+        if (button.id != R.id.launch_activity_to_side) {
+            return
+        }
+        when (componentName) {
+            activityA -> {
+                startActivity(Intent(this, SplitDeviceStateActivityB::class.java))
+            }
+            activityB -> finish()
+        }
+    }
+
+    override fun onCheckedChanged(c: CompoundButton, isChecked: Boolean) {
+        when (c.id) {
+            R.id.swap_primary_secondary_position_check_box -> {
+                shouldReverseContainerPosition = isChecked
+                updateSplitPairRuleWithRadioButtonId(
+                    viewBinding.splitAttributesOptionsRadioGroup.checkedRadioButtonId
+                )
+            }
+            R.id.show_horizontal_layout_in_tabletop_check_box -> {
+                shouldShowHorizontalInTabletop = isChecked
+                updateSplitPairRuleWithRadioButtonId(
+                    R.id.show_fullscreen_in_portrait_radio_button
+                )
+            }
+            R.id.show_fullscreen_in_book_mode_check_box -> {
+                shouldShowFullscreenInBookMode = isChecked
+                updateSplitPairRuleWithRadioButtonId(
+                    R.id.show_different_layout_with_size_radio_button
+                )
+            }
+        }
+    }
+
+    override fun onCheckedChanged(group: RadioGroup, id: Int) {
+        updateCheckboxWithRadioButton(id)
+        updateSplitPairRuleWithRadioButtonId(id)
+    }
+
+    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
+        demoActivityEmbeddingController.animationBackgroundColor =
+            ANIMATION_BACKGROUND_COLORS_VALUE[position]
+        updateSplitPairRuleWithRadioButtonId(lastCheckedRuleId)
+    }
+
+    override fun onNothingSelected(view: AdapterView<*>?) {
+        // Auto-generated method stub
+    }
+
+    private fun updateCheckboxWithRadioButton(id: Int) {
+        when (id) {
+            R.id.show_fullscreen_in_portrait_radio_button -> {
+                showCheckBox(R.id.show_horizontal_layout_in_tabletop_check_box)
+                hideCheckBox(R.id.show_fullscreen_in_book_mode_check_box)
+            }
+            R.id.show_different_layout_with_size_radio_button -> {
+                hideCheckBox(R.id.show_horizontal_layout_in_tabletop_check_box)
+                showCheckBox(R.id.show_fullscreen_in_book_mode_check_box)
+            }
+            else -> hideAllSubCheckBoxes()
+        }
+        // Disable the checkbox because this won't be applied if users want to use the default rule
+        // behavior.
+        viewBinding.swapPrimarySecondaryPositionCheckBox.isEnabled =
+            id != R.id.use_default_split_attributes
+    }
+
+    private fun hideAllSubCheckBoxes() {
+        hideCheckBox(R.id.show_horizontal_layout_in_tabletop_check_box)
+        hideCheckBox(R.id.show_fullscreen_in_book_mode_check_box)
+    }
+
+    /** Show check box with [id] and also hides other check boxes. */
+    private fun showCheckBox(id: Int) {
+        when (id) {
+            R.id.show_horizontal_layout_in_tabletop_check_box -> {
+                viewBinding.showFullscreenInPortraitDividerTop.visibility = View.VISIBLE
+                viewBinding.showHorizontalLayoutInTabletopCheckBox.visibility = View.VISIBLE
+                viewBinding.showFullscreenInPortraitDividerBottom.visibility = View.VISIBLE
+            }
+            R.id.show_fullscreen_in_book_mode_check_box -> {
+                viewBinding.showDifferentLayoutWithSizeDividerTop.visibility = View.VISIBLE
+                viewBinding.showFullscreenInBookModeCheckBox.visibility = View.VISIBLE
+                viewBinding.showDifferentLayoutWithSizeDividerBottom.visibility = View.VISIBLE
+            }
+        }
+    }
+
+    private fun hideCheckBox(id: Int) {
+        when (id) {
+            R.id.show_horizontal_layout_in_tabletop_check_box -> {
+                viewBinding.showFullscreenInPortraitDividerTop.visibility = View.GONE
+                viewBinding.showHorizontalLayoutInTabletopCheckBox.visibility = View.GONE
+                viewBinding.showFullscreenInPortraitDividerBottom.visibility = View.GONE
+                shouldShowHorizontalInTabletop = false
+            }
+            R.id.show_fullscreen_in_book_mode_check_box -> {
+                viewBinding.showDifferentLayoutWithSizeDividerTop.visibility = View.GONE
+                viewBinding.showFullscreenInBookModeCheckBox.visibility = View.GONE
+                viewBinding.showDifferentLayoutWithSizeDividerBottom.visibility = View.GONE
+                shouldShowFullscreenInBookMode = false
+            }
+        }
+    }
+
+    private fun updateSplitPairRuleWithRadioButtonId(id: Int) {
+        lastCheckedRuleId = id
+        ruleController.clearRules()
+
+        val splitPairFilters = HashSet<SplitPairFilter>()
+        val splitPairFilter = SplitPairFilter(
+            activityA,
+            activityB,
+            secondaryActivityIntentAction = null
+        )
+        splitPairFilters.add(splitPairFilter)
+        val defaultSplitAttributes = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.splitEqually())
+            .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+            .setAnimationBackgroundColor(demoActivityEmbeddingController.animationBackgroundColor)
+            .build()
+        // Use the tag to control the rule how to change split attributes with the current state
+        var tag = when (id) {
+            R.id.use_default_split_attributes -> TAG_USE_DEFAULT_SPLIT_ATTRIBUTES
+            R.id.show_fullscreen_in_portrait_radio_button -> {
+                if (shouldShowHorizontalInTabletop) {
+                    TAG_SHOW_FULLSCREEN_IN_PORTRAIT + SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP
+                } else {
+                    TAG_SHOW_FULLSCREEN_IN_PORTRAIT
+                }
+            }
+            R.id.show_horizontal_layout_in_tabletop_radio_button -> {
+                if (shouldReverseContainerPosition) {
+                    TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP + SUFFIX_REVERSED
+                } else {
+                    TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP
+                }
+            }
+            R.id.show_different_layout_with_size_radio_button -> {
+                if (shouldShowFullscreenInBookMode) {
+                    TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE + SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE
+                } else {
+                    TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE
+                }
+            }
+            R.id.split_by_hinge_when_separating_radio_button ->
+                TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING
+            else -> null
+        }
+        if (shouldReverseContainerPosition) {
+            tag += SUFFIX_REVERSED
+        }
+
+        splitPairRule = SplitPairRule.Builder(splitPairFilters)
+            .setTag(tag)
+            .setMinWidthDp(DEFAULT_MINIMUM_WIDTH_DP)
+            .setMinSmallestWidthDp(DEFAULT_MINIMUM_WIDTH_DP)
+            .setDefaultSplitAttributes(defaultSplitAttributes)
+            .build()
+        ruleController.addRule(splitPairRule)
+    }
+
+    /** Updates split attributes when receives callback from the extension. */
+    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
+        override fun accept(newSplitInfos: List<SplitInfo>) {
+            updateSplitAttributesText(newSplitInfos)
+            updateRadioGroupAndCheckBoxFromRule()
+        }
+    }
+
+    @OptIn(ExperimentalWindowApi::class)
+    fun updateSplitAttributesText(newSplitInfos: List<SplitInfo>) {
+        var splitAttributes: SplitAttributes = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .build()
+        var suggestToFinishItself = false
+        val isCallbackSupported = splitController.isSplitAttributesCalculatorSupported()
+        // Traverse SplitInfos from the end because last SplitInfo has the highest z-order.
+        for (info in newSplitInfos.reversed()) {
+            if (info.contains(this@SplitDeviceStateActivityBase)) {
+                splitAttributes = info.splitAttributes
+                if (componentName == activityB &&
+                    splitAttributes.splitType
+                        is SplitAttributes.SplitType.ExpandContainersSplitType
+                ) {
+                    // We don't put any functionality on activity B. Suggest users to finish the
+                    // activity if it fills the host task.
+                    suggestToFinishItself = true
+                }
+                break
+            }
+        }
+        runOnUiThread {
+            viewBinding.activityPairSplitAttributesTextView.text =
+                resources.getString(R.string.current_split_attributes) + splitAttributes
+            if (!isCallbackSupported) {
+                // Don't update the error message if the callback is not supported.
+                return@runOnUiThread
+            }
+            viewBinding.errorMessageTextView.text =
+                if (suggestToFinishItself) {
+                    "Please finish the activity to try other split configurations."
+                } else {
+                    ""
+                }
+        }
+    }
+
+    fun updateRadioGroupAndCheckBoxFromRule() {
+        val splitPairRule = ruleController.getRules().firstOrNull { rule ->
+            isRuleForSplitActivityA(rule)
+        } ?: return
+        val tag = splitPairRule.tag
+        viewBinding.splitAttributesOptionsRadioGroup.check(
+            when (tag?.substringBefore(SUFFIX_REVERSED)) {
+                TAG_USE_DEFAULT_SPLIT_ATTRIBUTES -> R.id.use_default_split_attributes
+                TAG_SHOW_FULLSCREEN_IN_PORTRAIT,
+                TAG_SHOW_FULLSCREEN_IN_PORTRAIT + SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP ->
+                    R.id.show_fullscreen_in_portrait_radio_button
+                TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP,
+                TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP + SUFFIX_REVERSED ->
+                    R.id.show_horizontal_layout_in_tabletop_radio_button
+                TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE,
+                TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE + SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE ->
+                    R.id.show_different_layout_with_size_radio_button
+                TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING ->
+                    R.id.split_by_hinge_when_separating_radio_button
+                else -> 0
+            }
+        )
+        if (tag?.contains(TAG_SHOW_FULLSCREEN_IN_PORTRAIT) == true) {
+            showCheckBox(R.id.show_horizontal_layout_in_tabletop_check_box)
+            viewBinding.showHorizontalLayoutInTabletopCheckBox.isChecked =
+                tag.contains(SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP)
+        } else if (tag?.contains(TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE) == true) {
+            showCheckBox(R.id.swap_primary_secondary_position_check_box)
+            viewBinding.showFullscreenInBookModeCheckBox.isChecked =
+                tag.contains(SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE)
+        }
+
+        viewBinding.swapPrimarySecondaryPositionCheckBox.isChecked =
+            tag?.contains(SUFFIX_REVERSED) ?: false
+    }
+
+    private fun isRuleForSplitActivityA(rule: EmbeddingRule): Boolean {
+        if (rule !is SplitPairRule) {
+            return false
+        }
+        rule.filters.forEach { filter ->
+            if (filter.primaryActivityName == activityA &&
+                filter.secondaryActivityName == activityB
+            ) {
+                return true
+            }
+        }
+        return false
+    }
+
+    companion object {
+        const val TAG_USE_DEFAULT_SPLIT_ATTRIBUTES = "use_default_split_attributes"
+        const val TAG_SHOW_FULLSCREEN_IN_PORTRAIT = "show_fullscreen_in_portrait"
+        const val TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP = "show_horizontal_layout_in_tabletop"
+        const val TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE = "show_different_layout_with_size"
+        const val TAG_SHOW_LAYOUT_FOLLOWING_HINGE_WHEN_SEPARATING = "show_layout_following_hinge"
+        const val SUFFIX_REVERSED = "_reversed"
+        const val SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP = "_and_horizontal_layout_in_tabletop"
+        const val SUFFIX_AND_FULLSCREEN_IN_BOOK_MODE = "_and_fullscreen_in_book_mode"
+        val ANIMATION_BACKGROUND_COLORS_TEXT = arrayOf("BLACK", "BLUE", "GREEN", "YELLOW")
+        val ANIMATION_BACKGROUND_COLORS_VALUE = arrayOf(
+            Color.BLACK,
+            Color.BLUE,
+            Color.GREEN,
+            Color.YELLOW
+        )
+
+        /**
+         * The default minimum dimension for large screen devices.
+         *
+         * It is also the default value of [SplitPairRule.minWidthDp] and
+         * [SplitPairRule.minSmallestWidthDp] if the properties are not specified in static rule
+         * XML format.
+         */
+        const val DEFAULT_MINIMUM_WIDTH_DP = 600
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityA.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityA.kt
new file mode 100644
index 0000000..eaffe18
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityA.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+open class SplitPipActivityA : SplitPipActivityBase()
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityB.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityB.kt
new file mode 100644
index 0000000..2446624
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityB.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+
+open class SplitPipActivityB : SplitPipActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewBinding.rootSplitActivityLayout.setBackgroundColor(Color.parseColor("#fff3e0"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
new file mode 100644
index 0000000..61c056c
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.content.ComponentName
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import android.view.View
+import android.widget.CompoundButton
+import android.widget.RadioGroup
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
+import androidx.window.demo.R
+import androidx.window.demo.common.util.PictureInPictureUtil
+import androidx.window.demo.databinding.ActivitySplitPipActivityLayoutBinding
+import androidx.window.embedding.ActivityFilter
+import androidx.window.embedding.EmbeddingRule
+import androidx.window.embedding.RuleController
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitInfo
+import androidx.window.embedding.SplitPairFilter
+import androidx.window.embedding.SplitPairRule
+import androidx.window.embedding.SplitPlaceholderRule
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ADJACENT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
+
+/**
+ * Sample showcase of split activity rules with picture-in-picture. Allows the user to select some
+ * split and PiP configuration options with checkboxes and launch activities with those options
+ * applied.
+ */
+abstract class SplitPipActivityBase : AppCompatActivity(), CompoundButton.OnCheckedChangeListener,
+    View.OnClickListener, RadioGroup.OnCheckedChangeListener {
+
+    lateinit var splitController: SplitController
+    lateinit var ruleController: RuleController
+    lateinit var viewBinding: ActivitySplitPipActivityLayoutBinding
+    lateinit var componentNameA: ComponentName
+    lateinit var componentNameB: ComponentName
+    lateinit var componentNameNotPip: ComponentName
+    lateinit var componentNamePlaceholder: ComponentName
+    private val splitChangeListener = SplitStateChangeListener()
+    private val splitRatio = 0.5f
+    private var enterPipOnUserLeave = false
+    private var autoEnterPip = false
+
+    /** In the process of updating checkboxes based on split rule. */
+    private var updatingConfigs = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewBinding = ActivitySplitPipActivityLayoutBinding.inflate(layoutInflater)
+        setContentView(viewBinding.root)
+
+        componentNameA = ComponentName(packageName, SplitPipActivityA::class.java.name)
+        componentNameB = ComponentName(packageName, SplitPipActivityB::class.java.name)
+        componentNameNotPip = ComponentName(packageName, SplitPipActivityNoPip::class.java.name)
+        componentNamePlaceholder = ComponentName(packageName,
+            SplitPipActivityPlaceholder::class.java.name)
+
+        splitController = SplitController.getInstance(this)
+        ruleController = RuleController.getInstance(this)
+
+        // Buttons for split rules of the main activity.
+        viewBinding.splitMainCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.finishPrimaryWithSecondaryCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.finishSecondaryWithPrimaryCheckBox.setOnCheckedChangeListener(this)
+
+        // Buttons for split rules of the secondary activity.
+        viewBinding.launchBButton.setOnClickListener(this)
+        viewBinding.usePlaceHolderCheckBox.setOnCheckedChangeListener(this)
+        viewBinding.useStickyPlaceHolderCheckBox.setOnCheckedChangeListener(this)
+
+        // Buttons for launching an activity that doesn't support PiP
+        viewBinding.launchNoPipButton.setOnClickListener(this)
+
+        // Buttons for PiP options.
+        viewBinding.enterPipButton.setOnClickListener(this)
+        viewBinding.supportPipRadioGroup.setOnCheckedChangeListener(this)
+    }
+
+    /** Called on checkbox changed. */
+    override fun onCheckedChanged(button: CompoundButton, isChecked: Boolean) {
+        if (button.id == R.id.split_main_check_box) {
+            if (isChecked) {
+                viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = true
+                viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = true
+            } else {
+                viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = false
+                viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked = false
+                viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = false
+                viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked = false
+            }
+        }
+        if (button.id == R.id.use_place_holder_check_box) {
+            if (isChecked) {
+                viewBinding.useStickyPlaceHolderCheckBox.isEnabled = true
+            } else {
+                viewBinding.useStickyPlaceHolderCheckBox.isEnabled = false
+                viewBinding.useStickyPlaceHolderCheckBox.isChecked = false
+            }
+        }
+        if (!updatingConfigs) {
+            updateSplitRules()
+        }
+    }
+
+    /** Called on button clicked. */
+    override fun onClick(button: View) {
+        when (button.id) {
+            R.id.launch_b_button -> {
+                startActivity(Intent(this, SplitPipActivityB::class.java))
+                return
+            }
+            R.id.launch_no_pip_button -> {
+                startActivity(Intent(this, SplitPipActivityNoPip::class.java))
+                return
+            }
+            R.id.enter_pip_button -> {
+                PictureInPictureUtil.startPictureInPicture(this, autoEnterPip)
+            }
+        }
+    }
+
+    /** Called on RatioGroup (PiP options) changed. */
+    override fun onCheckedChanged(group: RadioGroup, id: Int) {
+        when (id) {
+            R.id.support_pip_not_enter_on_exit -> {
+                enterPipOnUserLeave = false
+                autoEnterPip = false
+            }
+            R.id.support_pip_enter_on_user_leave -> {
+                enterPipOnUserLeave = true
+                autoEnterPip = false
+            }
+            R.id.support_pip_auto_enter -> {
+                enterPipOnUserLeave = false
+                autoEnterPip = true
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+                    Toast.makeText(this, "auto enter PiP not supported", Toast.LENGTH_LONG)
+                        .show()
+                }
+            }
+        }
+        PictureInPictureUtil.setPictureInPictureParams(this, autoEnterPip)
+    }
+
+    /** Enters PiP if enterPipOnUserLeave checkbox is checked. */
+    override fun onUserLeaveHint() {
+        super.onUserLeaveHint()
+        if (enterPipOnUserLeave) {
+            PictureInPictureUtil.startPictureInPicture(this, autoEnterPip)
+        }
+    }
+
+    /** Updates the checkboxes states after the split rules are changed by other activity. */
+    internal fun updateCheckboxes() {
+        updatingConfigs = true
+
+        val curRules = ruleController.getRules()
+        val splitRule = curRules.firstOrNull { isRuleForSplit(it) }
+        val placeholderRule = curRules.firstOrNull { isRuleForPlaceholder(it) }
+
+        if (splitRule != null && splitRule is SplitPairRule) {
+            viewBinding.splitMainCheckBox.isChecked = true
+            viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = true
+            viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked =
+                splitRule.finishPrimaryWithSecondary == ALWAYS
+            viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = true
+            viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked =
+                splitRule.finishSecondaryWithPrimary == ALWAYS
+        } else {
+            viewBinding.splitMainCheckBox.isChecked = false
+            viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = false
+            viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked = false
+            viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = false
+            viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked = false
+        }
+
+        if (placeholderRule != null && placeholderRule is SplitPlaceholderRule) {
+            viewBinding.usePlaceHolderCheckBox.isChecked = true
+            viewBinding.useStickyPlaceHolderCheckBox.isEnabled = true
+            viewBinding.useStickyPlaceHolderCheckBox.isChecked = placeholderRule.isSticky
+        } else {
+            viewBinding.usePlaceHolderCheckBox.isChecked = false
+            viewBinding.useStickyPlaceHolderCheckBox.isEnabled = false
+            viewBinding.useStickyPlaceHolderCheckBox.isChecked = false
+        }
+
+        updatingConfigs = false
+    }
+
+    /** Whether the given rule is for splitting activity A and others. */
+    private fun isRuleForSplit(rule: EmbeddingRule): Boolean {
+        if (rule !is SplitPairRule) {
+            return false
+        }
+        for (filter in rule.filters) {
+            if (filter.primaryActivityName.className == SplitPipActivityA::class.java.name) {
+                return true
+            }
+        }
+        return false
+    }
+
+    /** Whether the given rule is for launching placeholder with activity B. */
+    private fun isRuleForPlaceholder(rule: EmbeddingRule): Boolean {
+        if (rule !is SplitPlaceholderRule) {
+            return false
+        }
+        for (filter in rule.filters) {
+            if (filter.componentName.className == SplitPipActivityB::class.java.name) {
+                return true
+            }
+        }
+        return false
+    }
+
+    /** Updates the split rules based on the current selection on checkboxes. */
+    private fun updateSplitRules() {
+        ruleController.clearRules()
+        val defaultSplitAttributes = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(splitRatio))
+            .build()
+        if (viewBinding.splitMainCheckBox.isChecked) {
+            val pairFilters = HashSet<SplitPairFilter>()
+            pairFilters.add(SplitPairFilter(componentNameA, componentNameB, null))
+            pairFilters.add(SplitPairFilter(componentNameA, componentNameNotPip, null))
+            val finishAWithB = viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked
+            val finishBWithA = viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked
+            val rule = SplitPairRule.Builder(pairFilters)
+                .setMinWidthDp(0)
+                .setMinHeightDp(0)
+                .setMinSmallestWidthDp(0)
+                .setFinishPrimaryWithSecondary(
+                    if (finishAWithB) ALWAYS else NEVER)
+                .setFinishSecondaryWithPrimary(
+                    if (finishBWithA) ALWAYS else NEVER)
+                .setClearTop(true)
+                .setDefaultSplitAttributes(defaultSplitAttributes)
+                .build()
+            ruleController.addRule(rule)
+        }
+
+        if (viewBinding.usePlaceHolderCheckBox.isChecked) {
+            val activityFilters = HashSet<ActivityFilter>()
+            activityFilters.add(ActivityFilter(componentNameB, null))
+            val intent = Intent().setComponent(componentNamePlaceholder)
+            val isSticky = viewBinding.useStickyPlaceHolderCheckBox.isChecked
+            val rule = SplitPlaceholderRule.Builder(activityFilters, intent)
+                .setMinWidthDp(0)
+                .setMinHeightDp(0)
+                .setMinSmallestWidthDp(0)
+                .setSticky(isSticky)
+                .setFinishPrimaryWithPlaceholder(ADJACENT)
+                .setDefaultSplitAttributes(defaultSplitAttributes)
+                .build()
+            ruleController.addRule(rule)
+        }
+    }
+
+    override fun onStart() {
+        super.onStart()
+        splitController.addSplitListener(
+            this,
+            ContextCompat.getMainExecutor(this),
+            splitChangeListener
+        )
+    }
+
+    override fun onStop() {
+        super.onStop()
+        splitController.removeSplitListener(splitChangeListener)
+    }
+
+    /** Updates the embedding status when receives callback from the extension. */
+    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
+        override fun accept(newSplitInfos: List<SplitInfo>) {
+            var isInSplit = false
+            for (info in newSplitInfos) {
+                if (info.contains(this@SplitPipActivityBase) &&
+                    info.splitAttributes.splitType !is
+                        SplitAttributes.SplitType.ExpandContainersSplitType
+                ) {
+                    isInSplit = true
+                    break
+                }
+            }
+
+            runOnUiThread {
+                viewBinding.activityEmbeddedStatusTextView.visibility =
+                    if (isInSplit) View.VISIBLE else View.GONE
+
+                updateCheckboxes()
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityNoPip.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityNoPip.kt
new file mode 100644
index 0000000..0af97fb
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityNoPip.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+import android.os.Bundle
+
+open class SplitPipActivityNoPip : SplitActivityPlaceholder() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        viewBinding.placeholderText.text = "PiP not supported"
+    }
+}
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityPlaceholder.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityPlaceholder.kt
new file mode 100644
index 0000000..5989917
--- /dev/null
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityPlaceholder.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.demo.embedding
+
+open class SplitPipActivityPlaceholder : SplitActivityPlaceholder()
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/drawable/border.xml b/window/window-demos/demo/src/main/res/drawable/border.xml
similarity index 100%
rename from window/window-samples/src/main/res/drawable/border.xml
rename to window/window-demos/demo/src/main/res/drawable/border.xml
diff --git a/window/window-samples/src/main/res/drawable/ic_android_green_320dp.xml b/window/window-demos/demo/src/main/res/drawable/ic_android_green_320dp.xml
similarity index 100%
rename from window/window-samples/src/main/res/drawable/ic_android_green_320dp.xml
rename to window/window-demos/demo/src/main/res/drawable/ic_android_green_320dp.xml
diff --git a/window/window-demos/demo/src/main/res/layout/activity_display_features_no_config_change.xml b/window/window-demos/demo/src/main/res/layout/activity_display_features_no_config_change.xml
new file mode 100644
index 0000000..3a86e95
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_display_features_no_config_change.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/rootLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="androidx.window.demo.DisplayFeaturesActivity">
+
+    <FrameLayout
+        android:id="@+id/feature_container_layout"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+    <TextView
+        android:id="@+id/current_state"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:text="@string/current_state"
+        android:textAppearance="@style/TextAppearance.AppCompat"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/legendLayout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <TextView
+            android:id="@+id/legendTextView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/legend" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:id="@+id/foldColorImageView"
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:foreground="@color/colorFeatureFold" />
+
+            <TextView
+                android:id="@+id/foldColorTextView"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/fold" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/infoLogRecyclerView"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/current_state"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_foldin.xml b/window/window-demos/demo/src/main/res/layout/activity_foldin.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_foldin.xml
rename to window/window-demos/demo/src/main/res/layout/activity_foldin.xml
diff --git a/window/window-samples/src/main/res/layout/activity_ime.xml b/window/window-demos/demo/src/main/res/layout/activity_ime.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_ime.xml
rename to window/window-demos/demo/src/main/res/layout/activity_ime.xml
diff --git a/window/window-samples/src/main/res/layout/activity_organized_test_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_organized_test_layout.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_organized_test_layout.xml
rename to window/window-demos/demo/src/main/res/layout/activity_organized_test_layout.xml
diff --git a/window/window-demos/demo/src/main/res/layout/activity_rear_display.xml b/window/window-demos/demo/src/main/res/layout/activity_rear_display.xml
new file mode 100644
index 0000000..43bea60
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_rear_display.xml
@@ -0,0 +1,42 @@
+<?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.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rearStatusRecyclerView"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <Button
+        android:id="@+id/rear_display_button"
+        android:text="Enable RearDisplay"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAlignment="center"
+        android:layout_marginBottom="32dp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/res/layout/activity_split_activity_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_activity_layout.xml
new file mode 100644
index 0000000..0bbcddf
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_activity_layout.xml
@@ -0,0 +1,191 @@
+<?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.
+  -->
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="10dp">
+        <TextView
+            android:id="@+id/activity_embedded_status_text_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Activity is embedded" />
+
+        <CheckBox
+            android:id="@+id/splitMainCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Split Main with other activities" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_b"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch B" />
+
+        <CheckBox
+            android:id="@+id/usePlaceholderCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Use a placeholder for B" />
+
+        <CheckBox
+            android:id="@+id/useStickyPlaceholderCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Placeholder is sticky" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_b_and_C"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch B and C" />
+
+        <CheckBox
+            android:id="@+id/splitBCCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Split B with C" />
+
+        <CheckBox
+            android:id="@+id/finishBCCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Finish B and C together"
+            android:enabled="false" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_e"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch E" />
+
+        <CheckBox
+            android:id="@+id/fullscreenECheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Always launch E in fullscreen" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_f"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch f" />
+
+        <Button
+            android:id="@+id/launch_f_pending_intent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch F via Pending Intent" />
+
+        <CheckBox
+            android:id="@+id/splitWithFCheckBox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Split everything with F" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:text="Second app (UID)"
+            />
+
+        <Button
+            android:id="@+id/launch_uid2_trusted"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch with known certificate" />
+
+        <Button
+            android:id="@+id/launch_uid2_untrusted"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch in untrusted mode" />
+
+        <Button
+            android:id="@+id/launch_uid2_untrusted_display_features"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch display features" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_expanded_dialog_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:text="Launch Expanded Dialog" />
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_list_detail_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_activity_list_detail_layout.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_split_activity_list_detail_layout.xml
rename to window/window-demos/demo/src/main/res/layout/activity_split_activity_list_detail_layout.xml
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_list_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_activity_list_layout.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_split_activity_list_layout.xml
rename to window/window-demos/demo/src/main/res/layout/activity_split_activity_list_layout.xml
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_placeholder_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_activity_placeholder_layout.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_split_activity_placeholder_layout.xml
rename to window/window-demos/demo/src/main/res/layout/activity_split_activity_placeholder_layout.xml
diff --git a/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml
new file mode 100644
index 0000000..eb67379
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_device_state_layout.xml
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dp">
+
+        <TextView
+            android:id="@+id/activity_pair_split_attributes_text_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/current_split_attributes"/>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <TextView
+            android:id="@+id/choose_layout_text_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Choose the configuration to update the layout:" />
+
+        <RadioGroup
+            android:id="@+id/split_attributes_options_radio_group"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <RadioButton
+                android:id="@+id/use_default_split_attributes"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Use the default split attributes"
+                android:checked="true"/>
+
+            <!-- The fullscreen option group -->
+            <View
+                android:id="@+id/show_fullscreen_in_portrait_divider_top"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginBottom="10dp"
+                android:background="#AAAAAA"
+                android:visibility="gone"/>
+            <RadioButton
+                android:id="@+id/show_fullscreen_in_portrait_radio_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Show fullscreen in portrait"
+                android:checked="true"/>
+            <CheckBox
+                android:id="@+id/show_horizontal_layout_in_tabletop_check_box"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Also show horizontal layout in tabletop mode"
+                android:visibility="gone"/>
+            <View
+                android:id="@+id/show_fullscreen_in_portrait_divider_bottom"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginBottom="10dp"
+                android:background="#AAAAAA"
+                android:visibility="gone"/>
+            <!-- End of the fullscreen option group -->
+
+            <RadioButton
+                android:id="@+id/show_horizontal_layout_in_tabletop_radio_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Show horizontal layout in tabletop mode"/>
+
+            <!-- The different layout option group -->
+            <View
+                android:id="@+id/show_different_layout_with_size_divider_top"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginBottom="10dp"
+                android:background="#AAAAAA"
+                android:visibility="gone"/>
+            <RadioButton
+                android:id="@+id/show_different_layout_with_size_radio_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Show different layout with size"/>
+            <CheckBox
+                android:id="@+id/show_fullscreen_in_book_mode_check_box"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Also show fullscreen in book mode"
+                android:visibility="gone"/>
+            <View
+                android:id="@+id/show_different_layout_with_size_divider_bottom"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginBottom="10dp"
+                android:background="#AAAAAA"
+                android:visibility="gone"/>
+            <!-- End of the different layout option group -->
+
+            <RadioButton
+                android:id="@+id/split_by_hinge_when_separating_radio_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Show layout that follows the hinge when it is separated by hinge"/>
+            <CheckBox
+                android:id="@+id/swap_primary_secondary_position_check_box"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="Swap the position of primary and secondary container" />
+        </RadioGroup>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <!-- Dropdown for animation background color -->
+
+        <TextView
+            android:id="@+id/animation_background_color_text_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/current_animation_background_color"/>
+
+        <Spinner
+            android:id="@+id/animation_background_color_dropdown"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:spinnerMode="dropdown" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+
+        <Button
+            android:id="@+id/launch_activity_to_side"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"
+            android:layout_centerHorizontal="true"
+            android:text="Launch activity to side"/>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:background="#AAAAAA" />
+        <TextView
+            android:id="@+id/error_message_text_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/window/window-demos/demo/src/main/res/layout/activity_split_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_layout.xml
new file mode 100644
index 0000000..661df38
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/activity_split_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:custom="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/rootLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="SplitLayoutActivity">
+
+    <androidx.window.demo.SplitLayout
+        android:id="@+id/split_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        custom:startViewId="@+id/start_layout"
+        custom:endViewId="@+id/end_layout"
+        android:padding="5dp">
+        <include
+            android:id="@id/start_layout"
+            layout="@layout/split_layout_content" />
+        <include
+            android:id="@id/end_layout"
+            layout="@layout/split_layout_control" />
+    </androidx.window.demo.SplitLayout>
+</LinearLayout>
diff --git a/window/window-samples/src/main/res/layout/activity_split_pip_activity_layout.xml b/window/window-demos/demo/src/main/res/layout/activity_split_pip_activity_layout.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_split_pip_activity_layout.xml
rename to window/window-demos/demo/src/main/res/layout/activity_split_pip_activity_layout.xml
diff --git a/window/window-samples/src/main/res/layout/activity_window_demos.xml b/window/window-demos/demo/src/main/res/layout/activity_window_demos.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_window_demos.xml
rename to window/window-demos/demo/src/main/res/layout/activity_window_demos.xml
diff --git a/window/window-samples/src/main/res/layout/activity_window_metrics.xml b/window/window-demos/demo/src/main/res/layout/activity_window_metrics.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/activity_window_metrics.xml
rename to window/window-demos/demo/src/main/res/layout/activity_window_metrics.xml
diff --git a/window/window-samples/src/main/res/layout/presentation_second_display.xml b/window/window-demos/demo/src/main/res/layout/presentation_second_display.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/presentation_second_display.xml
rename to window/window-demos/demo/src/main/res/layout/presentation_second_display.xml
diff --git a/window/window-samples/src/main/res/layout/split_layout_content.xml b/window/window-demos/demo/src/main/res/layout/split_layout_content.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/split_layout_content.xml
rename to window/window-demos/demo/src/main/res/layout/split_layout_content.xml
diff --git a/window/window-samples/src/main/res/layout/split_layout_control.xml b/window/window-demos/demo/src/main/res/layout/split_layout_control.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/split_layout_control.xml
rename to window/window-demos/demo/src/main/res/layout/split_layout_control.xml
diff --git a/window/window-demos/demo/src/main/res/layout/test_ime.xml b/window/window-demos/demo/src/main/res/layout/test_ime.xml
new file mode 100644
index 0000000..07f5691
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/layout/test_ime.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/imeBackground">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="140dp"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <Button
+            android:id="@+id/button_clear"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/test_ime_button_clear"/>
+
+        <Button
+            android:id="@+id/button_close"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/test_ime_button_close"/>
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/view_holder_demo_item.xml b/window/window-demos/demo/src/main/res/layout/view_holder_demo_item.xml
similarity index 100%
rename from window/window-samples/src/main/res/layout/view_holder_demo_item.xml
rename to window/window-demos/demo/src/main/res/layout/view_holder_demo_item.xml
diff --git a/window/window-samples/src/main/res/menu/picture_in_picture_menu.xml b/window/window-demos/demo/src/main/res/menu/picture_in_picture_menu.xml
similarity index 100%
rename from window/window-samples/src/main/res/menu/picture_in_picture_menu.xml
rename to window/window-demos/demo/src/main/res/menu/picture_in_picture_menu.xml
diff --git a/window/window-samples/src/main/res/values/attrs.xml b/window/window-demos/demo/src/main/res/values/attrs.xml
similarity index 100%
rename from window/window-samples/src/main/res/values/attrs.xml
rename to window/window-demos/demo/src/main/res/values/attrs.xml
diff --git a/window/window-demos/demo/src/main/res/values/colors.xml b/window/window-demos/demo/src/main/res/values/colors.xml
new file mode 100644
index 0000000..95a6cfe
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/values/colors.xml
@@ -0,0 +1,29 @@
+<?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>
+    <color name="colorPrimary">#6200EE</color>
+    <color name="colorPrimaryDark">#3700B3</color>
+    <color name="colorAccent">#03DAC5</color>
+
+    <color name="colorFeatureFold">#7700FF00</color>
+
+    <color name="colorSplitContentBackground">#3B6BDB4C</color>
+    <color name="colorSplitControlsBackground">#475ABFF3</color>
+
+    <color name="imeBackground">#EEEEEE</color>
+</resources>
diff --git a/window/window-demos/demo/src/main/res/values/strings.xml b/window/window-demos/demo/src/main/res/values/strings.xml
new file mode 100644
index 0000000..1a86d90
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/values/strings.xml
@@ -0,0 +1,61 @@
+<!--
+  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>
+    <string name="app_name">WindowSamples</string>
+    <string name="deviceState">Device state</string>
+    <string name="fold">Fold</string>
+    <string name="legend">Legend:</string>
+    <string name="content_title">Content title</string>
+    <string name="green_droid">Green droid</string>
+    <string name="display_features_config_change">Display features handle config change</string>
+    <string name="display_features_no_config_change">Display features no config change</string>
+    <string name="split_layout">Split layout</string>
+    <string name="presentation">Presentation</string>
+    <string name="start_presentation">Start presentation</string>
+    <string name="stop_presentation">Stop presentation</string>
+    <string name="closeToStartPresentationHint">Close the device to start Presentation on
+        the outside screen</string>
+    <string name="windowManagerDemos">WindowManager Demos</string>
+    <string name="hardware_config_select">Hardware configuration to use</string>
+    <string name="device_default">Device default</string>
+    <string name="short_dimension_fold">Fold in the middle of the window along short
+        dimension</string>
+    <string name="long_dimension_fold">Fold in the middle of the window along long
+        dimension</string>
+    <string name="test_activity">Test activity</string>
+    <string name="show_all_display_features_config_change_description">Show all display features of the device on the screen and handle config changes</string>
+    <string name="show_all_display_features_no_config_change_description">Show all display features of the device on the screen and do not handle config changes.  The activity is recreated instead on rotation or resize</string>
+    <string name="split_layout_demo_description">Demo of a layout that splits the content to sides of a fold or a hinge. If not present or minimal size requirements are not meant, it behave like a FrameLayout.</string>
+    <string name="presentation_demo_description">Demo of using Presentation API to show content on secondary display.</string>
+    <string name="window_metrics">Window metrics</string>
+    <string name="window_metrics_description">Demo of using WindowMetrics API with activity handling rotations.</string>
+    <string name="rear_display">Rear Display Mode</string>
+    <string name="rear_display_description">Demo of observing to WindowAreaStatus and enabling/disabling RearDisplay mode</string>
+    <string name="current_split_attributes">Current SplitAttributes:</string>>
+    <string name="current_animation_background_color">Current Animation Background Color:</string>>
+    <string name="test_ime">Test IME</string>
+    <string name="test_ime_button_clear">Clear Logs</string>
+    <string name="test_ime_button_close">Close Test IME</string>
+    <string name="window_metrics_ime_hint">Tap to open IME</string>
+    <string name="ime">IME</string>
+    <string name="ime_demo_description">Demo of using various APIs from within IME.</string>
+    <string name="ime_demo_reminder">Reminder: To use the Test IME bundled with this application, remember to enable it in System Settings.</string>
+    <string name="ime_button_settings">System IME Settings</string>
+    <string name="ime_button_switch_default">Switch default IME</string>
+    <string name="install_samples_2">Install window-demos:demo-second-app to launch activities from a different UID.</string>
+    <string name="toast_split_not_support">Please enable PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED and ensure device supports splits.</string>
+</resources>
diff --git a/window/window-demos/demo/src/main/res/values/styles.xml b/window/window-demos/demo/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5586114
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/values/styles.xml
@@ -0,0 +1,32 @@
+<!--
+  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>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <!-- Theme to show the expanded dialog Activity as transparent. -->
+    <style name="ExpandedDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
+        <item name="windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+    </style>
+</resources>
diff --git a/window/window-demos/demo/src/main/res/xml/main_split_config.xml b/window/window-demos/demo/src/main/res/xml/main_split_config.xml
new file mode 100644
index 0000000..e4b150d
--- /dev/null
+++ b/window/window-demos/demo/src/main/res/xml/main_split_config.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <SplitPairRule
+        window:finishPrimaryWithSecondary="always"
+        window:finishSecondaryWithPrimary="adjacent">
+        <SplitPairFilter
+            window:primaryActivityName="androidx.window.demo.embedding.SplitActivityList"
+            window:secondaryActivityName="androidx.window.demo.embedding.SplitActivityDetail"/>
+    </SplitPairRule>
+    <SplitPlaceholderRule
+        window:placeholderActivityName="androidx.window.demo.embedding.SplitActivityListPlaceholder"
+        window:stickyPlaceholder="true"
+        window:finishPrimaryWithSecondary="adjacent">
+        <ActivityFilter
+            window:activityName="androidx.window.demo.embedding.SplitActivityList"/>
+    </SplitPlaceholderRule>
+</resources>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/xml/method.xml b/window/window-demos/demo/src/main/res/xml/method.xml
similarity index 100%
rename from window/window-samples/src/main/res/xml/method.xml
rename to window/window-demos/demo/src/main/res/xml/method.xml
diff --git a/window/window-java/api/current.txt b/window/window-java/api/current.txt
index 709904b..39c35ac 100644
--- a/window/window-java/api/current.txt
+++ b/window/window-java/api/current.txt
@@ -4,6 +4,7 @@
   public final class WindowInfoTrackerCallbackAdapter implements androidx.window.layout.WindowInfoTracker {
     ctor public WindowInfoTrackerCallbackAdapter(androidx.window.layout.WindowInfoTracker tracker);
     method public void addWindowLayoutInfoListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void addWindowLayoutInfoListener(@UiContext android.content.Context context, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
     method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
   }
 
diff --git a/window/window-java/api/public_plus_experimental_current.txt b/window/window-java/api/public_plus_experimental_current.txt
index 709904b..39c35ac 100644
--- a/window/window-java/api/public_plus_experimental_current.txt
+++ b/window/window-java/api/public_plus_experimental_current.txt
@@ -4,6 +4,7 @@
   public final class WindowInfoTrackerCallbackAdapter implements androidx.window.layout.WindowInfoTracker {
     ctor public WindowInfoTrackerCallbackAdapter(androidx.window.layout.WindowInfoTracker tracker);
     method public void addWindowLayoutInfoListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void addWindowLayoutInfoListener(@UiContext android.content.Context context, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
     method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
   }
 
diff --git a/window/window-java/api/restricted_current.txt b/window/window-java/api/restricted_current.txt
index 709904b..39c35ac 100644
--- a/window/window-java/api/restricted_current.txt
+++ b/window/window-java/api/restricted_current.txt
@@ -4,6 +4,7 @@
   public final class WindowInfoTrackerCallbackAdapter implements androidx.window.layout.WindowInfoTracker {
     ctor public WindowInfoTrackerCallbackAdapter(androidx.window.layout.WindowInfoTracker tracker);
     method public void addWindowLayoutInfoListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void addWindowLayoutInfoListener(@UiContext android.content.Context context, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
     method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
   }
 
diff --git a/window/window-java/src/androidTest/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapterTest.kt b/window/window-java/src/androidTest/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapterTest.kt
index 8c4fc81..74b3d87 100644
--- a/window/window-java/src/androidTest/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapterTest.kt
+++ b/window/window-java/src/androidTest/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapterTest.kt
@@ -17,6 +17,7 @@
 package androidx.window.java.layout
 
 import android.app.Activity
+import android.content.Context
 import androidx.window.java.TestConsumer
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.WindowInfoTracker
@@ -52,6 +53,21 @@
     }
 
     @Test
+    public fun testRegisterListenerForUiContext() {
+        val context = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val expected = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        whenever(mockTracker.windowLayoutInfo(context)).thenReturn(flowOf(expected))
+        val unitUnderTest = WindowInfoTrackerCallbackAdapter(mockTracker)
+        val testConsumer = TestConsumer<WindowLayoutInfo>()
+
+        unitUnderTest.addWindowLayoutInfoListener(context, Runnable::run, testConsumer)
+
+        testConsumer.assertValue(expected)
+    }
+
+    @Test
     public fun testWindowLayoutInfo_registerMultipleIsNoOp() {
         val activity = mock<Activity>()
         val feature = mock<FoldingFeature>()
@@ -86,4 +102,24 @@
         assertTrue(accepted)
         testConsumer.assertEmpty()
     }
+
+    @Test
+    public fun testWindowLayoutInfo_unregisterForUiContext() {
+        val context = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val info = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        val channel = Channel<WindowLayoutInfo>()
+        whenever(mockTracker.windowLayoutInfo(context)).thenReturn(channel.receiveAsFlow())
+        val unitUnderTest = WindowInfoTrackerCallbackAdapter(mockTracker)
+        val testConsumer = TestConsumer<WindowLayoutInfo>()
+
+        unitUnderTest.addWindowLayoutInfoListener(context, Runnable::run, testConsumer)
+        unitUnderTest.addWindowLayoutInfoListener(context, Runnable::run, mock())
+        unitUnderTest.removeWindowLayoutInfoListener(testConsumer)
+        val accepted = channel.trySend(info).isSuccess
+
+        assertTrue(accepted)
+        testConsumer.assertEmpty()
+    }
 }
diff --git a/window/window-java/src/main/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapter.kt b/window/window-java/src/main/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapter.kt
index 5d716c6..5966d28 100644
--- a/window/window-java/src/main/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapter.kt
+++ b/window/window-java/src/main/java/androidx/window/java/layout/WindowInfoTrackerCallbackAdapter.kt
@@ -17,7 +17,10 @@
 package androidx.window.java.layout
 
 import android.app.Activity
+import android.content.Context
+import androidx.annotation.UiContext
 import androidx.core.util.Consumer
+import android.inputmethodservice.InputMethodService
 import androidx.window.layout.WindowInfoTracker
 import androidx.window.layout.WindowLayoutInfo
 import kotlinx.coroutines.CoroutineScope
@@ -45,8 +48,11 @@
     private val consumerToJobMap = mutableMapOf<Consumer<*>, Job>()
 
     /**
-     * Register a listener to consume [WindowLayoutInfo] values. If the same consumer is
-     * registered twice then this method is a no-op.
+     * Registers a listener to consume [WindowLayoutInfo] values of the [Activity] window. If the
+     * same consumer is registered twice then this method is a no-op.
+     * @param activity an [Activity] that hosts a [Window].
+     * @param executor that the consumer will invoke on.
+     * @param consumer for [WindowLayoutInfo] values.
      * @see WindowInfoTracker.windowLayoutInfo
      */
     fun addWindowLayoutInfoListener(
@@ -58,6 +64,23 @@
     }
 
     /**
+     * Registers a [UiContext] listener to consume [WindowLayoutInfo] values. If the same consumer
+     * is registered twice then this method is a no-op.
+     * @param context a [UiContext] such as an [Activity], created with
+     * [Context#createWindowContext] or is a [InputMethodService].
+     * @param executor that the consumer will invoke on.
+     * @param consumer for [WindowLayoutInfo] values.
+     * @see WindowInfoTracker.windowLayoutInfo
+     */
+    fun addWindowLayoutInfoListener(
+        @UiContext context: Context,
+        executor: Executor,
+        consumer: Consumer<WindowLayoutInfo>
+    ) {
+        addListener(executor, consumer, tracker.windowLayoutInfo(context))
+    }
+
+    /**
      * Remove a listener to stop consuming [WindowLayoutInfo] values. If the listener has already
      * been removed then this is a no-op.
      * @see WindowInfoTracker.windowLayoutInfo
diff --git a/window/window-rxjava2/api/api_lint.ignore b/window/window-rxjava2/api/api_lint.ignore
new file mode 100644
index 0000000..636cfcc
--- /dev/null
+++ b/window/window-rxjava2/api/api_lint.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+ContextFirst: androidx.window.rxjava2.layout.WindowInfoTrackerRx#windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
+    Context is distinct, so it must be the first argument (method `windowLayoutInfoFlowable`)
+ContextFirst: androidx.window.rxjava2.layout.WindowInfoTrackerRx#windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
+    Context is distinct, so it must be the first argument (method `windowLayoutInfoObservable`)
diff --git a/window/window-rxjava2/api/current.txt b/window/window-rxjava2/api/current.txt
index 8135cee..5250696 100644
--- a/window/window-rxjava2/api/current.txt
+++ b/window/window-rxjava2/api/current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava2/api/public_plus_experimental_current.txt b/window/window-rxjava2/api/public_plus_experimental_current.txt
index 8135cee..5250696 100644
--- a/window/window-rxjava2/api/public_plus_experimental_current.txt
+++ b/window/window-rxjava2/api/public_plus_experimental_current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava2/api/restricted_current.txt b/window/window-rxjava2/api/restricted_current.txt
index 8135cee..5250696 100644
--- a/window/window-rxjava2/api/restricted_current.txt
+++ b/window/window-rxjava2/api/restricted_current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava2/build.gradle b/window/window-rxjava2/build.gradle
index 389a75c..dee2b16 100644
--- a/window/window-rxjava2/build.gradle
+++ b/window/window-rxjava2/build.gradle
@@ -37,6 +37,7 @@
     api(libs.kotlinCoroutinesRx2)
     api(libs.rxjava2)
     api(project(":window:window"))
+    implementation 'androidx.annotation:annotation:1.5.0'
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testRunner)
diff --git a/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/layout/WindowInfoTrackerRxTest.kt b/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/layout/WindowInfoTrackerRxTest.kt
index a22df89..418725d 100644
--- a/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/layout/WindowInfoTrackerRxTest.kt
+++ b/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/layout/WindowInfoTrackerRxTest.kt
@@ -17,6 +17,7 @@
 package androidx.window.rxjava2.layout
 
 import android.app.Activity
+import android.content.Context
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.WindowInfoTracker
 import androidx.window.layout.WindowLayoutInfo
@@ -28,10 +29,10 @@
 /**
  * Tests for the RxJava 2 adapters.
  */
-public class WindowInfoTrackerRxTest {
+class WindowInfoTrackerRxTest {
 
     @Test
-    public fun testWindowLayoutInfoObservable() {
+    fun testWindowLayoutInfoObservable() {
         val activity = mock<Activity>()
         val feature = mock<FoldingFeature>()
         val expected = WindowLayoutInfo(listOf(feature))
@@ -44,7 +45,7 @@
     }
 
     @Test
-    public fun testWindowLayoutInfoFlowable() {
+    fun testWindowLayoutInfoFlowable() {
         val activity = mock<Activity>()
         val feature = mock<FoldingFeature>()
         val expected = WindowLayoutInfo(listOf(feature))
@@ -55,4 +56,29 @@
 
         testSubscriber.assertValue(expected)
     }
+    @Test
+    fun testWindowLayoutInfoObservable_context() {
+        val activity = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val expected = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        whenever(mockTracker.windowLayoutInfo(activity)).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockTracker.windowLayoutInfoObservable(activity).test()
+
+        testSubscriber.assertValue(expected)
+    }
+
+    @Test
+    fun testWindowLayoutInfoFlowable_context() {
+        val activity = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val expected = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        whenever(mockTracker.windowLayoutInfo(activity)).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockTracker.windowLayoutInfoFlowable(activity).test()
+
+        testSubscriber.assertValue(expected)
+    }
 }
diff --git a/window/window-rxjava2/src/main/java/androidx/window/rxjava2/layout/WindowInfoTrackerRx.kt b/window/window-rxjava2/src/main/java/androidx/window/rxjava2/layout/WindowInfoTrackerRx.kt
index 2a82d8c..d41cc80 100644
--- a/window/window-rxjava2/src/main/java/androidx/window/rxjava2/layout/WindowInfoTrackerRx.kt
+++ b/window/window-rxjava2/src/main/java/androidx/window/rxjava2/layout/WindowInfoTrackerRx.kt
@@ -18,6 +18,8 @@
 package androidx.window.rxjava2.layout
 
 import android.app.Activity
+import android.content.Context
+import androidx.annotation.UiContext
 import androidx.window.layout.WindowInfoTracker
 import androidx.window.layout.WindowLayoutInfo
 import io.reactivex.Flowable
@@ -29,7 +31,7 @@
  * Return an [Observable] stream of [WindowLayoutInfo].
  * @see WindowInfoTracker.windowLayoutInfo
  */
-public fun WindowInfoTracker.windowLayoutInfoObservable(
+fun WindowInfoTracker.windowLayoutInfoObservable(
     activity: Activity
 ): Observable<WindowLayoutInfo> {
     return windowLayoutInfo(activity).asObservable()
@@ -39,8 +41,28 @@
  * Return a [Flowable] stream of [WindowLayoutInfo].
  * @see WindowInfoTracker.windowLayoutInfo
  */
-public fun WindowInfoTracker.windowLayoutInfoFlowable(
+fun WindowInfoTracker.windowLayoutInfoFlowable(
     activity: Activity
 ): Flowable<WindowLayoutInfo> {
     return windowLayoutInfo(activity).asFlowable()
 }
+
+/**
+ * Return an [Observable] stream of [WindowLayoutInfo].
+ * @see WindowInfoTracker.windowLayoutInfo
+ */
+fun WindowInfoTracker.windowLayoutInfoObservable(
+    @UiContext context: Context
+): Observable<WindowLayoutInfo> {
+    return windowLayoutInfo(context).asObservable()
+}
+
+/**
+ * Return a [Flowable] stream of [WindowLayoutInfo].
+ * @see WindowInfoTracker.windowLayoutInfo
+ */
+fun WindowInfoTracker.windowLayoutInfoFlowable(
+    @UiContext context: Context
+): Flowable<WindowLayoutInfo> {
+    return windowLayoutInfo(context).asFlowable()
+}
diff --git a/window/window-rxjava3/api/api_lint.ignore b/window/window-rxjava3/api/api_lint.ignore
new file mode 100644
index 0000000..8c55c33
--- /dev/null
+++ b/window/window-rxjava3/api/api_lint.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+ContextFirst: androidx.window.rxjava3.layout.WindowInfoTrackerRx#windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
+    Context is distinct, so it must be the first argument (method `windowLayoutInfoFlowable`)
+ContextFirst: androidx.window.rxjava3.layout.WindowInfoTrackerRx#windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
+    Context is distinct, so it must be the first argument (method `windowLayoutInfoObservable`)
diff --git a/window/window-rxjava3/api/current.txt b/window/window-rxjava3/api/current.txt
index 5700dd3..23510cc 100644
--- a/window/window-rxjava3/api/current.txt
+++ b/window/window-rxjava3/api/current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava3/api/public_plus_experimental_current.txt b/window/window-rxjava3/api/public_plus_experimental_current.txt
index 5700dd3..23510cc 100644
--- a/window/window-rxjava3/api/public_plus_experimental_current.txt
+++ b/window/window-rxjava3/api/public_plus_experimental_current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava3/api/restricted_current.txt b/window/window-rxjava3/api/restricted_current.txt
index 5700dd3..23510cc 100644
--- a/window/window-rxjava3/api/restricted_current.txt
+++ b/window/window-rxjava3/api/restricted_current.txt
@@ -3,7 +3,9 @@
 
   public final class WindowInfoTrackerRx {
     method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
     method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.app.Activity activity);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, @UiContext android.content.Context context);
   }
 
 }
diff --git a/window/window-rxjava3/build.gradle b/window/window-rxjava3/build.gradle
index 6874507..32804c4 100644
--- a/window/window-rxjava3/build.gradle
+++ b/window/window-rxjava3/build.gradle
@@ -36,6 +36,7 @@
     api(libs.kotlinCoroutinesRx3)
     api(libs.rxjava3)
     api(project(":window:window"))
+    implementation 'androidx.annotation:annotation:1.5.0'
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testRunner)
diff --git a/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/layout/WindowInfoTrackerRxTest.kt b/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/layout/WindowInfoTrackerRxTest.kt
index 04c68fc..f4a4c4c 100644
--- a/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/layout/WindowInfoTrackerRxTest.kt
+++ b/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/layout/WindowInfoTrackerRxTest.kt
@@ -17,6 +17,7 @@
 package androidx.window.rxjava3.layout
 
 import android.app.Activity
+import android.content.Context
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.WindowInfoTracker
 import androidx.window.layout.WindowLayoutInfo
@@ -30,10 +31,10 @@
  * [io.reactivex.rxjava3.core.Flowable] and ensure that data is forwarded appropriately.
  * @see WindowInfoTracker
  */
-public class WindowInfoTrackerRxTest {
+class WindowInfoTrackerRxTest {
 
     @Test
-    public fun testWindowLayoutInfoObservable() {
+    fun testWindowLayoutInfoObservable() {
         val activity = mock<Activity>()
         val feature = mock<FoldingFeature>()
         val expected = WindowLayoutInfo(listOf(feature))
@@ -46,7 +47,7 @@
     }
 
     @Test
-    public fun testWindowLayoutInfoFlowable() {
+    fun testWindowLayoutInfoFlowable() {
         val activity = mock<Activity>()
         val feature = mock<FoldingFeature>()
         val expected = WindowLayoutInfo(listOf(feature))
@@ -57,4 +58,30 @@
 
         testSubscriber.assertValue(expected)
     }
+
+    @Test
+    fun testWindowLayoutInfoObservable_context() {
+        val activity = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val expected = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        whenever(mockTracker.windowLayoutInfo(activity)).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockTracker.windowLayoutInfoObservable(activity).test()
+
+        testSubscriber.assertValue(expected)
+    }
+
+    @Test
+    fun testWindowLayoutInfoFlowable_context() {
+        val activity = mock<Context>()
+        val feature = mock<FoldingFeature>()
+        val expected = WindowLayoutInfo(listOf(feature))
+        val mockTracker = mock<WindowInfoTracker>()
+        whenever(mockTracker.windowLayoutInfo(activity)).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockTracker.windowLayoutInfoFlowable(activity).test()
+
+        testSubscriber.assertValue(expected)
+    }
 }
diff --git a/window/window-rxjava3/src/main/java/androidx/window/rxjava3/layout/WindowInfoTrackerRx.kt b/window/window-rxjava3/src/main/java/androidx/window/rxjava3/layout/WindowInfoTrackerRx.kt
index 374bbbb..084292b 100644
--- a/window/window-rxjava3/src/main/java/androidx/window/rxjava3/layout/WindowInfoTrackerRx.kt
+++ b/window/window-rxjava3/src/main/java/androidx/window/rxjava3/layout/WindowInfoTrackerRx.kt
@@ -18,6 +18,8 @@
 package androidx.window.rxjava3.layout
 
 import android.app.Activity
+import android.content.Context
+import androidx.annotation.UiContext
 import androidx.window.layout.WindowInfoTracker
 import androidx.window.layout.WindowLayoutInfo
 import io.reactivex.rxjava3.core.Flowable
@@ -29,7 +31,7 @@
  * Return an [Observable] stream of [WindowLayoutInfo].
  * @see WindowInfoTracker.windowLayoutInfo
  */
-public fun WindowInfoTracker.windowLayoutInfoObservable(
+fun WindowInfoTracker.windowLayoutInfoObservable(
     activity: Activity
 ): Observable<WindowLayoutInfo> {
     return windowLayoutInfo(activity).asObservable()
@@ -39,8 +41,28 @@
  * Return a [Flowable] stream of [WindowLayoutInfo].
  * @see WindowInfoTracker.windowLayoutInfo
  */
-public fun WindowInfoTracker.windowLayoutInfoFlowable(
+fun WindowInfoTracker.windowLayoutInfoFlowable(
     activity: Activity
 ): Flowable<WindowLayoutInfo> {
     return windowLayoutInfo(activity).asFlowable()
 }
+
+/**
+ * Return an [Observable] stream of [WindowLayoutInfo].
+ * @see WindowInfoTracker.windowLayoutInfo
+ */
+fun WindowInfoTracker.windowLayoutInfoObservable(
+    @UiContext context: Context
+): Observable<WindowLayoutInfo> {
+    return windowLayoutInfo(context).asObservable()
+}
+
+/**
+ * Return a [Flowable] stream of [WindowLayoutInfo].
+ * @see WindowInfoTracker.windowLayoutInfo
+ */
+fun WindowInfoTracker.windowLayoutInfoFlowable(
+    @UiContext context: Context
+): Flowable<WindowLayoutInfo> {
+    return windowLayoutInfo(context).asFlowable()
+}
diff --git a/window/window-samples/build.gradle b/window/window-samples/build.gradle
deleted file mode 100644
index 99cf856..0000000
--- a/window/window-samples/build.gradle
+++ /dev/null
@@ -1,65 +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.
- */
-
-import androidx.build.Publish
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.application")
-    id("org.jetbrains.kotlin.android")
-}
-
-android {
-    defaultConfig {
-        applicationId "androidx.window.sample"
-        minSdkVersion 23
-    }
-    buildFeatures {
-        viewBinding true
-    }
-    namespace "androidx.window.sample"
-}
-
-dependencies {
-    implementation("androidx.appcompat:appcompat:1.5.1")
-    implementation("androidx.core:core-ktx:1.3.2")
-    implementation("androidx.activity:activity:1.2.0")
-    implementation "androidx.recyclerview:recyclerview:1.2.1"
-    api(libs.constraintLayout)
-    // TODO(b/152245564) Conflicting dependencies cause IDE errors.
-    implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha02")
-    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02")
-    implementation "androidx.browser:browser:1.3.0"
-    implementation("androidx.startup:startup-runtime:1.1.0")
-
-    implementation(project(":window:window-java"))
-    debugImplementation(libs.leakcanary)
-
-    androidTestImplementation(libs.testCore)
-    androidTestImplementation(libs.testExtJunit)
-    androidTestImplementation(libs.testRunner)
-    androidTestImplementation(libs.testRules)
-    androidTestImplementation(libs.espressoCore, excludes.espresso)
-    androidTestImplementation(project(":window:window-testing"))
-}
-
-androidx {
-    name = "Jetpack WindowManager library samples"
-    publish = Publish.NONE
-    inceptionYear = "2020"
-    description = "Demo of Jetpack WindowManager library APIs"
-}
diff --git a/window/window-samples/src/androidTest/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivityTest.kt b/window/window-samples/src/androidTest/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivityTest.kt
deleted file mode 100644
index d0ff11b..0000000
--- a/window/window-samples/src/androidTest/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivityTest.kt
+++ /dev/null
@@ -1,94 +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.sample
-
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.assertion.ViewAssertions.matches
-import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
-import androidx.test.espresso.matcher.ViewMatchers.withSubstring
-import androidx.test.ext.junit.rules.ActivityScenarioRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import androidx.window.layout.FoldingFeature.Orientation.Companion.HORIZONTAL
-import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL
-import androidx.window.layout.FoldingFeature.State.Companion.FLAT
-import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
-import androidx.window.testing.layout.FoldingFeature
-import androidx.window.testing.layout.TestWindowLayoutInfo
-import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TestRule
-import org.junit.runner.RunWith
-
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-class DisplayFeaturesNoConfigChangeActivityTest {
-    private val activityRule =
-        ActivityScenarioRule(DisplayFeaturesNoConfigChangeActivity::class.java)
-    private val publisherRule = WindowLayoutInfoPublisherRule()
-
-    @get:Rule
-    val testRule: TestRule
-
-    init {
-        testRule = RuleChain.outerRule(publisherRule).around(activityRule)
-    }
-
-    @Test
-    fun testDeviceOpen_Flat() {
-        activityRule.scenario.onActivity { activity ->
-            val feature =
-                FoldingFeature(activity = activity, state = FLAT, orientation = HORIZONTAL)
-            val expected = TestWindowLayoutInfo(listOf(feature))
-
-            publisherRule.overrideWindowLayoutInfo(expected)
-        }
-        onView(withSubstring("state = FLAT")).check(matches(isDisplayed()))
-        onView(withSubstring("is not separated")).check(matches(isDisplayed()))
-        onView(withSubstring("Hinge is horizontal")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun testDeviceOpen_TableTop() {
-        activityRule.scenario.onActivity { activity ->
-            val feature =
-                FoldingFeature(activity = activity, state = HALF_OPENED, orientation = HORIZONTAL)
-            val expected = TestWindowLayoutInfo(listOf(feature))
-
-            publisherRule.overrideWindowLayoutInfo(expected)
-        }
-        onView(withSubstring("state = HALF_OPENED")).check(matches(isDisplayed()))
-        onView(withSubstring("are separated")).check(matches(isDisplayed()))
-        onView(withSubstring("Hinge is horizontal")).check(matches(isDisplayed()))
-    }
-
-    @Test
-    fun testDeviceOpen_Book() {
-        activityRule.scenario.onActivity { activity ->
-            val feature =
-                FoldingFeature(activity = activity, state = HALF_OPENED, orientation = VERTICAL)
-            val expected = TestWindowLayoutInfo(listOf(feature))
-
-            publisherRule.overrideWindowLayoutInfo(expected)
-        }
-        onView(withSubstring("state = HALF_OPENED")).check(matches(isDisplayed()))
-        onView(withSubstring("are separated")).check(matches(isDisplayed()))
-        onView(withSubstring("Hinge is vertical")).check(matches(isDisplayed()))
-    }
-}
diff --git a/window/window-samples/src/androidTest/java/androidx/window/sample/SplitLayoutActivityTest.kt b/window/window-samples/src/androidTest/java/androidx/window/sample/SplitLayoutActivityTest.kt
deleted file mode 100644
index f15e2ed..0000000
--- a/window/window-samples/src/androidTest/java/androidx/window/sample/SplitLayoutActivityTest.kt
+++ /dev/null
@@ -1,215 +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.sample
-
-import android.graphics.Rect
-import android.view.View
-import android.view.ViewGroup
-import android.widget.FrameLayout
-import android.widget.LinearLayout
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.assertion.PositionAssertions.isBottomAlignedWith
-import androidx.test.espresso.assertion.PositionAssertions.isCompletelyAbove
-import androidx.test.espresso.assertion.PositionAssertions.isCompletelyLeftOf
-import androidx.test.espresso.assertion.PositionAssertions.isLeftAlignedWith
-import androidx.test.espresso.assertion.PositionAssertions.isRightAlignedWith
-import androidx.test.espresso.assertion.PositionAssertions.isTopAlignedWith
-import androidx.test.espresso.matcher.ViewMatchers.withId
-import androidx.test.ext.junit.rules.ActivityScenarioRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.FoldingFeature.Orientation.Companion.HORIZONTAL
-import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL
-import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
-import androidx.window.testing.layout.FoldingFeature
-import androidx.window.testing.layout.TestWindowLayoutInfo
-import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TestRule
-import org.junit.runner.RunWith
-
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-class SplitLayoutActivityTest {
-    private val activityRule = ActivityScenarioRule(SplitLayoutActivity::class.java)
-    private val publisherRule = WindowLayoutInfoPublisherRule()
-
-    @get:Rule
-    val testRule: TestRule
-
-    init {
-        testRule = RuleChain.outerRule(publisherRule).around(activityRule)
-    }
-
-    @Test
-    fun testDeviceOpen_Flat() {
-        activityRule.scenario.onActivity {
-            val expected = TestWindowLayoutInfo(listOf())
-            publisherRule.overrideWindowLayoutInfo(expected)
-        }
-
-        // Checks that the two views are overlapped if there's no FoldingFeature.
-        onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
-        onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
-        onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
-        onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
-    }
-
-    @Test
-    fun testDeviceOpen_Vertical() {
-        var isWindowBigEnoughForTest = false
-        activityRule.scenario.onActivity { activity ->
-            val feature = FoldingFeature(
-                activity = activity,
-                orientation = VERTICAL,
-                state = HALF_OPENED
-            )
-            val expected = TestWindowLayoutInfo(listOf(feature))
-            publisherRule.overrideWindowLayoutInfo(expected)
-
-            val layout = activity.findViewById<LinearLayout>(R.id.rootLayout)
-            val startView = activity.findViewById<View>(R.id.start_layout)
-            val endView = activity.findViewById<View>(R.id.end_layout)
-
-            isWindowBigEnoughForTest = isWindowBigEnough(feature, layout, startView, endView)
-        }
-
-        if (isWindowBigEnoughForTest) {
-            // Checks that start_layout is on the left of end_layout with a vertical folding feature.
-            // This requires to run the test on a big enough screen to fit both views on screen
-            onView(withId(R.id.start_layout)).check(isCompletelyLeftOf(withId(R.id.end_layout)))
-        } else {
-            // Checks that the two views are overlapped if the test is running in a Window not
-            // big enough to allow having the two views side by side.
-            onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
-        }
-    }
-
-    @Test
-    fun testDeviceOpen_Horizontal() {
-        var isWindowBigEnoughForTest = false
-
-        activityRule.scenario.onActivity { activity ->
-            val feature = FoldingFeature(
-                activity = activity,
-                orientation = HORIZONTAL,
-                state = HALF_OPENED
-            )
-            val expected = TestWindowLayoutInfo(listOf(feature))
-            publisherRule.overrideWindowLayoutInfo(expected)
-
-            val layout = activity.findViewById<LinearLayout>(R.id.rootLayout)
-            val startView = activity.findViewById<View>(R.id.start_layout)
-            val endView = activity.findViewById<View>(R.id.end_layout)
-
-            isWindowBigEnoughForTest = isWindowBigEnough(feature, layout, startView, endView)
-        }
-
-        if (isWindowBigEnoughForTest) {
-            // Checks that start_layout is above of end_layout with a horizontal folding feature.
-            // This requires to run the test on a big enough screen to fit both views on screen
-            onView(withId(R.id.start_layout)).check(isCompletelyAbove(withId(R.id.end_layout)))
-        } else {
-            // Checks that the two views are overlapped if the test is running in a Window not
-            // big enough to allow having the two views side by side.
-            onView(withId(R.id.start_layout)).check(isBottomAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isTopAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isLeftAlignedWith(withId(R.id.end_layout)))
-            onView(withId(R.id.start_layout)).check(isRightAlignedWith(withId(R.id.end_layout)))
-        }
-    }
-
-    /**
-     * Check if the Window is big enough to fit {@code startView} and {@code endView} in the two
-     * display areas defined by the {@code feature} in the {@code layout}.
-     * @return A Boolean that defines if the window is big enough.
-     */
-    private fun isWindowBigEnough(
-        feature: FoldingFeature?,
-        layout: ViewGroup?,
-        startView: View?,
-        endView: View?
-    ): Boolean {
-        if (feature == null || layout == null || startView == null || endView == null) {
-            return false
-        }
-
-        // Calculate the area for view's content with padding
-        with(layout) {
-            val paddedWidth = width - paddingLeft - paddingRight
-            val paddedHeight = height - paddingTop - paddingBottom
-
-            val featureBounds = adjustFeaturePositionOffset(feature, this)
-            if (feature.orientation == HORIZONTAL) { // Horizontal layout
-                val topRect = Rect(
-                    paddingLeft, paddingTop,
-                    paddingLeft + paddedWidth, featureBounds.top
-                )
-                val bottomRect = Rect(
-                    paddingLeft, featureBounds.bottom,
-                    paddingLeft + paddedWidth, paddingTop + paddedHeight
-                )
-
-                if (measureAndCheckMinSize(topRect, startView) &&
-                    measureAndCheckMinSize(bottomRect, endView)
-                ) {
-                    return true
-                }
-            } else if (feature.orientation == VERTICAL) { // Vertical layout
-                val leftRect = Rect(
-                    paddingLeft, paddingTop,
-                    featureBounds.left, paddingTop + paddedHeight
-                )
-                val rightRect = Rect(
-                    featureBounds.right, paddingTop,
-                    paddingLeft + paddedWidth, paddingTop + paddedHeight
-                )
-
-                if (measureAndCheckMinSize(leftRect, startView) &&
-                    measureAndCheckMinSize(rightRect, endView)
-                ) {
-                    return true
-                }
-            }
-        }
-        return false
-    }
-
-    /**
-     * Measures a child view and sees if it will fit in the provided rect.
-     * <p>Note: This method calls [View.measure] on the child view, which updates
-     * its stored values for measured with and height. If the view will end up with different
-     * values, it should be measured again.
-     */
-    private fun measureAndCheckMinSize(rect: Rect, childView: View): Boolean {
-        val widthSpec =
-            View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.AT_MOST)
-        val heightSpec = View.MeasureSpec.makeMeasureSpec(
-            rect.height(),
-            View.MeasureSpec.AT_MOST
-        )
-        childView.measure(widthSpec, heightSpec)
-        return childView.measuredWidthAndState and FrameLayout.MEASURED_STATE_TOO_SMALL == 0 &&
-            childView.measuredHeightAndState and FrameLayout.MEASURED_STATE_TOO_SMALL == 0
-    }
-}
diff --git a/window/window-samples/src/main/AndroidManifest.xml b/window/window-samples/src/main/AndroidManifest.xml
deleted file mode 100644
index 17431f8..0000000
--- a/window/window-samples/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2020 The Android Open Source Project
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-       http://www.apache.org/licenses/LICENSE-2.0
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
-    <application
-        android:allowBackup="true"
-        android:label="@string/app_name"
-        android:supportsRtl="true"
-        android:theme="@style/AppTheme">
-
-        <service android:name="androidx.window.sample.TestIme"
-            android:label="@string/test_ime"
-            android:permission="android.permission.BIND_INPUT_METHOD"
-            android:exported="true">
-            <intent-filter>
-                <action android:name="android.view.InputMethod"/>
-            </intent-filter>
-            <meta-data android:name="android.view.im"
-                android:resource="@xml/method"/>
-        </service>
-
-        <activity android:name=".demos.WindowDemosActivity"
-            android:exported="true"
-            android:label="@string/windowManagerDemos">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity android:name=".PresentationActivity"
-            android:exported="false"
-            android:label="@string/presentation" />
-        <activity
-            android:name=".DisplayFeaturesConfigChangeActivity"
-            android:exported="false"
-            android:supportsPictureInPicture="true"
-            android:configChanges=
-                "orientation|screenSize|screenLayout|screenSize|layoutDirection|smallestScreenSize"
-            android:label="@string/display_features_config_change" />
-        <activity
-            android:name=".DisplayFeaturesNoConfigChangeActivity"
-            android:exported="false"
-            android:supportsPictureInPicture="true"
-            android:label="@string/display_features_no_config_change" />
-        <activity
-            android:name=".SplitLayoutActivity"
-            android:exported="false"
-            android:label="@string/split_layout" />
-        <activity android:name=".WindowMetricsActivity"
-            android:exported="false"
-            android:configChanges="orientation|screenSize|screenLayout|screenSize"
-            android:label="@string/window_metrics"/>
-        <activity
-            android:name=".embedding.SplitActivityA"
-            android:exported="true"
-            android:label="Split Main"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity
-            android:name=".embedding.SplitActivityB"
-            android:exported="false"
-            android:label="B"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityC"
-            android:exported="false"
-            android:label="C"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityD"
-            android:exported="false"
-            android:label="D"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityE"
-            android:exported="false"
-            android:label="E"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityF"
-            android:exported="false"
-            android:label="F"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityPlaceholder"
-            android:exported="false"
-            android:label="Placeholder"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityTrampoline"
-            android:exported="true"
-            android:label="Split Trampoline"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.trampoline_affinity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity-alias
-            android:name=".embedding.SplitActivityTrampolineTarget"
-            android:targetActivity=".embedding.SplitActivityA"/>
-        <activity
-            android:name=".embedding.SplitActivityList"
-            android:exported="true"
-            android:label="Split List"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.list_detail_split_affinity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity
-            android:name=".embedding.SplitActivityDetail"
-            android:exported="false"
-            android:label="Item detail"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:launchMode="singleTop"
-            android:taskAffinity="androidx.window.sample.list_detail_split_affinity"/>
-        <activity
-            android:name=".embedding.SplitActivityListPlaceholder"
-            android:exported="false"
-            android:label="Placeholder"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.list_detail_split_affinity" />
-
-        <!-- Split PiP App -->
-
-        <activity
-            android:name=".embedding.SplitPipActivityA"
-            android:exported="true"
-            android:label="Split and PiP"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:supportsPictureInPicture="true"
-            android:taskAffinity="androidx.window.sample.split_pip">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity
-            android:name=".embedding.SplitPipActivityB"
-            android:exported="false"
-            android:label="PiP B"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:supportsPictureInPicture="true"
-            android:taskAffinity="androidx.window.sample.split_pip">
-        </activity>
-        <activity
-            android:name=".embedding.SplitPipActivityNoPip"
-            android:exported="false"
-            android:label="No PiP support"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.split_pip">
-        </activity>
-        <activity
-            android:name=".embedding.SplitPipActivityPlaceholder"
-            android:exported="false"
-            android:label="PiP Placeholder"
-            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
-            android:taskAffinity="androidx.window.sample.split_pip">
-        </activity>
-
-        <!-- The demo app that shows various IME-related use cases -->
-
-        <activity android:name=".ImeActivity"
-            android:exported="false"
-            android:configChanges="orientation|screenSize|screenLayout|screenSize"
-            android:label="@string/ime"/>
-
-        <!-- Activity embedding initializer -->
-
-        <provider android:name="androidx.startup.InitializationProvider"
-            android:authorities="${applicationId}.androidx-startup"
-            android:exported="false"
-            tools:node="merge">
-            <!-- This entry makes ExampleWindowInitializer discoverable. -->
-            <meta-data  android:name="androidx.window.sample.embedding.ExampleWindowInitializer"
-                android:value="androidx.startup" />
-        </provider>
-
-        <!-- The app itself supports activity embedding, so a system override is not needed. -->
-        <property
-            android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE"
-            android:value="false" />
-
-    </application>
-</manifest>
diff --git a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.kt
deleted file mode 100644
index 7f07d24..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.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.window.sample
-
-import android.graphics.drawable.ColorDrawable
-import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import android.widget.FrameLayout
-import androidx.appcompat.app.AppCompatActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.layout.WindowInfoTracker
-import androidx.window.layout.WindowLayoutInfo
-import androidx.window.sample.infolog.InfoLogAdapter
-import androidx.window.sample.util.PictureInPictureUtil.appendPictureInPictureMenu
-import androidx.window.sample.util.PictureInPictureUtil.handlePictureInPictureMenuItem
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
-
-/** Demo activity that shows all display features and current device state on the screen. */
-class DisplayFeaturesConfigChangeActivity : AppCompatActivity() {
-
-    private val infoLogAdapter = InfoLogAdapter()
-    private val displayFeatureViews = ArrayList<View>()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_display_features_config_change)
-        val recyclerView = findViewById<RecyclerView>(R.id.infoLogRecyclerView)
-        recyclerView.adapter = infoLogAdapter
-
-        lifecycleScope.launch(Dispatchers.Main) {
-            // The block passed to repeatOnLifecycle is executed when the lifecycle
-            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
-            // It automatically restarts the block when the lifecycle is STARTED again.
-            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
-                // Safely collect from windowInfoRepo when the lifecycle is STARTED
-                // and stops collection when the lifecycle is STOPPED
-                WindowInfoTracker.getOrCreate(this@DisplayFeaturesConfigChangeActivity)
-                    .windowLayoutInfo(this@DisplayFeaturesConfigChangeActivity)
-                    .collect { newLayoutInfo ->
-                        // New posture information
-                        updateStateLog(newLayoutInfo)
-                        updateCurrentState(newLayoutInfo)
-                    }
-            }
-        }
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu): Boolean {
-        appendPictureInPictureMenu(menuInflater, menu)
-        return true
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        return when {
-            handlePictureInPictureMenuItem(this, item) -> true
-            else -> super.onOptionsItemSelected(item)
-        }
-    }
-
-    /** Updates the device state and display feature positions. */
-    private fun updateCurrentState(windowLayoutInfo: WindowLayoutInfo) {
-        // Cleanup previously added feature views
-        val rootLayout = findViewById<FrameLayout>(R.id.featureContainerLayout)
-        for (featureView in displayFeatureViews) {
-            rootLayout.removeView(featureView)
-        }
-        displayFeatureViews.clear()
-
-        // Add views that represent display features
-        for (displayFeature in windowLayoutInfo.displayFeatures) {
-            val lp = getLayoutParamsForFeatureInFrameLayout(displayFeature, rootLayout)
-
-            // Make sure that zero-wide and zero-high features are still shown
-            if (lp.width == 0) {
-                lp.width = 1
-            }
-            if (lp.height == 0) {
-                lp.height = 1
-            }
-
-            val featureView = View(this)
-            val color = getColor(R.color.colorFeatureFold)
-            featureView.foreground = ColorDrawable(color)
-
-            rootLayout.addView(featureView, lp)
-            featureView.id = View.generateViewId()
-
-            displayFeatureViews.add(featureView)
-        }
-    }
-
-    /** Adds the current state to the text log of changes on screen. */
-    private fun updateStateLog(info: Any) {
-        infoLogAdapter.append(getCurrentTimeString(), info.toString())
-        infoLogAdapter.notifyDataSetChanged()
-    }
-
-    private fun getCurrentTimeString(): String {
-        val sdf = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
-        val currentDate = sdf.format(Date())
-        return currentDate.toString()
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt
deleted file mode 100644
index 729ceb3..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt
+++ /dev/null
@@ -1,161 +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.sample
-
-import android.graphics.drawable.ColorDrawable
-import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import androidx.appcompat.app.AppCompatActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.WindowInfoTracker
-import androidx.window.layout.WindowLayoutInfo
-import androidx.window.sample.databinding.ActivityDisplayFeaturesNoConfigChangeBinding
-import androidx.window.sample.infolog.InfoLogAdapter
-import androidx.window.sample.util.PictureInPictureUtil.appendPictureInPictureMenu
-import androidx.window.sample.util.PictureInPictureUtil.handlePictureInPictureMenuItem
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
-
-class DisplayFeaturesNoConfigChangeActivity : AppCompatActivity() {
-
-    private val infoLogAdapter = InfoLogAdapter()
-    private val displayFeatureViews = ArrayList<View>()
-    private lateinit var binding: ActivityDisplayFeaturesNoConfigChangeBinding
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        binding = ActivityDisplayFeaturesNoConfigChangeBinding.inflate(layoutInflater)
-        setContentView(binding.root)
-
-        val recyclerView = binding.infoLogRecyclerView
-        recyclerView.adapter = infoLogAdapter
-
-        lifecycleScope.launch(Dispatchers.Main) {
-            // The block passed to repeatOnLifecycle is executed when the lifecycle
-            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
-            // It automatically restarts the block when the lifecycle is STARTED again.
-            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
-                // Safely collect from windowInfoRepo when the lifecycle is STARTED
-                // and stops collection when the lifecycle is STOPPED
-                WindowInfoTracker.getOrCreate(this@DisplayFeaturesNoConfigChangeActivity)
-                    .windowLayoutInfo(this@DisplayFeaturesNoConfigChangeActivity)
-                    .collect { newLayoutInfo ->
-                        // New posture information
-                        updateStateLog(newLayoutInfo)
-                        updateCurrentState(newLayoutInfo)
-                    }
-            }
-        }
-    }
-
-    override fun onCreateOptionsMenu(menu: Menu): Boolean {
-        appendPictureInPictureMenu(menuInflater, menu)
-        return true
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        return when {
-            handlePictureInPictureMenuItem(this, item) -> true
-            else -> super.onOptionsItemSelected(item)
-        }
-    }
-
-    /** Updates the device state and display feature positions. */
-    private fun updateCurrentState(windowLayoutInfo: WindowLayoutInfo) {
-        // Cleanup previously added feature views
-        val rootLayout = binding.featureContainerLayout
-        for (featureView in displayFeatureViews) {
-            rootLayout.removeView(featureView)
-        }
-        displayFeatureViews.clear()
-
-        // Update the UI with the current state
-        val stateStringBuilder = StringBuilder()
-        stateStringBuilder.append(getString(R.string.window_layout))
-            .append(": ")
-
-        // Add views that represent display features
-        for (displayFeature in windowLayoutInfo.displayFeatures) {
-            val lp = getLayoutParamsForFeatureInFrameLayout(displayFeature, rootLayout)
-
-            // Make sure that zero-wide and zero-high features are still shown
-            if (lp.width == 0) {
-                lp.width = 1
-            }
-            if (lp.height == 0) {
-                lp.height = 1
-            }
-
-            val featureView = View(this)
-            val foldFeature = displayFeature as? FoldingFeature
-            val color = getColor(R.color.colorFeatureFold)
-
-            featureView.foreground = ColorDrawable(color)
-
-            foldFeature?.let { feature ->
-                if (feature.isSeparating) {
-                    stateStringBuilder.append(getString(R.string.screens_are_separated))
-                } else {
-                    stateStringBuilder.append(getString(R.string.screens_are_not_separated))
-                }
-                stateStringBuilder
-                    .append(" - ")
-                    .append(
-                        if (feature.orientation == FoldingFeature.Orientation.HORIZONTAL) {
-                            getString(R.string.screen_is_horizontal)
-                        } else {
-                            getString(R.string.screen_is_vertical)
-                        }
-                    )
-                    .append(" - ")
-                    .append(
-                        if (feature.occlusionType == FoldingFeature.OcclusionType.FULL) {
-                            getString(R.string.occlusion_is_full)
-                        } else {
-                            getString(R.string.occlusion_is_none)
-                        }
-                    )
-            }
-
-            rootLayout.addView(featureView, lp)
-            featureView.id = View.generateViewId()
-
-            displayFeatureViews.add(featureView)
-        }
-        binding.currentState.text = stateStringBuilder.toString()
-    }
-
-    /** Adds the current state to the text log of changes on screen. */
-    private fun updateStateLog(info: Any) {
-        infoLogAdapter.append(getCurrentTimeString(), info.toString())
-        infoLogAdapter.notifyDataSetChanged()
-    }
-
-    private fun getCurrentTimeString(): String {
-        val sdf = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
-        val currentDate = sdf.format(Date())
-        return currentDate.toString()
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/ImeActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/ImeActivity.kt
deleted file mode 100644
index 5ee6536..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/ImeActivity.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample
-
-import android.content.Intent
-import android.os.Bundle
-import android.provider.Settings
-import android.view.inputmethod.InputMethodManager
-import android.widget.Button
-import androidx.appcompat.app.AppCompatActivity
-
-/**
- * Demo app that shows various IME-related features.
- */
-class ImeActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_ime)
-
-        findViewById<Button>(R.id.ime_button_settings).apply {
-            setOnClickListener {
-                val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
-                startActivity(intent)
-            }
-        }
-
-        findViewById<Button>(R.id.ime_button_switch_default).apply {
-            setOnClickListener {
-                val imm = getSystemService(InputMethodManager::class.java)
-                imm.showInputMethodPicker()
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/PresentationActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/PresentationActivity.kt
deleted file mode 100644
index d9001c8..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/PresentationActivity.kt
+++ /dev/null
@@ -1,162 +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.sample
-
-import android.app.Presentation
-import android.content.Context
-import android.hardware.display.DisplayManager
-import android.os.Build
-import android.os.Bundle
-import android.util.Log
-import android.view.Display
-import android.view.Display.DEFAULT_DISPLAY
-import android.view.View
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.WindowInfoTracker
-import androidx.window.layout.WindowLayoutInfo
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-
-/**
- * Demo activity that reacts to foldable device state change and shows content on the outside
- * display when the device is folded.
- */
-class PresentationActivity : AppCompatActivity() {
-    private val TAG = "FoldablePresentation"
-
-    private var presentation: DemoPresentation? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_foldin)
-
-        lifecycleScope.launch(Dispatchers.Main) {
-            // The block passed to repeatOnLifecycle is executed when the lifecycle
-            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
-            // It automatically restarts the block when the lifecycle is STARTED again.
-            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
-                // Safely collect from windowInfoRepo when the lifecycle is STARTED
-                // and stops collection when the lifecycle is STOPPED
-                WindowInfoTracker.getOrCreate(this@PresentationActivity)
-                    .windowLayoutInfo(this@PresentationActivity)
-                    .collect { newLayoutInfo ->
-                        // New posture information
-                        updateCurrentState(newLayoutInfo)
-                    }
-            }
-        }
-    }
-
-    private fun startPresentation(context: Context) {
-        if (presentation != null) {
-            val message = "Trying to show presentation that's already showing"
-            Toast.makeText(context, message, Toast.LENGTH_LONG).show()
-            Log.w(TAG, message)
-            return
-        }
-
-        // Look for a built-in display on the outer side of the foldable device to show our
-        // Presentation. Unfortunately, there are no direct methods to get the right one, but it's
-        // possible to make a pretty good guess by filtering out obviously invalid candidates.
-        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
-        val presentationDisplays = displayManager.displays
-        for (display in presentationDisplays) {
-            if (display.displayId == DEFAULT_DISPLAY) {
-                // This is the primary device display, but we're looking for a secondary one
-                continue
-            }
-            if (display.flags and Display.FLAG_PRESENTATION != Display.FLAG_PRESENTATION) {
-                // This display doesn't support showing Presentation
-                continue
-            }
-            if (display.flags and Display.FLAG_PRIVATE != 0) {
-                // Valid system-owned displays will be public
-                continue
-            }
-            if (display.state != Display.STATE_ON) {
-                // This display is not ready to show app content right now
-                continue
-            }
-
-            // This display seems like a good match!
-            presentation = DemoPresentation(context, display)
-            // Make sure that the window is marked to show on top of lock screen, since we're
-            // targeting  the screen on the other side when the device may be closed/locked.
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
-                presentation!!.window?.attributes?.flags =
-                    presentation!!.window?.attributes?.flags?.or(
-                        android.R.attr.showWhenLocked or android.R.attr.turnScreenOn
-                    )
-            }
-            presentation!!.show()
-            break
-        }
-
-        if (presentation == null) {
-            val message = "No matching display found, Presentation not shown"
-            Toast.makeText(context, message, Toast.LENGTH_LONG).show()
-            Log.w(TAG, message)
-        }
-    }
-
-    /**
-     * Method to be called from layout XML definition.
-     */
-    fun startPresentation(view: View) {
-        startPresentation(view.context)
-    }
-
-    @Suppress("UNUSED_PARAMETER") // Callback defined in xml
-    fun stopPresentation(view: View?) {
-        presentation?.hide()
-        presentation = null
-    }
-
-    /**
-     * The presentation to show on the secondary display.
-     */
-    private class DemoPresentation(context: Context?, display: Display?) :
-        Presentation(context, display) {
-
-        override fun onCreate(savedInstanceState: Bundle?) {
-            super.onCreate(savedInstanceState)
-            setContentView(R.layout.presentation_second_display)
-        }
-    }
-
-    /**
-     * Updates the display of the current fold feature state.
-     */
-    private fun updateCurrentState(info: WindowLayoutInfo) {
-        val stateStringBuilder = StringBuilder()
-
-        stateStringBuilder.append(getString(R.string.deviceState))
-            .append(": ")
-
-        info.displayFeatures
-            .mapNotNull { it as? FoldingFeature }
-            .joinToString(separator = "\n") { feature -> feature.state.toString() }
-
-        findViewById<TextView>(R.id.currentState).text = stateStringBuilder.toString()
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/SampleTools.kt b/window/window-samples/src/main/java/androidx/window/sample/SampleTools.kt
deleted file mode 100644
index b7c3a4d..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/SampleTools.kt
+++ /dev/null
@@ -1,49 +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.sample
-import android.graphics.Rect
-import android.view.View
-import android.widget.FrameLayout
-import androidx.window.layout.DisplayFeature
-
-/**
- * Offset the [DisplayFeature]'s bounds to match its respective
- * location in the view's coordinate space.
- */
-fun adjustFeaturePositionOffset(displayFeature: DisplayFeature, view: View): Rect {
-    // Get the location of the view in window to be in the same coordinate space as the feature.
-    val viewLocationInWindow = IntArray(2)
-    view.getLocationInWindow(viewLocationInWindow)
-
-    // Offset the feature coordinates to view coordinate space start point
-    val featureRectInView = Rect(displayFeature.bounds)
-    featureRectInView.offset(-viewLocationInWindow[0], -viewLocationInWindow[1])
-
-    return featureRectInView
-}
-
-/**
- * Gets the layout params for placing a rectangle indicating a
- * [DisplayFeature] inside a [FrameLayout].
- */
-fun getLayoutParamsForFeatureInFrameLayout(displayFeature: DisplayFeature, view: FrameLayout):
-    FrameLayout.LayoutParams {
-    val featureRectInView = adjustFeaturePositionOffset(displayFeature, view)
-    val lp = FrameLayout.LayoutParams(featureRectInView.width(), featureRectInView.height())
-    lp.leftMargin = featureRectInView.left
-    lp.topMargin = featureRectInView.top
-    return lp
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/SplitLayout.kt b/window/window-samples/src/main/java/androidx/window/sample/SplitLayout.kt
deleted file mode 100644
index ca17b23..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/SplitLayout.kt
+++ /dev/null
@@ -1,196 +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.sample
-
-import android.content.Context
-import android.graphics.Rect
-import android.util.AttributeSet
-import android.view.View
-import android.view.View.MeasureSpec.AT_MOST
-import android.view.View.MeasureSpec.EXACTLY
-import android.widget.FrameLayout
-import androidx.window.layout.DisplayFeature
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.WindowLayoutInfo
-
-/**
- * An example of split-layout for two views, separated by a display feature that goes across the
- * window. When both start and end views are added, it checks if there are display features that
- * separate the area in two (e.g. fold or hinge) and places them side-by-side or top-bottom.
- */
-class SplitLayout : FrameLayout {
-    private var windowLayoutInfo: WindowLayoutInfo? = null
-    private var startViewId = 0
-    private var endViewId = 0
-
-    private var lastWidthMeasureSpec: Int = 0
-    private var lastHeightMeasureSpec: Int = 0
-
-    constructor(context: Context) : super(context)
-
-    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
-        setAttributes(attrs)
-    }
-
-    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
-        context,
-        attrs,
-        defStyleAttr
-    ) {
-        setAttributes(attrs)
-    }
-
-    fun updateWindowLayout(windowLayoutInfo: WindowLayoutInfo) {
-        this.windowLayoutInfo = windowLayoutInfo
-        requestLayout()
-    }
-
-    private fun setAttributes(attrs: AttributeSet?) {
-        context.theme.obtainStyledAttributes(attrs, R.styleable.SplitLayout, 0, 0).apply {
-            try {
-                startViewId = getResourceId(R.styleable.SplitLayout_startViewId, 0)
-                endViewId = getResourceId(R.styleable.SplitLayout_endViewId, 0)
-            } finally {
-                recycle()
-            }
-        }
-    }
-
-    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
-        val startView = findStartView()
-        val endView = findEndView()
-        val splitPositions = splitViewPositions(startView, endView)
-
-        if (startView != null && endView != null && splitPositions != null) {
-            val startPosition = splitPositions[0]
-            val startWidthSpec = MeasureSpec.makeMeasureSpec(startPosition.width(), EXACTLY)
-            val startHeightSpec = MeasureSpec.makeMeasureSpec(startPosition.height(), EXACTLY)
-            startView.measure(startWidthSpec, startHeightSpec)
-            startView.layout(
-                startPosition.left, startPosition.top, startPosition.right,
-                startPosition.bottom
-            )
-
-            val endPosition = splitPositions[1]
-            val endWidthSpec = MeasureSpec.makeMeasureSpec(endPosition.width(), EXACTLY)
-            val endHeightSpec = MeasureSpec.makeMeasureSpec(endPosition.height(), EXACTLY)
-            endView.measure(endWidthSpec, endHeightSpec)
-            endView.layout(
-                endPosition.left, endPosition.top, endPosition.right,
-                endPosition.bottom
-            )
-        } else {
-            super.onLayout(changed, left, top, right, bottom)
-        }
-    }
-
-    private fun findStartView(): View? {
-        var startView = findViewById<View>(startViewId)
-        if (startView == null && childCount > 0) {
-            startView = getChildAt(0)
-        }
-        return startView
-    }
-
-    private fun findEndView(): View? {
-        var endView = findViewById<View>(endViewId)
-        if (endView == null && childCount > 1) {
-            endView = getChildAt(1)
-        }
-        return endView
-    }
-
-    /**
-     * Gets the position of the split for this view.
-     * @return A rect that defines of split, or {@code null} if there is no split.
-     */
-    private fun splitViewPositions(startView: View?, endView: View?): Array<Rect>? {
-        if (windowLayoutInfo == null || startView == null || endView == null) {
-            return null
-        }
-
-        // Calculate the area for view's content with padding
-        val paddedWidth = width - paddingLeft - paddingRight
-        val paddedHeight = height - paddingTop - paddingBottom
-
-        windowLayoutInfo?.displayFeatures
-            ?.firstOrNull { feature -> isValidFoldFeature(feature) }
-            ?.let { feature ->
-                val featureBounds = adjustFeaturePositionOffset(feature, this)
-                if (feature.bounds.left == 0) { // Horizontal layout
-                    val topRect = Rect(
-                        paddingLeft, paddingTop,
-                        paddingLeft + paddedWidth, featureBounds.top
-                    )
-                    val bottomRect = Rect(
-                        paddingLeft, featureBounds.bottom,
-                        paddingLeft + paddedWidth, paddingTop + paddedHeight
-                    )
-
-                    if (measureAndCheckMinSize(topRect, startView) &&
-                        measureAndCheckMinSize(bottomRect, endView)
-                    ) {
-                        return arrayOf(topRect, bottomRect)
-                    }
-                } else if (feature.bounds.top == 0) { // Vertical layout
-                    val leftRect = Rect(
-                        paddingLeft, paddingTop,
-                        featureBounds.left, paddingTop + paddedHeight
-                    )
-                    val rightRect = Rect(
-                        featureBounds.right, paddingTop,
-                        paddingLeft + paddedWidth, paddingTop + paddedHeight
-                    )
-
-                    if (measureAndCheckMinSize(leftRect, startView) &&
-                        measureAndCheckMinSize(rightRect, endView)
-                    ) {
-                        return arrayOf(leftRect, rightRect)
-                    }
-                }
-            }
-
-        // We have tried to fit the children and measured them previously. Since they didn't fit,
-        // we need to measure again to update the stored values.
-        measure(lastWidthMeasureSpec, lastHeightMeasureSpec)
-        return null
-    }
-
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
-        lastWidthMeasureSpec = widthMeasureSpec
-        lastHeightMeasureSpec = heightMeasureSpec
-    }
-
-    /**
-     * Measures a child view and sees if it will fit in the provided rect.
-     * <p>Note: This method calls [View.measure] on the child view, which updates
-     * its stored values for measured with and height. If the view will end up with different
-     * values, it should be measured again.
-     */
-    private fun measureAndCheckMinSize(rect: Rect, childView: View): Boolean {
-        val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), AT_MOST)
-        val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), AT_MOST)
-        childView.measure(widthSpec, heightSpec)
-        return childView.measuredWidthAndState and MEASURED_STATE_TOO_SMALL == 0 &&
-            childView.measuredHeightAndState and MEASURED_STATE_TOO_SMALL == 0
-    }
-
-    private fun isValidFoldFeature(displayFeature: DisplayFeature): Boolean {
-        return displayFeature is FoldingFeature
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/SplitLayoutActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/SplitLayoutActivity.kt
deleted file mode 100644
index 0bcdc5d..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/SplitLayoutActivity.kt
+++ /dev/null
@@ -1,54 +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.sample
-
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.window.layout.WindowInfoTracker
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-
-/** Demo of [SplitLayout]. */
-class SplitLayoutActivity : AppCompatActivity() {
-
-    private lateinit var splitLayout: SplitLayout
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_split_layout)
-        splitLayout = findViewById(R.id.split_layout)
-
-        // Create a new coroutine since repeatOnLifecycle is a suspend function
-        lifecycleScope.launch(Dispatchers.Main) {
-            // The block passed to repeatOnLifecycle is executed when the lifecycle
-            // is at least STARTED and is cancelled when the lifecycle is STOPPED.
-            // It automatically restarts the block when the lifecycle is STARTED again.
-            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
-                // Safely collect from windowInfoRepo when the lifecycle is STARTED
-                // and stops collection when the lifecycle is STOPPED
-                WindowInfoTracker.getOrCreate(this@SplitLayoutActivity)
-                    .windowLayoutInfo(this@SplitLayoutActivity)
-                    .collect { newLayoutInfo ->
-                        splitLayout.updateWindowLayout(newLayoutInfo)
-                    }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/TestIme.kt b/window/window-samples/src/main/java/androidx/window/sample/TestIme.kt
deleted file mode 100644
index d337e11..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/TestIme.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample
-
-import android.inputmethodservice.InputMethodService
-import android.view.View
-import android.view.inputmethod.InputMethodManager
-import android.widget.Button
-
-/**
- * A test IME that currently provides a minimal UI containing a "Close" button. To use this, go to
- * "Settings > System > Languages & Input > On-screen keyboard" and enable "Test IME". Remember you
- * may still need to switch to this IME after the default on-screen keyboard pops up.
- */
-internal class TestIme : InputMethodService() {
-
-    override fun onCreateInputView(): View {
-        return layoutInflater.inflate(R.layout.test_ime, null).apply {
-            findViewById<Button>(R.id.button_close).setOnClickListener {
-                requestHideSelf(InputMethodManager.HIDE_NOT_ALWAYS)
-            }
-        }
-    }
-
-    override fun onEvaluateFullscreenMode(): Boolean {
-        return false
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/WindowMetricsActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/WindowMetricsActivity.kt
deleted file mode 100644
index 525648b..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/WindowMetricsActivity.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample
-
-import android.content.res.Configuration
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.layout.WindowMetricsCalculator
-import androidx.window.sample.infolog.InfoLogAdapter
-
-class WindowMetricsActivity : AppCompatActivity() {
-
-    private val adapter = InfoLogAdapter()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_window_metrics)
-        findViewById<RecyclerView>(R.id.recycler_view).adapter = adapter
-        adapter.append("onCreate", "triggered")
-
-        updateMetrics()
-    }
-
-    override fun onConfigurationChanged(newConfig: Configuration) {
-        super.onConfigurationChanged(newConfig)
-        updateMetrics()
-    }
-
-    private fun updateMetrics() {
-        val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this)
-        val width = windowMetrics.bounds.width()
-        val height = windowMetrics.bounds.height()
-        adapter.append("WindowMetrics update", "width: $width, height: $height")
-        adapter.notifyDataSetChanged()
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoAdapter.kt b/window/window-samples/src/main/java/androidx/window/sample/demos/DemoAdapter.kt
deleted file mode 100644
index 8cb8aca..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoAdapter.kt
+++ /dev/null
@@ -1,39 +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.sample.demos
-
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.R
-
-class DemoAdapter(private val demoItems: List<DemoItem>) : RecyclerView.Adapter<DemoVH>() {
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DemoVH {
-        val inflater = LayoutInflater.from(parent.context)
-        val root = inflater.inflate(R.layout.view_holder_demo_item, parent, false)
-        return DemoVH(root)
-    }
-
-    override fun onBindViewHolder(holder: DemoVH, position: Int) {
-        holder.bind(demoItems[position])
-    }
-
-    override fun getItemCount(): Int {
-        return demoItems.size
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoItem.kt b/window/window-samples/src/main/java/androidx/window/sample/demos/DemoItem.kt
deleted file mode 100644
index fb08562..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoItem.kt
+++ /dev/null
@@ -1,20 +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.sample.demos
-
-import android.app.Activity
-
-class DemoItem(val description: String, val buttonTitle: String, val clazz: Class<out Activity>)
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoVH.kt b/window/window-samples/src/main/java/androidx/window/sample/demos/DemoVH.kt
deleted file mode 100644
index 5c08cc1..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/demos/DemoVH.kt
+++ /dev/null
@@ -1,39 +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.sample.demos
-
-import android.content.Intent
-import android.view.View
-import android.widget.Button
-import android.widget.TextView
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.R
-
-class DemoVH(view: View) : RecyclerView.ViewHolder(view) {
-    private val description = view.findViewById<TextView>(R.id.demo_description)
-    private val launchButton = view.findViewById<Button>(R.id.start_demo_button)
-
-    fun bind(item: DemoItem) {
-        description.text = item.description
-        launchButton.text = item.buttonTitle
-        launchButton.setOnClickListener { view ->
-            val context = view.context
-            val intent = Intent(context, item.clazz)
-            view.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt
deleted file mode 100644
index dd2f206..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt
+++ /dev/null
@@ -1,78 +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.sample.demos
-
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.DisplayFeaturesConfigChangeActivity
-import androidx.window.sample.DisplayFeaturesNoConfigChangeActivity
-import androidx.window.sample.ImeActivity
-import androidx.window.sample.PresentationActivity
-import androidx.window.sample.R
-import androidx.window.sample.R.string.display_features_config_change
-import androidx.window.sample.R.string.display_features_no_config_change
-import androidx.window.sample.R.string.show_all_display_features_config_change_description
-import androidx.window.sample.R.string.show_all_display_features_no_config_change_description
-import androidx.window.sample.SplitLayoutActivity
-import androidx.window.sample.WindowMetricsActivity
-
-/**
- * Main activity that launches WindowManager demos.
-*/
-class WindowDemosActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_window_demos)
-        val demoItems = listOf(
-            DemoItem(
-                buttonTitle = getString(display_features_config_change),
-                description = getString(show_all_display_features_config_change_description),
-                clazz = DisplayFeaturesConfigChangeActivity::class.java
-            ),
-            DemoItem(
-                buttonTitle = getString(display_features_no_config_change),
-                description = getString(show_all_display_features_no_config_change_description),
-                clazz = DisplayFeaturesNoConfigChangeActivity::class.java
-            ),
-            DemoItem(
-                buttonTitle = getString(R.string.window_metrics),
-                description = getString(R.string.window_metrics_description),
-                clazz = WindowMetricsActivity::class.java
-            ),
-            DemoItem(
-                buttonTitle = getString(R.string.split_layout),
-                description = getString(R.string.split_layout_demo_description),
-                clazz = SplitLayoutActivity::class.java
-            ),
-            DemoItem(
-                buttonTitle = getString(R.string.presentation),
-                description = getString(R.string.presentation_demo_description),
-                clazz = PresentationActivity::class.java
-            ),
-            DemoItem(
-                buttonTitle = getString(R.string.ime),
-                description = getString(R.string.ime_demo_description),
-                clazz = ImeActivity::class.java
-            )
-        )
-        val recyclerView = findViewById<RecyclerView>(R.id.demo_recycler_view)
-
-        recyclerView.adapter = DemoAdapter(demoItems)
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.kt
deleted file mode 100644
index 56f41445..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.kt
+++ /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.window.sample.embedding
-
-import android.content.Context
-import androidx.startup.Initializer
-import androidx.window.embedding.RuleController
-import androidx.window.sample.R
-
-/**
- * Initializes [RuleController] with a set of statically defined rules.
- */
-class ExampleWindowInitializer : Initializer<RuleController> {
-    override fun create(context: Context): RuleController =
-        RuleController.getInstance(context).apply {
-            setRules(RuleController.parseRules(context, R.xml.main_split_config))
-        }
-
-    override fun dependencies(): List<Class<out Initializer<*>>> {
-        return emptyList()
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt
deleted file mode 100644
index 20a8056..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt
+++ /dev/null
@@ -1,19 +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.sample.embedding
-
-open class SplitActivityA : SplitActivityBase()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt
deleted file mode 100644
index 6791b5c..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt
+++ /dev/null
@@ -1,39 +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.sample.embedding
-
-import android.content.Intent
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.window.sample.R
-
-open class SplitActivityB : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#fff3e0"))
-
-        if (intent.getBooleanExtra(EXTRA_LAUNCH_C_TO_SIDE, false)) {
-            startActivity(Intent(this, SplitActivityC::class.java))
-            // Make sure that the side activity is only launched once, as the activity may be
-            // recreated when the split bounds change and we need to avoid launching another
-            // instance.
-            intent.removeExtra(EXTRA_LAUNCH_C_TO_SIDE)
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
deleted file mode 100644
index c3acc7a..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
+++ /dev/null
@@ -1,360 +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.sample.embedding;
-
-import static android.app.PendingIntent.FLAG_IMMUTABLE;
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.CompoundButton;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.util.Consumer;
-import androidx.window.embedding.ActivityEmbeddingController;
-import androidx.window.embedding.ActivityFilter;
-import androidx.window.embedding.ActivityRule;
-import androidx.window.embedding.EmbeddingRule;
-import androidx.window.embedding.RuleController;
-import androidx.window.embedding.SplitController;
-import androidx.window.embedding.SplitInfo;
-import androidx.window.embedding.SplitPairFilter;
-import androidx.window.embedding.SplitPairRule;
-import androidx.window.embedding.SplitPlaceholderRule;
-import androidx.window.embedding.SplitRule;
-import androidx.window.sample.databinding.ActivitySplitActivityLayoutBinding;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Sample showcase of split activity rules. Allows the user to select some split configuration
- * options with checkboxes and launch activities with those options applied.
- */
-public class SplitActivityBase extends AppCompatActivity
-        implements CompoundButton.OnCheckedChangeListener {
-
-    private static final String TAG = "SplitActivityTest";
-    static final int MIN_SPLIT_WIDTH_DP = 600;
-    static final float SPLIT_RATIO = 0.3f;
-    static final String EXTRA_LAUNCH_C_TO_SIDE = "launch_c_to_side";
-
-    private SplitController mSplitController;
-
-    private final RuleController mRuleController = RuleController.getInstance(this);
-
-    private SplitInfoCallback mCallback;
-
-    private ActivitySplitActivityLayoutBinding mViewBinding;
-
-    /** In the process of updating checkboxes based on split rule. */
-    private boolean mUpdatingConfigs;
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mViewBinding = ActivitySplitActivityLayoutBinding.inflate(getLayoutInflater());
-        setContentView(mViewBinding.getRoot());
-
-        // Setup activity launch buttons.
-        mViewBinding.launchB.setOnClickListener((View v) ->
-                startActivity(new Intent(this, SplitActivityB.class)));
-        mViewBinding.launchBAndC.setOnClickListener((View v) -> {
-            Intent bStartIntent = new Intent(this, SplitActivityB.class);
-            bStartIntent.putExtra(EXTRA_LAUNCH_C_TO_SIDE, true);
-            startActivity(bStartIntent);
-        });
-        mViewBinding.launchE.setOnClickListener((View v) ->
-                startActivity(new Intent(this, SplitActivityE.class)));
-        mViewBinding.launchF.setOnClickListener((View v) ->
-                startActivity(new Intent(this, SplitActivityF.class)));
-        mViewBinding.launchFPendingIntent.setOnClickListener((View v) -> {
-            try {
-                PendingIntent.getActivity(this, 0, new Intent(this, SplitActivityF.class),
-                        FLAG_IMMUTABLE).send();
-            } catch (PendingIntent.CanceledException e) {
-                Log.e(TAG, e.getMessage());
-            }
-        });
-
-        // Listen for split configuration checkboxes to update the rules before launching
-        // activities.
-        mViewBinding.splitMainCheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.usePlaceholderCheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.useStickyPlaceholderCheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.splitBCCheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.finishBCCheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.fullscreenECheckBox.setOnCheckedChangeListener(this);
-        mViewBinding.splitWithFCheckBox.setOnCheckedChangeListener(this);
-
-        mSplitController = SplitController.getInstance(this);
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        mCallback = new SplitInfoCallback();
-        mSplitController.addSplitListener(this, Runnable::run, mCallback);
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        mSplitController.removeSplitListener(mCallback);
-        mCallback = null;
-    }
-
-    /** Updates the embedding status when receives callback from the extension. */
-    class SplitInfoCallback implements Consumer<List<SplitInfo>> {
-        @Override
-        public void accept(List<SplitInfo> splitInfoList) {
-            runOnUiThread(() -> {
-                updateEmbeddedStatus();
-                updateCheckboxesFromCurrentConfig();
-            });
-        }
-    }
-
-    /** Called on checkbox changed. */
-    @Override
-    public void onCheckedChanged(@NonNull CompoundButton c, boolean isChecked) {
-        if (c.getId() == mViewBinding.splitBCCheckBox.getId()) {
-            if (isChecked) {
-                mViewBinding.finishBCCheckBox.setEnabled(true);
-            } else {
-                mViewBinding.finishBCCheckBox.setEnabled(false);
-                mViewBinding.finishBCCheckBox.setChecked(false);
-            }
-        } else if (c.getId() == mViewBinding.usePlaceholderCheckBox.getId()) {
-            if (isChecked) {
-                mViewBinding.useStickyPlaceholderCheckBox.setEnabled(true);
-            } else {
-                mViewBinding.useStickyPlaceholderCheckBox.setEnabled(false);
-                mViewBinding.useStickyPlaceholderCheckBox.setChecked(false);
-            }
-        }
-        if (!mUpdatingConfigs) {
-            updateRulesFromCheckboxes();
-        }
-    }
-
-    /** Updates the checkboxes states after the split rules are changed by other activity. */
-    void updateCheckboxesFromCurrentConfig() {
-        mUpdatingConfigs = true;
-
-        SplitPairRule splitMainConfig = getRuleFor(SplitActivityA.class, null);
-        mViewBinding.splitMainCheckBox.setChecked(splitMainConfig != null);
-
-        SplitPlaceholderRule placeholderForBConfig = getPlaceholderRule(SplitActivityB.class);
-        mViewBinding.usePlaceholderCheckBox.setChecked(placeholderForBConfig != null);
-        mViewBinding.useStickyPlaceholderCheckBox.setEnabled(placeholderForBConfig != null);
-        mViewBinding.useStickyPlaceholderCheckBox.setChecked(placeholderForBConfig != null
-                && placeholderForBConfig.isSticky());
-
-        SplitPairRule bAndCPairConfig = getRuleFor(SplitActivityB.class,
-                SplitActivityC.class);
-        mViewBinding.splitBCCheckBox.setChecked(bAndCPairConfig != null);
-        mViewBinding.finishBCCheckBox.setEnabled(bAndCPairConfig != null);
-        mViewBinding.finishBCCheckBox.setChecked(bAndCPairConfig != null
-                && bAndCPairConfig.getFinishPrimaryWithSecondary() == SplitRule.FINISH_ALWAYS
-                && bAndCPairConfig.getFinishSecondaryWithPrimary() == SplitRule.FINISH_ALWAYS);
-
-        SplitPairRule fConfig = getRuleFor(null, SplitActivityF.class);
-        mViewBinding.splitWithFCheckBox.setChecked(fConfig != null);
-
-        ActivityRule configE = getRuleFor(SplitActivityE.class);
-        mViewBinding.fullscreenECheckBox.setChecked(configE != null && configE.getAlwaysExpand());
-
-        mUpdatingConfigs = false;
-    }
-
-    /** Gets the split rule for the given activity pair. */
-    private SplitPairRule getRuleFor(Class<? extends Activity> a, Class<? extends Activity> b) {
-        Set<EmbeddingRule> currentRules = mRuleController.getRules();
-        for (EmbeddingRule rule : currentRules) {
-            if (rule instanceof SplitPairRule && isRuleFor(a, b, (SplitPairRule) rule)) {
-                return (SplitPairRule) rule;
-            }
-        }
-        return null;
-    }
-
-    /** Gets the placeholder rule for the given activity. */
-    SplitPlaceholderRule getPlaceholderRule(@NonNull Class<? extends Activity> a) {
-        Set<EmbeddingRule> currentRules = mRuleController.getRules();
-        for (EmbeddingRule rule : currentRules) {
-            if (rule instanceof SplitPlaceholderRule) {
-                for (ActivityFilter filter : ((SplitPlaceholderRule) rule).getFilters()) {
-                    if (filter.getComponentName().getClassName().equals(a.getName())) {
-                        return (SplitPlaceholderRule) rule;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /** Gets the split rule for the given activity. */
-    private ActivityRule getRuleFor(Class<? extends Activity> a) {
-        Set<EmbeddingRule> currentRules = mRuleController.getRules();
-        for (EmbeddingRule rule : currentRules) {
-            if (rule instanceof ActivityRule && isRuleFor(a, (ActivityRule) rule)) {
-                return (ActivityRule) rule;
-            }
-        }
-        return null;
-    }
-
-    /** Whether the given rule is for splitting the given activity pair. */
-    private boolean isRuleFor(Class<? extends Activity> a, Class<? extends Activity> b,
-            SplitPairRule pairConfig) {
-        return isRuleFor(a != null ? a.getName() : "*", b != null ? b.getName() : "*",
-                pairConfig);
-    }
-
-    /** Whether the given rule is for splitting the given activity pair. */
-    private boolean isRuleFor(String primaryActivityName, String secondaryActivityName,
-            SplitPairRule pairConfig) {
-        for (SplitPairFilter filter : pairConfig.getFilters()) {
-            if (filter.getPrimaryActivityName().getClassName().contains(primaryActivityName)
-                    && filter.getSecondaryActivityName().getClassName()
-                    .contains(secondaryActivityName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /** Whether the given rule is for splitting the given activity with another. */
-    private boolean isRuleFor(@NonNull Class<? extends Activity> a, @NonNull ActivityRule config) {
-        for (ActivityFilter filter : config.getFilters()) {
-            if (filter.getComponentName().getClassName().equals(a.getName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /** Updates the split rules based on the current selection on checkboxes. */
-    private void updateRulesFromCheckboxes() {
-        mRuleController.clearRules();
-
-        Set<SplitPairFilter> pairFilters = new HashSet<>();
-        pairFilters.add(new SplitPairFilter(componentName(SplitActivityA.class),
-                componentName("*"), null));
-        SplitPairRule rule = new SplitPairRule.Builder(pairFilters)
-                .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
-                .setMinSmallestWidthDp(0)
-                .setFinishPrimaryWithSecondary(SplitRule.FINISH_NEVER)
-                .setFinishSecondaryWithPrimary(SplitRule.FINISH_NEVER)
-                .setClearTop(true)
-                .setSplitRatio(SPLIT_RATIO)
-                .build();
-        if (mViewBinding.splitMainCheckBox.isChecked()) {
-            mRuleController.addRule(rule);
-        }
-
-        Set<ActivityFilter> activityFilters = new HashSet<>();
-        activityFilters.add(new ActivityFilter(componentName(SplitActivityB.class), null));
-        Intent intent = new Intent();
-        intent.setComponent(
-                componentName("androidx.window.sample.embedding.SplitActivityPlaceholder"));
-        SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder(
-                activityFilters,
-                intent
-        )
-                .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
-                .setMinSmallestWidthDp(0)
-                .setSticky(mViewBinding.useStickyPlaceholderCheckBox.isChecked())
-                .setFinishPrimaryWithPlaceholder(SplitRule.FINISH_ADJACENT)
-                .setSplitRatio(SPLIT_RATIO)
-                .build();
-        if (mViewBinding.usePlaceholderCheckBox.isChecked()) {
-            mRuleController.addRule(placeholderRule);
-        }
-
-        pairFilters = new HashSet<>();
-        pairFilters.add(new SplitPairFilter(componentName(SplitActivityB.class),
-                componentName(SplitActivityC.class), null));
-        rule = new SplitPairRule.Builder(pairFilters)
-                .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
-                .setMinSmallestWidthDp(0)
-                .setFinishPrimaryWithSecondary(
-                        mViewBinding.finishBCCheckBox.isChecked()
-                                ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER
-                )
-                .setFinishSecondaryWithPrimary(
-                        mViewBinding.finishBCCheckBox.isChecked()
-                                ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER
-                )
-                .setClearTop(true)
-                .setSplitRatio(SPLIT_RATIO)
-                .build();
-        if (mViewBinding.splitBCCheckBox.isChecked()) {
-            mRuleController.addRule(rule);
-        }
-
-        pairFilters = new HashSet<>();
-        pairFilters.add(new SplitPairFilter(componentName("androidx.window.*"),
-                componentName(SplitActivityF.class), null));
-        rule = new SplitPairRule.Builder(pairFilters)
-                .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
-                .setMinSmallestWidthDp(0)
-                .setFinishPrimaryWithSecondary(SplitRule.FINISH_NEVER)
-                .setFinishSecondaryWithPrimary(SplitRule.FINISH_NEVER)
-                .setClearTop(true)
-                .setSplitRatio(SPLIT_RATIO)
-                .build();
-        if (mViewBinding.splitWithFCheckBox.isChecked()) {
-            mRuleController.addRule(rule);
-        }
-
-        activityFilters = new HashSet<>();
-        activityFilters.add(new ActivityFilter(componentName(SplitActivityE.class), null));
-        ActivityRule activityRule = new ActivityRule.Builder(activityFilters)
-                .setAlwaysExpand(true)
-                .build();
-        if (mViewBinding.fullscreenECheckBox.isChecked()) {
-            mRuleController.addRule(activityRule);
-        }
-    }
-
-    ComponentName componentName(Class<? extends Activity> activityClass) {
-        return new ComponentName(getPackageName(),
-                activityClass != null ? activityClass.getName() : "*");
-    }
-
-    ComponentName componentName(String className) {
-        return new ComponentName(getPackageName(), className);
-    }
-
-    /** Updates the status label that says when an activity is embedded. */
-    void updateEmbeddedStatus() {
-        if (ActivityEmbeddingController.getInstance(this).isActivityEmbedded(this)) {
-            mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.VISIBLE);
-        } else {
-            mViewBinding.activityEmbeddedStatusTextView.setVisibility(View.GONE);
-        }
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt
deleted file mode 100644
index 413c6c3..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt
+++ /dev/null
@@ -1,30 +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.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.window.sample.R
-
-open class SplitActivityC : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#e8f5e9"))
-    }
-}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt
deleted file mode 100644
index 9f919f0..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt
+++ /dev/null
@@ -1,30 +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.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.window.sample.R
-
-open class SplitActivityD : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#eeeeee"))
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt
deleted file mode 100644
index 6c4897e..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt
+++ /dev/null
@@ -1,48 +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.sample.embedding
-
-import android.content.Intent
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import android.widget.TextView
-import androidx.appcompat.app.AppCompatActivity
-import androidx.window.sample.R
-
-open class SplitActivityDetail : AppCompatActivity() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_split_activity_list_detail_layout)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#fff3e0"))
-
-        findViewById<TextView>(R.id.item_detail_text)
-            .setText(intent.getStringExtra(EXTRA_SELECTED_ITEM))
-    }
-
-    override fun onNewIntent(intent: Intent?) {
-        super.onNewIntent(intent)
-
-        findViewById<TextView>(R.id.item_detail_text)
-            .setText(intent?.getStringExtra(EXTRA_SELECTED_ITEM))
-    }
-
-    companion object {
-        const val EXTRA_SELECTED_ITEM = "selected_item"
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt
deleted file mode 100644
index 9960ef2..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt
+++ /dev/null
@@ -1,30 +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.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.window.sample.R
-
-open class SplitActivityE : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#ede7f6"))
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt
deleted file mode 100644
index 3243e5d..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt
+++ /dev/null
@@ -1,30 +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.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.window.sample.R
-
-open class SplitActivityF : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#ffebee"))
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt
deleted file mode 100644
index cb64edf..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt
+++ /dev/null
@@ -1,76 +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.sample.embedding
-
-import android.content.Intent
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import android.widget.TextView
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.ContextCompat
-import androidx.core.util.Consumer
-import androidx.window.embedding.SplitController
-import androidx.window.embedding.SplitInfo
-import androidx.window.sample.R
-import androidx.window.sample.embedding.SplitActivityDetail.Companion.EXTRA_SELECTED_ITEM
-
-open class SplitActivityList : AppCompatActivity() {
-    private lateinit var splitController: SplitController
-    private val splitChangeListener = SplitStateChangeListener()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_split_activity_list_layout)
-        findViewById<View>(R.id.root_split_activity_layout)
-            .setBackgroundColor(Color.parseColor("#e0f7fa"))
-
-        splitController = SplitController.getInstance(this)
-    }
-
-    open fun onItemClick(view: View) {
-        val text = (view as TextView).text ?: throw IllegalArgumentException()
-        val startIntent = Intent(this, SplitActivityDetail::class.java)
-        startIntent.putExtra(EXTRA_SELECTED_ITEM, text)
-        startActivity(startIntent)
-    }
-
-    override fun onStart() {
-        super.onStart()
-        splitController.addSplitListener(
-            this,
-            ContextCompat.getMainExecutor(this),
-            splitChangeListener
-        )
-    }
-
-    override fun onStop() {
-        super.onStop()
-        splitController.removeSplitListener(
-            splitChangeListener
-        )
-    }
-
-    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
-        override fun accept(newSplitInfos: List<SplitInfo>) {
-            runOnUiThread {
-                findViewById<View>(R.id.infoButton).visibility =
-                    if (newSplitInfos.isEmpty()) View.VISIBLE else View.GONE
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt
deleted file mode 100644
index 754e11d8..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt
+++ /dev/null
@@ -1,19 +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.sample.embedding
-
-open class SplitActivityListPlaceholder : SplitActivityPlaceholder()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.kt
deleted file mode 100644
index 7314921..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.kt
+++ /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.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-import androidx.window.sample.databinding.ActivitySplitActivityPlaceholderLayoutBinding
-
-open class SplitActivityPlaceholder : AppCompatActivity() {
-
-    lateinit var viewBinding: ActivitySplitActivityPlaceholderLayoutBinding
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        viewBinding = ActivitySplitActivityPlaceholderLayoutBinding.inflate(layoutInflater)
-        setContentView(viewBinding.root)
-
-        viewBinding.rootSplitActivityLayout.setBackgroundColor(Color.parseColor("#eeeeee"))
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt
deleted file mode 100644
index 212cbcb..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt
+++ /dev/null
@@ -1,52 +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.sample.embedding
-
-import android.content.Intent
-import android.os.Bundle
-import androidx.window.embedding.ActivityFilter
-import androidx.window.embedding.RuleController
-import androidx.window.embedding.SplitPlaceholderRule
-import androidx.window.embedding.SplitRule.Companion.FINISH_ADJACENT
-
-/**
- * Example trampoline activity that launches a split and finishes itself.
- */
-class SplitActivityTrampoline : SplitActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        val activityFilters = setOf(ActivityFilter(componentName(
-            "androidx.window.sample.embedding.SplitActivityTrampolineTarget"), null))
-        val placeholderIntent = Intent()
-        placeholderIntent.component =
-            componentName("androidx.window.sample.embedding.SplitActivityPlaceholder")
-        val placeholderRule = SplitPlaceholderRule.Builder(activityFilters, placeholderIntent)
-            .setMinWidthDp(MIN_SPLIT_WIDTH_DP)
-            .setMinSmallestWidthDp(0)
-            .setFinishPrimaryWithPlaceholder(FINISH_ADJACENT)
-            .setSplitRatio(SPLIT_RATIO)
-            .build()
-        RuleController.getInstance(this).addRule(placeholderRule)
-        val activityIntent = Intent()
-        activityIntent.component = componentName(
-            "androidx.window.sample.embedding.SplitActivityTrampolineTarget")
-        startActivity(activityIntent)
-
-        finish()
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityA.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityA.kt
deleted file mode 100644
index 7053e2d..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityA.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample.embedding
-
-open class SplitPipActivityA : SplitPipActivityBase()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityB.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityB.kt
deleted file mode 100644
index f47ab24..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityB.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample.embedding
-
-import android.graphics.Color
-import android.os.Bundle
-
-open class SplitPipActivityB : SplitPipActivityBase() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        viewBinding.rootSplitActivityLayout.setBackgroundColor(Color.parseColor("#fff3e0"))
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt
deleted file mode 100644
index 9b76563..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityBase.kt
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample.embedding
-
-import android.content.ComponentName
-import android.content.Intent
-import android.os.Build
-import android.os.Bundle
-import android.view.View
-import android.widget.CompoundButton
-import android.widget.RadioGroup
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.ContextCompat
-import androidx.core.util.Consumer
-import androidx.window.embedding.ActivityFilter
-import androidx.window.embedding.EmbeddingRule
-import androidx.window.embedding.RuleController
-import androidx.window.embedding.SplitController
-import androidx.window.embedding.SplitInfo
-import androidx.window.embedding.SplitPairFilter
-import androidx.window.embedding.SplitPairRule
-import androidx.window.embedding.SplitPlaceholderRule
-import androidx.window.embedding.SplitRule
-import androidx.window.sample.R
-import androidx.window.sample.databinding.ActivitySplitPipActivityLayoutBinding
-import androidx.window.sample.util.PictureInPictureUtil.setPictureInPictureParams
-import androidx.window.sample.util.PictureInPictureUtil.startPictureInPicture
-
-/**
- * Sample showcase of split activity rules with picture-in-picture. Allows the user to select some
- * split and PiP configuration options with checkboxes and launch activities with those options
- * applied.
- */
-abstract class SplitPipActivityBase : AppCompatActivity(), CompoundButton.OnCheckedChangeListener,
-    View.OnClickListener, RadioGroup.OnCheckedChangeListener {
-
-    lateinit var splitController: SplitController
-    lateinit var ruleController: RuleController
-    lateinit var viewBinding: ActivitySplitPipActivityLayoutBinding
-    lateinit var componentNameA: ComponentName
-    lateinit var componentNameB: ComponentName
-    lateinit var componentNameNotPip: ComponentName
-    lateinit var componentNamePlaceholder: ComponentName
-    private val splitChangeListener = SplitStateChangeListener()
-    private val splitRatio = 0.5f
-    private var enterPipOnUserLeave = false
-    private var autoEnterPip = false
-
-    /** In the process of updating checkboxes based on split rule. */
-    private var updatingConfigs = false
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        viewBinding = ActivitySplitPipActivityLayoutBinding.inflate(layoutInflater)
-        setContentView(viewBinding.root)
-
-        componentNameA = ComponentName(packageName, SplitPipActivityA::class.java.name)
-        componentNameB = ComponentName(packageName, SplitPipActivityB::class.java.name)
-        componentNameNotPip = ComponentName(packageName, SplitPipActivityNoPip::class.java.name)
-        componentNamePlaceholder = ComponentName(packageName,
-            SplitPipActivityPlaceholder::class.java.name)
-
-        splitController = SplitController.getInstance(this)
-        ruleController = RuleController.getInstance(this)
-
-        // Buttons for split rules of the main activity.
-        viewBinding.splitMainCheckBox.setOnCheckedChangeListener(this)
-        viewBinding.finishPrimaryWithSecondaryCheckBox.setOnCheckedChangeListener(this)
-        viewBinding.finishSecondaryWithPrimaryCheckBox.setOnCheckedChangeListener(this)
-
-        // Buttons for split rules of the secondary activity.
-        viewBinding.launchBButton.setOnClickListener(this)
-        viewBinding.usePlaceHolderCheckBox.setOnCheckedChangeListener(this)
-        viewBinding.useStickyPlaceHolderCheckBox.setOnCheckedChangeListener(this)
-
-        // Buttons for launching an activity that doesn't support PiP
-        viewBinding.launchNoPipButton.setOnClickListener(this)
-
-        // Buttons for PiP options.
-        viewBinding.enterPipButton.setOnClickListener(this)
-        viewBinding.supportPipRadioGroup.setOnCheckedChangeListener(this)
-    }
-
-    /** Called on checkbox changed. */
-    override fun onCheckedChanged(button: CompoundButton, isChecked: Boolean) {
-        if (button.id == R.id.split_main_check_box) {
-            if (isChecked) {
-                viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = true
-                viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = true
-            } else {
-                viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = false
-                viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked = false
-                viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = false
-                viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked = false
-            }
-        }
-        if (button.id == R.id.use_place_holder_check_box) {
-            if (isChecked) {
-                viewBinding.useStickyPlaceHolderCheckBox.isEnabled = true
-            } else {
-                viewBinding.useStickyPlaceHolderCheckBox.isEnabled = false
-                viewBinding.useStickyPlaceHolderCheckBox.isChecked = false
-            }
-        }
-        if (!updatingConfigs) {
-            updateSplitRules()
-        }
-    }
-
-    /** Called on button clicked. */
-    override fun onClick(button: View) {
-        when (button.id) {
-            R.id.launch_b_button -> {
-                startActivity(Intent(this, SplitPipActivityB::class.java))
-                return
-            }
-            R.id.launch_no_pip_button -> {
-                startActivity(Intent(this, SplitPipActivityNoPip::class.java))
-                return
-            }
-            R.id.enter_pip_button -> {
-                startPictureInPicture(this, autoEnterPip)
-            }
-        }
-    }
-
-    /** Called on RatioGroup (PiP options) changed. */
-    override fun onCheckedChanged(group: RadioGroup, id: Int) {
-        when (id) {
-            R.id.support_pip_not_enter_on_exit -> {
-                enterPipOnUserLeave = false
-                autoEnterPip = false
-            }
-            R.id.support_pip_enter_on_user_leave -> {
-                enterPipOnUserLeave = true
-                autoEnterPip = false
-            }
-            R.id.support_pip_auto_enter -> {
-                enterPipOnUserLeave = false
-                autoEnterPip = true
-                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
-                    Toast.makeText(this, "auto enter PiP not supported", Toast.LENGTH_LONG)
-                        .show()
-                }
-            }
-        }
-        setPictureInPictureParams(this, autoEnterPip)
-    }
-
-    /** Enters PiP if enterPipOnUserLeave checkbox is checked. */
-    override fun onUserLeaveHint() {
-        super.onUserLeaveHint()
-        if (enterPipOnUserLeave) {
-            startPictureInPicture(this, autoEnterPip)
-        }
-    }
-
-    /** Updates the checkboxes states after the split rules are changed by other activity. */
-    internal fun updateCheckboxes() {
-        updatingConfigs = true
-
-        val curRules = ruleController.getRules()
-        val splitRule = curRules.firstOrNull { isRuleForSplit(it) }
-        val placeholderRule = curRules.firstOrNull { isRuleForPlaceholder(it) }
-
-        if (splitRule != null && splitRule is SplitPairRule) {
-            viewBinding.splitMainCheckBox.isChecked = true
-            viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = true
-            viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked =
-                splitRule.finishPrimaryWithSecondary == SplitRule.FINISH_ALWAYS
-            viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = true
-            viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked =
-                splitRule.finishSecondaryWithPrimary == SplitRule.FINISH_ALWAYS
-        } else {
-            viewBinding.splitMainCheckBox.isChecked = false
-            viewBinding.finishPrimaryWithSecondaryCheckBox.isEnabled = false
-            viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked = false
-            viewBinding.finishSecondaryWithPrimaryCheckBox.isEnabled = false
-            viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked = false
-        }
-
-        if (placeholderRule != null && placeholderRule is SplitPlaceholderRule) {
-            viewBinding.usePlaceHolderCheckBox.isChecked = true
-            viewBinding.useStickyPlaceHolderCheckBox.isEnabled = true
-            viewBinding.useStickyPlaceHolderCheckBox.isChecked = placeholderRule.isSticky
-        } else {
-            viewBinding.usePlaceHolderCheckBox.isChecked = false
-            viewBinding.useStickyPlaceHolderCheckBox.isEnabled = false
-            viewBinding.useStickyPlaceHolderCheckBox.isChecked = false
-        }
-
-        updatingConfigs = false
-    }
-
-    /** Whether the given rule is for splitting activity A and others. */
-    private fun isRuleForSplit(rule: EmbeddingRule): Boolean {
-        if (rule !is SplitPairRule) {
-            return false
-        }
-        for (filter in rule.filters) {
-            if (filter.primaryActivityName.className == SplitPipActivityA::class.java.name) {
-                return true
-            }
-        }
-        return false
-    }
-
-    /** Whether the given rule is for launching placeholder with activity B. */
-    private fun isRuleForPlaceholder(rule: EmbeddingRule): Boolean {
-        if (rule !is SplitPlaceholderRule) {
-            return false
-        }
-        for (filter in rule.filters) {
-            if (filter.componentName.className == SplitPipActivityB::class.java.name) {
-                return true
-            }
-        }
-        return false
-    }
-
-    /** Updates the split rules based on the current selection on checkboxes. */
-    private fun updateSplitRules() {
-        ruleController.clearRules()
-
-        if (viewBinding.splitMainCheckBox.isChecked) {
-            val pairFilters = HashSet<SplitPairFilter>()
-            pairFilters.add(SplitPairFilter(componentNameA, componentNameB, null))
-            pairFilters.add(SplitPairFilter(componentNameA, componentNameNotPip, null))
-            val finishAWithB = viewBinding.finishPrimaryWithSecondaryCheckBox.isChecked
-            val finishBWithA = viewBinding.finishSecondaryWithPrimaryCheckBox.isChecked
-            val rule = SplitPairRule.Builder(pairFilters)
-                .setMinWidthDp(0)
-                .setMinSmallestWidthDp(0)
-                .setFinishPrimaryWithSecondary(
-                    if (finishAWithB) SplitRule.FINISH_ALWAYS else SplitRule.FINISH_NEVER)
-                .setFinishSecondaryWithPrimary(
-                    if (finishBWithA) SplitRule.FINISH_ALWAYS else SplitRule.FINISH_NEVER)
-                .setClearTop(true)
-                .setSplitRatio(splitRatio)
-                .build()
-            ruleController.addRule(rule)
-        }
-
-        if (viewBinding.usePlaceHolderCheckBox.isChecked) {
-            val activityFilters = HashSet<ActivityFilter>()
-            activityFilters.add(ActivityFilter(componentNameB, null))
-            val intent = Intent().setComponent(componentNamePlaceholder)
-            val isSticky = viewBinding.useStickyPlaceHolderCheckBox.isChecked
-            val rule = SplitPlaceholderRule.Builder(activityFilters, intent)
-                .setMinWidthDp(0)
-                .setMinSmallestWidthDp(0)
-                .setSticky(isSticky)
-                .setFinishPrimaryWithPlaceholder(SplitRule.FINISH_ADJACENT)
-                .setSplitRatio(splitRatio)
-                .build()
-            ruleController.addRule(rule)
-        }
-    }
-
-    override fun onStart() {
-        super.onStart()
-        splitController.addSplitListener(
-            this,
-            ContextCompat.getMainExecutor(this),
-            splitChangeListener
-        )
-    }
-
-    override fun onStop() {
-        super.onStop()
-        splitController.removeSplitListener(splitChangeListener)
-    }
-
-    /** Updates the embedding status when receives callback from the extension. */
-    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
-        override fun accept(newSplitInfos: List<SplitInfo>) {
-            var isInSplit = false
-            for (info in newSplitInfos) {
-                if (info.contains(this@SplitPipActivityBase) && info.splitRatio > 0) {
-                    isInSplit = true
-                    break
-                }
-            }
-
-            runOnUiThread {
-                viewBinding.activityEmbeddedStatusTextView.visibility =
-                    if (isInSplit) View.VISIBLE else View.GONE
-
-                updateCheckboxes()
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityNoPip.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityNoPip.kt
deleted file mode 100644
index 3cfc28c..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityNoPip.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample.embedding
-
-import android.os.Bundle
-
-open class SplitPipActivityNoPip : SplitActivityPlaceholder() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        viewBinding.placeholderText.text = "PiP not supported"
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityPlaceholder.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityPlaceholder.kt
deleted file mode 100644
index 7c8639b..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitPipActivityPlaceholder.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window.sample.embedding
-
-open class SplitPipActivityPlaceholder : SplitActivityPlaceholder()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLog.kt b/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLog.kt
deleted file mode 100644
index e69a77b..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLog.kt
+++ /dev/null
@@ -1,23 +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.sample.infolog
-
-/**
- * A data class to hold a title and a detail or subtitle that can be shown using [InfoLogAdapter]
- * . This can be used to create samples with an ordered timeline of events.
- */
-data class InfoLog(val title: String, val detail: String, val id: Int)
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogAdapter.kt b/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogAdapter.kt
deleted file mode 100644
index 29fefd6..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogAdapter.kt
+++ /dev/null
@@ -1,53 +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.sample.infolog
-
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.R
-
-class InfoLogAdapter : RecyclerView.Adapter<InfoLogVH>() {
-
-    private var id = 0
-    private val items = mutableListOf<InfoLog>()
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InfoLogVH {
-        val root = LayoutInflater.from(parent.context)
-            .inflate(R.layout.view_holder_info_log, parent, false)
-        return InfoLogVH(root)
-    }
-
-    override fun onBindViewHolder(holder: InfoLogVH, position: Int) {
-        val item = items[position]
-        holder.titleView.text = "ID: ${item.id} Title: ${item.title}"
-        holder.detailView.text = "Detail: ${item.detail}"
-    }
-
-    override fun getItemCount(): Int {
-        return items.size
-    }
-
-    fun append(title: String, message: String) {
-        append(InfoLog(title, message, id))
-        ++id
-    }
-
-    private fun append(item: InfoLog) {
-        items.add(0, item)
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogVH.kt b/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogVH.kt
deleted file mode 100644
index 4760be2..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/infolog/InfoLogVH.kt
+++ /dev/null
@@ -1,27 +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.sample.infolog
-
-import android.view.View
-import android.widget.TextView
-import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.R
-
-class InfoLogVH(view: View) : RecyclerView.ViewHolder(view) {
-    val titleView: TextView = view.findViewById(R.id.title_view)
-    val detailView: TextView = view.findViewById(R.id.detail_view)
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/util/PictureInPictureUtil.kt b/window/window-samples/src/main/java/androidx/window/sample/util/PictureInPictureUtil.kt
deleted file mode 100644
index 4f50715..0000000
--- a/window/window-samples/src/main/java/androidx/window/sample/util/PictureInPictureUtil.kt
+++ /dev/null
@@ -1,107 +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.sample.util
-
-import android.app.Activity
-import android.app.PictureInPictureParams
-import android.os.Build
-import android.view.Menu
-import android.view.MenuInflater
-import android.view.MenuItem
-import android.widget.Toast
-import androidx.annotation.RequiresApi
-import androidx.window.sample.R
-
-@RequiresApi(Build.VERSION_CODES.O)
-private object PictureInPictureLauncherO {
-    fun startPictureInPicture(activity: Activity) {
-        activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())
-    }
-
-    fun setPictureInPictureParams(activity: Activity) {
-        activity.setPictureInPictureParams(PictureInPictureParams.Builder().build())
-    }
-}
-
-@RequiresApi(Build.VERSION_CODES.S)
-private object PictureInPictureLauncherS {
-    fun startPictureInPicture(activity: Activity, autoEnterPip: Boolean = false) {
-        activity.enterPictureInPictureMode(PictureInPictureParams.Builder()
-            .setAutoEnterEnabled(autoEnterPip)
-            .build())
-    }
-
-    fun setPictureInPictureParams(activity: Activity, autoEnterPip: Boolean = false) {
-        activity.setPictureInPictureParams(PictureInPictureParams.Builder()
-            .setAutoEnterEnabled(autoEnterPip)
-            .build())
-    }
-}
-
-object PictureInPictureUtil {
-    /**
-     * Appends the start picture in picture [MenuItem] to the given [Menu] if picture in picture
-     * is supported.
-     * @param inflater a [MenuInflater] to load the [Menu] from a resource.
-     * @param menu the menu to contain the inflated resource.
-     */
-    fun appendPictureInPictureMenu(inflater: MenuInflater, menu: Menu) {
-        if (Build.VERSION.SDK_INT > 26) {
-            inflater.inflate(R.menu.picture_in_picture_menu, menu)
-        }
-    }
-
-    /**
-     * Requests that the [Activity] enters picture in picture mode if the [MenuItem] matches the
-     * resource loaded in [appendPictureInPictureMenu]. If the [Activity] does not support picture
-     * in picture then nothing happens.
-     * @return true if the [MenuItem] has the same id as the start pip [MenuItem], false otherwise
-     */
-    fun handlePictureInPictureMenuItem(activity: Activity, item: MenuItem): Boolean {
-        return when (item.itemId) {
-            R.id.menu_item_enter_pip -> {
-                startPictureInPicture(activity)
-                true
-            }
-            else -> false
-        }
-    }
-
-    fun startPictureInPicture(activity: Activity, autoEnterPip: Boolean = false) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-            PictureInPictureLauncherS.startPictureInPicture(activity, autoEnterPip)
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            PictureInPictureLauncherO.startPictureInPicture(activity)
-        } else {
-            Toast.makeText(activity, "PiP not supported", Toast.LENGTH_LONG).show()
-        }
-    }
-
-    fun setPictureInPictureParams(activity: Activity, autoEnterPip: Boolean = false) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-            PictureInPictureLauncherS.setPictureInPictureParams(activity, autoEnterPip)
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            PictureInPictureLauncherO.setPictureInPictureParams(activity)
-            if (autoEnterPip) {
-                Toast.makeText(activity, "Auto enter PIP not supported", Toast.LENGTH_LONG)
-                    .show()
-            }
-        } else {
-            Toast.makeText(activity, "PiP not supported", Toast.LENGTH_LONG).show()
-        }
-    }
-}
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_display_features_config_change.xml b/window/window-samples/src/main/res/layout/activity_display_features_config_change.xml
deleted file mode 100644
index 0e877e4..0000000
--- a/window/window-samples/src/main/res/layout/activity_display_features_config_change.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?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.
-  -->
-
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/rootLayout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="androidx.window.sample.DisplayFeaturesConfigChangeActivity">
-
-    <FrameLayout
-        android:id="@+id/featureContainerLayout"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <LinearLayout
-        android:id="@+id/legendLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent">
-
-        <TextView
-            android:id="@+id/legendTextView"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/legend" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="horizontal">
-
-            <ImageView
-                android:id="@+id/foldColorImageView"
-                android:layout_width="20dp"
-                android:layout_height="20dp"
-                android:foreground="@color/colorFeatureFold" />
-
-            <TextView
-                android:id="@+id/foldColorTextView"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:text="@string/fold" />
-        </LinearLayout>
-
-    </LinearLayout>
-
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/infoLogRecyclerView"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml b/window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml
deleted file mode 100644
index 46ade36..0000000
--- a/window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml
+++ /dev/null
@@ -1,93 +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.
-  -->
-
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/rootLayout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="androidx.window.sample.DisplayFeaturesNoConfigChangeActivity">
-
-    <FrameLayout
-        android:id="@+id/feature_container_layout"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"/>
-
-    <TextView
-        android:id="@+id/current_state"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:text="@string/current_state"
-        android:textAppearance="@style/TextAppearance.AppCompat.Large"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.0"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <LinearLayout
-        android:id="@+id/legendLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent">
-
-        <TextView
-            android:id="@+id/legendTextView"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/legend" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="horizontal">
-
-            <ImageView
-                android:id="@+id/foldColorImageView"
-                android:layout_width="20dp"
-                android:layout_height="20dp"
-                android:foreground="@color/colorFeatureFold" />
-
-            <TextView
-                android:id="@+id/foldColorTextView"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:text="@string/fold" />
-        </LinearLayout>
-
-    </LinearLayout>
-
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/infoLogRecyclerView"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/current_state"
-        app:layout_constraintBottom_toBottomOf="parent"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
deleted file mode 100644
index d67eefc..0000000
--- a/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2020 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/root_split_activity_layout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:padding="10dp">
-
-    <TextView
-        android:id="@+id/activity_embedded_status_text_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Activity is embedded" />
-
-    <CheckBox
-        android:id="@+id/splitMainCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Split Main with other activities" />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="10dp"
-        android:background="#AAAAAA" />
-
-    <Button
-        android:id="@+id/launch_b"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:layout_centerHorizontal="true"
-        android:text="Launch B" />
-
-    <CheckBox
-        android:id="@+id/usePlaceholderCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Use a placeholder for B" />
-
-    <CheckBox
-        android:id="@+id/useStickyPlaceholderCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Placeholder is sticky" />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="10dp"
-        android:background="#AAAAAA" />
-
-    <Button
-        android:id="@+id/launch_b_and_C"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:layout_centerHorizontal="true"
-        android:text="Launch B and C" />
-
-    <CheckBox
-        android:id="@+id/splitBCCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Split B with C" />
-
-    <CheckBox
-        android:id="@+id/finishBCCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Finish B and C together"
-        android:enabled="false" />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="10dp"
-        android:background="#AAAAAA" />
-
-    <Button
-        android:id="@+id/launch_e"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:layout_centerHorizontal="true"
-        android:text="Launch E" />
-
-    <CheckBox
-        android:id="@+id/fullscreenECheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Always launch E in fullscreen" />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginBottom="10dp"
-        android:background="#AAAAAA" />
-
-    <Button
-        android:id="@+id/launch_f"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:layout_centerHorizontal="true"
-        android:text="Launch f" />
-
-    <Button
-        android:id="@+id/launch_f_pending_intent"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:layout_centerHorizontal="true"
-        android:text="Launch F via Pending Intent" />
-
-    <CheckBox
-        android:id="@+id/splitWithFCheckBox"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Split everything with F" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_layout.xml b/window/window-samples/src/main/res/layout/activity_split_layout.xml
deleted file mode 100644
index 6950bf3..0000000
--- a/window/window-samples/src/main/res/layout/activity_split_layout.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2020 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:custom="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/rootLayout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="SplitLayoutActivity">
-
-    <androidx.window.sample.SplitLayout
-        android:id="@+id/split_layout"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        custom:startViewId="@+id/start_layout"
-        custom:endViewId="@+id/end_layout"
-        android:padding="5dp">
-        <include
-            android:id="@id/start_layout"
-            layout="@layout/split_layout_content" />
-        <include
-            android:id="@id/end_layout"
-            layout="@layout/split_layout_control" />
-    </androidx.window.sample.SplitLayout>
-</LinearLayout>
diff --git a/window/window-samples/src/main/res/layout/test_ime.xml b/window/window-samples/src/main/res/layout/test_ime.xml
deleted file mode 100644
index feda1d7..0000000
--- a/window/window-samples/src/main/res/layout/test_ime.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Copyright 2022 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-
-    <Button
-        android:id="@+id/button_close"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/test_ime_button_close"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/view_holder_info_log.xml b/window/window-samples/src/main/res/layout/view_holder_info_log.xml
deleted file mode 100644
index 7487737..0000000
--- a/window/window-samples/src/main/res/layout/view_holder_info_log.xml
+++ /dev/null
@@ -1,34 +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.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_marginTop="16dp"
-    android:layout_marginBottom="16dp"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-
-    <TextView
-        android:id="@+id/title_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
-
-    <TextView
-        android:id="@+id/detail_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/values/colors.xml b/window/window-samples/src/main/res/values/colors.xml
deleted file mode 100644
index 41a72b2..0000000
--- a/window/window-samples/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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>
-    <color name="colorPrimary">#6200EE</color>
-    <color name="colorPrimaryDark">#3700B3</color>
-    <color name="colorAccent">#03DAC5</color>
-
-    <color name="colorFeatureFold">#7700FF00</color>
-
-    <color name="colorSplitContentBackground">#3B6BDB4C</color>
-    <color name="colorSplitControlsBackground">#475ABFF3</color>
-</resources>
diff --git a/window/window-samples/src/main/res/values/strings.xml b/window/window-samples/src/main/res/values/strings.xml
deleted file mode 100644
index 45e3de2..0000000
--- a/window/window-samples/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,62 +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.
-  -->
-
-<resources>
-    <string name="app_name">WindowSamples</string>
-    <string name="current_state">Current state</string>
-    <string name="deviceState">Device state</string>
-    <string name="window_layout">Window layout</string>
-    <string name="fold">Fold</string>
-    <string name="legend">Legend:</string>
-    <string name="content_title">Content title</string>
-    <string name="green_droid">Green droid</string>
-    <string name="display_features_config_change">Display features handle config change</string>
-    <string name="display_features_no_config_change">Display features no config change</string>
-    <string name="split_layout">Split layout</string>
-    <string name="presentation">Presentation</string>
-    <string name="start_presentation">Start presentation</string>
-    <string name="stop_presentation">Stop presentation</string>
-    <string name="closeToStartPresentationHint">Close the device to start Presentation on
-        the outside screen</string>
-    <string name="windowManagerDemos">WindowManager Demos</string>
-    <string name="hardware_config_select">Hardware configuration to use</string>
-    <string name="device_default">Device default</string>
-    <string name="short_dimension_fold">Fold in the middle of the window along short
-        dimension</string>
-    <string name="long_dimension_fold">Fold in the middle of the window along long
-        dimension</string>
-    <string name="test_activity">Test activity</string>
-    <string name="show_all_display_features_config_change_description">Show all display features of the device on the screen and handle config changes</string>
-    <string name="show_all_display_features_no_config_change_description">Show all display features of the device on the screen and do not handle config changes.  The activity is recreated instead on rotation or resize</string>
-    <string name="split_layout_demo_description">Demo of a layout that splits the content to sides of a fold or a hinge. If not present or minimal size requirements are not meant, it behave like a FrameLayout.</string>
-    <string name="presentation_demo_description">Demo of using Presentation API to show content on secondary display.</string>
-    <string name="screens_are_separated">"Screens are separated"</string>
-    <string name="screens_are_not_separated">"Screen is not separated"</string>
-    <string name="screen_is_horizontal">"Hinge is horizontal"</string>
-    <string name="screen_is_vertical">"Hinge is vertical"</string>
-    <string name="occlusion_is_full">Occlusion is full</string>
-    <string name="occlusion_is_none">Occlusion is none</string>
-    <string name="window_metrics">Window metrics</string>
-    <string name="window_metrics_description">Demo of using WindowMetrics API with activity handling rotations.</string>
-    <string name="test_ime">Test IME</string>
-    <string name="test_ime_button_close">Close Test IME</string>
-    <string name="window_metrics_ime_hint">Tap to open IME</string>
-    <string name="ime">IME</string>
-    <string name="ime_demo_description">Demo of using various APIs from within IME.</string>
-    <string name="ime_demo_reminder">Reminder: To use the Test IME bundled with this application, remember to enable it in System Settings.</string>
-    <string name="ime_button_settings">System IME Settings</string>
-    <string name="ime_button_switch_default">Switch default IME</string>
-</resources>
diff --git a/window/window-samples/src/main/res/values/styles.xml b/window/window-samples/src/main/res/values/styles.xml
deleted file mode 100644
index eaa9ab2..0000000
--- a/window/window-samples/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,27 +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.
-  -->
-
-<resources>
-
-    <!-- Base application theme. -->
-    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
-        <!-- Customize your theme here. -->
-        <item name="colorPrimary">@color/colorPrimary</item>
-        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-        <item name="colorAccent">@color/colorAccent</item>
-    </style>
-
-</resources>
diff --git a/window/window-samples/src/main/res/xml/main_split_config.xml b/window/window-samples/src/main/res/xml/main_split_config.xml
deleted file mode 100644
index 5b93a1c..0000000
--- a/window/window-samples/src/main/res/xml/main_split_config.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
-    xmlns:window="http://schemas.android.com/apk/res-auto">
-    <SplitPairRule
-        window:finishPrimaryWithSecondary="always"
-        window:finishSecondaryWithPrimary="adjacent">
-        <SplitPairFilter
-            window:primaryActivityName="androidx.window.sample.embedding.SplitActivityList"
-            window:secondaryActivityName="androidx.window.sample.embedding.SplitActivityDetail"/>
-    </SplitPairRule>
-    <SplitPlaceholderRule
-        window:placeholderActivityName="androidx.window.sample.embedding.SplitActivityListPlaceholder"
-        window:stickyPlaceholder="true"
-        window:finishPrimaryWithSecondary="adjacent">
-        <ActivityFilter
-            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
-    </SplitPlaceholderRule>
-</resources>
\ No newline at end of file
diff --git a/window/window-testing/api/current.txt b/window/window-testing/api/current.txt
index 12a7d20..baf8ef4 100644
--- a/window/window-testing/api/current.txt
+++ b/window/window-testing/api/current.txt
@@ -1,4 +1,17 @@
 // Signature format: 4.0
+package androidx.window.testing.embedding {
+
+  public final class TestSplitAttributesCalculatorParams {
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied, optional String? splitRuleTag);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics);
+  }
+
+}
+
 package androidx.window.testing.layout {
 
   public final class DisplayFeatureTesting {
diff --git a/window/window-testing/api/public_plus_experimental_current.txt b/window/window-testing/api/public_plus_experimental_current.txt
index 56856b4..aa96039 100644
--- a/window/window-testing/api/public_plus_experimental_current.txt
+++ b/window/window-testing/api/public_plus_experimental_current.txt
@@ -1,4 +1,17 @@
 // Signature format: 4.0
+package androidx.window.testing.embedding {
+
+  public final class TestSplitAttributesCalculatorParams {
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied, optional String? splitRuleTag);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics);
+  }
+
+}
+
 package androidx.window.testing.layout {
 
   public final class DisplayFeatureTesting {
diff --git a/window/window-testing/api/restricted_current.txt b/window/window-testing/api/restricted_current.txt
index 12a7d20..baf8ef4 100644
--- a/window/window-testing/api/restricted_current.txt
+++ b/window/window-testing/api/restricted_current.txt
@@ -1,4 +1,17 @@
 // Signature format: 4.0
+package androidx.window.testing.embedding {
+
+  public final class TestSplitAttributesCalculatorParams {
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied, optional String? splitRuleTag);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes, optional boolean areDefaultConstraintsSatisfied);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo, optional androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration, optional androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics, optional android.content.res.Configuration parentConfiguration);
+    method public static androidx.window.embedding.SplitAttributesCalculatorParams createTestSplitAttributesCalculatorParams(androidx.window.layout.WindowMetrics parentWindowMetrics);
+  }
+
+}
+
 package androidx.window.testing.layout {
 
   public final class DisplayFeatureTesting {
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
new file mode 100644
index 0000000..cec8cb1
--- /dev/null
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.testing.emedding;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.res.Configuration;
+import android.graphics.Rect;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.OptIn;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.window.core.ExperimentalWindowApi;
+import androidx.window.embedding.SplitAttributes;
+import androidx.window.embedding.SplitAttributesCalculatorParams;
+import androidx.window.layout.DisplayFeature;
+import androidx.window.layout.FoldingFeature;
+import androidx.window.layout.WindowLayoutInfo;
+import androidx.window.layout.WindowMetrics;
+import androidx.window.testing.embedding.TestSplitAttributesCalculatorParams;
+import androidx.window.testing.layout.DisplayFeatureTesting;
+import androidx.window.testing.layout.WindowLayoutInfoTesting;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** Test class to verify {@link TestSplitAttributesCalculatorParams} in Java. */
+public class SplitAttributesCalculatorParamsTestingJavaTest {
+    private static final Rect TEST_BOUNDS = new Rect(0, 0, 2000, 2000);
+    private static final WindowMetrics TEST_METRICS = new WindowMetrics(TEST_BOUNDS,
+            WindowInsetsCompat.CONSUMED);
+    private static final SplitAttributes DEFAULT_SPLIT_ATTRIBUTES =
+            new SplitAttributes.Builder().build();
+    private static final SplitAttributes TABLETOP_HINGE_ATTRIBUTES = new SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.splitByHinge(
+                    SplitAttributes.SplitType.splitEqually()))
+            .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
+            .build();
+
+    /**
+     * Verifies if the default value of {@link TestSplitAttributesCalculatorParams} is as expected.
+     */
+    @Test
+    public void testDefaults() {
+        final SplitAttributesCalculatorParams params = TestSplitAttributesCalculatorParams
+                .createTestSplitAttributesCalculatorParams(TEST_METRICS);
+
+        assertEquals(TEST_METRICS, params.getParentWindowMetrics());
+        assertEquals(0, params.getParentConfiguration().diff(new Configuration()));
+        assertEquals(DEFAULT_SPLIT_ATTRIBUTES, params.getDefaultSplitAttributes());
+        assertTrue(params.areDefaultConstraintsSatisfied());
+        assertEquals(new WindowLayoutInfo(Collections.emptyList()),
+                params.getParentWindowLayoutInfo());
+        assertNull(params.getSplitRuleTag());
+
+        assertEquals(DEFAULT_SPLIT_ATTRIBUTES, testSplitAttributesCalculator(params));
+    }
+
+    @OptIn(markerClass = ExperimentalWindowApi.class)
+    @Test
+    public void testParamsWithTabletopFoldingFeature() {
+        final FoldingFeature tabletopFoldingFeature =
+                DisplayFeatureTesting.createFoldingFeature(TEST_BOUNDS);
+        final List<DisplayFeature> displayFeatures = new ArrayList<>();
+        displayFeatures.add(tabletopFoldingFeature);
+        final WindowLayoutInfo parentWindowLayoutInfo =
+                WindowLayoutInfoTesting.createWindowLayoutInfo(displayFeatures);
+        SplitAttributesCalculatorParams params = TestSplitAttributesCalculatorParams
+                .createTestSplitAttributesCalculatorParams(TEST_METRICS, new Configuration(),
+                        parentWindowLayoutInfo, DEFAULT_SPLIT_ATTRIBUTES,  true);
+
+        assertEquals(TABLETOP_HINGE_ATTRIBUTES, testSplitAttributesCalculator(params));
+    }
+
+    private SplitAttributes testSplitAttributesCalculator(
+            @NonNull SplitAttributesCalculatorParams params) {
+        List<DisplayFeature> displayFeatures = params.getParentWindowLayoutInfo()
+                .getDisplayFeatures();
+        List<FoldingFeature> foldingFeatures = new ArrayList<>();
+        for (DisplayFeature feature : displayFeatures) {
+            if (feature instanceof FoldingFeature) {
+                foldingFeatures.add((FoldingFeature) feature);
+            }
+        }
+        final FoldingFeature foldingFeature = (foldingFeatures.size() == 1)
+                ? foldingFeatures.get(0) : null;
+        if (foldingFeature != null
+                && foldingFeature.getState().equals(FoldingFeature.State.HALF_OPENED)
+                && foldingFeature.getOrientation().equals(
+                        FoldingFeature.Orientation.HORIZONTAL)) {
+            return TABLETOP_HINGE_ATTRIBUTES;
+        }
+        if (params.areDefaultConstraintsSatisfied()) {
+            return params.getDefaultSplitAttributes();
+        } else {
+            return new SplitAttributes.Builder()
+                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .build();
+        }
+    }
+}
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
new file mode 100644
index 0000000..ff94890
--- /dev/null
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.testing.emedding
+
+import androidx.window.testing.layout.FoldingFeature as testFoldingFeature
+import android.content.res.Configuration
+import android.graphics.Rect
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributesCalculatorParams
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
+import androidx.window.testing.embedding.TestSplitAttributesCalculatorParams
+import androidx.window.testing.layout.TestWindowLayoutInfo
+import java.util.Collections
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+/** Test class to verify [TestSplitAttributesCalculatorParams]. */
+class SplitAttributesCalculatorParamsTestingTest {
+    /** Verifies if the default values of [TestSplitAttributesCalculatorParams] are as expected. */
+    @Test
+    fun testDefaults() {
+        val params = TestSplitAttributesCalculatorParams(TEST_METRICS)
+
+        assertEquals(TEST_METRICS, params.parentWindowMetrics)
+        assertEquals(0, params.parentConfiguration.diff(Configuration()))
+        assertEquals(DEFAULT_SPLIT_ATTRIBUTES, params.defaultSplitAttributes)
+        assertTrue(params.areDefaultConstraintsSatisfied)
+        assertEquals(WindowLayoutInfo(Collections.emptyList()), params.parentWindowLayoutInfo)
+        assertNull(params.splitRuleTag)
+
+        assertEquals(DEFAULT_SPLIT_ATTRIBUTES, testSplitAttributesCalculator(params))
+    }
+
+    @OptIn(ExperimentalWindowApi::class)
+    @Test
+    fun testParamsWithTabletopFoldingFeature() {
+        val tabletopFoldingFeature = testFoldingFeature(TEST_BOUNDS)
+        val parentWindowLayoutInfo = TestWindowLayoutInfo(listOf(tabletopFoldingFeature))
+        val params = TestSplitAttributesCalculatorParams(
+                parentWindowMetrics = TEST_METRICS,
+                parentWindowLayoutInfo = parentWindowLayoutInfo
+            )
+
+        assertEquals(TEST_METRICS, params.parentWindowMetrics)
+        assertEquals(0, params.parentConfiguration.diff(Configuration()))
+        assertEquals(DEFAULT_SPLIT_ATTRIBUTES, params.defaultSplitAttributes)
+        assertTrue(params.areDefaultConstraintsSatisfied)
+        assertEquals(parentWindowLayoutInfo, params.parentWindowLayoutInfo)
+        assertNull(params.splitRuleTag)
+
+        assertEquals(TABLETOP_HINGE_ATTRIBUTES, testSplitAttributesCalculator(params))
+    }
+
+    private fun testSplitAttributesCalculator(
+        params: SplitAttributesCalculatorParams
+    ): SplitAttributes {
+        val foldingFeatures = params.parentWindowLayoutInfo.displayFeatures
+            .filterIsInstance<FoldingFeature>()
+        val foldingFeature: FoldingFeature? =
+            if (foldingFeatures.size == 1) {
+                foldingFeatures.first()
+            } else {
+                null
+            }
+        if (foldingFeature?.state == FoldingFeature.State.HALF_OPENED &&
+            foldingFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
+        ) {
+            return TABLETOP_HINGE_ATTRIBUTES
+        }
+        return if (params.areDefaultConstraintsSatisfied) {
+            params.defaultSplitAttributes
+        } else {
+            SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .build()
+        }
+    }
+
+    companion object {
+        private val TEST_BOUNDS = Rect(0, 0, 2000, 2000)
+        private val TEST_METRICS = WindowMetrics(TEST_BOUNDS)
+        private val DEFAULT_SPLIT_ATTRIBUTES = SplitAttributes.Builder().build()
+        private val TABLETOP_HINGE_ATTRIBUTES = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.splitByHinge())
+            .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
+            .build()
+    }
+}
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt
index 2118436..3e6544d 100644
--- a/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt
@@ -16,6 +16,11 @@
 
 package androidx.window.testing.layout
 
+import android.content.Context
+import android.graphics.Point
+import android.os.Build
+import android.view.WindowManager
+import androidx.annotation.RequiresApi
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.window.core.ExperimentalWindowApi
@@ -75,6 +80,81 @@
         }
     }
 
+    @RequiresApi(Build.VERSION_CODES.R)
+    @Test
+    fun testCurrentWindowMetrics_context_matchesWindowMetricsMetrics_30AndAbove() {
+        Utils.assumePlatformAtOrAbove(Build.VERSION_CODES.R)
+
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+            val wm = activity.getSystemService(WindowManager::class.java)
+            val windowMetrics = wm.currentWindowMetrics.bounds
+            val actual = calculator.computeCurrentWindowMetrics(activity as Context)
+
+            assertEquals(0, actual.bounds.left)
+            assertEquals(0, actual.bounds.top)
+            assertEquals(windowMetrics.width(), actual.bounds.right)
+            assertEquals(windowMetrics.height(), actual.bounds.bottom)
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    @Test
+    fun testCurrentWindowMetrics_context_matchesDisplayRealSize_17to29() {
+        Utils.assumePlatformAtOrBelow(Build.VERSION_CODES.Q)
+        Utils.assumePlatformAtOrAbove(Build.VERSION_CODES.JELLY_BEAN_MR1)
+
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+            val wm = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+            val displaySize = Point()
+            // DefaultDisplay#getRealSize is used in StubWindowMetricsCalculator for compatibility
+            // with older versions. We're just asserting that the value via
+            // StubWindowMetricsCalculator#computeCurrentWindowMetrics is equal to this.
+            @Suppress("DEPRECATION")
+            wm.defaultDisplay.getRealSize(displaySize)
+            val actual = calculator.computeCurrentWindowMetrics(activity as Context)
+
+            assertEquals(0, actual.bounds.left)
+            assertEquals(0, actual.bounds.top)
+            assertEquals(displaySize.x, actual.bounds.right)
+            assertEquals(displaySize.y, actual.bounds.bottom)
+        }
+    }
+
+    // DefaultDisplay width/height used in tests for API16 and lower
+    @Suppress("DEPRECATION")
+    @Test
+    fun testCurrentWindowMetrics_context_matchesDisplayMetrics_16AndBelow() {
+        Utils.assumePlatformAtOrBelow(Build.VERSION_CODES.JELLY_BEAN)
+
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+            val wm = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+            val actual = calculator.computeCurrentWindowMetrics(activity as Context)
+
+            assertEquals(0, actual.bounds.left)
+            assertEquals(0, actual.bounds.top)
+            assertEquals(wm.defaultDisplay.width, actual.bounds.right)
+            assertEquals(wm.defaultDisplay.height, actual.bounds.bottom)
+        }
+    }
+
+    @Test
+    fun testCurrentWindowMetrics_context_matchesMaximumMetrics() {
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+
+            val currentMetrics = calculator.computeCurrentWindowMetrics(activity as Context)
+            val maximumMetrics = calculator.computeMaximumWindowMetrics(activity as Context)
+
+            assertEquals(currentMetrics.bounds.left, maximumMetrics.bounds.left)
+            assertEquals(currentMetrics.bounds.top, maximumMetrics.bounds.top)
+            assertEquals(currentMetrics.bounds.right, maximumMetrics.bounds.right)
+            assertEquals(currentMetrics.bounds.bottom, maximumMetrics.bounds.bottom)
+        }
+    }
+
     /**
      * Tests that when applying a [Statement] then the decorator is removed. This is necessary to
      * keep tests hermetic. If this fails on the last test run then the fake implementation of
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/layout/Utils.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/Utils.kt
new file mode 100644
index 0000000..9c57994
--- /dev/null
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/Utils.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.testing.layout
+
+import android.os.Build
+import org.junit.Assume
+
+internal object Utils {
+    fun assumePlatformAtOrAbove(version: Int) {
+        Assume.assumeTrue(Build.VERSION.SDK_INT >= version)
+    }
+
+    fun assumePlatformAtOrBelow(version: Int) {
+        Assume.assumeTrue(Build.VERSION.SDK_INT <= version)
+    }
+}
\ No newline at end of file
diff --git a/window/window-testing/src/main/java/androidx/window/testing/embedding/SplitAttributesCalculatorParamsTesting.kt b/window/window-testing/src/main/java/androidx/window/testing/embedding/SplitAttributesCalculatorParamsTesting.kt
new file mode 100644
index 0000000..4b39749
--- /dev/null
+++ b/window/window-testing/src/main/java/androidx/window/testing/embedding/SplitAttributesCalculatorParamsTesting.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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("TestSplitAttributesCalculatorParams")
+
+package androidx.window.testing.embedding
+
+import android.content.res.Configuration
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributesCalculatorParams
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitPairRule
+import androidx.window.embedding.SplitPlaceholderRule
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
+import java.util.Collections
+
+/**
+ * Returns an instance of [SplitAttributesCalculatorParams] for testing. It is used to verify the
+ * developer implemented callback set by [SplitController.setSplitAttributesCalculator] by setting
+ * the relevant values in [SplitAttributesCalculatorParams] with this method.
+ *
+ * @param parentWindowMetrics The [WindowMetrics] of the host task. See
+ *   [SplitAttributesCalculatorParams.parentWindowMetrics].
+ * @param parentConfiguration The [Configuration] of the host task with empty [Configuration] as
+ *   the default value. See [SplitAttributesCalculatorParams.parentConfiguration]
+ * @param parentWindowLayoutInfo Used for reporting the
+ *   [androidx.window.layout.FoldingFeature] with empty [WindowLayoutInfo] as the default value.
+ *   See [androidx.window.testing.layout.TestWindowLayoutInfo] and
+ *   [androidx.window.testing.layout.FoldingFeature] for how to create test
+ *   [WindowLayoutInfo] with [androidx.window.layout.FoldingFeature].
+ * @param defaultSplitAttributes The [SplitPairRule.defaultSplitAttributes] or
+ *   the [SplitPlaceholderRule.defaultSplitAttributes] that the callback is applied a vertical
+ *   equal [SplitAttributes] as the default value.
+ *   See [SplitAttributesCalculatorParams.defaultSplitAttributes]
+ * @param areDefaultConstraintsSatisfied `true` to indicate that the [parentWindowMetrics] satisfies
+ *   the constraints of [SplitPairRule] or [SplitPlaceholderRule] which defaults to `true`.
+ *   See [SplitAttributesCalculatorParams.areDefaultConstraintsSatisfied]
+ * @param splitRuleTag The [SplitPairRule.tag] or the [SplitPlaceholderRule.tag] that the callback
+ *   is applied with `null` as the default value.
+ *   See [SplitAttributesCalculatorParams.splitRuleTag].
+ *
+ * @see SplitAttributesCalculatorParams
+ */
+@Suppress("FunctionName")
+@JvmName("createTestSplitAttributesCalculatorParams")
+@JvmOverloads
+fun TestSplitAttributesCalculatorParams(
+    parentWindowMetrics: WindowMetrics,
+    parentConfiguration: Configuration = Configuration(),
+    parentWindowLayoutInfo: WindowLayoutInfo = WindowLayoutInfo(Collections.emptyList()),
+    defaultSplitAttributes: SplitAttributes = SplitAttributes.Builder().build(),
+    areDefaultConstraintsSatisfied: Boolean = true,
+    splitRuleTag: String? = null,
+): SplitAttributesCalculatorParams =
+    SplitAttributesCalculatorParams(
+        parentWindowMetrics,
+        parentConfiguration,
+        parentWindowLayoutInfo,
+        defaultSplitAttributes,
+        areDefaultConstraintsSatisfied,
+        splitRuleTag
+    )
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt
index d02349a..14bf0c7 100644
--- a/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt
@@ -26,6 +26,6 @@
 @ExperimentalWindowApi
 internal object StubMetricDecorator : WindowMetricsCalculatorDecorator {
     override fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator {
-        return StubWindowMetricsCalculator
+        return StubWindowMetricsCalculator()
     }
 }
\ No newline at end of file
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt
index c9b994e..5a040ab 100644
--- a/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt
@@ -17,17 +17,25 @@
 package androidx.window.testing.layout
 
 import android.app.Activity
+import android.content.Context
+import android.graphics.Point
 import android.graphics.Rect
+import android.os.Build
+import android.view.Display
+import android.view.WindowManager
+import androidx.annotation.RequiresApi
+import androidx.annotation.UiContext
 import androidx.window.layout.WindowMetrics
 import androidx.window.layout.WindowMetricsCalculator
 
 /**
- * A stub implementation of [WindowMetricsCalculator] that returns the
- * [android.util.DisplayMetrics] for the current and maximum [WindowMetrics]. This is not correct
- * in general terms, as an application may be running in multi-window or otherwise adjusted to not
+ * A stub implementation of [WindowMetricsCalculator] that's intended to be used by Robolectric.
+ * [computeCurrentWindowMetrics] and [computeMaximumWindowMetrics] returns reasonable
+ * [WindowMetrics] for all supported SDK levels, but is not correct in general terms, as an
+ * application or [UiContext] may be running in multi-window mode, or otherwise adjusted to not
  * occupy the entire display.
  */
-internal object StubWindowMetricsCalculator : WindowMetricsCalculator {
+internal class StubWindowMetricsCalculator : WindowMetricsCalculator {
 
     override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
         val displayMetrics = activity.resources.displayMetrics
@@ -40,4 +48,52 @@
         val bounds = Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
         return WindowMetrics(bounds)
     }
+
+    // WindowManager#getDefaultDisplay is deprecated but we have this for compatibility with
+    // older versions.
+    @Suppress("DEPRECATION")
+    override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            Api30Impl.getWindowMetrics(wm)
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            val displaySize = Point()
+            // We use getRealSize instead of getSize here because:
+            //   1) computeCurrentWindowMetrics and computeMaximumWindowMetrics in this class
+            //      always return a measurement equal to the entire display (see class-level
+            //      documentation).
+            //   2) getRealSize returns the largest region of the display, whereas getSize returns
+            //      the current app window. So to stay consistent with class documentation, we use
+            //      getRealSize.
+            Api17Impl.getRealSize(wm.defaultDisplay, displaySize)
+            val bounds = Rect(0, 0, displaySize.x, displaySize.y)
+            WindowMetrics(bounds)
+        } else {
+            val width = wm.defaultDisplay.width
+            val height = wm.defaultDisplay.height
+            val bounds = Rect(0, 0, width, height)
+            WindowMetrics(bounds)
+        }
+    }
+
+    override fun computeMaximumWindowMetrics(@UiContext context: Context): WindowMetrics {
+        return computeCurrentWindowMetrics(context)
+    }
+
+    @RequiresApi(Build.VERSION_CODES.R)
+    private object Api30Impl {
+        fun getWindowMetrics(windowManager: WindowManager): WindowMetrics {
+            return WindowMetrics(windowManager.currentWindowMetrics.bounds)
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    private object Api17Impl {
+        // getRealSize is deprecated but we have this for compatibility with older versions.
+        @Suppress("DEPRECATION")
+        fun getRealSize(display: Display, point: Point) {
+            display.getRealSize(point)
+        }
+    }
 }
\ No newline at end of file
diff --git a/window/window/api/current.txt b/window/window/api/current.txt
index 4c43822..2a716a3 100644
--- a/window/window/api/current.txt
+++ b/window/window/api/current.txt
@@ -4,6 +4,7 @@
   public final class WindowProperties {
     field public static final androidx.window.WindowProperties INSTANCE;
     field public static final String PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE = "android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE";
+    field public static final String PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED = "android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED";
   }
 
 }
@@ -41,29 +42,29 @@
     ctor public ActivityRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters);
     method public androidx.window.embedding.ActivityRule build();
     method public androidx.window.embedding.ActivityRule.Builder setAlwaysExpand(boolean alwaysExpand);
+    method public androidx.window.embedding.ActivityRule.Builder setTag(String tag);
   }
 
   public final class ActivityStack {
-    ctor public ActivityStack(java.util.List<? extends android.app.Activity> activitiesInProcess, optional boolean isEmpty);
     method public operator boolean contains(android.app.Activity activity);
     method public boolean isEmpty();
     property public final boolean isEmpty;
   }
 
   public final class EmbeddingAspectRatio {
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public static androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_ALLOW;
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_DISALLOW;
     field public static final androidx.window.embedding.EmbeddingAspectRatio.Companion Companion;
   }
 
   public static final class EmbeddingAspectRatio.Companion {
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -82,6 +83,82 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public int getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final int animationBackgroundColor;
+    property public final androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes.SplitType splitType;
+    field public static final androidx.window.embedding.SplitAttributes.Companion Companion;
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.embedding.SplitAttributes build();
+    method public androidx.window.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int color);
+    method public androidx.window.embedding.SplitAttributes.Builder setLayoutDirection(androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection);
+    method public androidx.window.embedding.SplitAttributes.Builder setSplitType(androidx.window.embedding.SplitAttributes.SplitType type);
+  }
+
+  public static final class SplitAttributes.Companion {
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection BOTTOM_TO_TOP;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LEFT_TO_RIGHT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LOCALE;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection RIGHT_TO_LEFT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection TOP_TO_BOTTOM;
+  }
+
+  public static final class SplitAttributes.LayoutDirection.Companion {
+  }
+
+  public static class SplitAttributes.SplitType {
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+    field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+  }
+
+  public static final class SplitAttributes.SplitType.Companion {
+    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
+    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public float getRatio();
+    property public final float ratio;
+  }
+
+  public final class SplitAttributesCalculatorParams {
+    method public boolean getAreDefaultConstraintsSatisfied();
+    method public androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public androidx.window.layout.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
+    property public final boolean areDefaultConstraintsSatisfied;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
+    property public final android.content.res.Configuration parentConfiguration;
+    property public final androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo;
+    property public final androidx.window.layout.WindowMetrics parentWindowMetrics;
+    property public final String? splitRuleTag;
+  }
+
   public final class SplitController {
     method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
     method public static androidx.window.embedding.SplitController getInstance(android.content.Context context);
@@ -98,10 +175,10 @@
     method public operator boolean contains(android.app.Activity activity);
     method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.embedding.SplitAttributes getSplitAttributes();
     property public final androidx.window.embedding.ActivityStack primaryActivityStack;
     property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
-    property public final float splitRatio;
+    property public final androidx.window.embedding.SplitAttributes splitAttributes;
   }
 
   public final class SplitPairFilter {
@@ -119,35 +196,36 @@
   public final class SplitPairRule extends androidx.window.embedding.SplitRule {
     method public boolean getClearTop();
     method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
-    method public int getFinishPrimaryWithSecondary();
-    method public int getFinishSecondaryWithPrimary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithSecondary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishSecondaryWithPrimary();
     property public final boolean clearTop;
     property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
-    property public final int finishPrimaryWithSecondary;
-    property public final int finishSecondaryWithPrimary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary;
   }
 
   public static final class SplitPairRule.Builder {
     ctor public SplitPairRule.Builder(java.util.Set<androidx.window.embedding.SplitPairFilter> filters);
     method public androidx.window.embedding.SplitPairRule build();
     method public androidx.window.embedding.SplitPairRule.Builder setClearTop(boolean clearTop);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int finishPrimaryWithSecondary);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int finishSecondaryWithPrimary);
-    method public androidx.window.embedding.SplitPairRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setTag(String? tag);
   }
 
   public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
     method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
-    method public int getFinishPrimaryWithPlaceholder();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithPlaceholder();
     method public android.content.Intent getPlaceholderIntent();
     method public boolean isSticky();
     property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
-    property public final int finishPrimaryWithPlaceholder;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder;
     property public final boolean isSticky;
     property public final android.content.Intent placeholderIntent;
   }
@@ -155,33 +233,31 @@
   public static final class SplitPlaceholderRule.Builder {
     ctor public SplitPlaceholderRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent);
     method public androidx.window.embedding.SplitPlaceholderRule build();
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int finishPrimaryWithPlaceholder);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setSticky(boolean isSticky);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setTag(String? tag);
   }
 
   public class SplitRule extends androidx.window.embedding.EmbeddingRule {
-    method public final int getLayoutDirection();
+    method public final androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInLandscape();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInPortrait();
+    method public final int getMinHeightDp();
     method public final int getMinSmallestWidthDp();
     method public final int getMinWidthDp();
-    method public final float getSplitRatio();
-    property public final int layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInLandscape;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInPortrait;
+    property public final int minHeightDp;
     property public final int minSmallestWidthDp;
     property public final int minWidthDp;
-    property public final float splitRatio;
     field public static final androidx.window.embedding.SplitRule.Companion Companion;
-    field public static final int FINISH_ADJACENT = 2; // 0x2
-    field public static final int FINISH_ALWAYS = 1; // 0x1
-    field public static final int FINISH_NEVER = 0; // 0x0
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT;
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT;
     field public static final int SPLIT_MIN_DIMENSION_ALWAYS_ALLOW = 0; // 0x0
@@ -191,6 +267,16 @@
   public static final class SplitRule.Companion {
   }
 
+  public static final class SplitRule.FinishBehavior {
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ADJACENT;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ALWAYS;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior.Companion Companion;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior NEVER;
+  }
+
+  public static final class SplitRule.FinishBehavior.Companion {
+  }
+
 }
 
 package androidx.window.layout {
@@ -240,6 +326,7 @@
 
   public interface WindowInfoTracker {
     method public default static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
+    method public default kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(@UiContext android.content.Context context);
     method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
     field public static final androidx.window.layout.WindowInfoTracker.Companion Companion;
   }
@@ -260,7 +347,9 @@
 
   public interface WindowMetricsCalculator {
     method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(@UiContext android.content.Context context);
     method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(@UiContext android.content.Context context);
     method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
     field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
   }
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index da9c818..986a2d0 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -4,6 +4,7 @@
   public final class WindowProperties {
     field public static final androidx.window.WindowProperties INSTANCE;
     field public static final String PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE = "android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE";
+    field public static final String PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED = "android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED";
   }
 
 }
@@ -48,29 +49,29 @@
     ctor public ActivityRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters);
     method public androidx.window.embedding.ActivityRule build();
     method public androidx.window.embedding.ActivityRule.Builder setAlwaysExpand(boolean alwaysExpand);
+    method public androidx.window.embedding.ActivityRule.Builder setTag(String tag);
   }
 
   public final class ActivityStack {
-    ctor public ActivityStack(java.util.List<? extends android.app.Activity> activitiesInProcess, optional boolean isEmpty);
     method public operator boolean contains(android.app.Activity activity);
     method public boolean isEmpty();
     property public final boolean isEmpty;
   }
 
   public final class EmbeddingAspectRatio {
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public static androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_ALLOW;
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_DISALLOW;
     field public static final androidx.window.embedding.EmbeddingAspectRatio.Companion Companion;
   }
 
   public static final class EmbeddingAspectRatio.Companion {
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -89,11 +90,90 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public int getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final int animationBackgroundColor;
+    property public final androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes.SplitType splitType;
+    field public static final androidx.window.embedding.SplitAttributes.Companion Companion;
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.embedding.SplitAttributes build();
+    method public androidx.window.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int color);
+    method public androidx.window.embedding.SplitAttributes.Builder setLayoutDirection(androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection);
+    method public androidx.window.embedding.SplitAttributes.Builder setSplitType(androidx.window.embedding.SplitAttributes.SplitType type);
+  }
+
+  public static final class SplitAttributes.Companion {
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection BOTTOM_TO_TOP;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LEFT_TO_RIGHT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LOCALE;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection RIGHT_TO_LEFT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection TOP_TO_BOTTOM;
+  }
+
+  public static final class SplitAttributes.LayoutDirection.Companion {
+  }
+
+  public static class SplitAttributes.SplitType {
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+    field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+  }
+
+  public static final class SplitAttributes.SplitType.Companion {
+    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
+    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public float getRatio();
+    property public final float ratio;
+  }
+
+  public final class SplitAttributesCalculatorParams {
+    method public boolean getAreDefaultConstraintsSatisfied();
+    method public androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public androidx.window.layout.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
+    property public final boolean areDefaultConstraintsSatisfied;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
+    property public final android.content.res.Configuration parentConfiguration;
+    property public final androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo;
+    property public final androidx.window.layout.WindowMetrics parentWindowMetrics;
+    property public final String? splitRuleTag;
+  }
+
   public final class SplitController {
     method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+    method @androidx.window.core.ExperimentalWindowApi public void clearSplitAttributesCalculator();
     method public static androidx.window.embedding.SplitController getInstance(android.content.Context context);
+    method @androidx.window.core.ExperimentalWindowApi public boolean isSplitAttributesCalculatorSupported();
     method public boolean isSplitSupported();
     method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+    method @androidx.window.core.ExperimentalWindowApi public void setSplitAttributesCalculator(kotlin.jvm.functions.Function1<? super androidx.window.embedding.SplitAttributesCalculatorParams,androidx.window.embedding.SplitAttributes> calculator);
     field public static final androidx.window.embedding.SplitController.Companion Companion;
   }
 
@@ -105,10 +185,10 @@
     method public operator boolean contains(android.app.Activity activity);
     method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.embedding.SplitAttributes getSplitAttributes();
     property public final androidx.window.embedding.ActivityStack primaryActivityStack;
     property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
-    property public final float splitRatio;
+    property public final androidx.window.embedding.SplitAttributes splitAttributes;
   }
 
   public final class SplitPairFilter {
@@ -126,35 +206,36 @@
   public final class SplitPairRule extends androidx.window.embedding.SplitRule {
     method public boolean getClearTop();
     method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
-    method public int getFinishPrimaryWithSecondary();
-    method public int getFinishSecondaryWithPrimary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithSecondary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishSecondaryWithPrimary();
     property public final boolean clearTop;
     property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
-    property public final int finishPrimaryWithSecondary;
-    property public final int finishSecondaryWithPrimary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary;
   }
 
   public static final class SplitPairRule.Builder {
     ctor public SplitPairRule.Builder(java.util.Set<androidx.window.embedding.SplitPairFilter> filters);
     method public androidx.window.embedding.SplitPairRule build();
     method public androidx.window.embedding.SplitPairRule.Builder setClearTop(boolean clearTop);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int finishPrimaryWithSecondary);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int finishSecondaryWithPrimary);
-    method public androidx.window.embedding.SplitPairRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setTag(String? tag);
   }
 
   public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
     method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
-    method public int getFinishPrimaryWithPlaceholder();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithPlaceholder();
     method public android.content.Intent getPlaceholderIntent();
     method public boolean isSticky();
     property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
-    property public final int finishPrimaryWithPlaceholder;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder;
     property public final boolean isSticky;
     property public final android.content.Intent placeholderIntent;
   }
@@ -162,33 +243,31 @@
   public static final class SplitPlaceholderRule.Builder {
     ctor public SplitPlaceholderRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent);
     method public androidx.window.embedding.SplitPlaceholderRule build();
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int finishPrimaryWithPlaceholder);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setSticky(boolean isSticky);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setTag(String? tag);
   }
 
   public class SplitRule extends androidx.window.embedding.EmbeddingRule {
-    method public final int getLayoutDirection();
+    method public final androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInLandscape();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInPortrait();
+    method public final int getMinHeightDp();
     method public final int getMinSmallestWidthDp();
     method public final int getMinWidthDp();
-    method public final float getSplitRatio();
-    property public final int layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInLandscape;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInPortrait;
+    property public final int minHeightDp;
     property public final int minSmallestWidthDp;
     property public final int minWidthDp;
-    property public final float splitRatio;
     field public static final androidx.window.embedding.SplitRule.Companion Companion;
-    field public static final int FINISH_ADJACENT = 2; // 0x2
-    field public static final int FINISH_ALWAYS = 1; // 0x1
-    field public static final int FINISH_NEVER = 0; // 0x0
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT;
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT;
     field public static final int SPLIT_MIN_DIMENSION_ALWAYS_ALLOW = 0; // 0x0
@@ -198,6 +277,16 @@
   public static final class SplitRule.Companion {
   }
 
+  public static final class SplitRule.FinishBehavior {
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ADJACENT;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ALWAYS;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior.Companion Companion;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior NEVER;
+  }
+
+  public static final class SplitRule.FinishBehavior.Companion {
+  }
+
 }
 
 package androidx.window.layout {
@@ -247,6 +336,7 @@
 
   public interface WindowInfoTracker {
     method public default static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
+    method public default kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(@UiContext android.content.Context context);
     method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
     field public static final androidx.window.layout.WindowInfoTracker.Companion Companion;
   }
@@ -268,7 +358,9 @@
 
   public interface WindowMetricsCalculator {
     method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(@UiContext android.content.Context context);
     method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(@UiContext android.content.Context context);
     method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
     field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
   }
diff --git a/window/window/api/res-current.txt b/window/window/api/res-current.txt
index e69de29..185352b 100644
--- a/window/window/api/res-current.txt
+++ b/window/window/api/res-current.txt
@@ -0,0 +1,21 @@
+attr activityAction
+attr activityName
+attr alwaysExpand
+attr animationBackgroundColor
+attr clearTop
+attr finishPrimaryWithPlaceholder
+attr finishPrimaryWithSecondary
+attr finishSecondaryWithPrimary
+attr placeholderActivityName
+attr primaryActivityName
+attr secondaryActivityAction
+attr secondaryActivityName
+attr splitLayoutDirection
+attr splitMaxAspectRatioInLandscape
+attr splitMaxAspectRatioInPortrait
+attr splitMinHeightDp
+attr splitMinSmallestWidthDp
+attr splitMinWidthDp
+attr splitRatio
+attr stickyPlaceholder
+attr tag
diff --git a/window/window/api/restricted_current.txt b/window/window/api/restricted_current.txt
index 4c43822..2a716a3 100644
--- a/window/window/api/restricted_current.txt
+++ b/window/window/api/restricted_current.txt
@@ -4,6 +4,7 @@
   public final class WindowProperties {
     field public static final androidx.window.WindowProperties INSTANCE;
     field public static final String PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE = "android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE";
+    field public static final String PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED = "android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED";
   }
 
 }
@@ -41,29 +42,29 @@
     ctor public ActivityRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters);
     method public androidx.window.embedding.ActivityRule build();
     method public androidx.window.embedding.ActivityRule.Builder setAlwaysExpand(boolean alwaysExpand);
+    method public androidx.window.embedding.ActivityRule.Builder setTag(String tag);
   }
 
   public final class ActivityStack {
-    ctor public ActivityStack(java.util.List<? extends android.app.Activity> activitiesInProcess, optional boolean isEmpty);
     method public operator boolean contains(android.app.Activity activity);
     method public boolean isEmpty();
     property public final boolean isEmpty;
   }
 
   public final class EmbeddingAspectRatio {
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public static androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public static androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_ALLOW;
+    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_DISALLOW;
     field public static final androidx.window.embedding.EmbeddingAspectRatio.Companion Companion;
   }
 
   public static final class EmbeddingAspectRatio.Companion {
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysAllow();
-    method public androidx.window.embedding.EmbeddingAspectRatio alwaysDisallow();
     method public androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
   }
 
   public abstract class EmbeddingRule {
+    method public final String? getTag();
+    property public final String? tag;
   }
 
   public final class RuleController {
@@ -82,6 +83,82 @@
     method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
   }
 
+  public final class SplitAttributes {
+    method public int getAnimationBackgroundColor();
+    method public androidx.window.embedding.SplitAttributes.LayoutDirection getLayoutDirection();
+    method public androidx.window.embedding.SplitAttributes.SplitType getSplitType();
+    property public final int animationBackgroundColor;
+    property public final androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes.SplitType splitType;
+    field public static final androidx.window.embedding.SplitAttributes.Companion Companion;
+  }
+
+  public static final class SplitAttributes.Builder {
+    ctor public SplitAttributes.Builder();
+    method public androidx.window.embedding.SplitAttributes build();
+    method public androidx.window.embedding.SplitAttributes.Builder setAnimationBackgroundColor(@ColorInt int color);
+    method public androidx.window.embedding.SplitAttributes.Builder setLayoutDirection(androidx.window.embedding.SplitAttributes.LayoutDirection layoutDirection);
+    method public androidx.window.embedding.SplitAttributes.Builder setSplitType(androidx.window.embedding.SplitAttributes.SplitType type);
+  }
+
+  public static final class SplitAttributes.Companion {
+  }
+
+  public static final class SplitAttributes.LayoutDirection {
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection BOTTOM_TO_TOP;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LEFT_TO_RIGHT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection LOCALE;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection RIGHT_TO_LEFT;
+    field public static final androidx.window.embedding.SplitAttributes.LayoutDirection TOP_TO_BOTTOM;
+  }
+
+  public static final class SplitAttributes.LayoutDirection.Companion {
+  }
+
+  public static class SplitAttributes.SplitType {
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+    field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+  }
+
+  public static final class SplitAttributes.SplitType.Companion {
+    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
+    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
+    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  }
+
+  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+  }
+
+  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
+    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
+  }
+
+  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
+    method public float getRatio();
+    property public final float ratio;
+  }
+
+  public final class SplitAttributesCalculatorParams {
+    method public boolean getAreDefaultConstraintsSatisfied();
+    method public androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
+    method public android.content.res.Configuration getParentConfiguration();
+    method public androidx.window.layout.WindowLayoutInfo getParentWindowLayoutInfo();
+    method public androidx.window.layout.WindowMetrics getParentWindowMetrics();
+    method public String? getSplitRuleTag();
+    property public final boolean areDefaultConstraintsSatisfied;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
+    property public final android.content.res.Configuration parentConfiguration;
+    property public final androidx.window.layout.WindowLayoutInfo parentWindowLayoutInfo;
+    property public final androidx.window.layout.WindowMetrics parentWindowMetrics;
+    property public final String? splitRuleTag;
+  }
+
   public final class SplitController {
     method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
     method public static androidx.window.embedding.SplitController getInstance(android.content.Context context);
@@ -98,10 +175,10 @@
     method public operator boolean contains(android.app.Activity activity);
     method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
     method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
-    method public float getSplitRatio();
+    method public androidx.window.embedding.SplitAttributes getSplitAttributes();
     property public final androidx.window.embedding.ActivityStack primaryActivityStack;
     property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
-    property public final float splitRatio;
+    property public final androidx.window.embedding.SplitAttributes splitAttributes;
   }
 
   public final class SplitPairFilter {
@@ -119,35 +196,36 @@
   public final class SplitPairRule extends androidx.window.embedding.SplitRule {
     method public boolean getClearTop();
     method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
-    method public int getFinishPrimaryWithSecondary();
-    method public int getFinishSecondaryWithPrimary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithSecondary();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishSecondaryWithPrimary();
     property public final boolean clearTop;
     property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
-    property public final int finishPrimaryWithSecondary;
-    property public final int finishSecondaryWithPrimary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary;
   }
 
   public static final class SplitPairRule.Builder {
     ctor public SplitPairRule.Builder(java.util.Set<androidx.window.embedding.SplitPairFilter> filters);
     method public androidx.window.embedding.SplitPairRule build();
     method public androidx.window.embedding.SplitPairRule.Builder setClearTop(boolean clearTop);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int finishPrimaryWithSecondary);
-    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int finishSecondaryWithPrimary);
-    method public androidx.window.embedding.SplitPairRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPairRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithSecondary);
+    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(androidx.window.embedding.SplitRule.FinishBehavior finishSecondaryWithPrimary);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPairRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
+    method public androidx.window.embedding.SplitPairRule.Builder setTag(String? tag);
   }
 
   public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
     method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
-    method public int getFinishPrimaryWithPlaceholder();
+    method public androidx.window.embedding.SplitRule.FinishBehavior getFinishPrimaryWithPlaceholder();
     method public android.content.Intent getPlaceholderIntent();
     method public boolean isSticky();
     property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
-    property public final int finishPrimaryWithPlaceholder;
+    property public final androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder;
     property public final boolean isSticky;
     property public final android.content.Intent placeholderIntent;
   }
@@ -155,33 +233,31 @@
   public static final class SplitPlaceholderRule.Builder {
     ctor public SplitPlaceholderRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent);
     method public androidx.window.embedding.SplitPlaceholderRule build();
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int finishPrimaryWithPlaceholder);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int layoutDirection);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setDefaultSplitAttributes(androidx.window.embedding.SplitAttributes defaultSplitAttributes);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(androidx.window.embedding.SplitRule.FinishBehavior finishPrimaryWithPlaceholder);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinHeightDp(@IntRange(from=0L) int minHeightDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
-    method public androidx.window.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
     method public androidx.window.embedding.SplitPlaceholderRule.Builder setSticky(boolean isSticky);
+    method public androidx.window.embedding.SplitPlaceholderRule.Builder setTag(String? tag);
   }
 
   public class SplitRule extends androidx.window.embedding.EmbeddingRule {
-    method public final int getLayoutDirection();
+    method public final androidx.window.embedding.SplitAttributes getDefaultSplitAttributes();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInLandscape();
     method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInPortrait();
+    method public final int getMinHeightDp();
     method public final int getMinSmallestWidthDp();
     method public final int getMinWidthDp();
-    method public final float getSplitRatio();
-    property public final int layoutDirection;
+    property public final androidx.window.embedding.SplitAttributes defaultSplitAttributes;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInLandscape;
     property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInPortrait;
+    property public final int minHeightDp;
     property public final int minSmallestWidthDp;
     property public final int minWidthDp;
-    property public final float splitRatio;
     field public static final androidx.window.embedding.SplitRule.Companion Companion;
-    field public static final int FINISH_ADJACENT = 2; // 0x2
-    field public static final int FINISH_ALWAYS = 1; // 0x1
-    field public static final int FINISH_NEVER = 0; // 0x0
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT;
     field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT;
     field public static final int SPLIT_MIN_DIMENSION_ALWAYS_ALLOW = 0; // 0x0
@@ -191,6 +267,16 @@
   public static final class SplitRule.Companion {
   }
 
+  public static final class SplitRule.FinishBehavior {
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ADJACENT;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior ALWAYS;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior.Companion Companion;
+    field public static final androidx.window.embedding.SplitRule.FinishBehavior NEVER;
+  }
+
+  public static final class SplitRule.FinishBehavior.Companion {
+  }
+
 }
 
 package androidx.window.layout {
@@ -240,6 +326,7 @@
 
   public interface WindowInfoTracker {
     method public default static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
+    method public default kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(@UiContext android.content.Context context);
     method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
     field public static final androidx.window.layout.WindowInfoTracker.Companion Companion;
   }
@@ -260,7 +347,9 @@
 
   public interface WindowMetricsCalculator {
     method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(@UiContext android.content.Context context);
     method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(@UiContext android.content.Context context);
     method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
     field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
   }
diff --git a/window/window/build.gradle b/window/window/build.gradle
index 5236d42..cdbbf0f 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -45,12 +45,13 @@
 dependencies {
     api(libs.kotlinStdlib)
     api(libs.kotlinCoroutinesAndroid)
-    implementation("androidx.annotation:annotation:1.2.0")
+    implementation("androidx.annotation:annotation:1.3.0")
     implementation("androidx.collection:collection:1.1.0")
     implementation("androidx.core:core:1.8.0")
+    implementation("androidx.window.extensions.core:core:1.0.0-alpha01")
 
     compileOnly(project(":window:sidecar:sidecar"))
-    compileOnly("androidx.window.extensions:extensions:1.1.0-alpha02")
+    compileOnly(project(":window:extensions:extensions"))
 
     testImplementation(libs.testCore)
     testImplementation(libs.testRunner)
@@ -61,7 +62,8 @@
     testImplementation(libs.mockitoKotlin4)
     testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(compileOnly(project(":window:sidecar:sidecar")))
-    testImplementation(compileOnly("androidx.window.extensions:extensions:1.1.0-alpha02"))
+    testImplementation(compileOnly(project(":window:extensions:extensions")))
+    testImplementation(implementation("androidx.window.extensions.core:core:1.0.0-alpha01"))
 
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.kotlinTestJunit)
@@ -75,8 +77,9 @@
     androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.junit) // Needed for Assert.assertThrows
+    androidTestImplementation(compileOnly(project(":window:extensions:extensions")))
     androidTestImplementation(compileOnly(project(":window:sidecar:sidecar")))
-    androidTestImplementation(compileOnly("androidx.window.extensions:extensions:1.1.0-alpha02"))
+    androidTestImplementation(implementation("androidx.window.extensions.core:core:1.0.0-alpha01"))
     samples(project(":window:window-samples"))
 }
 
diff --git a/window/window/samples/build.gradle b/window/window/samples/build.gradle
new file mode 100644
index 0000000..a391e0a
--- /dev/null
+++ b/window/window/samples/build.gradle
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+    api(project(":window:window"))
+
+    compileOnly(project(":annotation:annotation-sampled"))
+}
+
+android {
+    namespace "androidx.window.samples"
+}
+
+androidx {
+    name = "Jetpack WindowManager Library Samples"
+    type = LibraryType.SAMPLES
+    inceptionYear = "2022"
+    description = "Code samples for WindowManager Jetpack library."
+}
diff --git a/window/window/samples/src/main/java/androidx/window/samples/embedding/SplitAttributesCalculatorSamples.kt b/window/window/samples/src/main/java/androidx/window/samples/embedding/SplitAttributesCalculatorSamples.kt
new file mode 100644
index 0000000..916701e
--- /dev/null
+++ b/window/window/samples/src/main/java/androidx/window/samples/embedding/SplitAttributesCalculatorSamples.kt
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.samples.embedding
+
+import android.app.Application
+import android.graphics.Color
+import androidx.annotation.Sampled
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitController
+import androidx.window.layout.FoldingFeature
+
+@OptIn(ExperimentalWindowApi::class)
+@Sampled
+fun splitAttributesCalculatorSample() {
+    SplitController.getInstance(context)
+        .setSplitAttributesCalculator { params ->
+            val tag = params.splitRuleTag
+            val parentWindowMetrics = params.parentWindowMetrics
+            val parentConfig = params.parentConfiguration
+            val foldingFeatures = params.parentWindowLayoutInfo.displayFeatures
+                .filterIsInstance<FoldingFeature>()
+            val foldingState = if (foldingFeatures.size == 1) foldingFeatures[0] else null
+            // Tag can be used to filter the SplitRule to apply the SplitAttributes
+            if (TAG_SPLIT_RULE_MAIN != tag && params.areDefaultConstraintsSatisfied) {
+                return@setSplitAttributesCalculator params.defaultSplitAttributes
+            }
+
+            // This sample will make the app show a layout to
+            // - split the task bounds vertically if the device is in landscape
+            // - fill the task bounds if the device is in portrait and its folding state does not
+            //   split the screen
+            // - split the task bounds horizontally in tabletop mode
+            val bounds = parentWindowMetrics.bounds
+            if (foldingState?.isSeparating == true) {
+                // Split the parent container that followed by the hinge if the hinge separates the
+                // parent window.
+                return@setSplitAttributesCalculator SplitAttributes.Builder()
+                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setLayoutDirection(
+                        if (foldingState.orientation == FoldingFeature.Orientation.HORIZONTAL) {
+                            SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+                        } else {
+                            SplitAttributes.LayoutDirection.LOCALE
+                        }
+                    )
+                    // Set the color to use when switching between vertical and horizontal
+                    .setAnimationBackgroundColor(Color.GRAY)
+                    .build()
+            }
+            return@setSplitAttributesCalculator if (
+                parentConfig.screenWidthDp >= 600 && bounds.width() >= bounds.height()
+            ) {
+                // Split the parent container equally and vertically if the device is in landscape.
+                SplitAttributes.Builder()
+                    .setSplitType(SplitAttributes.SplitType.splitEqually())
+                    .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                    .setAnimationBackgroundColor(Color.GRAY)
+                    .build()
+            } else {
+                // Expand containers if the device is in portrait or the width is less than 600 dp.
+                SplitAttributes.Builder()
+                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .build()
+            }
+        }
+}
+
+@OptIn(ExperimentalWindowApi::class)
+@Sampled
+fun splitWithOrientations() {
+    SplitController.getInstance(context)
+        .setSplitAttributesCalculator { params ->
+            // A sample to split with the dimension that larger than 600 DP. If there's no dimension
+            // larger than 600 DP, show the presentation to fill the task bounds.
+            val parentConfiguration = params.parentConfiguration
+            val builder = SplitAttributes.Builder()
+            return@setSplitAttributesCalculator if (parentConfiguration.screenWidthDp >= 600) {
+                builder
+                    .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                    // Set the color to use when switching between vertical and horizontal
+                    .setAnimationBackgroundColor(Color.GRAY)
+                    .build()
+            } else if (parentConfiguration.screenHeightDp >= 600) {
+                builder
+                    .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
+                    // Set the color to use when switching between vertical and horizontal
+                    .setAnimationBackgroundColor(Color.GRAY)
+                    .build()
+            } else {
+                // Fallback to expand the secondary container
+                builder
+                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .build()
+            }
+        }
+}
+
+@OptIn(ExperimentalWindowApi::class)
+@Sampled
+fun expandContainersInPortrait() {
+    SplitController.getInstance(context)
+        .setSplitAttributesCalculator { params ->
+            // A sample to always fill task bounds when the device is in portrait.
+            val tag = params.splitRuleTag
+            val bounds = params.parentWindowMetrics.bounds
+            val defaultSplitAttributes = params.defaultSplitAttributes
+            val areDefaultConstraintsSatisfied = params.areDefaultConstraintsSatisfied
+
+            val expandContainersAttrs = SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .build()
+            if (!areDefaultConstraintsSatisfied) {
+                return@setSplitAttributesCalculator expandContainersAttrs
+            }
+            // Always expand containers for the splitRule tagged as
+            // TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT if the device is in portrait
+            // even if [areDefaultConstraintsSatisfied] reports true.
+            if (bounds.height() > bounds.width() && TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT.equals(tag)) {
+                return@setSplitAttributesCalculator expandContainersAttrs
+            }
+            // Otherwise, use the default splitAttributes.
+            return@setSplitAttributesCalculator defaultSplitAttributes
+        }
+}
+
+/** Assume it's a valid [Application]... */
+val context = Application()
+const val TAG_SPLIT_RULE_MAIN = "main"
+const val TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT = "expand_in_portrait"
\ No newline at end of file
diff --git a/window/window/src/androidTest/AndroidManifest.xml b/window/window/src/androidTest/AndroidManifest.xml
index d543136..cd1d81e 100644
--- a/window/window/src/androidTest/AndroidManifest.xml
+++ b/window/window/src/androidTest/AndroidManifest.xml
@@ -25,5 +25,8 @@
         <property
             android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE"
             android:value="true" />
+        <property
+            android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED"
+            android:value="true" />
     </application>
 </manifest>
diff --git a/window/window/src/androidTest/java/androidx/window/WindowPropertiesTest.kt b/window/window/src/androidTest/java/androidx/window/WindowPropertiesTest.kt
index b1c97d0..34eb50f 100644
--- a/window/window/src/androidTest/java/androidx/window/WindowPropertiesTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/WindowPropertiesTest.kt
@@ -49,6 +49,24 @@
         }
     }
 
+    @Test
+    fun test_property_activity_embedding_splits() {
+        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+            // No-op, but to suppress lint
+            return
+        }
+        activityRule.scenario.onActivity { activity ->
+            // Should be true as defined in AndroidManifest.xml
+            assertTrue(
+                getProperty(
+                    activity,
+                    WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED
+                )
+            )
+        }
+    }
+
     @RequiresApi(Build.VERSION_CODES.S)
     @Throws(PackageManager.NameNotFoundException::class)
     private fun getProperty(context: Context, propertyName: String): Boolean {
diff --git a/window/window/src/androidTest/java/androidx/window/WindowTestUtils.kt b/window/window/src/androidTest/java/androidx/window/WindowTestUtils.kt
new file mode 100644
index 0000000..d9ae80b
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowTestUtils.kt
@@ -0,0 +1,42 @@
+package androidx.window
+
+import android.app.Application
+import android.content.Context
+import android.hardware.display.DisplayManager
+import android.os.Build
+import android.view.Display
+import android.view.WindowManager
+import androidx.annotation.RequiresApi
+import androidx.test.core.app.ApplicationProvider
+import androidx.window.core.ExtensionsUtil
+import org.junit.Assume.assumeTrue
+
+open class WindowTestUtils {
+    companion object {
+
+        @RequiresApi(Build.VERSION_CODES.R)
+        fun createOverlayWindowContext(): Context {
+            val context = ApplicationProvider.getApplicationContext<Application>()
+            return context.createDisplayContext(
+                context.getSystemService(DisplayManager::class.java)
+                    .getDisplay(Display.DEFAULT_DISPLAY)
+            ).createWindowContext(
+                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
+                /* options= */ null
+            )
+        }
+
+        @OptIn(androidx.window.core.ExperimentalWindowApi::class)
+        fun assumeAtLeastVendorApiLevel(min: Int) {
+            val apiLevel = ExtensionsUtil.safeVendorApiLevel
+            assumeTrue(apiLevel >= min)
+        }
+
+        @OptIn(androidx.window.core.ExperimentalWindowApi::class)
+        fun assumeBeforeVendorApiLevel(max: Int) {
+            val apiLevel = ExtensionsUtil.safeVendorApiLevel
+            assumeTrue(apiLevel < max)
+            assumeTrue(apiLevel > 0)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
new file mode 100644
index 0000000..32e974e
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.embedding
+
+import androidx.window.extensions.embedding.ActivityStack as OEMActivityStack
+import androidx.window.extensions.embedding.SplitAttributes as OEMSplitAttributes
+import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
+import android.graphics.Color
+import androidx.window.WindowTestUtils
+import androidx.window.core.PredicateAdapter
+import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.extensions.WindowExtensions
+import androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.ExpandContainersSplitType
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.HingeSplitType
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+
+/** Tests for [EmbeddingAdapter] */
+class EmbeddingAdapterTest {
+    private lateinit var adapter: EmbeddingAdapter
+
+    @Before
+    fun setUp() {
+        adapter = EmbeddingBackend::class.java.classLoader?.let { loader ->
+            EmbeddingAdapter(PredicateAdapter(loader))
+        }!!
+    }
+
+    @Test
+    fun testTranslateSplitInfoWithDefaultAttrs() {
+        WindowTestUtils.assumeAtLeastVendorApiLevel(WindowExtensions.VENDOR_API_LEVEL_2)
+
+        val mockPrimaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSecondaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSplitAttributes = mock<OEMSplitAttributes>().apply {
+            whenever(splitType).thenReturn(RatioSplitType.splitEqually())
+        }
+        val oemSplitInfo = mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(mockPrimaryActivityStack)
+            whenever(secondaryActivityStack).thenReturn(mockSecondaryActivityStack)
+            whenever(splitAttributes).thenReturn(mockSplitAttributes)
+        }
+        val expectedSplitInfo = SplitInfo(
+            ActivityStack(ArrayList(), isEmpty = true),
+            ActivityStack(ArrayList(), isEmpty = true),
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.splitEqually())
+                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                .setAnimationBackgroundColor(0)
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+
+    @Test
+    fun testTranslateSplitInfoWithExpandingContainers() {
+        WindowTestUtils.assumeAtLeastVendorApiLevel(WindowExtensions.VENDOR_API_LEVEL_2)
+
+        val mockPrimaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSecondaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSplitAttributes = mock<OEMSplitAttributes>().apply {
+            whenever(splitType).thenReturn(ExpandContainersSplitType())
+        }
+        val oemSplitInfo = mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(mockPrimaryActivityStack)
+            whenever(secondaryActivityStack).thenReturn(mockSecondaryActivityStack)
+            whenever(splitAttributes).thenReturn(mockSplitAttributes)
+        }
+        val expectedSplitInfo = SplitInfo(
+            ActivityStack(ArrayList(), isEmpty = true),
+            ActivityStack(ArrayList(), isEmpty = true),
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.expandContainers())
+                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+
+    @Suppress("DEPRECATION")
+    @Test
+    fun testTranslateSplitInfoWithApiLevel1() {
+        WindowTestUtils.assumeBeforeVendorApiLevel(WindowExtensions.VENDOR_API_LEVEL_2)
+
+        val expectedSplitRatio = 0.3f
+        val mockPrimaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSecondaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val oemSplitInfo = mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(mockPrimaryActivityStack)
+            whenever(secondaryActivityStack).thenReturn(mockSecondaryActivityStack)
+            whenever(splitRatio).thenReturn(expectedSplitRatio)
+        }
+
+        val expectedSplitInfo = SplitInfo(
+            ActivityStack(ArrayList(), isEmpty = true),
+            ActivityStack(ArrayList(), isEmpty = true),
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.ratio(expectedSplitRatio))
+                // OEMSplitInfo with Vendor API level 1 doesn't provide layoutDirection.
+                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+
+    @Test
+    fun testTranslateSplitInfoWithApiLevel2() {
+        WindowTestUtils.assumeAtLeastVendorApiLevel(WindowExtensions.VENDOR_API_LEVEL_2)
+
+        val mockPrimaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSecondaryActivityStack = mock<OEMActivityStack>().apply {
+            whenever(activities).thenReturn(emptyList())
+            whenever(isEmpty).thenReturn(true)
+        }
+        val mockSplitAttributes = mock<OEMSplitAttributes>().apply {
+            whenever(splitType).thenReturn(HingeSplitType(RatioSplitType(0.3f)))
+            whenever(layoutDirection).thenReturn(TOP_TO_BOTTOM)
+            whenever(animationBackgroundColor).thenReturn(Color.YELLOW)
+        }
+        val oemSplitInfo = mock<OEMSplitInfo>().apply {
+            whenever(primaryActivityStack).thenReturn(mockPrimaryActivityStack)
+            whenever(secondaryActivityStack).thenReturn(mockSecondaryActivityStack)
+            whenever(splitAttributes).thenReturn(mockSplitAttributes)
+        }
+        val expectedSplitInfo = SplitInfo(
+            ActivityStack(ArrayList(), isEmpty = true),
+            ActivityStack(ArrayList(), isEmpty = true),
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.splitByHinge(SplitType.ratio(0.3f)))
+                .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
+                .setAnimationBackgroundColor(Color.YELLOW)
+                .build()
+        )
+        assertEquals(listOf(expectedSplitInfo), adapter.translate(listOf(oemSplitInfo)))
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingRuleConstructionTests.kt b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingRuleConstructionTests.kt
index 8203078..62dcd3b 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingRuleConstructionTests.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingRuleConstructionTests.kt
@@ -19,24 +19,34 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.graphics.Color
 import android.graphics.Rect
-import android.util.LayoutDirection
+import android.os.Build
+import androidx.annotation.RequiresApi
 import androidx.test.core.app.ApplicationProvider
-import androidx.window.embedding.EmbeddingAspectRatio.Companion.alwaysAllow
-import androidx.window.embedding.EmbeddingAspectRatio.Companion.alwaysDisallow
+import androidx.window.embedding.EmbeddingAspectRatio.Companion.ALWAYS_ALLOW
+import androidx.window.embedding.EmbeddingAspectRatio.Companion.ALWAYS_DISALLOW
 import androidx.window.embedding.EmbeddingAspectRatio.Companion.ratio
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.BOTTOM_TO_TOP
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
-import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
-import androidx.window.embedding.SplitRule.Companion.FINISH_ADJACENT
-import androidx.window.embedding.SplitRule.Companion.FINISH_ALWAYS
-import androidx.window.embedding.SplitRule.Companion.FINISH_NEVER
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_ALWAYS_ALLOW
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ADJACENT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
 import androidx.window.test.R
+import junit.framework.TestCase.assertNull
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertThrows
 import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
+import org.junit.Before
 import org.junit.Test
 
 /**
@@ -47,7 +57,17 @@
  */
 class EmbeddingRuleConstructionTests {
     private val application = ApplicationProvider.getApplicationContext<Context>()
+    private val ruleController = RuleController.getInstance(application)
     private val density = application.resources.displayMetrics.density
+    private lateinit var validBounds: Rect
+    private lateinit var invalidBounds: Rect
+
+    @Before
+    fun setUp() {
+        validBounds = minValidWindowBounds()
+        invalidBounds = almostValidWindowBounds()
+        ruleController.clearRules()
+    }
 
     /**
      * Verifies that default params are set correctly when reading {@link SplitPairRule} from XML.
@@ -58,17 +78,23 @@
             .parseRules(application, R.xml.test_split_config_default_split_pair_rule)
         assertEquals(1, rules.size)
         val rule: SplitPairRule = rules.first() as SplitPairRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.5f))
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        assertNull(rule.tag)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minWidthDp)
+        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minHeightDp)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minSmallestWidthDp)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT, rule.maxAspectRatioInPortrait)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_NEVER, rule.finishPrimaryWithSecondary)
-        assertEquals(FINISH_ALWAYS, rule.finishSecondaryWithPrimary)
+        assertEquals(NEVER, rule.finishPrimaryWithSecondary)
+        assertEquals(ALWAYS, rule.finishSecondaryWithPrimary)
         assertEquals(false, rule.clearTop)
-        assertEquals(0.5f, rule.splitRatio)
-        assertEquals(LayoutDirection.LOCALE, rule.layoutDirection)
-        assertTrue(rule.checkParentBounds(density, minValidWindowBounds()))
-        assertFalse(rule.checkParentBounds(density, almostValidWindowBounds()))
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertTrue(rule.checkParentBounds(density, validBounds))
+        assertFalse(rule.checkParentBounds(density, invalidBounds))
     }
 
     /**
@@ -81,15 +107,41 @@
             .parseRules(application, R.xml.test_split_config_custom_split_pair_rule)
         assertEquals(1, rules.size)
         val rule: SplitPairRule = rules.first() as SplitPairRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.1f))
+            .setLayoutDirection(RIGHT_TO_LEFT)
+            .build()
+        assertEquals("rule2", rule.tag)
         assertEquals(123, rule.minWidthDp)
-        assertEquals(456, rule.minSmallestWidthDp)
+        assertEquals(456, rule.minHeightDp)
+        assertEquals(789, rule.minSmallestWidthDp)
         assertEquals(1.23f, rule.maxAspectRatioInPortrait.value)
-        assertEquals(alwaysDisallow(), rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ALWAYS, rule.finishPrimaryWithSecondary)
-        assertEquals(FINISH_NEVER, rule.finishSecondaryWithPrimary)
+        assertEquals(ALWAYS_DISALLOW, rule.maxAspectRatioInLandscape)
+        assertEquals(ALWAYS, rule.finishPrimaryWithSecondary)
+        assertEquals(NEVER, rule.finishSecondaryWithPrimary)
         assertEquals(true, rule.clearTop)
-        assertEquals(0.1f, rule.splitRatio)
-        assertEquals(LayoutDirection.RTL, rule.layoutDirection)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+    }
+
+    /** Verifies that horizontal layout are set correctly when reading [SplitPairRule] from XML. */
+    @Test
+    fun testHorizontalLayout_SplitPairRule_Xml() {
+        val rules = RuleController
+            .parseRules(application, R.xml.test_split_config_split_pair_rule_horizontal_layout)
+        assertEquals(1, rules.size)
+        val rule: SplitPairRule = rules.first() as SplitPairRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.3f))
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(Color.BLUE)
+            .build()
+        assertEquals(TEST_TAG, rule.tag)
+        assertEquals(NEVER, rule.finishPrimaryWithSecondary)
+        assertEquals(ALWAYS, rule.finishSecondaryWithPrimary)
+        assertEquals(false, rule.clearTop)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertTrue(rule.checkParentBounds(density, validBounds))
+        assertFalse(rule.checkParentBounds(density, invalidBounds))
     }
 
     /**
@@ -99,17 +151,23 @@
     @Test
     fun testDefaults_SplitPairRule_Builder() {
         val rule = SplitPairRule.Builder(HashSet()).build()
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.5f))
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        assertNull(rule.tag)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minWidthDp)
+        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minHeightDp)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minSmallestWidthDp)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT, rule.maxAspectRatioInPortrait)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_NEVER, rule.finishPrimaryWithSecondary)
-        assertEquals(FINISH_ALWAYS, rule.finishSecondaryWithPrimary)
+        assertEquals(NEVER, rule.finishPrimaryWithSecondary)
+        assertEquals(ALWAYS, rule.finishSecondaryWithPrimary)
         assertEquals(false, rule.clearTop)
-        assertEquals(0.5f, rule.splitRatio)
-        assertEquals(LayoutDirection.LOCALE, rule.layoutDirection)
-        assertTrue(rule.checkParentBounds(density, minValidWindowBounds()))
-        assertFalse(rule.checkParentBounds(density, almostValidWindowBounds()))
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertTrue(rule.checkParentBounds(density, validBounds))
+        assertFalse(rule.checkParentBounds(density, invalidBounds))
     }
 
     /**
@@ -119,6 +177,11 @@
     @Test
     fun test_SplitPairRule_Builder() {
         val filters = HashSet<SplitPairFilter>()
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.3f))
+            .setLayoutDirection(LEFT_TO_RIGHT)
+            .setAnimationBackgroundColor(Color.GREEN)
+            .build()
         filters.add(
             SplitPairFilter(
                 ComponentName("a", "b"),
@@ -128,23 +191,25 @@
         )
         val rule = SplitPairRule.Builder(filters)
             .setMinWidthDp(123)
-            .setMinSmallestWidthDp(456)
+            .setMinHeightDp(456)
+            .setMinSmallestWidthDp(789)
             .setMaxAspectRatioInPortrait(ratio(1.23f))
             .setMaxAspectRatioInLandscape(ratio(4.56f))
-            .setFinishPrimaryWithSecondary(FINISH_ADJACENT)
-            .setFinishSecondaryWithPrimary(FINISH_ADJACENT)
+            .setFinishPrimaryWithSecondary(ADJACENT)
+            .setFinishSecondaryWithPrimary(ADJACENT)
             .setClearTop(true)
-            .setSplitRatio(0.3f)
-            .setLayoutDirection(LayoutDirection.LTR)
+            .setDefaultSplitAttributes(expectedSplitLayout)
+            .setTag(TEST_TAG)
             .build()
-        assertEquals(FINISH_ADJACENT, rule.finishPrimaryWithSecondary)
-        assertEquals(FINISH_ADJACENT, rule.finishSecondaryWithPrimary)
+        assertEquals(ADJACENT, rule.finishPrimaryWithSecondary)
+        assertEquals(ADJACENT, rule.finishSecondaryWithPrimary)
         assertEquals(true, rule.clearTop)
-        assertEquals(0.3f, rule.splitRatio)
-        assertEquals(LayoutDirection.LTR, rule.layoutDirection)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertEquals(TEST_TAG, rule.tag)
         assertEquals(filters, rule.filters)
         assertEquals(123, rule.minWidthDp)
-        assertEquals(456, rule.minSmallestWidthDp)
+        assertEquals(456, rule.minHeightDp)
+        assertEquals(789, rule.minSmallestWidthDp)
         assertEquals(1.23f, rule.maxAspectRatioInPortrait.value)
         assertEquals(4.56f, rule.maxAspectRatioInLandscape.value)
     }
@@ -158,31 +223,26 @@
         assertThrows(IllegalArgumentException::class.java) {
             SplitPairRule.Builder(HashSet())
                 .setMinWidthDp(-1)
-                .setMinSmallestWidthDp(456)
+                .setMinHeightDp(456)
+                .setMinSmallestWidthDp(789)
                 .build()
         }
         assertThrows(IllegalArgumentException::class.java) {
             SplitPairRule.Builder(HashSet())
                 .setMinWidthDp(123)
+                .setMinHeightDp(-1)
+                .setMinSmallestWidthDp(789)
+                .build()
+        }
+        assertThrows(IllegalArgumentException::class.java) {
+            SplitPairRule.Builder(HashSet())
+                .setMinWidthDp(123)
+                .setMinHeightDp(456)
                 .setMinSmallestWidthDp(-1)
                 .build()
         }
         assertThrows(IllegalArgumentException::class.java) {
             SplitPairRule.Builder(HashSet())
-                .setMinWidthDp(123)
-                .setMinSmallestWidthDp(456)
-                .setSplitRatio(-1.0f)
-                .build()
-        }
-        assertThrows(IllegalArgumentException::class.java) {
-            SplitPairRule.Builder(HashSet())
-                .setMinWidthDp(123)
-                .setMinSmallestWidthDp(456)
-                .setSplitRatio(1.1f)
-                .build()
-        }
-        assertThrows(IllegalArgumentException::class.java) {
-            SplitPairRule.Builder(HashSet())
                 .setMaxAspectRatioInPortrait(ratio(-1f))
                 .build()
         }
@@ -202,9 +262,10 @@
         // Always allow split
         var rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
-            .setMaxAspectRatioInPortrait(alwaysAllow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
             .build()
         var width = 100
         var height = 1000
@@ -214,9 +275,10 @@
         // Always disallow split in portrait
         rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
-            .setMaxAspectRatioInPortrait(alwaysDisallow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
+            .setMaxAspectRatioInPortrait(ALWAYS_DISALLOW)
             .build()
         width = 100
         height = 101
@@ -229,8 +291,9 @@
         // Compare the aspect ratio in portrait
         rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ratio(1.1f))
             .build()
         // Equals to the max aspect ratio
@@ -257,9 +320,10 @@
         // Always allow split
         var rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
-            .setMaxAspectRatioInLandscape(alwaysAllow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
             .build()
         var width = 1000
         var height = 100
@@ -269,9 +333,10 @@
         // Always disallow split in landscape
         rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
-            .setMaxAspectRatioInLandscape(alwaysDisallow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
+            .setMaxAspectRatioInLandscape(ALWAYS_DISALLOW)
             .build()
         width = 101
         height = 100
@@ -284,8 +349,9 @@
         // Compare the aspect ratio in landscape
         rule = SplitPairRule.Builder(HashSet())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ratio(1.1f))
             .build()
         // Equals to the max aspect ratio
@@ -313,16 +379,22 @@
             .parseRules(application, R.xml.test_split_config_default_split_placeholder_rule)
         assertEquals(1, rules.size)
         val rule: SplitPlaceholderRule = rules.first() as SplitPlaceholderRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.5f))
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        assertNull(rule.tag)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minWidthDp)
+        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minHeightDp)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minSmallestWidthDp)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT, rule.maxAspectRatioInPortrait)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ALWAYS, rule.finishPrimaryWithPlaceholder)
+        assertEquals(ALWAYS, rule.finishPrimaryWithPlaceholder)
         assertEquals(false, rule.isSticky)
-        assertEquals(0.5f, rule.splitRatio)
-        assertEquals(LayoutDirection.LOCALE, rule.layoutDirection)
-        assertTrue(rule.checkParentBounds(density, minValidWindowBounds()))
-        assertFalse(rule.checkParentBounds(density, almostValidWindowBounds()))
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertTrue(rule.checkParentBounds(density, validBounds))
+        assertFalse(rule.checkParentBounds(density, invalidBounds))
     }
 
     /**
@@ -335,14 +407,44 @@
             .parseRules(application, R.xml.test_split_config_custom_split_placeholder_rule)
         assertEquals(1, rules.size)
         val rule: SplitPlaceholderRule = rules.first() as SplitPlaceholderRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.1f))
+            .setLayoutDirection(RIGHT_TO_LEFT)
+            .build()
+        assertEquals("rule3", rule.tag)
         assertEquals(123, rule.minWidthDp)
-        assertEquals(456, rule.minSmallestWidthDp)
+        assertEquals(456, rule.minHeightDp)
+        assertEquals(789, rule.minSmallestWidthDp)
         assertEquals(1.23f, rule.maxAspectRatioInPortrait.value)
-        assertEquals(alwaysDisallow(), rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ADJACENT, rule.finishPrimaryWithPlaceholder)
+        assertEquals(ALWAYS_DISALLOW, rule.maxAspectRatioInLandscape)
+        assertEquals(ADJACENT, rule.finishPrimaryWithPlaceholder)
         assertEquals(true, rule.isSticky)
-        assertEquals(0.1f, rule.splitRatio)
-        assertEquals(LayoutDirection.RTL, rule.layoutDirection)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+    }
+
+    /**
+     * Verifies that horizontal layout are set correctly when reading [SplitPlaceholderRule]
+     * from XML.
+     */
+    @RequiresApi(Build.VERSION_CODES.M)
+    @Test
+    fun testHorizontalLayout_SplitPlaceholderRule_Xml() {
+        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+        val rules = RuleController
+            .parseRules(application, R.xml.test_split_config_split_placeholder_horizontal_layout)
+        assertEquals(1, rules.size)
+        val rule: SplitPlaceholderRule = rules.first() as SplitPlaceholderRule
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.3f))
+            .setLayoutDirection(BOTTOM_TO_TOP)
+            .setAnimationBackgroundColor(application.resources.getColor(R.color.testColor, null))
+            .build()
+        assertEquals(TEST_TAG, rule.tag)
+        assertEquals(ALWAYS, rule.finishPrimaryWithPlaceholder)
+        assertEquals(false, rule.isSticky)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
+        assertTrue(rule.checkParentBounds(density, validBounds))
+        assertFalse(rule.checkParentBounds(density, invalidBounds))
     }
 
     /**
@@ -352,14 +454,20 @@
     @Test
     fun testDefaults_SplitPlaceholderRule_Builder() {
         val rule = SplitPlaceholderRule.Builder(HashSet(), Intent()).build()
+        assertNull(rule.tag)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minWidthDp)
+        assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minHeightDp)
         assertEquals(SPLIT_MIN_DIMENSION_DP_DEFAULT, rule.minSmallestWidthDp)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT, rule.maxAspectRatioInPortrait)
         assertEquals(SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT, rule.maxAspectRatioInLandscape)
-        assertEquals(FINISH_ALWAYS, rule.finishPrimaryWithPlaceholder)
+        assertEquals(ALWAYS, rule.finishPrimaryWithPlaceholder)
         assertEquals(false, rule.isSticky)
-        assertEquals(0.5f, rule.splitRatio)
-        assertEquals(LayoutDirection.LOCALE, rule.layoutDirection)
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.5f))
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
         assertTrue(rule.checkParentBounds(density, minValidWindowBounds()))
         assertFalse(rule.checkParentBounds(density, almostValidWindowBounds()))
     }
@@ -378,24 +486,31 @@
             )
         )
         val intent = Intent("ACTION")
+        val expectedSplitLayout = SplitAttributes.Builder()
+            .setSplitType(SplitAttributes.SplitType.ratio(0.3f))
+            .setLayoutDirection(LEFT_TO_RIGHT)
+            .setAnimationBackgroundColor(Color.GREEN)
+            .build()
         val rule = SplitPlaceholderRule.Builder(filters, intent)
             .setMinWidthDp(123)
-            .setMinSmallestWidthDp(456)
+            .setMinHeightDp(456)
+            .setMinSmallestWidthDp(789)
             .setMaxAspectRatioInPortrait(ratio(1.23f))
             .setMaxAspectRatioInLandscape(ratio(4.56f))
-            .setFinishPrimaryWithPlaceholder(FINISH_ADJACENT)
+            .setFinishPrimaryWithPlaceholder(ADJACENT)
             .setSticky(true)
-            .setSplitRatio(0.3f)
-            .setLayoutDirection(LayoutDirection.LTR)
+            .setDefaultSplitAttributes(expectedSplitLayout)
+            .setTag(TEST_TAG)
             .build()
-        assertEquals(FINISH_ADJACENT, rule.finishPrimaryWithPlaceholder)
+        assertEquals(ADJACENT, rule.finishPrimaryWithPlaceholder)
         assertEquals(true, rule.isSticky)
-        assertEquals(0.3f, rule.splitRatio)
-        assertEquals(LayoutDirection.LTR, rule.layoutDirection)
+        assertEquals(expectedSplitLayout, rule.defaultSplitAttributes)
         assertEquals(filters, rule.filters)
         assertEquals(intent, rule.placeholderIntent)
         assertEquals(123, rule.minWidthDp)
-        assertEquals(456, rule.minSmallestWidthDp)
+        assertEquals(456, rule.minHeightDp)
+        assertEquals(789, rule.minSmallestWidthDp)
+        assertEquals(TEST_TAG, rule.tag)
         assertEquals(1.23f, rule.maxAspectRatioInPortrait.value)
         assertEquals(4.56f, rule.maxAspectRatioInLandscape.value)
     }
@@ -409,34 +524,30 @@
         assertThrows(IllegalArgumentException::class.java) {
             SplitPlaceholderRule.Builder(HashSet(), Intent())
                 .setMinWidthDp(-1)
-                .setMinSmallestWidthDp(456)
+                .setMinHeightDp(456)
+                .setMinSmallestWidthDp(789)
                 .build()
         }
         assertThrows(IllegalArgumentException::class.java) {
             SplitPlaceholderRule.Builder(HashSet(), Intent())
                 .setMinWidthDp(123)
+                .setMinHeightDp(-1)
+                .setMinSmallestWidthDp(789)
+                .build()
+        }
+        assertThrows(IllegalArgumentException::class.java) {
+            SplitPlaceholderRule.Builder(HashSet(), Intent())
+                .setMinWidthDp(123)
+                .setMinHeightDp(456)
                 .setMinSmallestWidthDp(-1)
                 .build()
         }
         assertThrows(IllegalArgumentException::class.java) {
             SplitPlaceholderRule.Builder(HashSet(), Intent())
                 .setMinWidthDp(123)
-                .setMinSmallestWidthDp(456)
-                .setFinishPrimaryWithPlaceholder(FINISH_NEVER)
-                .build()
-        }
-        assertThrows(IllegalArgumentException::class.java) {
-            SplitPlaceholderRule.Builder(HashSet(), Intent())
-                .setMinWidthDp(123)
-                .setMinSmallestWidthDp(456)
-                .setSplitRatio(-1.0f)
-                .build()
-        }
-        assertThrows(IllegalArgumentException::class.java) {
-            SplitPlaceholderRule.Builder(HashSet(), Intent())
-                .setMinWidthDp(123)
-                .setMinSmallestWidthDp(456)
-                .setSplitRatio(1.1f)
+                .setMinHeightDp(456)
+                .setMinSmallestWidthDp(789)
+                .setFinishPrimaryWithPlaceholder(NEVER)
                 .build()
         }
         assertThrows(IllegalArgumentException::class.java) {
@@ -460,9 +571,10 @@
         // Always allow split
         var rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
-            .setMaxAspectRatioInPortrait(alwaysAllow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
             .build()
         var width = 100
         var height = 1000
@@ -472,9 +584,10 @@
         // Always disallow split in portrait
         rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
-            .setMaxAspectRatioInPortrait(alwaysDisallow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
+            .setMaxAspectRatioInPortrait(ALWAYS_DISALLOW)
             .build()
         width = 100
         height = 101
@@ -487,8 +600,9 @@
         // Compare the aspect ratio in portrait
         rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInLandscape(alwaysAllow())
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
             .setMaxAspectRatioInPortrait(ratio(1.1f))
             .build()
         // Equals to the max aspect ratio
@@ -515,9 +629,10 @@
         // Always allow split
         var rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
-            .setMaxAspectRatioInLandscape(alwaysAllow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
+            .setMaxAspectRatioInLandscape(ALWAYS_ALLOW)
             .build()
         var width = 1000
         var height = 100
@@ -530,9 +645,10 @@
         // Always disallow split in landscape
         rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
-            .setMaxAspectRatioInLandscape(alwaysDisallow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
+            .setMaxAspectRatioInLandscape(ALWAYS_DISALLOW)
             .build()
         width = 101
         height = 100
@@ -545,8 +661,9 @@
         // Compare the aspect ratio in landscape
         rule = SplitPlaceholderRule.Builder(HashSet(), Intent())
             .setMinWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
+            .setMinHeightDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
             .setMinSmallestWidthDp(SPLIT_MIN_DIMENSION_ALWAYS_ALLOW)
-            .setMaxAspectRatioInPortrait(alwaysAllow())
+            .setMaxAspectRatioInPortrait(ALWAYS_ALLOW)
             .setMaxAspectRatioInLandscape(ratio(1.1f))
             .build()
         // Equals to the max aspect ratio
@@ -573,7 +690,8 @@
             .parseRules(application, R.xml.test_split_config_default_activity_rule)
         assertEquals(1, rules.size)
         val rule: ActivityRule = rules.first() as ActivityRule
-        assertEquals(false, rule.alwaysExpand)
+        assertNull(rule.tag)
+        assertFalse(rule.alwaysExpand)
     }
 
     /**
@@ -586,7 +704,22 @@
             .parseRules(application, R.xml.test_split_config_custom_activity_rule)
         assertEquals(1, rules.size)
         val rule: ActivityRule = rules.first() as ActivityRule
-        assertEquals(true, rule.alwaysExpand)
+        assertEquals("rule1", rule.tag)
+        assertTrue(rule.alwaysExpand)
+    }
+
+    /**
+     * Verifies that [ActivityRule.tag] and [ActivityRule.alwaysExpand] are set correctly when
+     * reading [ActivityRule] from XML.
+     */
+    @Test
+    fun testSetTagAndAlwaysExpand_ActivityRule_Xml() {
+        val rules = RuleController
+            .parseRules(application, R.xml.test_split_config_activity_rule_with_tag)
+        assertEquals(1, rules.size)
+        val rule: ActivityRule = rules.first() as ActivityRule
+        assertEquals(TEST_TAG, rule.tag)
+        assertTrue(rule.alwaysExpand)
     }
 
     /**
@@ -596,7 +729,7 @@
     @Test
     fun testDefaults_ActivityRule_Builder() {
         val rule = ActivityRule.Builder(HashSet()).build()
-        assertEquals(false, rule.alwaysExpand)
+        assertFalse(rule.alwaysExpand)
     }
 
     /**
@@ -613,8 +746,10 @@
         )
         val rule = ActivityRule.Builder(filters)
             .setAlwaysExpand(true)
+            .setTag(TEST_TAG)
             .build()
-        assertEquals(true, rule.alwaysExpand)
+        assertTrue(rule.alwaysExpand)
+        assertEquals(TEST_TAG, rule.tag)
         assertEquals(filters, rule.filters)
     }
 
@@ -635,4 +770,60 @@
 
         return Rect(0, 0, minValidWidthPx, minValidWidthPx)
     }
+
+    @Test
+    fun testIllegalTag_XML() {
+        assertThrows(IllegalArgumentException::class.java) {
+            RuleController.parseRules(application, R.xml.test_split_config_duplicated_tag)
+        }
+    }
+
+    @Test
+    fun testReplacingRuleWithTag() {
+        var rules = RuleController
+            .parseRules(application, R.xml.test_split_config_activity_rule_with_tag)
+        assertEquals(1, rules.size)
+        var rule = rules.first()
+        assertEquals(TEST_TAG, rule.tag)
+        val staticRule = rule as ActivityRule
+        assertTrue(staticRule.alwaysExpand)
+        ruleController.setRules(rules)
+
+        val filters = HashSet<ActivityFilter>()
+        filters.add(
+            ActivityFilter(
+                ComponentName("a", "b"),
+                "ACTION"
+            )
+        )
+        val rule1 = ActivityRule.Builder(filters)
+            .setAlwaysExpand(true)
+            .setTag(TEST_TAG)
+            .build()
+        ruleController.addRule(rule1)
+
+        rules = ruleController.getRules()
+        assertEquals(1, rules.size)
+        rule = rules.first()
+        assertEquals(rule1, rule)
+
+        val intent = Intent("ACTION")
+        val rule2 = SplitPlaceholderRule.Builder(filters, intent)
+            .setMinWidthDp(123)
+            .setMinHeightDp(456)
+            .setMinSmallestWidthDp(789)
+            .setTag(TEST_TAG)
+            .build()
+
+        ruleController.addRule(rule2)
+
+        rules = ruleController.getRules()
+        assertEquals(1, rules.size)
+        rule = rules.first()
+        assertEquals(rule2, rule)
+    }
+
+    companion object {
+        const val TEST_TAG = "test"
+    }
 }
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/layout/ContextUtilsTest.kt b/window/window/src/androidTest/java/androidx/window/layout/ContextUtilsTest.kt
new file mode 100644
index 0000000..7cb4812
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/layout/ContextUtilsTest.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.layout
+
+import android.app.Activity
+import android.content.ContextWrapper
+import android.inputmethodservice.InputMethodService
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.window.layout.util.ContextUtils
+import androidx.window.layout.util.ContextUtils.unwrapUiContext
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+
+/**
+ * Instrumentation tests for [ContextUtils].
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ContextUtilsTest {
+
+    @Test
+    fun testUnwrapUiContext_noContextWrapper_activity() {
+        val context = mock(Activity::class.java)
+        assertEquals(context, unwrapUiContext(context))
+    }
+
+    @Test
+    fun testUnwrapUiContext_noContextWrapper_inputMethodService() {
+        val context = mock(InputMethodService::class.java)
+        assertEquals(context, unwrapUiContext(context))
+    }
+
+    @Test
+    fun testUnwrapUiContext_contextWrapper_null() {
+        val contextWrapper = ContextWrapper(null)
+        assertEquals(contextWrapper, unwrapUiContext(contextWrapper))
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
index 16dbdf6..1d86ece 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoTrackerImplTest.kt
@@ -16,21 +16,24 @@
 
 package androidx.window.layout
 
-import android.app.Activity
+import android.content.Context
+import android.os.Build
 import androidx.core.util.Consumer
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.window.TestActivity
 import androidx.window.TestConsumer
+import androidx.window.WindowTestUtils
+import androidx.window.WindowTestUtils.Companion.assumeAtLeastVendorApiLevel
 import androidx.window.layout.adapter.WindowBackend
+import java.util.concurrent.Executor
 import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
 import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.Job
 import org.junit.Rule
 import org.junit.Test
-import java.util.concurrent.Executor
 
 @OptIn(ExperimentalCoroutinesApi::class)
 public class WindowInfoTrackerImplTest {
@@ -60,6 +63,25 @@
     }
 
     @Test
+    public fun testWindowLayoutFeatures_contextAsListener(): Unit = testScope.runTest {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return@runTest
+        }
+        assumeAtLeastVendorApiLevel(2)
+        val fakeBackend = FakeWindowBackend()
+        val repo = WindowInfoTrackerImpl(WindowMetricsCalculatorCompat, fakeBackend)
+        val collector = TestConsumer<WindowLayoutInfo>()
+
+        val windowContext =
+            WindowTestUtils.createOverlayWindowContext()
+        testScope.launch(Job()) {
+            repo.windowLayoutInfo(windowContext).collect(collector::accept)
+        }
+        fakeBackend.triggerSignal(WindowLayoutInfo(emptyList()))
+        collector.assertValue(WindowLayoutInfo(emptyList()))
+    }
+
+    @Test
     public fun testWindowLayoutFeatures_multicasting(): Unit = testScope.runTest {
         activityScenario.scenario.onActivity { testActivity ->
             val windowMetricsCalculator = WindowMetricsCalculatorCompat
@@ -77,10 +99,44 @@
                 repo.windowLayoutInfo(testActivity).collect(collector::accept)
             }
             fakeBackend.triggerSignal(WindowLayoutInfo(emptyList()))
-            collector.assertValues(WindowLayoutInfo(emptyList()), WindowLayoutInfo(emptyList()))
+            collector.assertValues(
+                WindowLayoutInfo(emptyList()),
+                WindowLayoutInfo(emptyList())
+            )
         }
     }
 
+    @Test
+    public fun testWindowLayoutFeatures_multicastingWithContext(): Unit = testScope.runTest {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return@runTest
+        }
+        assumeAtLeastVendorApiLevel(2)
+        val windowMetricsCalculator = WindowMetricsCalculatorCompat
+        val fakeBackend = FakeWindowBackend()
+        val repo = WindowInfoTrackerImpl(
+            windowMetricsCalculator,
+            fakeBackend
+        )
+        val collector = TestConsumer<WindowLayoutInfo>()
+        val job = Job()
+
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+
+        launch(job) {
+            repo.windowLayoutInfo(windowContext).collect(collector::accept)
+        }
+        launch(job) {
+            repo.windowLayoutInfo(windowContext).collect(collector::accept)
+        }
+
+        fakeBackend.triggerSignal(WindowLayoutInfo(emptyList()))
+        collector.assertValues(
+            WindowLayoutInfo(emptyList()),
+            WindowLayoutInfo(emptyList())
+        )
+    }
+
     private class FakeWindowBackend : WindowBackend {
 
         private class CallbackHolder(
@@ -100,7 +156,7 @@
         }
 
         override fun registerLayoutChangeCallback(
-            activity: Activity,
+            context: Context,
             executor: Executor,
             callback: Consumer<WindowLayoutInfo>
         ) {
diff --git a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackendTest.kt b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackendTest.kt
index 1cdf333..2b80d87 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackendTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackendTest.kt
@@ -16,18 +16,27 @@
 
 package androidx.window.layout.adapter.extensions
 
+import androidx.window.extensions.core.util.function.Consumer as OEMConsumer
 import androidx.window.extensions.layout.FoldingFeature as OEMFoldingFeature
 import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
 import java.util.function.Consumer as JavaConsumer
 import android.annotation.SuppressLint
 import android.app.Activity
+import android.content.Context
 import android.graphics.Rect
 import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.annotation.UiContext
 import androidx.core.util.Consumer
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.window.TestActivity
 import androidx.window.TestConsumer
+import androidx.window.WindowTestUtils
+import androidx.window.WindowTestUtils.Companion.assumeAtLeastVendorApiLevel
+import androidx.window.WindowTestUtils.Companion.assumeBeforeVendorApiLevel
 import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
+import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.layout.FoldingFeature.STATE_FLAT
 import androidx.window.extensions.layout.FoldingFeature.TYPE_HINGE
 import androidx.window.extensions.layout.WindowLayoutComponent
@@ -67,6 +76,7 @@
 
     @Test
     public fun testExtensionWindowBackend_delegatesToWindowLayoutComponent() {
+        assumeAtLeastVendorApiLevel(1)
         val component = RequestTrackingWindowComponent()
 
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -80,7 +90,35 @@
     }
 
     @Test
+    public fun testExtensionWindowBackend_delegatesToWindowLayoutComponentWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = RequestTrackingWindowComponent()
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+        assertTrue(
+            "Expected call with Context: $windowContext",
+            component.hasAddCall(windowContext)
+        )
+    }
+
+    /**
+     * After {@link WindowExtensions#VENDOR_API_LEVEL_2} registerLayoutChangeCallback calls
+     * addWindowLayoutInfoListener(context) instead.
+     * {@link testExtensionWindowBackend_registerAtMostOnceWithContext} verifies the same behavior.
+     */
+    @Suppress("Deprecation")
+    @Test
     public fun testExtensionWindowBackend_registerAtMostOnce() {
+        assumeBeforeVendorApiLevel(2)
         val component = mock<WindowLayoutComponent>()
 
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -90,22 +128,59 @@
             backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
             backend.registerLayoutChangeCallback(activity, Runnable::run, mock())
 
-            verify(component).addWindowLayoutInfoListener(eq(activity), any())
+            val consumerCaptor = argumentCaptor<JavaConsumer<OEMWindowLayoutInfo>>()
+            verify(component).addWindowLayoutInfoListener(eq(activity), consumerCaptor.capture())
+        }
+    }
+
+    @Test
+    public fun testExtensionWindowBackend_registerAtMostOnceWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = mock<WindowLayoutComponent>()
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+
+        val consumerCaptor = argumentCaptor<OEMConsumer<OEMWindowLayoutInfo>>()
+
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, mock())
+        verify(component).addWindowLayoutInfoListener(
+            eq(windowContext),
+            consumerCaptor.capture(),
+        )
+
+        activityScenario.scenario.onActivity { activity ->
+            val consumer = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, mock())
+            verify(component).addWindowLayoutInfoListener(
+                eq(activity as Context),
+                consumerCaptor.capture()
+            )
         }
     }
 
     @Ignore // b/260647675, b/260648288
-    @SuppressLint("NewApi") // java.util.function.Consumer was added in API 24 (N)
+    @Suppress("NewApi", "Deprecation") // java.util.function.Consumer was added in API 24 (N)
     @Test
     public fun testExtensionWindowBackend_translateValues() {
         assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
 
         val component = mock<WindowLayoutComponent>()
-        whenever(component.addWindowLayoutInfoListener(any(), any()))
-            .thenAnswer { invocation ->
-                val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
-                consumer.accept(OEMWindowLayoutInfo(emptyList()))
-            }
+        whenever(component.addWindowLayoutInfoListener(
+            any(),
+            any<JavaConsumer<OEMWindowLayoutInfo>>())
+        ).thenAnswer { invocation ->
+            val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
+            consumer.accept(OEMWindowLayoutInfo(emptyList()))
+        }
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
@@ -116,17 +191,51 @@
         }
     }
 
-    @SuppressLint("NewApi") // java.util.function.Consumer was added in API 24 (N)
     @Test
-    public fun testExtensionWindowBackend_infoReplayedForAdditionalListener() {
+    public fun testExtensionWindowBackend_translateValuesWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = FakeWindowComponent()
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+        val windowLayoutInfoFromContext = newTestOEMWindowLayoutInfo(windowContext)
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+        component.emit(windowLayoutInfoFromContext)
+        windowContextConsumer.assertValue(
+                translate(
+                    windowContext,
+                    windowLayoutInfoFromContext
+                )
+        )
+
+        val consumer = TestConsumer<WindowLayoutInfo>()
+        activityScenario.scenario.onActivity { activity ->
+            val windowLayoutInfoFromActivity = newTestOEMWindowLayoutInfo(activity)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            component.emit(newTestOEMWindowLayoutInfo(activity))
+            consumer.assertValues(listOf(translate(activity, windowLayoutInfoFromActivity)))
+        }
+    }
+
+    @Suppress("NewApi", "Deprecation") // java.util.function.Consumer was added in API 24 (N)
+    @Test
+    fun testExtensionWindowBackend_infoReplayedForAdditionalListener() {
+        assumeBeforeVendorApiLevel(2)
         assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
 
         val component = mock<WindowLayoutComponent>()
-        whenever(component.addWindowLayoutInfoListener(any(), any()))
-            .thenAnswer { invocation ->
-                val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
-                consumer.accept(OEMWindowLayoutInfo(emptyList()))
-            }
+        whenever(component.addWindowLayoutInfoListener(
+            any(),
+            any<JavaConsumer<OEMWindowLayoutInfo>>())
+        ).thenAnswer { invocation ->
+            val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
+            consumer.accept(OEMWindowLayoutInfo(emptyList()))
+        }
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
@@ -139,7 +248,48 @@
     }
 
     @Test
-    public fun testExtensionWindowBackend_removeMatchingCallback() {
+    public fun testExtensionWindowBackend_infoReplayedForAdditionalListenerWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = mock<WindowLayoutComponent>()
+        whenever(component.addWindowLayoutInfoListener(
+            any(),
+            any<OEMConsumer<OEMWindowLayoutInfo>>())
+        ).thenAnswer { invocation ->
+            val consumer = invocation.getArgument(1) as OEMConsumer<OEMWindowLayoutInfo>
+            consumer.accept(OEMWindowLayoutInfo(emptyList()))
+        }
+        whenever(component.addWindowLayoutInfoListener(
+            any(),
+            any<OEMConsumer<OEMWindowLayoutInfo>>())
+        ).thenAnswer { invocation ->
+            val consumer = invocation.getArgument(1) as OEMConsumer<OEMWindowLayoutInfo>
+            consumer.accept(OEMWindowLayoutInfo(emptyList()))
+        }
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        activityScenario.scenario.onActivity { activity ->
+            val consumer = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(activity, Runnable::run, mock())
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+
+            consumer.assertValue(WindowLayoutInfo(emptyList()))
+        }
+
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, mock())
+        windowContextConsumer.assertValue(WindowLayoutInfo(emptyList()))
+    }
+
+    @Suppress("Deprecation")
+    @Test
+    fun testExtensionWindowBackend_removeMatchingCallback() {
+        assumeBeforeVendorApiLevel(2)
         val component = mock<WindowLayoutComponent>()
 
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -156,8 +306,10 @@
         }
     }
 
+    @Suppress("Deprecation")
     @Test
-    public fun testExtensionWindowBackend_removesMultipleCallback() {
+    fun testExtensionWindowBackend_removesMultipleCallback() {
+        assumeBeforeVendorApiLevel(2)
         val component = mock<WindowLayoutComponent>()
 
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -177,8 +329,116 @@
         }
     }
 
+    /**
+     * Verifies context and consumer registration can be registered with using either
+     * addWindowLayoutInfoListener(context) or addWindowLayoutInfoListener(activity),
+     * but all registration are cleaned up by  removeWindowLayoutInfoListener().
+     * Note: addWindowLayoutInfoListener(context) is added in
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}.
+     */
     @Test
-    public fun testExtensionWindowBackend_reRegisterCallback() {
+    fun testExtensionWindowBackend_removeMatchingCallbackWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            // createWindowContext is available after R.
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = mock<WindowLayoutComponent>()
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        activityScenario.scenario.onActivity { activity ->
+            val consumer = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            backend.unregisterLayoutChangeCallback(consumer)
+            val windowContext = WindowTestUtils.createOverlayWindowContext()
+            val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(
+                windowContext,
+                Runnable::run,
+                windowContextConsumer
+            )
+            backend.unregisterLayoutChangeCallback(windowContextConsumer)
+
+            val consumerCaptor = argumentCaptor<OEMConsumer<OEMWindowLayoutInfo>>()
+            verify(component).addWindowLayoutInfoListener(
+                eq(activity as Context),
+                consumerCaptor.capture()
+            )
+            verify(component).removeWindowLayoutInfoListener(
+                consumerCaptor.firstValue
+            )
+
+            verify(component).addWindowLayoutInfoListener(
+                eq(windowContext),
+                consumerCaptor.capture()
+            )
+            verify(component).removeWindowLayoutInfoListener(
+                consumerCaptor.lastValue
+            )
+        }
+    }
+
+    @Test
+    fun testExtensionWindowBackend_removeMultipleCallbackWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            // createWindowContext is available after R.
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = mock<WindowLayoutComponent>()
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        activityScenario.scenario.onActivity { activity ->
+            val consumer = TestConsumer<WindowLayoutInfo>()
+            val consumer2 = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer2)
+            backend.unregisterLayoutChangeCallback(consumer)
+            backend.unregisterLayoutChangeCallback(consumer2)
+            val windowContext = WindowTestUtils.createOverlayWindowContext()
+            val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+            val windowContextConsumer2 = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(
+                windowContext,
+                Runnable::run,
+                windowContextConsumer
+            )
+            backend.registerLayoutChangeCallback(
+                windowContext,
+                Runnable::run,
+                windowContextConsumer2
+            )
+            backend.unregisterLayoutChangeCallback(windowContextConsumer)
+            backend.unregisterLayoutChangeCallback(windowContextConsumer2)
+
+            val consumerCaptor = argumentCaptor<OEMConsumer<OEMWindowLayoutInfo>>()
+            verify(component).addWindowLayoutInfoListener(
+                eq(activity as Context),
+                consumerCaptor.capture()
+            )
+            verify(component).removeWindowLayoutInfoListener(
+                consumerCaptor.firstValue
+            )
+
+            verify(component).addWindowLayoutInfoListener(
+                eq(windowContext),
+                consumerCaptor.capture()
+            )
+            verify(component).removeWindowLayoutInfoListener(
+                consumerCaptor.lastValue
+            )
+            assertFalse(backend.hasRegisteredListeners())
+        }
+    }
+
+    @Suppress("Deprecation")
+    @Test
+    fun testExtensionWindowBackend_reRegisterCallback() {
+        assumeBeforeVendorApiLevel(2)
         val component = mock<WindowLayoutComponent>()
 
         val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -198,8 +458,58 @@
         }
     }
 
+    /**
+     * Verifies that a [WindowLayoutInfo] is published to the consumer upon each registration.
+     * Note: addWindowLayoutInfoListener(context) is added in
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @Test
+    fun testExtensionWindowBackend_reRegisterCallbackWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = mock<WindowLayoutComponent>()
+
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        val windowContextConsumer = TestConsumer<WindowLayoutInfo>()
+
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+        backend.unregisterLayoutChangeCallback(windowContextConsumer)
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, windowContextConsumer)
+
+        val consumerCaptor = argumentCaptor<OEMConsumer<OEMWindowLayoutInfo>>()
+        verify(component, times(2)).addWindowLayoutInfoListener(
+            eq(windowContext),
+            consumerCaptor.capture()
+        )
+        verify(component).removeWindowLayoutInfoListener(
+            consumerCaptor.firstValue
+        )
+
+        activityScenario.scenario.onActivity { activity ->
+            val consumer = TestConsumer<WindowLayoutInfo>()
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            backend.unregisterLayoutChangeCallback(consumer)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+
+            verify(component, times(2))
+                .addWindowLayoutInfoListener(
+                    eq(activity as Context),
+                    consumerCaptor.capture()
+                )
+            verify(component).removeWindowLayoutInfoListener(
+                consumerCaptor.firstValue
+            )
+        }
+    }
+
     @Test
     public fun testRegisterLayoutChangeCallback_clearListeners() {
+        assumeBeforeVendorApiLevel(2)
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
             val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -213,12 +523,12 @@
                 { obj: Runnable -> obj.run() },
                 firstConsumer
             )
+
             backend.registerLayoutChangeCallback(
                 activity,
                 { obj: Runnable -> obj.run() },
                 secondConsumer
             )
-
             assertEquals("Expected one registration for same Activity", 1, component.consumers.size)
             // Check unregistering the layout change callback
             backend.unregisterLayoutChangeCallback(firstConsumer)
@@ -227,8 +537,50 @@
         }
     }
 
+    /**
+     * Verifies that both [Activity] and [UiContext] can be independently registered as listeners to
+     * [WindowLayoutInfo].
+     * Note: addWindowLayoutInfoListener(context) is added in
+     * {@link WindowExtensions#VENDOR_API_LEVEL_2}
+     */
+    @Test
+    public fun testRegisterLayoutChangeCallback_clearListenersWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        activityScenario.scenario.onActivity { activity ->
+            val component = FakeWindowComponent()
+            val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+            // Check registering the layout change callback
+            val firstConsumer = mock<Consumer<WindowLayoutInfo>>()
+            val secondConsumer = mock<Consumer<WindowLayoutInfo>>()
+            val thirdConsumer = mock<Consumer<WindowLayoutInfo>>()
+            val windowContext = WindowTestUtils.createOverlayWindowContext()
+
+            backend.registerLayoutChangeCallback(activity, Runnable::run, firstConsumer)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, secondConsumer)
+            backend.registerLayoutChangeCallback(windowContext, Runnable::run, thirdConsumer)
+
+            assertEquals(
+                "Expected one registration for same Activity",
+                2 /* expected */,
+                component.oemConsumers.size
+            )
+            // Check unregistering the layout change callback
+            backend.unregisterLayoutChangeCallback(firstConsumer)
+            backend.unregisterLayoutChangeCallback(secondConsumer)
+            backend.unregisterLayoutChangeCallback(thirdConsumer)
+            assertTrue("Expected all listeners to be removed", component.oemConsumers.isEmpty())
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.R)
     @Test
     public fun testLayoutChangeCallback_emitNewValue() {
+        assumeBeforeVendorApiLevel(2)
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
             val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -245,7 +597,31 @@
     }
 
     @Test
+    public fun testExtensionWindowBackend_emitNewValueWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
+
+        val component = FakeWindowComponent()
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+
+        // Check that callbacks from the extension are propagated for WindowContext.
+        val consumer = mock<Consumer<WindowLayoutInfo>>()
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+        backend.registerLayoutChangeCallback(
+            windowContext, Runnable::run, consumer
+        )
+        val windowLayoutInfo = newTestOEMWindowLayoutInfo(windowContext)
+
+        component.emit(windowLayoutInfo)
+        verify(consumer).accept(translate(windowContext, windowLayoutInfo))
+    }
+
+    @RequiresApi(Build.VERSION_CODES.R)
+    @Test
     public fun testWindowLayoutInfo_updatesOnSubsequentRegistration() {
+        assumeAtLeastVendorApiLevel(1)
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
             val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
@@ -266,8 +642,36 @@
         }
     }
 
-    internal companion object {
+    @Test
+    public fun testWindowLayoutInfo_updatesOnSubsequentRegistrationWithContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
+            return
+        }
+        assumeAtLeastVendorApiLevel(2)
 
+        val component = FakeWindowComponent()
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
+        val consumer = TestConsumer<WindowLayoutInfo>()
+        val windowContext = WindowTestUtils.createOverlayWindowContext()
+
+        val oemWindowLayoutInfo = newTestOEMWindowLayoutInfo(windowContext)
+
+        val expected = listOf(
+            translate(windowContext, oemWindowLayoutInfo),
+            translate(windowContext, oemWindowLayoutInfo)
+        )
+
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, consumer)
+        component.emit(newTestOEMWindowLayoutInfo(windowContext))
+        backend.unregisterLayoutChangeCallback(consumer)
+
+        backend.registerLayoutChangeCallback(windowContext, Runnable::run, consumer)
+        component.emit(newTestOEMWindowLayoutInfo(windowContext))
+        backend.unregisterLayoutChangeCallback(consumer)
+        consumer.assertValues(expected)
+    }
+
+    internal companion object {
         private fun newTestOEMWindowLayoutInfo(activity: Activity): OEMWindowLayoutInfo {
             val bounds = WindowMetricsCalculatorCompat.computeCurrentWindowMetrics(activity).bounds
             val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
@@ -275,6 +679,20 @@
             val displayFeatures = listOf(feature)
             return OEMWindowLayoutInfo(displayFeatures)
         }
+
+        /**
+         * Creates an empty OEMWindowLayoutInfo. Note that before R context needs to be an
+         * [Activity]. After R Context can be an [Activity] or a [UiContext] created with
+         * [Context#createWindowContext] or [InputMethodService].
+         */
+        @RequiresApi(Build.VERSION_CODES.R)
+        private fun newTestOEMWindowLayoutInfo(@UiContext context: Context): OEMWindowLayoutInfo {
+            val bounds = WindowMetricsCalculatorCompat.computeCurrentWindowMetrics(context).bounds
+            val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
+            val feature = OEMFoldingFeature(featureBounds, TYPE_HINGE, STATE_FLAT)
+            val displayFeatures = listOf(feature)
+            return OEMWindowLayoutInfo(displayFeatures)
+        }
     }
 
     private class RequestTrackingWindowComponent : WindowLayoutComponent {
@@ -288,19 +706,27 @@
             records.add(AddCall(activity))
         }
 
+        override fun addWindowLayoutInfoListener(
+            context: Context,
+            consumer: OEMConsumer<OEMWindowLayoutInfo>,
+        ) {
+            records.add(AddCall(context))
+        }
+
         override fun removeWindowLayoutInfoListener(consumer: JavaConsumer<OEMWindowLayoutInfo>) {
         }
 
-        class AddCall(val activity: Activity)
+        class AddCall(val context: Context)
 
-        fun hasAddCall(activity: Activity): Boolean {
-            return records.any { addRecord -> addRecord.activity == activity }
+        fun hasAddCall(context: Context): Boolean {
+            return records.any { addRecord -> addRecord.context == context }
         }
     }
 
     private class FakeWindowComponent : WindowLayoutComponent {
 
         val consumers = mutableListOf<JavaConsumer<OEMWindowLayoutInfo>>()
+        val oemConsumers = mutableListOf<OEMConsumer<OEMWindowLayoutInfo>>()
 
         override fun addWindowLayoutInfoListener(
             activity: Activity,
@@ -309,13 +735,30 @@
             consumers.add(consumer)
         }
 
+        override fun addWindowLayoutInfoListener(
+            context: Context,
+            consumer: OEMConsumer<OEMWindowLayoutInfo>
+        ) {
+            oemConsumers.add(consumer)
+        }
+
         override fun removeWindowLayoutInfoListener(consumer: JavaConsumer<OEMWindowLayoutInfo>) {
             consumers.remove(consumer)
         }
 
+        override fun removeWindowLayoutInfoListener(
+            consumer: OEMConsumer<OEMWindowLayoutInfo>
+        ) {
+            oemConsumers.remove(consumer)
+        }
+
         @SuppressLint("NewApi")
         fun emit(info: OEMWindowLayoutInfo) {
-            consumers.forEach { it.accept(info) }
+            if (ExtensionsUtil.safeVendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+                consumers.forEach { it.accept(info) }
+            } else {
+                oemConsumers.forEach { it.accept(info) }
+            }
         }
     }
 }
diff --git a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapterTest.kt
index f1d8f53..376cf74 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapterTest.kt
@@ -16,26 +16,30 @@
 
 package androidx.window.layout.adapter.extensions
 
+import androidx.window.extensions.layout.FoldingFeature as OEMFoldingFeature
+import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
 import android.graphics.Rect
+import android.os.Build
+import androidx.annotation.RequiresApi
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.window.TestActivity
+import androidx.window.WindowTestUtils
 import androidx.window.core.Bounds
 import androidx.window.extensions.layout.FoldingFeature.STATE_HALF_OPENED
 import androidx.window.extensions.layout.FoldingFeature.TYPE_HINGE
 import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
+import androidx.window.layout.HardwareFoldingFeature
 import androidx.window.layout.HardwareFoldingFeature.Type.Companion.HINGE
 import androidx.window.layout.TestFoldingFeatureUtil.invalidNonZeroFoldBounds
+import androidx.window.layout.WindowLayoutInfo
 import androidx.window.layout.WindowMetricsCalculatorCompat.computeCurrentWindowMetrics
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
-import androidx.window.extensions.layout.FoldingFeature as OEMFoldingFeature
-import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
-import androidx.window.layout.HardwareFoldingFeature
-import androidx.window.layout.WindowLayoutInfo
 
 class ExtensionsWindowLayoutInfoAdapterTest {
 
@@ -46,12 +50,13 @@
     @Test
     fun testTranslate_foldingFeature() {
         activityScenario.scenario.onActivity { activity ->
-            val bounds = computeCurrentWindowMetrics(activity).bounds
+            val windowMetrics = computeCurrentWindowMetrics(activity)
+            val bounds = windowMetrics.bounds
             val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
             val oemFeature = OEMFoldingFeature(featureBounds, TYPE_HINGE, STATE_HALF_OPENED)
             val expected = HardwareFoldingFeature(Bounds(featureBounds), HINGE, HALF_OPENED)
 
-            val actual = ExtensionsWindowLayoutInfoAdapter.translate(activity, oemFeature)
+            val actual = ExtensionsWindowLayoutInfoAdapter.translate(windowMetrics, oemFeature)
 
             assertEquals(expected, actual)
         }
@@ -74,14 +79,34 @@
         }
     }
 
+    @RequiresApi(Build.VERSION_CODES.S)
     @Test
-    fun testTranslate_foldingFeature_invalidType() {
+    fun testTranslate_windowLayoutInfoFromContext() {
+        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
         activityScenario.scenario.onActivity { activity ->
             val bounds = computeCurrentWindowMetrics(activity).bounds
             val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
+            val oemFeature = OEMFoldingFeature(featureBounds, TYPE_HINGE, STATE_HALF_OPENED)
+            val oemInfo = OEMWindowLayoutInfo(listOf(oemFeature))
+            val localFeature = HardwareFoldingFeature(Bounds(featureBounds), HINGE, HALF_OPENED)
+            val expected = WindowLayoutInfo(listOf(localFeature))
+
+            val windowContext = WindowTestUtils.createOverlayWindowContext()
+
+            val fromContext = ExtensionsWindowLayoutInfoAdapter.translate(windowContext, oemInfo)
+            assertEquals(expected, fromContext)
+        }
+    }
+
+    @Test
+    fun testTranslate_foldingFeature_invalidType() {
+        activityScenario.scenario.onActivity { activity ->
+            val windowMetrics = computeCurrentWindowMetrics(activity)
+            val bounds = windowMetrics.bounds
+            val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
             val oemFeature = OEMFoldingFeature(featureBounds, -1, STATE_HALF_OPENED)
 
-            val actual = ExtensionsWindowLayoutInfoAdapter.translate(activity, oemFeature)
+            val actual = ExtensionsWindowLayoutInfoAdapter.translate(windowMetrics, oemFeature)
 
             assertNull(actual)
         }
@@ -90,11 +115,12 @@
     @Test
     fun testTranslate_foldingFeature_invalidState() {
         activityScenario.scenario.onActivity { activity ->
-            val bounds = computeCurrentWindowMetrics(activity).bounds
+            val windowMetrics = computeCurrentWindowMetrics(activity)
+            val bounds = windowMetrics.bounds
             val featureBounds = Rect(0, bounds.centerY(), bounds.width(), bounds.centerY())
             val oemFeature = OEMFoldingFeature(featureBounds, TYPE_HINGE, -1)
 
-            val actual = ExtensionsWindowLayoutInfoAdapter.translate(activity, oemFeature)
+            val actual = ExtensionsWindowLayoutInfoAdapter.translate(windowMetrics, oemFeature)
 
             assertNull(actual)
         }
@@ -103,7 +129,8 @@
     @Test
     fun testTranslate_foldingFeature_invalidBounds() {
         activityScenario.scenario.onActivity { activity ->
-            val windowBounds = computeCurrentWindowMetrics(activity).bounds
+            val windowMetrics = computeCurrentWindowMetrics(activity)
+            val windowBounds = windowMetrics.bounds
 
             val source = invalidNonZeroFoldBounds(windowBounds)
                 .map { featureBounds ->
@@ -111,7 +138,7 @@
                 }
 
             val invalidFeatures = source.mapNotNull { feature ->
-                ExtensionsWindowLayoutInfoAdapter.translate(activity, feature)
+                ExtensionsWindowLayoutInfoAdapter.translate(windowMetrics, feature)
             }
 
             assertTrue(source.isNotEmpty())
@@ -121,4 +148,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/window/window/src/androidTest/res/values/colors.xml b/window/window/src/androidTest/res/values/colors.xml
new file mode 100644
index 0000000..939eec6
--- /dev/null
+++ b/window/window/src/androidTest/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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="testColor">#00FF00</color>
+</resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_activity_rule_with_tag.xml b/window/window/src/androidTest/res/xml/test_split_config_activity_rule_with_tag.xml
new file mode 100644
index 0000000..d7e0025
--- /dev/null
+++ b/window/window/src/androidTest/res/xml/test_split_config_activity_rule_with_tag.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <ActivityRule
+        window:tag="test"
+        window:alwaysExpand="true">
+        <ActivityFilter
+            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
+    </ActivityRule>
+</resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_custom_activity_rule.xml b/window/window/src/androidTest/res/xml/test_split_config_custom_activity_rule.xml
index 63e54b6..f651baf 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_custom_activity_rule.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_custom_activity_rule.xml
@@ -17,6 +17,7 @@
 <resources
     xmlns:window="http://schemas.android.com/apk/res-auto">
     <ActivityRule
+        window:tag="rule1"
         window:alwaysExpand="true">
         <ActivityFilter
             window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
diff --git a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule.xml b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule.xml
index 128eeaa..face30c 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_custom_split_pair_rule.xml
@@ -17,9 +17,11 @@
 <resources
     xmlns:window="http://schemas.android.com/apk/res-auto">
     <SplitPairRule
+        window:tag="rule2"
         window:splitRatio="0.1"
         window:splitMinWidthDp="123"
-        window:splitMinSmallestWidthDp="456"
+        window:splitMinHeightDp="456"
+        window:splitMinSmallestWidthDp="789"
         window:splitMaxAspectRatioInPortrait="1.23"
         window:splitMaxAspectRatioInLandscape="alwaysDisallow"
         window:splitLayoutDirection="rtl"
diff --git a/window/window/src/androidTest/res/xml/test_split_config_custom_split_placeholder_rule.xml b/window/window/src/androidTest/res/xml/test_split_config_custom_split_placeholder_rule.xml
index 3a0716e..273c855 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_custom_split_placeholder_rule.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_custom_split_placeholder_rule.xml
@@ -17,9 +17,11 @@
 <resources
     xmlns:window="http://schemas.android.com/apk/res-auto">
     <SplitPlaceholderRule
+        window:tag="rule3"
         window:splitRatio="0.1"
         window:splitMinWidthDp="123"
-        window:splitMinSmallestWidthDp="456"
+        window:splitMinHeightDp="456"
+        window:splitMinSmallestWidthDp="789"
         window:splitMaxAspectRatioInPortrait="1.23"
         window:splitMaxAspectRatioInLandscape="alwaysDisallow"
         window:splitLayoutDirection="rtl"
diff --git a/window/window/src/androidTest/res/xml/test_split_config_default_activity_rule.xml b/window/window/src/androidTest/res/xml/test_split_config_default_activity_rule.xml
index 3ae66aa..e47b93e 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_default_activity_rule.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_default_activity_rule.xml
@@ -18,6 +18,6 @@
     xmlns:window="http://schemas.android.com/apk/res-auto">
     <ActivityRule>
         <ActivityFilter
-            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
+            window:activityName="SplitActivityList"/>
     </ActivityRule>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_default_split_placeholder_rule.xml b/window/window/src/androidTest/res/xml/test_split_config_default_split_placeholder_rule.xml
index ffbc6ca..e67acb3 100644
--- a/window/window/src/androidTest/res/xml/test_split_config_default_split_placeholder_rule.xml
+++ b/window/window/src/androidTest/res/xml/test_split_config_default_split_placeholder_rule.xml
@@ -19,6 +19,6 @@
     <SplitPlaceholderRule
         window:placeholderActivityName="C">
         <ActivityFilter
-            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
+            window:activityName="SplitActivityList"/>
     </SplitPlaceholderRule>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_duplicated_tag.xml b/window/window/src/androidTest/res/xml/test_split_config_duplicated_tag.xml
new file mode 100644
index 0000000..aba63db
--- /dev/null
+++ b/window/window/src/androidTest/res/xml/test_split_config_duplicated_tag.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <ActivityRule
+        window:tag="test">
+        <ActivityFilter
+            window:activityName="A"/>
+    </ActivityRule>
+    <SplitPairRule
+        window:tag="test">
+        <SplitPairFilter
+            window:primaryActivityName="A"
+            window:secondaryActivityName="B"/>
+    </SplitPairRule>
+</resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml b/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml
new file mode 100644
index 0000000..5e75a12
--- /dev/null
+++ b/window/window/src/androidTest/res/xml/test_split_config_split_pair_rule_horizontal_layout.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <SplitPairRule
+        window:splitRatio="0.3"
+        window:tag="test"
+        window:splitMinWidthDp="0"
+        window:splitMinHeightDp="600"
+        window:splitMinSmallestWidthDp="0"
+        window:splitLayoutDirection="topToBottom"
+        window:animationBackgroundColor="#0000FF">
+        <SplitPairFilter
+            window:primaryActivityName="A"
+            window:secondaryActivityName="B"/>
+    </SplitPairRule>
+</resources>
\ No newline at end of file
diff --git a/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml b/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml
new file mode 100644
index 0000000..df0871f
--- /dev/null
+++ b/window/window/src/androidTest/res/xml/test_split_config_split_placeholder_horizontal_layout.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <SplitPlaceholderRule
+        window:tag="test"
+        window:placeholderActivityName="C"
+        window:splitRatio="0.3"
+        window:splitMinWidthDp="0"
+        window:splitMinHeightDp="600"
+        window:splitMinSmallestWidthDp="0"
+        window:splitLayoutDirection="bottomToTop"
+        window:animationBackgroundColor="@color/testColor">
+        <ActivityFilter
+            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
+    </SplitPlaceholderRule>
+</resources>
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/WindowProperties.kt b/window/window/src/main/java/androidx/window/WindowProperties.kt
index 226430b..156652f 100644
--- a/window/window/src/main/java/androidx/window/WindowProperties.kt
+++ b/window/window/src/main/java/androidx/window/WindowProperties.kt
@@ -30,9 +30,10 @@
      *
      * If `true`, the system is permitted to override the app's windowing
      * behavior and implement activity embedding split rules, such as displaying
-     * activities side by side. A system override informs the app that the
-     * activity embedding APIs are disabled so the app will not provide its own
-     * activity embedding rules, which would conflict with the system's rules.
+     * activities adjacent to each other. A system override informs the app that
+     * the activity embedding APIs are disabled so the app will not provide its
+     * own activity embedding rules, which would conflict with the system's
+     * rules.
      *
      * If `false`, the system is not permitted to override the windowing
      * behavior of the app. Set the property to `false` if the app provides its
@@ -62,4 +63,28 @@
      */
     const val PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE =
         "android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE"
+
+    /**
+     * Application level
+     * [PackageManager][android.content.pm.PackageManager.Property] tag
+     * that an app must specify to inform the system that the app is ActivityEmbedding
+     * split feature enabled. In other words, the ActivityEmbedding splits feature cannot be
+     * used if the app has no property set.
+     *
+     * With this property, the system could provide custom behaviors for the apps that
+     * have ActivityEmbedding split feature enabled. For example, the fixed-portrait orientation
+     * requests of the activities could be ignored by the system in order to provide seamless
+     * ActivityEmbedding split experiences while holding the large-screen devices in landscape mode.
+     *
+     * **Syntax:**
+     * <pre>
+     * &lt;application&gt;
+     *   &lt;property
+     *     android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED"
+     *     android:value="true|false"/&gt;
+     * &lt;/application&gt;
+     * </pre>
+     */
+    const val PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED =
+        "android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED"
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt b/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt
index e81e16e..af51cd0 100644
--- a/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt
+++ b/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt
@@ -18,6 +18,7 @@
 
 import android.annotation.SuppressLint
 import android.app.Activity
+import android.content.Context
 import androidx.annotation.CheckResult
 import java.lang.reflect.InvocationHandler
 import java.lang.reflect.Method
@@ -84,6 +85,61 @@
         }
     }
 
+    @CheckResult
+    fun <T : Any> createSubscriptionNoActivity(
+        obj: Any,
+        clazz: KClass<T>,
+        addMethodName: String,
+        removeMethodName: String,
+        consumer: (T) -> Unit
+    ): Subscription {
+        val javaConsumer = buildConsumer(clazz, consumer)
+        obj.javaClass.getMethod(addMethodName, unsafeConsumerClass())
+            .invoke(obj, javaConsumer)
+        val removeMethod = obj.javaClass.getMethod(removeMethodName, unsafeConsumerClass())
+        return object : Subscription {
+            override fun dispose() {
+                removeMethod.invoke(obj, javaConsumer)
+            }
+        }
+    }
+
+    @CheckResult
+    fun <T : Any> createSubscription(
+        obj: Any,
+        clazz: KClass<T>,
+        addMethodName: String,
+        removeMethodName: String,
+        context: Context,
+        consumer: (T) -> Unit
+    ): Subscription {
+        val javaConsumer = buildConsumer(clazz, consumer)
+        obj.javaClass.getMethod(addMethodName, Context::class.java, unsafeConsumerClass())
+            .invoke(obj, context, javaConsumer)
+        val removeMethod = obj.javaClass.getMethod(removeMethodName, unsafeConsumerClass())
+        return object : Subscription {
+            override fun dispose() {
+                removeMethod.invoke(obj, javaConsumer)
+            }
+        }
+    }
+
+    /**
+     * Similar to {@link #createSubscription} but without needing to provide
+     * a {@code removeMethodName} due to it being handled on the extensions side
+     */
+    fun <T : Any> createConsumer(
+        obj: Any,
+        clazz: KClass<T>,
+        addMethodName: String,
+        activity: Activity,
+        consumer: (T) -> Unit
+    ) {
+        val javaConsumer = buildConsumer(clazz, consumer)
+        obj.javaClass.getMethod(addMethodName, Activity::class.java, unsafeConsumerClass())
+            .invoke(obj, activity, javaConsumer)
+        }
+
     private class ConsumerHandler<T : Any>(
         private val clazz: KClass<T>,
         private val consumer: (T) -> Unit
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt b/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
index d38b78d..c231818 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
@@ -21,6 +21,7 @@
  * [SplitPairRule].
  */
 class ActivityRule internal constructor(
+    tag: String?,
     /**
      * Filters used to choose when to apply this rule. The rule will be applied if any one of the
      * provided filters matches.
@@ -29,10 +30,10 @@
     /**
      * Whether the activity should always be expanded on launch. Some activities are supposed to
      * expand to the full task bounds, independent of the state of the split. An example is an
-     * activity that blocks all user interactions, like a warning dialog.
+     * activity that blocks all user interactions, such as a warning dialog.
      */
     val alwaysExpand: Boolean = false
-) : EmbeddingRule() {
+) : EmbeddingRule(tag) {
 
     /**
      * Builder for [ActivityRule].
@@ -40,18 +41,25 @@
      * @param filters See [ActivityRule.filters].
      */
     class Builder(
-        private val filters: Set<ActivityFilter>
+        private val filters: Set<ActivityFilter>,
     ) {
+        private var tag: String? = null
         private var alwaysExpand: Boolean = false
 
         /**
-         * @see ActivityRule.alwaysExpand
+         * Whether the activity should always be expanded on launch. Some activities are supposed to
+         * expand to the full task bounds, independent of the state of the split. An example is an
+         * activity that blocks all user interactions, such as a warning dialog.
          */
         @SuppressWarnings("MissingGetterMatchingBuilder")
         fun setAlwaysExpand(alwaysExpand: Boolean): Builder =
             apply { this.alwaysExpand = alwaysExpand }
 
-        fun build() = ActivityRule(filters, alwaysExpand)
+        /** @see ActivityRule.tag */
+        fun setTag(tag: String): Builder =
+            apply { this.tag = tag }
+
+        fun build() = ActivityRule(tag, filters, alwaysExpand)
     }
 
     /**
@@ -59,16 +67,14 @@
      * @see filters
      */
     internal operator fun plus(filter: ActivityFilter): ActivityRule {
-        return ActivityRule(
-            filters + filter,
-            alwaysExpand
-        )
+        return ActivityRule(tag, filters + filter, alwaysExpand)
     }
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is ActivityRule) return false
 
+        if (!super.equals(other)) return false
         if (filters != other.filters) return false
         if (alwaysExpand != other.alwaysExpand) return false
 
@@ -76,8 +82,16 @@
     }
 
     override fun hashCode(): Int {
-        var result = filters.hashCode()
+        var result = super.hashCode()
+        result = 31 * result + filters.hashCode()
         result = 31 * result + alwaysExpand.hashCode()
         return result
     }
-}
\ No newline at end of file
+
+    override fun toString(): String {
+        return "ActivityRule:{" +
+            "tag={$tag}," +
+            "filters={$filters}, " +
+            "alwaysExpand={$alwaysExpand}}"
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt b/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
index bd90e21..310ce17 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
@@ -20,14 +20,8 @@
 /**
  * A container that holds a stack of activities, overlapping and bound to the same rectangle on the
  * screen.
- *
- * @param activitiesInProcess the [Activity] list in this application's process that belongs to this
- * [ActivityStack]. Activities running in other processes will not be contained in this list.
- * @param isEmpty whether there is no [Activity] running in this [ActivityStack]. It can be
- * non-empty when the [activitiesInProcess] is empty, because there can be [Activity] running in
- * other processes, which will not be reported in [activitiesInProcess].
  */
-class ActivityStack(
+class ActivityStack internal constructor(
     /**
      * The [Activity] list in this application's process that belongs to this [ActivityStack].
      *
@@ -69,11 +63,9 @@
         return result
     }
 
-    override fun toString(): String {
-        return buildString {
-            append("ActivityStack{")
-            append("activitiesInProcess=$activitiesInProcess")
-            append("isEmpty=$isEmpty}")
-        }
-    }
-}
\ No newline at end of file
+    override fun toString(): String =
+        "ActivityStack{" +
+            "activitiesInProcess=$activitiesInProcess" +
+            ", isEmpty=$isEmpty" +
+            "}"
+}
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
index 1700d8d..c96432f 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -16,9 +16,13 @@
 
 package androidx.window.embedding
 
+import android.util.Pair as AndroidPair
 import androidx.window.extensions.embedding.ActivityRule as OEMActivityRule
 import androidx.window.extensions.embedding.ActivityRule.Builder as ActivityRuleBuilder
 import androidx.window.extensions.embedding.EmbeddingRule as OEMEmbeddingRule
+import androidx.window.extensions.embedding.SplitAttributes as OEMSplitAttributes
+import androidx.window.extensions.embedding.SplitAttributes.SplitType as OEMSplitType
+import androidx.window.extensions.embedding.SplitAttributesCalculatorParams as OEMSplitAttributesCalculatorParams
 import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
 import androidx.window.extensions.embedding.SplitPairRule as OEMSplitPairRule
 import androidx.window.extensions.embedding.SplitPairRule.Builder as SplitPairRuleBuilder
@@ -28,9 +32,24 @@
 import android.app.Activity
 import android.content.Context
 import android.content.Intent
+import android.util.LayoutDirection
 import android.view.WindowMetrics
+import androidx.window.core.ExtensionsUtil
 import androidx.window.core.PredicateAdapter
-import androidx.window.extensions.WindowExtensionsProvider
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.BOTTOM_TO_TOP
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
+import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.extensions.WindowExtensions
+import androidx.window.extensions.core.util.function.Function
+import androidx.window.extensions.core.util.function.Predicate
+import androidx.window.extensions.embedding.SplitPairRule.FINISH_ADJACENT
+import androidx.window.extensions.embedding.SplitPairRule.FINISH_ALWAYS
+import androidx.window.extensions.embedding.SplitPairRule.FINISH_NEVER
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.layout.adapter.extensions.ExtensionsWindowLayoutInfoAdapter
 
 /**
  * Adapter class that translates data classes between Extension and Jetpack interfaces.
@@ -38,9 +57,11 @@
 internal class EmbeddingAdapter(
     private val predicateAdapter: PredicateAdapter
 ) {
+    private val vendorApiLevel = ExtensionsUtil.safeVendorApiLevel
+    private val vendorApiLevel1Impl = VendorApiLevel1Impl(predicateAdapter)
 
     fun translate(splitInfoList: List<OEMSplitInfo>): List<SplitInfo> {
-        return splitInfoList.map(::translate)
+        return splitInfoList.map(this::translate)
     }
 
     private fun translate(splitInfo: OEMSplitInfo): SplitInfo {
@@ -66,125 +87,240 @@
             secondaryActivityStack.activities,
             isSecondaryStackEmpty
         )
-        return SplitInfo(primaryFragment, secondaryFragment, splitInfo.splitRatio)
-    }
 
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateActivityPairPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
-        return predicateAdapter.buildPairPredicate(
-            Activity::class,
-            Activity::class
-        ) { first: Activity, second: Activity ->
-            splitPairFilters.any { filter -> filter.matchesActivityPair(first, second) }
+        val splitAttributes = if (vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2) {
+            translate(splitInfo.splitAttributes)
+        } else {
+            vendorApiLevel1Impl.getSplitAttributesCompat(splitInfo)
         }
+        return SplitInfo(primaryFragment, secondaryFragment, splitAttributes)
     }
 
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateActivityIntentPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
-        return predicateAdapter.buildPairPredicate(
-            Activity::class,
-            Intent::class
-        ) { first, second ->
-            splitPairFilters.any { filter -> filter.matchesActivityIntentPair(first, second) }
+    private fun translate(splitAttributes: OEMSplitAttributes): SplitAttributes =
+        SplitAttributes.Builder()
+            .setSplitType(translate(splitAttributes.splitType))
+            .setLayoutDirection(
+                when (val layoutDirection = splitAttributes.layoutDirection) {
+                    OEMSplitAttributes.LayoutDirection.LEFT_TO_RIGHT -> LEFT_TO_RIGHT
+                    OEMSplitAttributes.LayoutDirection.RIGHT_TO_LEFT -> RIGHT_TO_LEFT
+                    OEMSplitAttributes.LayoutDirection.LOCALE -> LOCALE
+                    OEMSplitAttributes.LayoutDirection.TOP_TO_BOTTOM -> TOP_TO_BOTTOM
+                    OEMSplitAttributes.LayoutDirection.BOTTOM_TO_TOP -> BOTTOM_TO_TOP
+                    else -> throw IllegalArgumentException(
+                        "Unknown layout direction: $layoutDirection"
+                    )
+                }
+            )
+            .setAnimationBackgroundColor(splitAttributes.animationBackgroundColor)
+            .build()
+
+    private fun translate(splitType: OEMSplitType): SplitType =
+        when (splitType) {
+            is OEMSplitType.RatioSplitType -> translate(splitType)
+            is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
+            is OEMSplitType.HingeSplitType -> translate(splitType)
+            else -> throw IllegalArgumentException("Unsupported split type: $splitType")
         }
-    }
 
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateParentMetricsPredicate(context: Context, splitRule: SplitRule): Any {
-        return predicateAdapter.buildPredicate(WindowMetrics::class) { windowMetrics ->
-            splitRule.checkParentMetrics(context, windowMetrics)
+    private fun translate(hinge: OEMSplitType.HingeSplitType): SplitType.HingeSplitType =
+        SplitType.splitByHinge(
+            when (val splitType = hinge.fallbackSplitType) {
+                is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
+                is OEMSplitType.RatioSplitType -> translate(splitType)
+                else -> throw IllegalArgumentException("Unsupported split type: $splitType")
+            }
+        )
+
+    private fun translate(splitRatio: OEMSplitType.RatioSplitType): SplitType.RatioSplitType =
+        SplitType.ratio(splitRatio.ratio)
+
+    fun translateSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    ): Function<OEMSplitAttributesCalculatorParams, OEMSplitAttributes> = Function { oemParams ->
+            translateSplitAttributes(calculator.invoke(translate(oemParams)))
         }
+
+    @SuppressLint("NewApi")
+    fun translate(
+        params: OEMSplitAttributesCalculatorParams
+    ): SplitAttributesCalculatorParams = let {
+        val taskWindowMetrics = params.parentWindowMetrics
+        val taskConfiguration = params.parentConfiguration
+        val windowLayoutInfo = params.parentWindowLayoutInfo
+        val defaultSplitAttributes = params.defaultSplitAttributes
+        val areDefaultConstraintsSatisfied = params.areDefaultConstraintsSatisfied()
+        val splitRuleTag = params.splitRuleTag
+        val windowMetrics = WindowMetricsCalculator.translateWindowMetrics(taskWindowMetrics)
+
+        SplitAttributesCalculatorParams(
+            windowMetrics,
+            taskConfiguration,
+            ExtensionsWindowLayoutInfoAdapter.translate(windowMetrics, windowLayoutInfo),
+            translate(defaultSplitAttributes),
+            areDefaultConstraintsSatisfied,
+            splitRuleTag,
+        )
     }
 
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateActivityPredicates(activityFilters: Set<ActivityFilter>): Any {
-        return predicateAdapter.buildPredicate(Activity::class) { activity ->
-            activityFilters.any { filter -> filter.matchesActivity(activity) }
-        }
-    }
-
-    @SuppressLint("ClassVerificationFailure", "NewApi")
-    private fun translateIntentPredicates(activityFilters: Set<ActivityFilter>): Any {
-        return predicateAdapter.buildPredicate(Intent::class) { intent ->
-            activityFilters.any { filter -> filter.matchesIntent(intent) }
-        }
-    }
-
-    @SuppressLint("WrongConstant") // Converting from Jetpack to Extensions constants
     private fun translateSplitPairRule(
         context: Context,
         rule: SplitPairRule,
         predicateClass: Class<*>
     ): OEMSplitPairRule {
-        val builder = SplitPairRuleBuilder::class.java.getConstructor(
-            predicateClass,
-            predicateClass,
-            predicateClass
-        ).newInstance(
-            translateActivityPairPredicates(rule.filters),
-            translateActivityIntentPredicates(rule.filters),
-            translateParentMetricsPredicate(context, rule)
-        )
-            .setSplitRatio(rule.splitRatio)
-            .setLayoutDirection(rule.layoutDirection)
-            .setShouldClearTop(rule.clearTop)
-            .setFinishPrimaryWithSecondary(rule.finishPrimaryWithSecondary)
-            .setFinishSecondaryWithPrimary(rule.finishSecondaryWithPrimary)
-        return builder.build()
+        if (vendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+            return vendorApiLevel1Impl.translateSplitPairRuleCompat(context, rule, predicateClass)
+        } else {
+            val activitiesPairPredicate =
+                Predicate<AndroidPair<Activity, Activity>> { activitiesPair ->
+                    rule.filters.any { filter ->
+                        filter.matchesActivityPair(activitiesPair.first, activitiesPair.second)
+                    }
+                }
+            val activityIntentPredicate =
+                Predicate<AndroidPair<Activity, Intent>> { activityIntentPair ->
+                    rule.filters.any { filter ->
+                        filter.matchesActivityIntentPair(
+                            activityIntentPair.first,
+                            activityIntentPair.second
+                        )
+                    }
+                }
+            val windowMetricsPredicate = Predicate<WindowMetrics> { windowMetrics ->
+                rule.checkParentMetrics(context, windowMetrics)
+            }
+            val tag = rule.tag
+            val builder = SplitPairRuleBuilder(
+                activitiesPairPredicate,
+                activityIntentPredicate,
+                windowMetricsPredicate,
+            )
+                .setDefaultSplitAttributes(translateSplitAttributes(rule.defaultSplitAttributes))
+                .setFinishPrimaryWithSecondary(
+                    translateFinishBehavior(rule.finishPrimaryWithSecondary)
+                ).setFinishSecondaryWithPrimary(
+                    translateFinishBehavior(rule.finishSecondaryWithPrimary)
+                ).setShouldClearTop(rule.clearTop)
+
+            if (tag != null) {
+                builder.setTag(tag)
+            }
+            return builder.build()
+        }
     }
 
-    @SuppressLint("WrongConstant") // Converting from Jetpack to Extensions constants
+    private fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
+        require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
+        // To workaround the "unused" error in ktlint. It is necessary to translate SplitAttributes
+        // from WM Jetpack version to WM extension version.
+        return androidx.window.extensions.embedding.SplitAttributes.Builder()
+            .setSplitType(translateSplitType(splitAttributes.splitType))
+            .setLayoutDirection(
+                when (splitAttributes.layoutDirection) {
+                    LOCALE -> OEMSplitAttributes.LayoutDirection.LOCALE
+                    LEFT_TO_RIGHT -> OEMSplitAttributes.LayoutDirection.LEFT_TO_RIGHT
+                    RIGHT_TO_LEFT -> OEMSplitAttributes.LayoutDirection.RIGHT_TO_LEFT
+                    TOP_TO_BOTTOM -> OEMSplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+                    BOTTOM_TO_TOP -> OEMSplitAttributes.LayoutDirection.BOTTOM_TO_TOP
+                    else -> throw IllegalArgumentException("Unsupported layoutDirection:" +
+                        "$splitAttributes.layoutDirection"
+                    )
+                }
+            )
+            .setAnimationBackgroundColor(splitAttributes.animationBackgroundColor)
+            .build()
+    }
+
+    private fun translateSplitType(splitType: SplitType): OEMSplitType {
+        require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
+        return when (splitType) {
+            is SplitType.HingeSplitType -> translateHinge(splitType)
+            is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
+            is SplitType.RatioSplitType -> translateRatio(splitType)
+            else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
+        }
+    }
+
+    private fun translateHinge(hinge: SplitType.HingeSplitType): OEMSplitType.HingeSplitType =
+        OEMSplitType.HingeSplitType(
+            when (val splitType = hinge.fallbackSplitType) {
+                is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
+                is SplitType.RatioSplitType -> translateRatio(splitType)
+                else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
+            }
+        )
+
+    private fun translateRatio(splitRatio: SplitType.RatioSplitType): OEMSplitType.RatioSplitType =
+        OEMSplitType.RatioSplitType(splitRatio.ratio)
+
     private fun translateSplitPlaceholderRule(
         context: Context,
         rule: SplitPlaceholderRule,
         predicateClass: Class<*>
     ): OEMSplitPlaceholderRule {
-        val builder = SplitPlaceholderRuleBuilder::class.java.getConstructor(
-            Intent::class.java,
-            predicateClass,
-            predicateClass,
-            predicateClass
-        ).newInstance(
-            rule.placeholderIntent,
-            translateActivityPredicates(rule.filters),
-            translateIntentPredicates(rule.filters),
-            translateParentMetricsPredicate(context, rule)
-        )
-            .setSplitRatio(rule.splitRatio)
-            .setLayoutDirection(rule.layoutDirection)
-            .setSticky(rule.isSticky)
-            .safeSetFinishPrimaryWithPlaceholder(rule.finishPrimaryWithPlaceholder)
-        return builder.build()
-    }
-
-    @Suppress("DEPRECATION")
-    // setFinishPrimaryWithSecondary is to be deprecated but we want to make a safe fallback
-    // behavior here for compatibility reason.
-    // Suppressing deprecation warning to prevent breaking build.
-    private fun SplitPlaceholderRuleBuilder.safeSetFinishPrimaryWithPlaceholder(
-        behavior: @SplitPlaceholderRule.SplitPlaceholderFinishBehavior Int
-    ): SplitPlaceholderRuleBuilder {
-       var extensionApiLevel: Int = WindowExtensionsProvider.getWindowExtensions().vendorApiLevel
-        return if (extensionApiLevel >= 2) {
-            setFinishPrimaryWithPlaceholder(behavior)
+        if (vendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+            return vendorApiLevel1Impl.translateSplitPlaceholderRuleCompat(
+                context,
+                rule,
+                predicateClass
+            )
         } else {
-            setFinishPrimaryWithSecondary(behavior)
+            val activityPredicate = Predicate<Activity> { activity ->
+                rule.filters.any { filter -> filter.matchesActivity(activity) }
+            }
+            val intentPredicate = Predicate<Intent> { intent ->
+                rule.filters.any { filter -> filter.matchesIntent(intent) }
+            }
+            val windowMetricsPredicate = Predicate<WindowMetrics> { windowMetrics ->
+                rule.checkParentMetrics(context, windowMetrics)
+            }
+            val tag = rule.tag
+            val builder = SplitPlaceholderRuleBuilder(
+                rule.placeholderIntent,
+                activityPredicate,
+                intentPredicate,
+                windowMetricsPredicate
+            )
+                .setSticky(rule.isSticky)
+                .setDefaultSplitAttributes(translateSplitAttributes(rule.defaultSplitAttributes))
+                .setFinishPrimaryWithPlaceholder(
+                    translateFinishBehavior(rule.finishPrimaryWithPlaceholder)
+                )
+            if (tag != null) {
+                builder.setTag(tag)
+            }
+            return builder.build()
         }
     }
 
+    fun translateFinishBehavior(behavior: SplitRule.FinishBehavior): Int =
+        when (behavior) {
+            SplitRule.FinishBehavior.NEVER -> FINISH_NEVER
+            SplitRule.FinishBehavior.ALWAYS -> FINISH_ALWAYS
+            SplitRule.FinishBehavior.ADJACENT -> FINISH_ADJACENT
+            else -> throw IllegalArgumentException("Unknown finish behavior:$behavior")
+        }
+
     private fun translateActivityRule(
         rule: ActivityRule,
         predicateClass: Class<*>
     ): OEMActivityRule {
-        return ActivityRuleBuilder::class.java.getConstructor(
-            predicateClass,
-            predicateClass
-        ).newInstance(
-            translateActivityPredicates(rule.filters),
-            translateIntentPredicates(rule.filters)
-        )
-            .setShouldAlwaysExpand(rule.alwaysExpand)
-            .build()
+        if (vendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+            return vendorApiLevel1Impl.translateActivityRuleCompat(rule, predicateClass)
+        } else {
+            val activityPredicate = Predicate<Activity> { activity ->
+                rule.filters.any { filter -> filter.matchesActivity(activity) }
+            }
+            val intentPredicate = Predicate<Intent> { intent ->
+                rule.filters.any { filter -> filter.matchesIntent(intent) }
+            }
+            val builder = ActivityRuleBuilder(activityPredicate, intentPredicate)
+                .setShouldAlwaysExpand(rule.alwaysExpand)
+            val tag = rule.tag
+            if (tag != null) {
+                builder.setTag(tag)
+            }
+            return builder.build()
+        }
     }
 
     fun translate(context: Context, rules: Set<EmbeddingRule>): Set<OEMEmbeddingRule> {
@@ -199,4 +335,164 @@
             }
         }.toSet()
     }
+
+    /**
+     * Provides backward compatibility for Window extensions with
+     * [WindowExtensions.VENDOR_API_LEVEL_1]
+     * @see WindowExtensions.getVendorApiLevel
+     */
+    // Suppress deprecation because this object is to provide backward compatibility.
+    @Suppress("DEPRECATION")
+    private inner class VendorApiLevel1Impl(val predicateAdapter: PredicateAdapter) {
+        /**
+         * Obtains [SplitAttributes] from [OEMSplitInfo] with [WindowExtensions.VENDOR_API_LEVEL_1]
+         */
+        fun getSplitAttributesCompat(splitInfo: OEMSplitInfo): SplitAttributes =
+            SplitAttributes.Builder()
+                .setSplitType(SplitType.buildSplitTypeFromValue(splitInfo.splitRatio))
+                .setLayoutDirection(LOCALE)
+                .build()
+
+        fun translateActivityRuleCompat(
+            rule: ActivityRule,
+            predicateClass: Class<*>
+        ): OEMActivityRule = ActivityRuleBuilder::class.java.getConstructor(
+                predicateClass,
+                predicateClass
+            ).newInstance(
+                translateActivityPredicates(rule.filters),
+                translateIntentPredicates(rule.filters)
+            )
+                .setShouldAlwaysExpand(rule.alwaysExpand)
+                .build()
+
+        fun translateSplitPlaceholderRuleCompat(
+            context: Context,
+            rule: SplitPlaceholderRule,
+            predicateClass: Class<*>
+        ): OEMSplitPlaceholderRule = SplitPlaceholderRuleBuilder::class.java.getConstructor(
+                Intent::class.java,
+                predicateClass,
+                predicateClass,
+                predicateClass
+            ).newInstance(
+                rule.placeholderIntent,
+                translateActivityPredicates(rule.filters),
+                translateIntentPredicates(rule.filters),
+                translateParentMetricsPredicate(context, rule)
+            )
+                .setSticky(rule.isSticky)
+                .setFinishPrimaryWithSecondary(
+                    translateFinishBehavior(rule.finishPrimaryWithPlaceholder)
+                ).setDefaultSplitAttributesCompat(rule.defaultSplitAttributes)
+                .build()
+
+        private fun SplitPlaceholderRuleBuilder.setDefaultSplitAttributesCompat(
+            defaultAttrs: SplitAttributes,
+        ): SplitPlaceholderRuleBuilder = apply {
+            val (splitRatio, layoutDirection) = translateSplitAttributesCompatInternal(defaultAttrs)
+            // #setDefaultAttributes or SplitAttributes ctr weren't supported.
+            setSplitRatio(splitRatio)
+            setLayoutDirection(layoutDirection)
+        }
+
+        fun translateSplitPairRuleCompat(
+            context: Context,
+            rule: SplitPairRule,
+            predicateClass: Class<*>
+        ): OEMSplitPairRule = SplitPairRuleBuilder::class.java.getConstructor(
+                predicateClass,
+                predicateClass,
+                predicateClass,
+            ).newInstance(
+                translateActivityPairPredicates(rule.filters),
+                translateActivityIntentPredicates(rule.filters),
+                translateParentMetricsPredicate(context, rule)
+            )
+                .setDefaultSplitAttributesCompat(rule.defaultSplitAttributes)
+                .setShouldClearTop(rule.clearTop)
+                .setFinishPrimaryWithSecondary(
+                    translateFinishBehavior(rule.finishPrimaryWithSecondary)
+                ).setFinishSecondaryWithPrimary(
+                    translateFinishBehavior(rule.finishSecondaryWithPrimary)
+                ).build()
+
+        @SuppressLint("ClassVerificationFailure", "NewApi")
+        private fun translateActivityPairPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
+            return predicateAdapter.buildPairPredicate(
+                Activity::class,
+                Activity::class
+            ) { first: Activity, second: Activity ->
+                splitPairFilters.any { filter -> filter.matchesActivityPair(first, second) }
+            }
+        }
+
+        @SuppressLint("ClassVerificationFailure", "NewApi")
+        private fun translateActivityIntentPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
+            return predicateAdapter.buildPairPredicate(
+                Activity::class,
+                Intent::class
+            ) { first, second ->
+                splitPairFilters.any { filter -> filter.matchesActivityIntentPair(first, second) }
+            }
+        }
+
+        private fun SplitPairRuleBuilder.setDefaultSplitAttributesCompat(
+            defaultAttrs: SplitAttributes,
+        ): SplitPairRuleBuilder = apply {
+            val (splitRatio, layoutDirection) = translateSplitAttributesCompatInternal(defaultAttrs)
+            setSplitRatio(splitRatio)
+            setLayoutDirection(layoutDirection)
+        }
+
+        private fun translateSplitAttributesCompatInternal(
+            attrs: SplitAttributes
+        ): Pair<Float, Int> = // Use a (Float, Integer) pair since SplitAttributes weren't supported
+            if (!isSplitAttributesSupported(attrs)) {
+                // Fallback to expand the secondary container if the SplitAttributes are not
+                // supported.
+                Pair(0.0f, LayoutDirection.LOCALE)
+            } else {
+                Pair(
+                    attrs.splitType.value,
+                    when (attrs.layoutDirection) {
+                        // Legacy LayoutDirection uses LayoutDirection constants in framework APIs.
+                        LOCALE -> LayoutDirection.LOCALE
+                        LEFT_TO_RIGHT -> LayoutDirection.LTR
+                        RIGHT_TO_LEFT -> LayoutDirection.RTL
+                        else -> throw IllegalStateException("Unsupported layout direction must be" +
+                            " covered in @isSplitAttributesSupported!")
+                    }
+                )
+            }
+
+        /**
+         * Returns `true` if `attrs` is compatible with [WindowExtensions.VENDOR_API_LEVEL_1] and
+         * doesn't use the new features introduced in [WindowExtensions.VENDOR_API_LEVEL_2] or
+         * higher.
+         */
+        private fun isSplitAttributesSupported(attrs: SplitAttributes) =
+            attrs.splitType is SplitType.RatioSplitType &&
+                attrs.layoutDirection in arrayOf(LEFT_TO_RIGHT, RIGHT_TO_LEFT, LOCALE)
+
+        @SuppressLint("ClassVerificationFailure", "NewApi")
+        private fun translateActivityPredicates(activityFilters: Set<ActivityFilter>): Any {
+            return predicateAdapter.buildPredicate(Activity::class) { activity ->
+                activityFilters.any { filter -> filter.matchesActivity(activity) }
+            }
+        }
+
+        @SuppressLint("ClassVerificationFailure", "NewApi")
+        private fun translateIntentPredicates(activityFilters: Set<ActivityFilter>): Any {
+            return predicateAdapter.buildPredicate(Intent::class) { intent ->
+                activityFilters.any { filter -> filter.matchesIntent(intent) }
+            }
+        }
+
+        @SuppressLint("ClassVerificationFailure", "NewApi")
+        private fun translateParentMetricsPredicate(context: Context, splitRule: SplitRule): Any =
+            predicateAdapter.buildPredicate(WindowMetrics::class) { windowMetrics ->
+                splitRule.checkParentMetrics(context, windowMetrics)
+            }
+    }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAspectRatio.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAspectRatio.kt
index 643e6fb..e09b9a4 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAspectRatio.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAspectRatio.kt
@@ -19,7 +19,7 @@
 import androidx.annotation.FloatRange
 
 /**
- * The aspect ratio of the parent window bounds to allow embedding with the rule.
+ * The aspect ratio of the parent window bound to allow embedding with the rule.
  *
  * @see SplitRule.maxAspectRatioInPortrait
  * @see SplitRule.maxAspectRatioInLandscape
@@ -60,8 +60,8 @@
          * @param ratio the aspect ratio.
          * @return the [EmbeddingAspectRatio] representing the [ratio].
          *
-         * @see alwaysAllow for always allow embedding.
-         * @see alwaysDisallow for always disallow embedding.
+         * @see ALWAYS_ALLOW for always allow embedding.
+         * @see ALWAYS_DISALLOW for always disallow embedding.
          */
         @JvmStatic
         fun ratio(@FloatRange(from = 1.0, fromInclusive = false) ratio: Float):
@@ -70,18 +70,14 @@
             return EmbeddingAspectRatio("ratio:$ratio", ratio)
         }
 
-        private val ALWAYS_ALLOW = EmbeddingAspectRatio("ALWAYS_ALLOW", 0f)
-
         /**
          * Gets the special [EmbeddingAspectRatio] to represent it always allows embedding.
          *
          * An example use case is to set it on [SplitRule.maxAspectRatioInLandscape] if the app
          * wants to always allow embedding as split when the parent window is in landscape.
          */
-        @JvmStatic
-        fun alwaysAllow() = ALWAYS_ALLOW
-
-        private val ALWAYS_DISALLOW = EmbeddingAspectRatio("ALWAYS_DISALLOW", -1f)
+        @JvmField
+        val ALWAYS_ALLOW = EmbeddingAspectRatio("ALWAYS_ALLOW", 0f)
 
         /**
          * Gets the special [EmbeddingAspectRatio] to represent it always disallows embedding.
@@ -89,8 +85,8 @@
          * An example use case is to set it on [SplitRule.maxAspectRatioInPortrait] if the app
          * wants to disallow embedding as split when the parent window is in portrait.
          */
-        @JvmStatic
-        fun alwaysDisallow() = ALWAYS_DISALLOW
+        @JvmField
+        val ALWAYS_DISALLOW = EmbeddingAspectRatio("ALWAYS_DISALLOW", -1f)
 
         /**
          * Returns a [EmbeddingAspectRatio] with the given [value].
@@ -98,10 +94,10 @@
         internal fun buildAspectRatioFromValue(value: Float): EmbeddingAspectRatio {
             return when (value) {
                 ALWAYS_ALLOW.value -> {
-                    alwaysAllow()
+                    ALWAYS_ALLOW
                 }
                 ALWAYS_DISALLOW.value -> {
-                    alwaysDisallow()
+                    ALWAYS_DISALLOW
                 }
                 else -> {
                     ratio(value)
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
index 539e69d..77ed5ef 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
@@ -43,4 +43,12 @@
     fun isSplitSupported(): Boolean
 
     fun isActivityEmbedded(activity: Activity): Boolean
+
+    fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    )
+
+    fun clearSplitAttributesCalculator()
+
+    fun isSplitAttributesCalculatorSupported(): Boolean
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
index ea701a1..0109ecf 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
@@ -21,8 +21,12 @@
 import android.content.Context
 import android.util.Log
 import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
 import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
+import androidx.window.extensions.WindowExtensions
+import androidx.window.extensions.WindowExtensions.VENDOR_API_LEVEL_2
 import androidx.window.extensions.WindowExtensionsProvider
+import androidx.window.extensions.core.util.function.Consumer
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent
 import java.lang.reflect.Proxy
 
@@ -38,18 +42,40 @@
 ) : EmbeddingInterfaceCompat {
 
     override fun setRules(rules: Set<EmbeddingRule>) {
+        var hasSplitRule = false
+        for (rule in rules) {
+            if (rule is SplitRule) {
+                hasSplitRule = true
+                break
+            }
+        }
+        if (hasSplitRule && !SplitController.getInstance(applicationContext).isSplitSupported()) {
+            Log.e(
+                TAG, "Cannot set SplitRule because ActivityEmbedding Split is not supported" +
+                    " or PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED is not set."
+            )
+            return
+        }
+
         val r = adapter.translate(applicationContext, rules)
         embeddingExtension.setEmbeddingRules(r)
     }
 
     override fun setEmbeddingCallback(embeddingCallback: EmbeddingCallbackInterface) {
-        consumerAdapter.addConsumer(
-            embeddingExtension,
-            List::class,
-            "setSplitInfoCallback"
-        ) { values ->
-            val splitInfoList = values.filterIsInstance<OEMSplitInfo>()
-            embeddingCallback.onSplitInfoChanged(adapter.translate(splitInfoList))
+        if (ExtensionsUtil.safeVendorApiLevel < VENDOR_API_LEVEL_2) {
+            consumerAdapter.addConsumer(
+                embeddingExtension,
+                List::class,
+                "setSplitInfoCallback"
+            ) { values ->
+                val splitInfoList = values.filterIsInstance<OEMSplitInfo>()
+                embeddingCallback.onSplitInfoChanged(adapter.translate(splitInfoList))
+            }
+        } else {
+            val callback = Consumer<List<OEMSplitInfo>> { splitInfoList ->
+                embeddingCallback.onSplitInfoChanged(adapter.translate(splitInfoList))
+            }
+            embeddingExtension.setSplitInfoCallback(callback)
         }
     }
 
@@ -57,6 +83,29 @@
         return embeddingExtension.isActivityEmbedded(activity)
     }
 
+    override fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    ) {
+        if (!isSplitAttributesCalculatorSupported()) {
+            throw UnsupportedOperationException("#setSplitAttributesCalculator is not supported " +
+                "on the device.")
+        }
+        return embeddingExtension.setSplitAttributesCalculator(
+            adapter.translateSplitAttributesCalculator(calculator)
+        )
+    }
+
+    override fun clearSplitAttributesCalculator() {
+        if (!isSplitAttributesCalculatorSupported()) {
+            throw UnsupportedOperationException("#clearSplitAttributesCalculator is not " +
+                "supported on the device.")
+        }
+        return embeddingExtension.clearSplitAttributesCalculator()
+    }
+
+    override fun isSplitAttributesCalculatorSupported(): Boolean =
+        ExtensionsUtil.safeVendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2
+
     companion object {
         const val DEBUG = true
         private const val TAG = "EmbeddingCompat"
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
index ff0f50f..8c74aec 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
@@ -34,4 +34,12 @@
     }
 
     fun isActivityEmbedded(activity: Activity): Boolean
+
+    fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    )
+
+    fun clearSplitAttributesCalculator()
+
+    fun isSplitAttributesCalculatorSupported(): Boolean
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
index e3ff7dd..987360f 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
@@ -20,4 +20,26 @@
  * Base abstract class for activity embedding presentation rules, such as [SplitPairRule] and
  * [ActivityRule]. Allows grouping different rule types together when updating.
  */
-abstract class EmbeddingRule internal constructor()
+abstract class EmbeddingRule internal constructor(
+    /**
+     * A unique string to identify this [EmbeddingRule], which defaults to `null`.
+     * The suggested usage is to set the tag in the corresponding rule builder to be able to
+     * differentiate between different rules in the callbacks. For example, it can be used to
+     * compute the right [SplitAttributes] for the right split rule in callback set in
+     * [SplitController.setSplitAttributesCalculator].
+     *
+     * @see androidx.window.embedding.RuleController.addRule
+     */
+    val tag: String?
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is EmbeddingRule) return false
+
+        return tag == other.tag
+    }
+
+    override fun hashCode(): Int {
+        return tag.hashCode()
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
index 7fb48ffc..666b488 100644
--- a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
@@ -21,13 +21,13 @@
 import android.util.Log
 import androidx.annotation.GuardedBy
 import androidx.annotation.VisibleForTesting
+import androidx.collection.ArraySet
 import androidx.core.util.Consumer
 import androidx.window.core.ConsumerAdapter
 import androidx.window.core.ExtensionsUtil
 import androidx.window.core.PredicateAdapter
 import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
 import java.util.concurrent.CopyOnWriteArrayList
-import java.util.concurrent.CopyOnWriteArraySet
 import java.util.concurrent.Executor
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.concurrent.withLock
@@ -116,30 +116,109 @@
         }
     }
 
-    private val rules: CopyOnWriteArraySet<EmbeddingRule> =
-        CopyOnWriteArraySet<EmbeddingRule>()
+    @GuardedBy("globalLock")
+    private val ruleTracker = RuleTracker()
 
+    @GuardedBy("globalLock")
     override fun getRules(): Set<EmbeddingRule> {
-        return rules
+        globalLock.withLock { return ruleTracker.splitRules }
     }
 
+    @GuardedBy("globalLock")
     override fun setRules(rules: Set<EmbeddingRule>) {
-        this.rules.clear()
-        this.rules.addAll(rules)
-        embeddingExtension?.setRules(this.rules)
-    }
-
-    override fun addRule(rule: EmbeddingRule) {
-        if (!rules.contains(rule)) {
-            rules.add(rule)
-            embeddingExtension?.setRules(rules)
+        globalLock.withLock {
+            ruleTracker.setRules(rules)
+            embeddingExtension?.setRules(getRules())
         }
     }
 
+    @GuardedBy("globalLock")
+    override fun addRule(rule: EmbeddingRule) {
+        globalLock.withLock {
+            if (rule !in ruleTracker) {
+                ruleTracker.addOrUpdateRule(rule)
+                embeddingExtension?.setRules(getRules())
+            }
+        }
+    }
+
+    @GuardedBy("globalLock")
     override fun removeRule(rule: EmbeddingRule) {
-        if (rules.contains(rule)) {
-            rules.remove(rule)
-            embeddingExtension?.setRules(rules)
+        globalLock.withLock {
+            if (rule in ruleTracker) {
+                ruleTracker.removeRule(rule)
+                embeddingExtension?.setRules(getRules())
+            }
+        }
+    }
+
+    /**
+     * A helper class to manage the registered [tags][EmbeddingRule.tag] and [rules][EmbeddingRule]
+     * It supports:
+     *   - Add a set of [rules][EmbeddingRule] and verify if there's duplicated [EmbeddingRule.tag]
+     *     if needed.
+     *   - Clears all registered [rules][EmbeddingRule]
+     *   - Add a runtime [rule][EmbeddingRule] or update an existing [rule][EmbeddingRule] by
+     *   [tag][EmbeddingRule.tag] if the tag has been registered.
+     *   - Remove a runtime [rule][EmbeddingRule]
+     */
+    private class RuleTracker {
+        val splitRules = ArraySet<EmbeddingRule>()
+        private val tagRuleMap = HashMap<String, EmbeddingRule>()
+
+        fun setRules(rules: Set<EmbeddingRule>) {
+            clearRules()
+            rules.forEach { rule -> addOrUpdateRule(rule, throwOnDuplicateTag = true) }
+        }
+
+        fun clearRules() {
+            splitRules.clear()
+            tagRuleMap.clear()
+        }
+
+        /**
+         * Adds a rule to [RuleTracker] or update an existing rule if the [tag][EmbeddingRule.tag]
+         * has been registered and `throwOnDuplicateTag` is `false`
+         * @throws IllegalArgumentException if `throwOnDuplicateTag` is `true` and the
+         * [tag][EmbeddingRule.tag] has been registered.
+         */
+        fun addOrUpdateRule(rule: EmbeddingRule, throwOnDuplicateTag: Boolean = false) {
+            if (rule in splitRules) {
+                return
+            }
+            val tag = rule.tag
+            if (tag == null) {
+                splitRules.add(rule)
+            } else if (tagRuleMap.containsKey(tag)) {
+                if (throwOnDuplicateTag) {
+                    throw IllegalArgumentException("Duplicated tag: $tag. Tag must be unique " +
+                        "among all registered rules")
+                } else {
+                    // Update the rule if throwOnDuplicateTag = false
+                    val oldRule = tagRuleMap[tag]
+                    splitRules.remove(oldRule)
+                    tagRuleMap[tag] = rule
+                    splitRules.add(rule)
+                }
+            } else {
+                tagRuleMap[tag] = rule
+                splitRules.add(rule)
+            }
+        }
+
+        fun removeRule(rule: EmbeddingRule) {
+            if (rule !in splitRules) {
+                return
+            }
+            splitRules.remove(rule)
+            val tag = rule.tag
+            if (tag != null) {
+                tagRuleMap.remove(rule.tag)
+            }
+        }
+
+        operator fun contains(rule: EmbeddingRule): Boolean {
+            return splitRules.contains(rule)
         }
     }
 
@@ -223,4 +302,21 @@
     override fun isActivityEmbedded(activity: Activity): Boolean {
         return embeddingExtension?.isActivityEmbedded(activity) ?: false
     }
+
+    override fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    ) {
+        globalLock.withLock {
+            embeddingExtension?.setSplitAttributesCalculator(calculator)
+        }
+    }
+
+    override fun clearSplitAttributesCalculator() {
+        globalLock.withLock {
+            embeddingExtension?.clearSplitAttributesCalculator()
+        }
+    }
+
+    override fun isSplitAttributesCalculatorSupported(): Boolean =
+        embeddingExtension?.isSplitAttributesCalculatorSupported() ?: false
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/RuleController.kt b/window/window/src/main/java/androidx/window/embedding/RuleController.kt
index 867a1a1..17eac14 100644
--- a/window/window/src/main/java/androidx/window/embedding/RuleController.kt
+++ b/window/window/src/main/java/androidx/window/embedding/RuleController.kt
@@ -38,7 +38,8 @@
     private val embeddingBackend: EmbeddingBackend = ExtensionEmbeddingBackend
         .getInstance(applicationContext)
 
-    // TODO(b/258356512): Make this a coroutine API that returns Flow<Set<EmbeddingRule>>.
+    // TODO(b/258356512): Make this API a make this a coroutine API that returns
+    //  Flow<Set<EmbeddingRule>>.
     /**
      * Returns a copy of the currently registered rules.
      */
@@ -47,11 +48,17 @@
     }
 
     /**
-     * Registers a new rule. Will be cleared automatically when the process is stopped.
+     * Registers a new rule, or updates an existing rule if the [tag][EmbeddingRule.tag] has been
+     * registered with [RuleController]. Will be cleared automatically when the process is stopped.
      *
-     * Note that added rules will **not** be applied to any existing split activity
-     * container, and will only be used for new split containers created with future activity
-     * launches.
+     * Registering a `SplitRule` may fail if the [SplitController.isSplitSupported]
+     * returns `false`. If not supported, it could be either because
+     * [androidx.window.WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED] not enabled
+     * in AndroidManifest or the feature not available on the device.
+     *
+     * Note that registering a new rule or updating the existing rule will **not** be applied to any
+     * existing split activity container, and will only be used for new split containers created
+     * with future activity launches.
      *
      * @param rule new [EmbeddingRule] to register.
      */
@@ -81,6 +88,11 @@
      * - [SplitPlaceholderRule.Builder]
      * - [ActivityRule.Builder]
      *
+     * Registering `SplitRule`s may fail if the [SplitController.isSplitSupported]
+     * returns `false`. If not supported, it could be either because
+     * [androidx.window.WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED] not enabled
+     * in AndroidManifest or the feature not available on the device.
+     *
      * Note that updating the existing rules will **not** be applied to any existing split activity
      * container, and will only be used for new split containers created with future activity
      * launches.
diff --git a/window/window/src/main/java/androidx/window/embedding/RuleParser.kt b/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
index 5d3cea3..c3334c0 100644
--- a/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
+++ b/window/window/src/main/java/androidx/window/embedding/RuleParser.kt
@@ -21,14 +21,13 @@
 import android.content.Intent
 import android.content.res.Resources
 import android.content.res.XmlResourceParser
-import android.util.LayoutDirection
 import androidx.annotation.XmlRes
-
 import androidx.window.R
 import androidx.window.embedding.EmbeddingAspectRatio.Companion.buildAspectRatioFromValue
-import androidx.window.embedding.SplitRule.Companion.FINISH_ALWAYS
-import androidx.window.embedding.SplitRule.Companion.FINISH_NEVER
-
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.getFinishBehaviorFromValue
 import org.xmlpull.v1.XmlPullParser
 
 /**
@@ -67,14 +66,14 @@
                 "SplitPairRule" -> {
                     val splitConfig = parseSplitPairRule(context, parser)
                     lastSplitPairRule = splitConfig
-                    rules.add(lastSplitPairRule)
+                    rules.addRuleWithDuplicatedTagCheck(lastSplitPairRule)
                     lastSplitPlaceholderRule = null
                     lastActivityRule = null
                 }
                 "SplitPlaceholderRule" -> {
                     val placeholderConfig = parseSplitPlaceholderRule(context, parser)
                     lastSplitPlaceholderRule = placeholderConfig
-                    rules.add(lastSplitPlaceholderRule)
+                    rules.addRuleWithDuplicatedTagCheck(lastSplitPlaceholderRule)
                     lastActivityRule = null
                     lastSplitPairRule = null
                 }
@@ -87,11 +86,11 @@
                     val splitFilter = parseSplitPairFilter(context, parser)
                     rules.remove(lastSplitPairRule)
                     lastSplitPairRule += splitFilter
-                    rules.add(lastSplitPairRule)
+                    rules.addRuleWithDuplicatedTagCheck(lastSplitPairRule)
                 }
                 "ActivityRule" -> {
                     val activityConfig = parseActivityRule(context, parser)
-                    rules.add(activityConfig)
+                    rules.addRuleWithDuplicatedTagCheck(activityConfig)
                     lastSplitPairRule = null
                     lastSplitPlaceholderRule = null
                     lastActivityRule = activityConfig
@@ -106,154 +105,191 @@
                     if (lastActivityRule != null) {
                         rules.remove(lastActivityRule)
                         lastActivityRule += activityFilter
-                        rules.add(lastActivityRule)
+                        rules.addRuleWithDuplicatedTagCheck(lastActivityRule)
                     } else if (lastSplitPlaceholderRule != null) {
                         rules.remove(lastSplitPlaceholderRule)
                         lastSplitPlaceholderRule += activityFilter
-                        rules.add(lastSplitPlaceholderRule)
+                        rules.addRuleWithDuplicatedTagCheck(lastSplitPlaceholderRule)
                     }
                 }
             }
             type = parser.next()
         }
-
         return rules
     }
 
+    private fun HashSet<EmbeddingRule>.addRuleWithDuplicatedTagCheck(rule: EmbeddingRule) {
+        val tag = rule.tag
+        forEach { addedRule ->
+            if (tag != null && tag == addedRule.tag) {
+                throw IllegalArgumentException("Duplicated tag: $tag for $rule. " +
+                    "The tag must be unique in XML rule definition.")
+            }
+        }
+        add(rule)
+    }
+
     private fun parseSplitPairRule(
         context: Context,
         parser: XmlResourceParser
-    ): SplitPairRule {
-        val ratio: Float
-        val minWidthDp: Int
-        val minSmallestWidthDp: Int
-        val maxAspectRatioInPortrait: Float
-        val maxAspectRatioInLandscape: Float
-        val layoutDir: Int
-        val finishPrimaryWithSecondary: Int
-        val finishSecondaryWithPrimary: Int
-        val clearTop: Boolean
+    ): SplitPairRule =
         context.theme.obtainStyledAttributes(
             parser,
             R.styleable.SplitPairRule,
             0,
             0
-        ).apply {
-            ratio = getFloat(R.styleable.SplitPairRule_splitRatio, 0.5f)
-            minWidthDp = getInteger(
+        ).let { typedArray ->
+            val tag = typedArray.getString(R.styleable.SplitPairRule_tag)
+            val ratio = typedArray.getFloat(R.styleable.SplitPairRule_splitRatio, 0.5f)
+            val minWidthDp = typedArray.getInteger(
                 R.styleable.SplitPairRule_splitMinWidthDp,
                 SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
             )
-            minSmallestWidthDp = getInteger(
+            val minHeightDp = typedArray.getInteger(
+                R.styleable.SplitPairRule_splitMinHeightDp,
+                SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
+            )
+            val minSmallestWidthDp = typedArray.getInteger(
                 R.styleable.SplitPairRule_splitMinSmallestWidthDp,
                 SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
             )
-            maxAspectRatioInPortrait = getFloat(
+            val maxAspectRatioInPortrait = typedArray.getFloat(
                 R.styleable.SplitPairRule_splitMaxAspectRatioInPortrait,
                 SplitRule.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT.value
             )
-            maxAspectRatioInLandscape = getFloat(
+            val maxAspectRatioInLandscape = typedArray.getFloat(
                 R.styleable.SplitPairRule_splitMaxAspectRatioInLandscape,
                 SplitRule.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT.value
             )
-            layoutDir = getInt(
+            val layoutDir = typedArray.getInt(
                 R.styleable.SplitPairRule_splitLayoutDirection,
-                LayoutDirection.LOCALE
+                LOCALE.value
             )
-            finishPrimaryWithSecondary =
-                getInt(R.styleable.SplitPairRule_finishPrimaryWithSecondary, FINISH_NEVER)
-            finishSecondaryWithPrimary =
-                getInt(R.styleable.SplitPairRule_finishSecondaryWithPrimary, FINISH_ALWAYS)
-            clearTop =
-                getBoolean(R.styleable.SplitPairRule_clearTop, false)
+            val finishPrimaryWithSecondary = typedArray.getInt(
+                R.styleable.SplitPairRule_finishPrimaryWithSecondary,
+                NEVER.value
+            )
+            val finishSecondaryWithPrimary = typedArray.getInt(
+                R.styleable.SplitPairRule_finishSecondaryWithPrimary,
+                ALWAYS.value
+            )
+            val clearTop = typedArray.getBoolean(R.styleable.SplitPairRule_clearTop, false)
+            val animationBackgroundColor = typedArray.getColor(
+                R.styleable.SplitPairRule_animationBackgroundColor,
+                0)
+            typedArray.recycle()
+
+            val defaultAttrs = SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.buildSplitTypeFromValue(ratio))
+                .setLayoutDirection(
+                    SplitAttributes.LayoutDirection.getLayoutDirectionFromValue(layoutDir)
+                )
+                .setAnimationBackgroundColor(animationBackgroundColor)
+                .build()
+
+            SplitPairRule.Builder(emptySet())
+                .setTag(tag)
+                .setMinWidthDp(minWidthDp)
+                .setMinHeightDp(minHeightDp)
+                .setMinSmallestWidthDp(minSmallestWidthDp)
+                .setMaxAspectRatioInPortrait(buildAspectRatioFromValue(maxAspectRatioInPortrait))
+                .setMaxAspectRatioInLandscape(buildAspectRatioFromValue(maxAspectRatioInLandscape))
+                .setFinishPrimaryWithSecondary(
+                    getFinishBehaviorFromValue(finishPrimaryWithSecondary))
+                .setFinishSecondaryWithPrimary(
+                    getFinishBehaviorFromValue(finishSecondaryWithPrimary))
+                .setClearTop(clearTop)
+                .setDefaultSplitAttributes(defaultAttrs)
+                .build()
         }
-        return SplitPairRule.Builder(emptySet())
-            .setMinWidthDp(minWidthDp)
-            .setMinSmallestWidthDp(minSmallestWidthDp)
-            .setMaxAspectRatioInPortrait(buildAspectRatioFromValue(maxAspectRatioInPortrait))
-            .setMaxAspectRatioInLandscape(buildAspectRatioFromValue(maxAspectRatioInLandscape))
-            .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary)
-            .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary)
-            .setClearTop(clearTop)
-            .setSplitRatio(ratio)
-            .setLayoutDirection(layoutDir)
-            .build()
-    }
 
     private fun parseSplitPlaceholderRule(
         context: Context,
         parser: XmlResourceParser
-    ): SplitPlaceholderRule {
-        val placeholderActivityIntentName: String?
-        val stickyPlaceholder: Boolean
-        val finishPrimaryWithPlaceholder: Int
-        val ratio: Float
-        val minWidthDp: Int
-        val minSmallestWidthDp: Int
-        val maxAspectRatioInPortrait: Float
-        val maxAspectRatioInLandscape: Float
-        val layoutDir: Int
+    ): SplitPlaceholderRule =
         context.theme.obtainStyledAttributes(
             parser,
             R.styleable.SplitPlaceholderRule,
             0,
             0
-        ).apply {
-            placeholderActivityIntentName = getString(
+        ).let { typedArray ->
+            val tag = typedArray.getString(R.styleable.SplitPlaceholderRule_tag)
+            val placeholderActivityIntentName = typedArray.getString(
                 R.styleable.SplitPlaceholderRule_placeholderActivityName
             )
-            stickyPlaceholder = getBoolean(R.styleable.SplitPlaceholderRule_stickyPlaceholder,
-                false)
-            finishPrimaryWithPlaceholder =
-                getInt(R.styleable.SplitPlaceholderRule_finishPrimaryWithPlaceholder, FINISH_ALWAYS)
-            ratio = getFloat(R.styleable.SplitPlaceholderRule_splitRatio, 0.5f)
-            minWidthDp = getInteger(
+            val stickyPlaceholder = typedArray.getBoolean(
+                R.styleable.SplitPlaceholderRule_stickyPlaceholder,
+                false
+            )
+            val finishPrimaryWithPlaceholder = typedArray.getInt(
+                R.styleable.SplitPlaceholderRule_finishPrimaryWithPlaceholder,
+                ALWAYS.value
+            )
+            if (finishPrimaryWithPlaceholder == NEVER.value) {
+                throw IllegalArgumentException(
+                    "Never is not a valid configuration for Placeholder activities. " +
+                        "Please use FINISH_ALWAYS or FINISH_ADJACENT instead or refer to the " +
+                        "current API")
+            }
+            val ratio = typedArray.getFloat(R.styleable.SplitPlaceholderRule_splitRatio, 0.5f)
+            val minWidthDp = typedArray.getInteger(
                 R.styleable.SplitPlaceholderRule_splitMinWidthDp,
                 SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
             )
-            minSmallestWidthDp = getInteger(
+            val minHeightDp = typedArray.getInteger(
+                R.styleable.SplitPlaceholderRule_splitMinHeightDp,
+                SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
+            )
+            val minSmallestWidthDp = typedArray.getInteger(
                 R.styleable.SplitPlaceholderRule_splitMinSmallestWidthDp,
                 SplitRule.SPLIT_MIN_DIMENSION_DP_DEFAULT
             )
-            maxAspectRatioInPortrait = getFloat(
+            val maxAspectRatioInPortrait = typedArray.getFloat(
                 R.styleable.SplitPlaceholderRule_splitMaxAspectRatioInPortrait,
                 SplitRule.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT.value
             )
-            maxAspectRatioInLandscape = getFloat(
+            val maxAspectRatioInLandscape = typedArray.getFloat(
                 R.styleable.SplitPlaceholderRule_splitMaxAspectRatioInLandscape,
                 SplitRule.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT.value
             )
-            layoutDir = getInt(
+            val layoutDir = typedArray.getInt(
                 R.styleable.SplitPlaceholderRule_splitLayoutDirection,
-                LayoutDirection.LOCALE
+                LOCALE.value
             )
-        }
-        if (finishPrimaryWithPlaceholder == FINISH_NEVER) {
-                throw IllegalArgumentException(
-                    "FINISH_NEVER is not a valid configuration for Placeholder activities. " +
-                        "Please use FINISH_ALWAYS or FINISH_ADJACENT instead or refer to the " +
-                        "current API")
-        }
-        val packageName = context.applicationContext.packageName
-        val placeholderActivityClassName = buildClassName(
-            packageName,
-            placeholderActivityIntentName
-        )
+            val animationBackgroundColor = typedArray.getColor(
+                R.styleable.SplitPlaceholderRule_animationBackgroundColor,
+                0)
+            typedArray.recycle()
 
-        return SplitPlaceholderRule.Builder(
-            emptySet(),
-            Intent().setComponent(placeholderActivityClassName)
-        )
-            .setMinWidthDp(minWidthDp)
-            .setMinSmallestWidthDp(minSmallestWidthDp)
-            .setMaxAspectRatioInPortrait(buildAspectRatioFromValue(maxAspectRatioInPortrait))
-            .setMaxAspectRatioInLandscape(buildAspectRatioFromValue(maxAspectRatioInLandscape))
-            .setSticky(stickyPlaceholder)
-            .setFinishPrimaryWithPlaceholder(finishPrimaryWithPlaceholder)
-            .setSplitRatio(ratio)
-            .setLayoutDirection(layoutDir)
-            .build()
-    }
+            val defaultAttrs = SplitAttributes.Builder()
+                .setSplitType(SplitAttributes.SplitType.buildSplitTypeFromValue(ratio))
+                .setLayoutDirection(
+                    SplitAttributes.LayoutDirection.getLayoutDirectionFromValue(layoutDir)
+                )
+                .setAnimationBackgroundColor(animationBackgroundColor)
+                .build()
+            val packageName = context.applicationContext.packageName
+            val placeholderActivityClassName = buildClassName(
+                packageName,
+                placeholderActivityIntentName
+            )
+
+            SplitPlaceholderRule.Builder(
+                emptySet(),
+                Intent().setComponent(placeholderActivityClassName)
+            )
+                .setTag(tag)
+                .setMinWidthDp(minWidthDp)
+                .setMinHeightDp(minHeightDp)
+                .setMinSmallestWidthDp(minSmallestWidthDp)
+                .setMaxAspectRatioInPortrait(buildAspectRatioFromValue(maxAspectRatioInPortrait))
+                .setMaxAspectRatioInLandscape(buildAspectRatioFromValue(maxAspectRatioInLandscape))
+                .setSticky(stickyPlaceholder)
+                .setFinishPrimaryWithPlaceholder(
+                    getFinishBehaviorFromValue(finishPrimaryWithPlaceholder))
+                .setDefaultSplitAttributes(defaultAttrs)
+                .build()
+        }
 
     private fun parseSplitPairFilter(
         context: Context,
@@ -289,18 +325,23 @@
     private fun parseActivityRule(
         context: Context,
         parser: XmlResourceParser
-    ): ActivityRule {
-        val alwaysExpand: Boolean
+    ): ActivityRule =
         context.theme.obtainStyledAttributes(
             parser,
             R.styleable.ActivityRule,
             0,
             0
-        ).apply {
-            alwaysExpand = getBoolean(R.styleable.ActivityRule_alwaysExpand, false)
+        ).let { typedArray ->
+            val tag = typedArray.getString(R.styleable.ActivityRule_tag)
+            val alwaysExpand = typedArray.getBoolean(R.styleable.ActivityRule_alwaysExpand, false)
+            typedArray.recycle()
+
+            val builder = ActivityRule.Builder(emptySet()).setAlwaysExpand(alwaysExpand)
+            if (tag != null) {
+                builder.setTag(tag)
+            }
+            builder.build()
         }
-        return ActivityRule.Builder(emptySet()).setAlwaysExpand(alwaysExpand).build()
-    }
 
     private fun parseActivityFilter(
         context: Context,
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
new file mode 100644
index 0000000..d83ce52
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
@@ -0,0 +1,535 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.embedding
+
+import android.annotation.SuppressLint
+import androidx.annotation.ColorInt
+import androidx.annotation.FloatRange
+import androidx.annotation.IntRange
+import androidx.window.core.SpecificationComputer.Companion.startSpecification
+import androidx.window.core.VerificationMode
+import androidx.window.embedding.SplitAttributes.LayoutDirection
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.splitEqually
+
+/**
+ * Attributes that describe how the parent window (typically the activity task
+ * window) is split between the primary and secondary activity containers,
+ * including:
+ *   - Split type &mdash; Categorizes the split and specifies the sizes of the
+ *     primary and secondary activity containers relative to the parent bounds
+ *   - Layout direction &mdash; Specifies whether the parent window is split
+ *     vertically or horizontally and in which direction the primary and
+ *     secondary containers are respectively positioned (left to right, right to
+ *     left, top to bottom, and so forth)
+ *   - Animation background color &mdash; The color of the background during
+ *     animation of the split involving this `SplitAttributes` object if the
+ *     animation requires a background
+ *
+ * Attributes can be configured by:
+ *   - Setting the default `SplitAttributes` using
+ *     [SplitPairRule.Builder.setDefaultSplitAttributes] or
+ *     [SplitPlaceholderRule.Builder.setDefaultSplitAttributes].
+ *   - Setting `splitRatio`, `splitLayoutDirection`, and
+ *     `animationBackgroundColor` attributes in `<SplitPairRule>` or
+ *     `<SplitPlaceholderRule>` tags in an XML configuration file. The
+ *     attributes are parsed as [SplitType], [LayoutDirection], and [ColorInt],
+ *     respectively. Note that [SplitType.HingeSplitType] is not supported XML
+ *     format.
+ *   - Using
+ *     [SplitAttributesCalculator.computeSplitAttributesForParams] to customize
+ *     the `SplitAttributes` for a given device and window state.
+ *
+ * @see SplitAttributes.SplitType
+ * @see SplitAttributes.LayoutDirection
+ */
+class SplitAttributes internal constructor(
+
+    /**
+     * The split type attribute. Defaults to an equal split of the parent window
+     * for the primary and secondary containers.
+     */
+    val splitType: SplitType = splitEqually(),
+
+    /**
+     * The layout direction attribute for the parent window split. The default
+     * is based on locale.
+     */
+    val layoutDirection: LayoutDirection = LOCALE,
+
+    /**
+     * The [ColorInt] to use for the background color during the animation of
+     * the split involving this `SplitAttributes` object if the animation
+     * requires a background.
+     *
+     * The default is 0, which specifies the theme window background color.
+     */
+    @ColorInt
+    val animationBackgroundColor: Int = 0
+) {
+
+    /**
+     * The type of parent window split, which defines the proportion of the
+     * parent window occupied by the primary and secondary activity containers.
+     */
+    open class SplitType internal constructor(
+
+        /**
+         * The description of this `SplitType`.
+         */
+        internal val description: String,
+
+        /**
+         * An identifier for the split type.
+         *
+         * Used in the evaluation in the `equals()` method.
+         */
+        internal val value: Float,
+
+    ) {
+
+        /**
+         * A string representation of this split type.
+         *
+         * @return The string representation of the object.
+         */
+        override fun toString(): String = description
+
+        /**
+         * Determines whether this object is the same type of split as the
+         * compared object.
+         *
+         * @param other The object to compare to this object.
+         * @return True if the objects are the same split type, false otherwise.
+         */
+        override fun equals(other: Any?): Boolean {
+            if (other === this) return true
+            if (other !is SplitType) return false
+            return value == other.value &&
+                description == other.description
+        }
+
+        /**
+         * Returns a hash code for this split type.
+         *
+         * @return The hash code for this object.
+         */
+        override fun hashCode(): Int = description.hashCode() + 31 * value.hashCode()
+
+        /**
+         * A window split that's based on the ratio of the size of the primary
+         * container to the size of the parent window.
+         *
+         * @see SplitAttributes.SplitType.ratio
+         */
+        class RatioSplitType internal constructor(
+
+            /**
+             * The proportion of the parent window occupied by the primary
+             * container of the split.
+             */
+            @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
+            val ratio: Float
+
+        ) : SplitType("ratio:$ratio", ratio)
+
+        /**
+         * A window split in which the primary and secondary activity containers
+         * each occupy the entire parent window.
+         *
+         * The secondary container overlays the primary container.
+         *
+         * @see SplitAttributes.SplitType.ExpandContainersSplitType
+         */
+        class ExpandContainersSplitType internal constructor() : SplitType("expandContainer", 0.0f)
+
+        /**
+         * A parent window split that conforms to a hinge or separating fold in
+         * the device display.
+         *
+         * @see SplitAttributes.SplitType.splitByHinge
+         */
+        class HingeSplitType internal constructor(
+
+            /**
+             * The split type to use if a split based on the device hinge or
+             * separating fold cannot be determined.
+             */
+            val fallbackSplitType: SplitType
+
+        ) : SplitType("hinge, fallback=$fallbackSplitType", -1.0f)
+
+        /**
+         * Methods that create various split types.
+         */
+        companion object {
+
+            /**
+             * Creates a split type based on the proportion of the parent window
+             * occupied by the primary container of the split.
+             *
+             * Values in the non-inclusive range (0.0, 1.0) define the size of
+             * the primary container relative to the size of the parent window:
+             * - 0.5 &mdash; Primary container occupies half of the parent
+             *   window; secondary container, the other half
+             * - &gt; 0.5 &mdash; Primary container occupies a larger proportion
+             *   of the parent window than the secondary container
+             * - &lt; 0.5 &mdash; Primary container occupies a smaller
+             *   proportion of the parent window than the secondary container
+             *
+             * @param ratio The proportion of the parent window occupied by the
+             *     primary container of the split.
+             * @return An instance of [RatioSplitType] with the specified ratio.
+             */
+            @JvmStatic
+            fun ratio(
+                @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
+                ratio: Float
+            ): RatioSplitType {
+                val checkedRatio = ratio.startSpecification(
+                    TAG,
+                    VerificationMode.STRICT
+                ).require("Ratio must be in range (0.0, 1.0). " +
+                    "Use SplitType.expandContainers() instead of 0 or 1.") {
+                    ratio in 0.0..1.0 && ratio !in arrayOf(0.0f, 1.0f)
+                }.compute()!!
+                return RatioSplitType(checkedRatio)
+            }
+
+            private val EXPAND_CONTAINERS = ExpandContainersSplitType()
+
+            /**
+             * Creates a split type in which the primary and secondary activity
+             * containers each expand to fill the parent window; the secondary
+             * container overlays the primary container.
+             *
+             * Use this method with the function set in
+             * [SplitController.setSplitAttributesCalculator] to expand the activity containers in
+             * some device states. The following sample shows how to always fill the parent bounds
+             * if the device is in portrait orientation:
+             *
+             * @sample androidx.window.samples.embedding.expandContainersInPortrait
+             *
+             * @return An instance of [ExpandContainersSplitType].
+             */
+            @JvmStatic
+            fun expandContainers(): ExpandContainersSplitType = EXPAND_CONTAINERS
+
+            /**
+             * Creates a split type in which the primary and secondary
+             * containers occupy equal portions of the parent window.
+             *
+             * Serves as the default [SplitType].
+             *
+             * @return A `RatioSplitType` in which the activity containers
+             *     occupy equal portions of the parent window.
+             */
+            @JvmStatic
+            fun splitEqually(): RatioSplitType = ratio(0.5f)
+
+            /**
+             * Creates a split type in which the split ratio conforms to the
+             * position of a hinge or separating fold in the device display.
+             *
+             * The split type is created only if:
+             * <ul>
+             *     <li>The host task is not in multi-window mode (e.g.,
+             *         split-screen mode or picture-in-picture mode)</li>
+             *     <li>The device has a hinge or separating fold reported by
+             *         [androidx.window.layout.FoldingFeature.isSeparating]</li>
+             *     <li>The hinge or separating fold orientation matches how the
+             *         parent bounds are split:
+             *         <ul style="list-style-type: circle;">
+             *             <li>The hinge or fold orientation is vertical, and
+             *                 the parent bounds are also split vertically
+             *                 (containers are side by side)</li>
+             *             <li>The hinge or fold orientation is horizontal, and
+             *                 the parent bounds are also split horizontally
+             *                 (containers are top and bottom)</li>
+             *         </ul>
+             *     </li>
+             * </ul>
+             *
+             * Otherwise, the method falls back to `fallbackSplitType`.
+             *
+             * @param fallbackSplitType The split type to use if a split based
+             *     on the device hinge or separating fold cannot be determined.
+             *     Can be a [RatioSplitType] or [ExpandContainersSplitType].
+             *     Defaults to [SplitType.splitEqually].
+             * @return An instance of [HingeSplitType] with a fallback split
+             *     type.
+             */
+            @JvmStatic
+            fun splitByHinge(
+                fallbackSplitType: SplitType = splitEqually()
+            ): HingeSplitType {
+                val checkedType = fallbackSplitType.startSpecification(
+                    TAG,
+                    VerificationMode.STRICT
+                ).require(
+                    "FallbackSplitType must be a RatioSplitType or ExpandContainerSplitType"
+                ) {
+                    fallbackSplitType is RatioSplitType ||
+                        fallbackSplitType is ExpandContainersSplitType
+                }.compute()!!
+                return HingeSplitType(checkedType)
+            }
+
+            /**
+             * Returns a `SplitType` with the given `value`.
+             */
+            @SuppressLint("Range") // value = 0.0 is covered.
+            @JvmStatic
+            internal fun buildSplitTypeFromValue(
+                @FloatRange(from = 0.0, to = 1.0, toInclusive = false) value: Float
+            ) = if (value == EXPAND_CONTAINERS.value) {
+                    expandContainers()
+                } else {
+                    ratio(value)
+                }
+        }
+    }
+
+    /**
+     * The layout direction of the primary and secondary activity containers.
+     */
+    class LayoutDirection private constructor(
+
+        /**
+         * The description of this `LayoutDirection`.
+         */
+        private val description: String,
+
+        /**
+         * The enum value defined in `splitLayoutDirection` attributes in
+         * `attrs.xml`.
+         */
+        internal val value: Int,
+
+    ) {
+
+        /**
+         * A string representation of this `LayoutDirection`.
+         *
+         * @return The string representation of the object.
+         */
+        override fun toString(): String = description
+
+        /**
+         * Non-public properties and methods.
+         */
+        companion object {
+            /**
+             * Specifies that the parent bounds are split vertically (side to
+             * side).
+             *
+             * The direction of the primary and secondary containers is deduced
+             * from the locale as either `LEFT_TO_RIGHT` or `RIGHT_TO_LEFT`.
+             *
+             * See also [layoutDirection].
+             */
+            @JvmField
+            val LOCALE = LayoutDirection("LOCALE", 0)
+            /**
+             * Specifies that the parent bounds are split vertically (side to
+             * side).
+             *
+             * Places the primary container in the left portion of the parent
+             * window, and the secondary container in the right portion.
+             *
+             * <img width="70%" height="70%" src="/images/guide/topics/large-screens/activity-embedding/reference-docs/a_to_a_b_ltr.png" alt="Activity A starts activity B to the right."/>
+             *
+             * See also [layoutDirection].
+             */
+            @JvmField
+            val LEFT_TO_RIGHT = LayoutDirection("LEFT_TO_RIGHT", 1)
+            /**
+             * Specifies that the parent bounds are split vertically (side to
+             * side).
+             *
+             * Places the primary container in the right portion of the parent
+             * window, and the secondary container in the left portion.
+             *
+             * <img width="70%" height="70%" src="/images/guide/topics/large-screens/activity-embedding/reference-docs/a_to_a_b_rtl.png" alt="Activity A starts activity B to the left."/>
+             *
+             * See also [layoutDirection].
+             */
+            @JvmField
+            val RIGHT_TO_LEFT = LayoutDirection("RIGHT_TO_LEFT", 2)
+            /**
+             * Specifies that the parent bounds are split horizontally (top and
+             * bottom).
+             *
+             * Places the primary container in the top portion of the parent
+             * window, and the secondary container in the bottom portion.
+             *
+             * <img width="70%" height="70%" src="/images/guide/topics/large-screens/activity-embedding/reference-docs/a_to_a_b_ttb.png" alt="Activity A starts activity B to the bottom."/>
+             *
+             * If the horizontal layout direction is not supported on the
+             * device, layout direction falls back to `LOCALE`.
+             *
+             * See also [layoutDirection].
+             */
+            @JvmField
+            val TOP_TO_BOTTOM = LayoutDirection("TOP_TO_BOTTOM", 3)
+            /**
+             * Specifies that the parent bounds are split horizontally (top and
+             * bottom).
+             *
+             * Places the primary container in the bottom portion of the parent
+             * window, and the secondary container in the top portion.
+             *
+             * <img width="70%" height="70%" src="/images/guide/topics/large-screens/activity-embedding/reference-docs/a_to_a_b_btt.png" alt="Activity A starts activity B to the top."/>
+             *
+             * If the horizontal layout direction is not supported on the
+             * device, layout direction falls back to `LOCALE`.
+             *
+             * See also [layoutDirection].
+             */
+            @JvmField
+            val BOTTOM_TO_TOP = LayoutDirection("BOTTOM_TO_TOP", 4)
+
+            /**
+             * Returns `LayoutDirection` with the given `value`.
+             */
+            @JvmStatic
+            internal fun getLayoutDirectionFromValue(
+                @IntRange(from = 0, to = 4) value: Int
+            ) = when (value) {
+                LEFT_TO_RIGHT.value -> LEFT_TO_RIGHT
+                RIGHT_TO_LEFT.value -> RIGHT_TO_LEFT
+                LOCALE.value -> LOCALE
+                TOP_TO_BOTTOM.value -> TOP_TO_BOTTOM
+                BOTTOM_TO_TOP.value -> BOTTOM_TO_TOP
+                else -> throw IllegalArgumentException("Undefined value:$value")
+            }
+        }
+    }
+
+    /**
+     * Non-public properties and methods.
+     */
+    companion object {
+        private val TAG = SplitAttributes::class.java.simpleName
+    }
+
+    /**
+     * Returns a hash code for this `SplitAttributes` object.
+     *
+     * @return The hash code for this object.
+     */
+    override fun hashCode(): Int {
+        var result = splitType.hashCode()
+        result = result * 31 + layoutDirection.hashCode()
+        result = result * 31 + animationBackgroundColor.hashCode()
+        return result
+    }
+
+    /**
+     * Determines whether this object has the same split attributes as the
+     * compared object.
+     *
+     * @param other The object to compare to this object.
+     * @return True if the objects have the same split attributes, false
+     * otherwise.
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is SplitAttributes) return false
+        return splitType == other.splitType &&
+            layoutDirection == other.layoutDirection &&
+            animationBackgroundColor == other.animationBackgroundColor
+    }
+
+    /**
+     * A string representation of this `SplitAttributes` object.
+     *
+     * @return The string representation of the object.
+     */
+    override fun toString(): String =
+        "${SplitAttributes::class.java.simpleName}:" +
+            "{splitType=$splitType, layoutDir=$layoutDirection," +
+            " animationBackgroundColor=${Integer.toHexString(animationBackgroundColor)}"
+
+    /**
+     * Builder for creating an instance of [SplitAttributes].
+     *
+     * The default split type is an equal split between primary and secondary
+     * containers. The default layout direction is based on locale. The default
+     * animation background color is 0, which specifies the theme window
+     * background color.
+     */
+    class Builder {
+        private var splitType: SplitType = splitEqually()
+        private var layoutDirection = LOCALE
+        @ColorInt
+        private var animationBackgroundColor = 0
+
+        /**
+         * Sets the split type attribute.
+         *
+         * The default is an equal split between primary and secondary
+         * containers.
+         *
+         * @param type The split type attribute.
+         * @return This `Builder`.
+         *
+         * @see SplitAttributes.SplitType
+         */
+        fun setSplitType(type: SplitType): Builder = apply { splitType = type }
+
+        /**
+         * Sets the split layout direction attribute.
+         *
+         * The default is based on locale.
+         *
+         * @param layoutDirection The layout direction attribute.
+         * @return This `Builder`.
+         *
+         * @see SplitAttributes.LayoutDirection
+         */
+        fun setLayoutDirection(layoutDirection: LayoutDirection): Builder =
+            apply { this.layoutDirection = layoutDirection }
+
+        /**
+         * Sets the [ColorInt] to use for the background color during animation
+         * of the split involving this `SplitAttributes` object if the animation
+         * requires a background.
+         *
+         * The default is 0, which specifies the theme window background color.
+         *
+         * @param color A packed color int of the form `AARRGGBB`, for the
+         * animation background color.
+         * @return This `Builder`.
+         *
+         * @see SplitAttributes.animationBackgroundColor
+         */
+        fun setAnimationBackgroundColor(@ColorInt color: Int): Builder =
+            apply { this.animationBackgroundColor = color }
+
+        /**
+         * Builds a `SplitAttributes` instance with the attributes specified by
+         * [setSplitType], [setLayoutDirection], and
+         * [setAnimationBackgroundColor].
+         *
+         * @return The new `SplitAttributes` instance.
+         */
+        fun build(): SplitAttributes = SplitAttributes(splitType, layoutDirection,
+            animationBackgroundColor)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitAttributesCalculatorParams.kt b/window/window/src/main/java/androidx/window/embedding/SplitAttributesCalculatorParams.kt
new file mode 100644
index 0000000..40453be
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributesCalculatorParams.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.embedding
+
+import android.content.res.Configuration
+import androidx.annotation.RestrictTo
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
+
+/**
+ * The parameter container used to report the current device and window state in
+ * [SplitController.setSplitAttributesCalculator] and references the corresponding [SplitRule] by
+ * [splitRuleTag] if [SplitPairRule.tag] is specified.
+ */
+class SplitAttributesCalculatorParams @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) constructor(
+    /** The parent container's [WindowMetrics] */
+    val parentWindowMetrics: WindowMetrics,
+    /** The parent container's [Configuration] */
+    val parentConfiguration: Configuration,
+    /** The parent container's [WindowLayoutInfo] */
+    val parentWindowLayoutInfo: WindowLayoutInfo,
+    /**
+     * The [SplitRule.defaultSplitAttributes]. It could be from [SplitRule] Builder APIs
+     * ([SplitPairRule.Builder.setDefaultSplitAttributes] or
+     * [SplitPlaceholderRule.Builder.setDefaultSplitAttributes]) or from the `splitRatio` and
+     * `splitLayoutDirection` attributes from static rule definitions.
+     */
+    val defaultSplitAttributes: SplitAttributes,
+    /**
+     * Whether the [parentWindowMetrics] satisfies the dimensions and aspect
+     * ratios requirements specified in the [SplitRule], which are:
+     *  - [SplitRule.minWidthDp]
+     *  - [SplitRule.minHeightDp]
+     *  - [SplitRule.minSmallestWidthDp]
+     *  - [SplitRule.maxAspectRatioInPortrait]
+     *  - [SplitRule.maxAspectRatioInLandscape]
+     */
+    @get: JvmName("areDefaultConstraintsSatisfied")
+    val areDefaultConstraintsSatisfied: Boolean,
+    /**
+     * The [tag of `SplitRule`][SplitRule.tag] to apply this [SplitAttributes], which is `null`
+     * if the tag is not set.
+     *
+     * @see SplitPairRule.Builder.setTag
+     * @see SplitPlaceholderRule.Builder.setTag
+     */
+    val splitRuleTag: String?,
+) {
+    override fun toString(): String =
+        "${SplitAttributesCalculatorParams::class.java.simpleName}:{" +
+            "windowMetrics=$parentWindowMetrics" +
+            ", configuration=$parentConfiguration" +
+            ", windowLayoutInfo=$parentWindowLayoutInfo" +
+            ", defaultSplitAttributes=$defaultSplitAttributes" +
+            ", areDefaultConstraintsSatisfied=$areDefaultConstraintsSatisfied" +
+            ", tag=$splitRuleTag}"
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitController.kt b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
index 4825dc0..9e061b5 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitController.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
@@ -18,26 +18,36 @@
 
 import android.app.Activity
 import android.content.Context
+import android.content.pm.PackageManager
+import android.os.Build
+import android.util.Log
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
 import androidx.core.util.Consumer
+import androidx.window.WindowProperties
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.SplitController.Api31Impl.isSplitPropertyEnabled
+import androidx.window.layout.WindowMetrics
 import java.util.concurrent.Executor
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.concurrent.withLock
 
 /**
- * A singleton controller class that gets information about the currently active activity
- * splits and provides interaction points to customize the splits and form new
- * splits.
- *
- * A split is a pair of containers that host activities in the same or different
- * processes, combined under the same parent window of the hosting task.
- *
- * A pair of activities can be put into a split by providing a static or runtime
- * split rule and then launching the activities in the same task using
- * [Activity.startActivity()][android.app.Activity.startActivity].
- */
-class SplitController private constructor(applicationContext: Context) {
+* A singleton controller class that gets information about the currently active activity
+* splits and provides interaction points to customize the splits and form new
+* splits.
+*
+* A split is a pair of containers that host activities in the same or different
+* processes, combined under the same parent window of the hosting task.
+*
+* A pair of activities can be put into a split by providing a static or runtime
+* split rule and then launching the activities in the same task using
+* [Activity.startActivity()][android.app.Activity.startActivity].
+*/
+class SplitController private constructor(private val applicationContext: Context) {
     private val embeddingBackend: EmbeddingBackend = ExtensionEmbeddingBackend
         .getInstance(applicationContext)
+    private var splitPropertyEnabled: Boolean = false
 
     // TODO(b/258356512): Make this method a flow API
     /**
@@ -85,15 +95,97 @@
      * `isSplitSupported` always returns `true`, and if the split is collapsed,
      * activities are launched on top, following the non-activity embedding
      * model.
+     *
+     * Also the [androidx.window.WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED]
+     * must be enabled in AndroidManifest within <application> in order to get the correct
+     * state or `false` will be returned by default.
      */
     fun isSplitSupported(): Boolean {
-        return embeddingBackend.isSplitSupported()
+        if (!splitPropertyEnabled) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+                splitPropertyEnabled = isSplitPropertyEnabled(applicationContext)
+            } else {
+                // The PackageManager#getProperty API is not supported before S, assuming
+                // the property is enabled to keep the same behavior on earlier platforms.
+                splitPropertyEnabled = true
+            }
+        }
+        return splitPropertyEnabled && embeddingBackend.isSplitSupported()
     }
 
+    /**
+     * Sets or replaces the previously registered [SplitAttributes] calculator.
+     *
+     * **Note** that it's callers' responsibility to check if this API is supported by calling
+     * [isSplitAttributesCalculatorSupported] before using the this API. It is suggested to always
+     * set meaningful [SplitRule.defaultSplitAttributes] in case this API is not supported on some
+     * devices.
+     *
+     * Also, replacing the calculator will only update existing split pairs after a change
+     * in the window or device state, such as orientation changes or folding state changes.
+     *
+     * The [SplitAttributes] calculator is a function to compute the current [SplitAttributes] for
+     * the given [SplitRule] with the current device and window state. Then The calculator will be
+     * invoked if either:
+     * - An activity is started and matches a registered [SplitRule].
+     * - A parent configuration is updated and there's an existing split pair.
+     *
+     * By default, [SplitRule.defaultSplitAttributes] are applied if the parent container's
+     * [WindowMetrics] satisfies the [SplitRule]'s dimensions requirements, which are
+     * [SplitRule.minWidthDp], [SplitRule.minHeightDp] and [SplitRule.minSmallestWidthDp].
+     * The [SplitRule.defaultSplitAttributes] can be set by
+     * - [SplitRule] Builder APIs, which are
+     *   [SplitPairRule.Builder.setDefaultSplitAttributes] and
+     *   [SplitPlaceholderRule.Builder.setDefaultSplitAttributes].
+     * - Specifying with `splitRatio` and `splitLayoutDirection` attributes in `<SplitPairRule>` or
+     * `<SplitPlaceHolderRule>` tags in XML files.
+     *
+     * Developers may want to apply different [SplitAttributes] for different device or window
+     * states. For example, on foldable devices, developers may want to split the screen vertically
+     * if the device is in landscape, fill the screen if the device is in portrait and split
+     * the screen horizontally if the device is in
+     * [tabletop posture](https://developer.android.com/guide/topics/ui/foldables#postures).
+     * In this case, the [SplitAttributes] can be customized by the [SplitAttributes] calculator,
+     * which takes effects after calling this API. Developers can also clear the calculator
+     * by [clearSplitAttributesCalculator].
+     * Then, developers could implement the [SplitAttributes] calculator as the sample linked below
+     * shows.
+     *
+     * @sample androidx.window.samples.embedding.splitAttributesCalculatorSample
+     * @param calculator the function to calculate [SplitAttributes] based on the
+     * [SplitAttributesCalculatorParams]. It will replace the previously set if it exists.
+     * @throws UnsupportedOperationException if [isSplitAttributesCalculatorSupported] reports
+     * `false`
+     */
+    @ExperimentalWindowApi
+    fun setSplitAttributesCalculator(
+        calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
+    ) {
+        embeddingBackend.setSplitAttributesCalculator(calculator)
+    }
+
+    /**
+     * Clears the callback previously set by [setSplitAttributesCalculator].
+     * The caller **must** make sure [isSplitAttributesCalculatorSupported] before invoking.
+     *
+     * @throws UnsupportedOperationException if [isSplitAttributesCalculatorSupported] reports
+     * `false`
+     */
+    @ExperimentalWindowApi
+    fun clearSplitAttributesCalculator() {
+        embeddingBackend.clearSplitAttributesCalculator()
+    }
+
+    /** Returns whether [setSplitAttributesCalculator] is supported or not. */
+    @ExperimentalWindowApi
+    fun isSplitAttributesCalculatorSupported(): Boolean =
+        embeddingBackend.isSplitAttributesCalculatorSupported()
+
     companion object {
         @Volatile
         private var globalInstance: SplitController? = null
         private val globalLock = ReentrantLock()
+        private const val TAG = "SplitController"
 
         internal const val sDebug = false
 
@@ -114,4 +206,35 @@
             return globalInstance!!
         }
     }
+
+    @RequiresApi(31)
+    private object Api31Impl {
+        @DoNotInline
+        fun isSplitPropertyEnabled(applicationContext: Context): Boolean {
+            val property = try {
+                applicationContext.packageManager.getProperty(
+                    WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED,
+                    applicationContext.packageName
+                )
+            } catch (e: PackageManager.NameNotFoundException) {
+                Log.e(
+                    TAG, WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED +
+                    " must be set and enabled in AndroidManifest.xml to use splits APIs."
+                )
+                return false
+            } catch (e: Exception) {
+                // This can happen when it is a test environment that doesn't support getProperty.
+                Log.e(TAG, "PackageManager.getProperty is not supported", e)
+                return false
+            }
+            if (!property.isBoolean) {
+                Log.e(
+                    TAG, WindowProperties.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED +
+                    " must have a boolean value"
+                )
+                return false
+            }
+            return property.boolean
+        }
+    }
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt b/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
index 3cabc9e..3bfea72 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
@@ -28,10 +28,8 @@
      * The [ActivityStack] representing the secondary split container.
      */
     val secondaryActivityStack: ActivityStack,
-    /**
-     * Ratio of the Task width that is given to the primary split container.
-     */
-    val splitRatio: Float
+    /** The [SplitAttributes] of this split pair. */
+    val splitAttributes: SplitAttributes
 ) {
     operator fun contains(activity: Activity): Boolean {
         return primaryActivityStack.contains(activity) ||
@@ -44,7 +42,7 @@
 
         if (primaryActivityStack != other.primaryActivityStack) return false
         if (secondaryActivityStack != other.secondaryActivityStack) return false
-        if (splitRatio != other.splitRatio) return false
+        if (splitAttributes != other.splitAttributes) return false
 
         return true
     }
@@ -52,7 +50,7 @@
     override fun hashCode(): Int {
         var result = primaryActivityStack.hashCode()
         result = 31 * result + secondaryActivityStack.hashCode()
-        result = 31 * result + splitRatio.hashCode()
+        result = 31 * result + splitAttributes.hashCode()
         return result
     }
 
@@ -61,7 +59,7 @@
             append("SplitInfo:{")
             append("primaryActivityStack=$primaryActivityStack,")
             append("secondaryActivityStack=$secondaryActivityStack,")
-            append("splitRatio=$splitRatio}")
+            append("splitAttributes=$splitAttributes}")
         }
     }
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
index 0b684a4..76a561c 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
@@ -16,14 +16,18 @@
 
 package androidx.window.embedding
 
-import android.util.LayoutDirection.LOCALE
-import androidx.annotation.FloatRange
 import androidx.annotation.IntRange
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_ALWAYS_ALLOW
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
 
 /**
- * Split configuration rules for activity pairs. Define when activities that were launched on top of
- * each other should be shown side-by-side, and the visual properties of such splits. Can be set
- * either via [RuleController.setRules] or via [RuleController.addRule]. The rules are always
+ * Split configuration rules for activity pairs. Define when activities that were launched on top
+ * should be placed adjacent to the one below, and the visual properties of such splits. Can be set
+ * either by [RuleController.setRules] or [RuleController.addRule]. The rules are always
  * applied only to activities that will be started after the rules were set.
  */
 class SplitPairRule : SplitRule {
@@ -37,18 +41,22 @@
     /**
      * Determines what happens with the primary container when all activities are finished in the
      * associated secondary container.
-     * @see SplitRule.SplitFinishBehavior
+     *
+     * @see SplitRule.FinishBehavior.NEVER
+     * @see SplitRule.FinishBehavior.ALWAYS
+     * @see SplitRule.FinishBehavior.ADJACENT
      */
-    @SplitFinishBehavior
-    val finishPrimaryWithSecondary: Int
+    val finishPrimaryWithSecondary: FinishBehavior
 
     /**
      * Determines what happens with the secondary container when all activities are finished in the
      * associated primary container.
-     * @see SplitRule.SplitFinishBehavior
+     *
+     * @see SplitRule.FinishBehavior.NEVER
+     * @see SplitRule.FinishBehavior.ALWAYS
+     * @see SplitRule.FinishBehavior.ADJACENT
      */
-    @SplitFinishBehavior
-    val finishSecondaryWithPrimary: Int
+    val finishSecondaryWithPrimary: FinishBehavior
 
     /**
      * If there is an existing split with the same primary container, indicates whether the
@@ -58,18 +66,19 @@
     val clearTop: Boolean
 
     internal constructor(
+        tag: String? = null,
         filters: Set<SplitPairFilter>,
-        @SplitFinishBehavior finishPrimaryWithSecondary: Int = FINISH_NEVER,
-        @SplitFinishBehavior finishSecondaryWithPrimary: Int = FINISH_ALWAYS,
+        finishPrimaryWithSecondary: FinishBehavior = NEVER,
+        finishSecondaryWithPrimary: FinishBehavior = ALWAYS,
         clearTop: Boolean = false,
         @IntRange(from = 0) minWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
+        @IntRange(from = 0) minHeightDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
         @IntRange(from = 0) minSmallestWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
         maxAspectRatioInPortrait: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT,
         maxAspectRatioInLandscape: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT,
-        @FloatRange(from = 0.0, to = 1.0) splitRatio: Float = SPLIT_RATIO_DEFAULT,
-        @LayoutDirection layoutDirection: Int = LOCALE
-    ) : super(minWidthDp, minSmallestWidthDp, maxAspectRatioInPortrait, maxAspectRatioInLandscape,
-        splitRatio, layoutDirection) {
+        defaultSplitAttributes: SplitAttributes,
+    ) : super(tag, minWidthDp, minHeightDp, minSmallestWidthDp, maxAspectRatioInPortrait,
+        maxAspectRatioInLandscape, defaultSplitAttributes) {
         this.filters = filters.toSet()
         this.clearTop = clearTop
         this.finishPrimaryWithSecondary = finishPrimaryWithSecondary
@@ -79,89 +88,170 @@
     /**
      * Builder for [SplitPairRule].
      *
-     * @param filters See [SplitPairRule.filters].
+     * @param filters Filters used to choose when to apply this rule. The rule may be used if any
+     * one of the provided filters matches.
      */
     class Builder(
-        private val filters: Set<SplitPairFilter>,
+        private val filters: Set<SplitPairFilter>
     ) {
+        private var tag: String? = null
         @IntRange(from = 0)
         private var minWidthDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
         @IntRange(from = 0)
+        private var minHeightDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
+        @IntRange(from = 0)
         private var minSmallestWidthDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
         private var maxAspectRatioInPortrait = SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
         private var maxAspectRatioInLandscape = SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
-        @SplitFinishBehavior
-        private var finishPrimaryWithSecondary = FINISH_NEVER
-        @SplitFinishBehavior
-        private var finishSecondaryWithPrimary = FINISH_ALWAYS
+        private var finishPrimaryWithSecondary = NEVER
+        private var finishSecondaryWithPrimary = ALWAYS
         private var clearTop = false
-        @FloatRange(from = 0.0, to = 1.0)
-        private var splitRatio = SPLIT_RATIO_DEFAULT
-        @LayoutDirection
-        private var layoutDirection = LOCALE
+        private var defaultSplitAttributes = SplitAttributes.Builder().build()
 
         /**
-         * @see SplitPairRule.minWidthDp
+         * Sets the smallest value of width of the parent window when the split should be used, in
+         * DP.
+         * When the window size is smaller than requested here, activities in the secondary
+         * container will be stacked on top of the activities in the primary one, completely
+         * overlapping them.
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
          */
         fun setMinWidthDp(@IntRange(from = 0) minWidthDp: Int): Builder =
             apply { this.minWidthDp = minWidthDp }
 
         /**
-         * @see SplitPairRule.minSmallestWidthDp
+         * Sets the smallest value of height of the parent task window when the split should be
+         * used, in DP. When the window size is smaller than requested here, activities in the
+         * secondary container will be stacked on top of the activities in the primary one,
+         * completely overlapping them.
+         *
+         * It is useful if it's necessary to split the parent window horizontally for this
+         * [SplitPairRule].
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+         *
+         * @see SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+         * @see SplitAttributes.LayoutDirection.BOTTOM_TO_TOP
+         */
+        fun setMinHeightDp(@IntRange(from = 0) minHeightDp: Int): Builder =
+            apply { this.minHeightDp = minHeightDp }
+
+        /**
+         * Sets the smallest value of the smallest possible width of the parent window in any
+         * rotation  when the split should be used, in DP. When the window size is smaller than
+         * requested here, activities in the secondary container will be stacked on top of the
+         * activities in the primary one, completely overlapping them.
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
          */
         fun setMinSmallestWidthDp(@IntRange(from = 0) minSmallestWidthDp: Int): Builder =
             apply { this.minSmallestWidthDp = minSmallestWidthDp }
 
         /**
-         * @see SplitPairRule.maxAspectRatioInPortrait
+         * Sets the largest value of the aspect ratio, expressed as `height / width` in decimal
+         * form, of the parent window bounds in portrait when the split should be used. When the
+         * window aspect ratio is greater than requested here, activities in the secondary container
+         * will be stacked on top of the activities in the primary one, completely overlapping them.
+         *
+         * This value is only used when the parent window is in portrait (height >= width).
+         *
+         * The default is [SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT] if the app doesn't set, which is
+         * the recommend value to only allow split when the parent window is not too stretched in
+         * portrait.
+         *
+         * @see EmbeddingAspectRatio.ratio
+         * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+         * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
          */
         fun setMaxAspectRatioInPortrait(aspectRatio: EmbeddingAspectRatio): Builder =
             apply { this.maxAspectRatioInPortrait = aspectRatio }
 
         /**
-         * @see SplitPairRule.maxAspectRatioInLandscape
+         * Sets the largest value of the aspect ratio, expressed as `width / height` in decimal
+         * form, of the parent window bounds in landscape when the split should be used. When the
+         * window aspect ratio is greater than requested here, activities in the secondary container
+         * will be stacked on top of the activities in the primary one, completely overlapping them.
+         *
+         * This value is only used when the parent window is in landscape (width > height).
+         *
+         * The default is [SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT] if the app doesn't set, which
+         * is the recommend value to always allow split when the parent window is in landscape.
+         *
+         * @see EmbeddingAspectRatio.ratio
+         * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+         * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
          */
         fun setMaxAspectRatioInLandscape(aspectRatio: EmbeddingAspectRatio): Builder =
             apply { this.maxAspectRatioInLandscape = aspectRatio }
 
         /**
-         * @see SplitPairRule.finishPrimaryWithSecondary
+         * Sets the behavior of the primary container when all activities are finished in the
+         * associated secondary container.
+         *
+         * @see SplitRule.FinishBehavior.NEVER
+         * @see SplitRule.FinishBehavior.ALWAYS
+         * @see SplitRule.FinishBehavior.ADJACENT
          */
         fun setFinishPrimaryWithSecondary(
-            @SplitFinishBehavior finishPrimaryWithSecondary: Int
+            finishPrimaryWithSecondary: FinishBehavior
         ): Builder =
             apply { this.finishPrimaryWithSecondary = finishPrimaryWithSecondary }
 
         /**
-         * @see SplitPairRule.finishSecondaryWithPrimary
+         * Sets the behavior of the secondary container when all activities are finished in the
+         * associated primary container.
+         *
+         * @see SplitRule.FinishBehavior.NEVER
+         * @see SplitRule.FinishBehavior.ALWAYS
+         * @see SplitRule.FinishBehavior.ADJACENT
          */
         fun setFinishSecondaryWithPrimary(
-            @SplitFinishBehavior finishSecondaryWithPrimary: Int
+            finishSecondaryWithPrimary: FinishBehavior
         ): Builder =
             apply { this.finishSecondaryWithPrimary = finishSecondaryWithPrimary }
 
         /**
-         * @see SplitPairRule.clearTop
+         * Sets whether the existing secondary container on top and all activities in it should be
+         * destroyed when a new split is created using this rule. Otherwise the new secondary will
+         * appear on top by default.
          */
         @SuppressWarnings("MissingGetterMatchingBuilder")
         fun setClearTop(clearTop: Boolean): Builder =
             apply { this.clearTop = clearTop }
 
         /**
-         * @see SplitPairRule.splitRatio
+         * Sets the default [SplitAttributes] to apply on the activity containers pair when the host
+         * task bounds satisfy [minWidthDp], [minHeightDp], [minSmallestWidthDp],
+         * [maxAspectRatioInPortrait] and [maxAspectRatioInLandscape] requirements.
          */
-        fun setSplitRatio(@FloatRange(from = 0.0, to = 1.0) splitRatio: Float): Builder =
-            apply { this.splitRatio = splitRatio }
+        fun setDefaultSplitAttributes(defaultSplitAttributes: SplitAttributes): Builder =
+            apply { this.defaultSplitAttributes = defaultSplitAttributes }
 
         /**
-         * @see SplitPairRule.layoutDirection
+         * Sets a unique string to identify this [SplitPairRule], which defaults to `null`.
+         * The suggested usage is to set the tag to be able to differentiate between different rules
+         * in the [SplitAttributesCalculatorParams.splitRuleTag].
          */
-        fun setLayoutDirection(@LayoutDirection layoutDirection: Int): Builder =
-            apply { this.layoutDirection = layoutDirection }
+        fun setTag(tag: String?): Builder =
+            apply { this.tag = tag }
 
-        fun build() = SplitPairRule(filters, finishPrimaryWithSecondary, finishSecondaryWithPrimary,
-            clearTop, minWidthDp, minSmallestWidthDp, maxAspectRatioInPortrait,
-            maxAspectRatioInLandscape, splitRatio, layoutDirection)
+        fun build() = SplitPairRule(
+            tag,
+            filters,
+            finishPrimaryWithSecondary,
+            finishSecondaryWithPrimary,
+            clearTop,
+            minWidthDp,
+            minHeightDp,
+            minSmallestWidthDp,
+            maxAspectRatioInPortrait,
+            maxAspectRatioInLandscape,
+            defaultSplitAttributes,
+        )
     }
 
     /**
@@ -173,15 +263,16 @@
         newSet.addAll(filters)
         newSet.add(filter)
         return Builder(newSet.toSet())
+            .setTag(tag)
             .setMinWidthDp(minWidthDp)
+            .setMinHeightDp(minHeightDp)
             .setMinSmallestWidthDp(minSmallestWidthDp)
             .setMaxAspectRatioInPortrait(maxAspectRatioInPortrait)
             .setMaxAspectRatioInLandscape(maxAspectRatioInLandscape)
             .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary)
             .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary)
             .setClearTop(clearTop)
-            .setSplitRatio(splitRatio)
-            .setLayoutDirection(layoutDirection)
+            .setDefaultSplitAttributes(defaultSplitAttributes)
             .build()
     }
 
@@ -209,9 +300,10 @@
 
     override fun toString(): String =
         "${SplitPairRule::class.java.simpleName}{" +
-            " splitRatio=$splitRatio" +
-            ", layoutDirection=$layoutDirection" +
+            "tag=$tag" +
+            ", defaultSplitAttributes=$defaultSplitAttributes" +
             ", minWidthDp=$minWidthDp" +
+            ", minHeightDp=$minHeightDp" +
             ", minSmallestWidthDp=$minSmallestWidthDp" +
             ", maxAspectRatioInPortrait=$maxAspectRatioInPortrait" +
             ", maxAspectRatioInLandscape=$maxAspectRatioInLandscape" +
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
index fe5f896..83ed1ca 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
@@ -17,11 +17,15 @@
 package androidx.window.embedding
 
 import android.content.Intent
-import android.util.LayoutDirection.LOCALE
-import androidx.annotation.FloatRange
-import androidx.annotation.IntDef
 import androidx.annotation.IntRange
 import androidx.core.util.Preconditions.checkArgument
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_ALWAYS_ALLOW
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ALWAYS
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.NEVER
+import androidx.window.extensions.WindowExtensions
 
 /**
  * Configuration rules for split placeholders.
@@ -59,37 +63,30 @@
     val isSticky: Boolean
 
     /**
-     * Defines whether a container should be finished together when the associated placeholder
-     * activity is being finished based on current presentation mode.
-     */
-    @Target(AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.TYPE)
-    @Retention(AnnotationRetention.SOURCE)
-    @IntDef(FINISH_ALWAYS, FINISH_ADJACENT)
-    internal annotation class SplitPlaceholderFinishBehavior
-
-    /**
      * Determines what happens with the primary container when all activities are finished in the
      * associated placeholder container.
-     * @see SplitPlaceholderFinishBehavior
+     *
+     * @see SplitRule.FinishBehavior.ALWAYS
+     * @see SplitRule.FinishBehavior.ADJACENT
      */
-    @SplitPlaceholderFinishBehavior
-    val finishPrimaryWithPlaceholder: Int
+    val finishPrimaryWithPlaceholder: FinishBehavior
 
     internal constructor(
+        tag: String? = null,
         filters: Set<ActivityFilter>,
         placeholderIntent: Intent,
         isSticky: Boolean,
-        @SplitPlaceholderFinishBehavior finishPrimaryWithPlaceholder: Int = FINISH_ALWAYS,
+        finishPrimaryWithPlaceholder: FinishBehavior = ALWAYS,
         @IntRange(from = 0) minWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
+        @IntRange(from = 0) minHeightDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
         @IntRange(from = 0) minSmallestWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
         maxAspectRatioInPortrait: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT,
         maxAspectRatioInLandscape: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT,
-        @FloatRange(from = 0.0, to = 1.0) splitRatio: Float = SPLIT_RATIO_DEFAULT,
-        @LayoutDirection layoutDirection: Int = LOCALE
-    ) : super(minWidthDp, minSmallestWidthDp, maxAspectRatioInPortrait, maxAspectRatioInLandscape,
-        splitRatio, layoutDirection) {
-        checkArgument(finishPrimaryWithPlaceholder != FINISH_NEVER,
-            "FINISH_NEVER is not a valid configuration for SplitPlaceholderRule. " +
+        defaultSplitAttributes: SplitAttributes,
+    ) : super(tag, minWidthDp, minHeightDp, minSmallestWidthDp, maxAspectRatioInPortrait,
+        maxAspectRatioInLandscape, defaultSplitAttributes) {
+        checkArgument(finishPrimaryWithPlaceholder != NEVER,
+            "NEVER is not a valid configuration for SplitPlaceholderRule. " +
                 "Please use FINISH_ALWAYS or FINISH_ADJACENT instead or refer to the current API.")
         this.filters = filters.toSet()
         this.placeholderIntent = placeholderIntent
@@ -100,82 +97,153 @@
     /**
      * Builder for [SplitPlaceholderRule].
      *
-     * @param filters See [SplitPlaceholderRule.filters].
-     * @param placeholderIntent See [SplitPlaceholderRule.placeholderIntent].
+     * @param filters Filters used to choose when to apply this rule. The rule may be used if any
+     * one of the provided filters matches.
+     * @param placeholderIntent Intent to launch the placeholder activity.
      */
     class Builder(
         private val filters: Set<ActivityFilter>,
-        private val placeholderIntent: Intent,
+        private val placeholderIntent: Intent
     ) {
+        private var tag: String? = null
         @IntRange(from = 0)
         private var minWidthDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
         @IntRange(from = 0)
+        private var minHeightDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
+        @IntRange(from = 0)
         private var minSmallestWidthDp = SPLIT_MIN_DIMENSION_DP_DEFAULT
         private var maxAspectRatioInPortrait = SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
         private var maxAspectRatioInLandscape = SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
-        @SplitPlaceholderFinishBehavior
-        private var finishPrimaryWithPlaceholder = FINISH_ALWAYS
+        private var finishPrimaryWithPlaceholder = ALWAYS
         private var isSticky = false
-        @FloatRange(from = 0.0, to = 1.0)
-        private var splitRatio = SPLIT_RATIO_DEFAULT
-        @LayoutDirection
-        private var layoutDirection = LOCALE
+        private var defaultSplitAttributes = SplitAttributes.Builder().build()
 
         /**
-         * @see SplitPlaceholderRule.minWidthDp
+         * Sets the smallest value of width of the parent window when the split should be used, in
+         * DP.
+         * When the window size is smaller than requested here, activities in the secondary
+         * container will be stacked on top of the activities in the primary one, completely
+         * overlapping them.
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
          */
         fun setMinWidthDp(@IntRange(from = 0) minWidthDp: Int): Builder =
             apply { this.minWidthDp = minWidthDp }
 
         /**
-         * @see SplitPlaceholderRule.minSmallestWidthDp
+         * Sets the smallest value of height of the parent task window when the split should be
+         * used, in DP. When the window size is smaller than requested here, activities in the
+         * secondary container will be stacked on top of the activities in the primary one,
+         * completely overlapping them.
+         *
+         * It is useful if it's necessary to split the parent window horizontally for this
+         * [SplitPlaceholderRule].
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+         *
+         * @see SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+         * @see SplitAttributes.LayoutDirection.BOTTOM_TO_TOP
+         */
+        fun setMinHeightDp(@IntRange(from = 0) minHeightDp: Int): Builder =
+            apply { this.minHeightDp = minHeightDp }
+
+        /**
+         * Sets the smallest value of the smallest possible width of the parent window in any
+         * rotation  when the split should be used, in DP. When the window size is smaller than
+         * requested here, activities in the secondary container will be stacked on top of the
+         * activities in the primary one, completely overlapping them.
+         *
+         * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
+         * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
          */
         fun setMinSmallestWidthDp(@IntRange(from = 0) minSmallestWidthDp: Int): Builder =
             apply { this.minSmallestWidthDp = minSmallestWidthDp }
 
         /**
-         * @see SplitPlaceholderRule.maxAspectRatioInPortrait
+         * Sets the largest value of the aspect ratio, expressed as `height / width` in decimal
+         * form, of the parent window bounds in portrait when the split should be used. When the
+         * window aspect ratio is greater than requested here, activities in the secondary container
+         * will be stacked on top of the activities in the primary one, completely overlapping them.
+         *
+         * This value is only used when the parent window is in portrait (height >= width).
+         *
+         * The default is [SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT] if the app doesn't set, which is
+         * the recommend value to only allow split when the parent window is not too stretched in
+         * portrait.
+         *
+         * @see EmbeddingAspectRatio.ratio
+         * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+         * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
          */
         fun setMaxAspectRatioInPortrait(aspectRatio: EmbeddingAspectRatio): Builder =
             apply { this.maxAspectRatioInPortrait = aspectRatio }
 
         /**
-         * @see SplitPlaceholderRule.maxAspectRatioInLandscape
+         * Sets the largest value of the aspect ratio, expressed as `width / height` in decimal
+         * form, of the parent window bounds in landscape when the split should be used. When the
+         * window aspect ratio is greater than requested here, activities in the secondary container
+         * will be stacked on top of the activities in the primary one, completely overlapping them.
+         *
+         * This value is only used when the parent window is in landscape (width > height).
+         *
+         * The default is [SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT] if the app doesn't set, which
+         * is the recommend value to always allow split when the parent window is in landscape.
+         *
+         * @see EmbeddingAspectRatio.ratio
+         * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+         * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
          */
         fun setMaxAspectRatioInLandscape(aspectRatio: EmbeddingAspectRatio): Builder =
             apply { this.maxAspectRatioInLandscape = aspectRatio }
 
         /**
-         * @see SplitPlaceholderRule.finishPrimaryWithPlaceholder
+         * Sets the behavior of the primary container when all activities are finished in the
+         * associated placeholder container.
+         *
+         * @see SplitRule.FinishBehavior.ALWAYS
+         * @see SplitRule.FinishBehavior.ADJACENT
          */
-        fun setFinishPrimaryWithPlaceholder(
-            @SplitPlaceholderFinishBehavior finishPrimaryWithPlaceholder: Int
-        ): Builder =
+        fun setFinishPrimaryWithPlaceholder(finishPrimaryWithPlaceholder: FinishBehavior): Builder =
             apply {
                this.finishPrimaryWithPlaceholder = finishPrimaryWithPlaceholder
             }
 
         /**
-         * @see SplitPlaceholderRule.isSticky
+         * @see SplitPlaceholderRule#getTag
+         * since [WindowExtensions.VENDOR_API_LEVEL_2]
+         */
+        fun setTag(tag: String?): Builder = apply { this.tag = tag }
+
+        /**
+         * Sets whether the placeholder will show on top in a smaller window size after it first
+         * appeared in a split with sufficient minimum width.
          */
         fun setSticky(isSticky: Boolean): Builder =
             apply { this.isSticky = isSticky }
 
         /**
-         * @see SplitPlaceholderRule.splitRatio
+         * Sets the default [SplitAttributes] to apply on the activity containers pair when the host
+         * task bounds satisfy [minWidthDp], [minHeightDp], [minSmallestWidthDp],
+         * [maxAspectRatioInPortrait] and [maxAspectRatioInLandscape] requirements.
          */
-        fun setSplitRatio(@FloatRange(from = 0.0, to = 1.0) splitRatio: Float): Builder =
-            apply { this.splitRatio = splitRatio }
+        fun setDefaultSplitAttributes(defaultSplitAttributes: SplitAttributes): Builder =
+            apply { this.defaultSplitAttributes = defaultSplitAttributes }
 
-        /**
-         * @see SplitPlaceholderRule.layoutDirection
-         */
-        fun setLayoutDirection(@LayoutDirection layoutDirection: Int): Builder =
-            apply { this.layoutDirection = layoutDirection }
-
-        fun build() = SplitPlaceholderRule(filters, placeholderIntent, isSticky,
-            finishPrimaryWithPlaceholder, minWidthDp, minSmallestWidthDp, maxAspectRatioInPortrait,
-            maxAspectRatioInLandscape, splitRatio, layoutDirection)
+        fun build() = SplitPlaceholderRule(
+            tag,
+            filters,
+            placeholderIntent,
+            isSticky,
+            finishPrimaryWithPlaceholder,
+            minWidthDp,
+            minHeightDp,
+            minSmallestWidthDp,
+            maxAspectRatioInPortrait,
+            maxAspectRatioInLandscape,
+            defaultSplitAttributes,
+        )
     }
 
     /**
@@ -187,14 +255,15 @@
         newSet.addAll(filters)
         newSet.add(filter)
         return Builder(newSet.toSet(), placeholderIntent)
+            .setTag(tag)
             .setMinWidthDp(minWidthDp)
+            .setMinHeightDp(minHeightDp)
             .setMinSmallestWidthDp(minSmallestWidthDp)
             .setMaxAspectRatioInPortrait(maxAspectRatioInPortrait)
             .setMaxAspectRatioInLandscape(maxAspectRatioInLandscape)
             .setSticky(isSticky)
             .setFinishPrimaryWithPlaceholder(finishPrimaryWithPlaceholder)
-            .setSplitRatio(splitRatio)
-            .setLayoutDirection(layoutDirection)
+            .setDefaultSplitAttributes(defaultSplitAttributes)
             .build()
     }
 
@@ -221,16 +290,17 @@
     }
 
     override fun toString(): String =
-        "SplitPlaceholderRule{" +
-            " splitRatio=$splitRatio" +
-            ", layoutDirection=$layoutDirection" +
-            ", minWidthDp=$minWidthDp" +
-            ", minSmallestWidthDp=$minSmallestWidthDp" +
-            ", maxAspectRatioInPortrait=$maxAspectRatioInPortrait" +
-            ", maxAspectRatioInLandscape=$maxAspectRatioInLandscape" +
-            ", placeholderIntent=$placeholderIntent" +
-            ", isSticky=$isSticky" +
-            ", finishPrimaryWithPlaceholder=$finishPrimaryWithPlaceholder" +
-            ", filters=$filters" +
-            "}"
+         "SplitPlaceholderRule{" +
+             "tag=$tag" +
+             ", defaultSplitAttributes=$defaultSplitAttributes" +
+             ", minWidthDp=$minWidthDp" +
+             ", minHeightDp=$minHeightDp" +
+             ", minSmallestWidthDp=$minSmallestWidthDp" +
+             ", maxAspectRatioInPortrait=$maxAspectRatioInPortrait" +
+             ", maxAspectRatioInLandscape=$maxAspectRatioInLandscape" +
+             ", placeholderIntent=$placeholderIntent" +
+             ", isSticky=$isSticky" +
+             ", finishPrimaryWithPlaceholder=$finishPrimaryWithPlaceholder" +
+             ", filters=$filters" +
+             "}"
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
index c4f7905..df33033 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
@@ -19,19 +19,19 @@
 import android.content.Context
 import android.graphics.Rect
 import android.os.Build
-import android.util.LayoutDirection.LOCALE
-import android.util.LayoutDirection.LTR
-import android.util.LayoutDirection.RTL
 import android.view.WindowMetrics
 import androidx.annotation.DoNotInline
-import androidx.annotation.FloatRange
-import androidx.annotation.IntDef
 import androidx.annotation.IntRange
+import androidx.annotation.OptIn
 import androidx.annotation.RequiresApi
+import androidx.core.os.BuildCompat
 import androidx.core.util.Preconditions
-import androidx.window.embedding.EmbeddingAspectRatio.Companion.alwaysAllow
+import androidx.window.embedding.EmbeddingAspectRatio.Companion.ALWAYS_ALLOW
 import androidx.window.embedding.EmbeddingAspectRatio.Companion.ratio
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT
+import androidx.window.embedding.SplitRule.Companion.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
 import androidx.window.embedding.SplitRule.Companion.SPLIT_MIN_DIMENSION_DP_DEFAULT
+import androidx.window.embedding.SplitRule.FinishBehavior.Companion.ADJACENT
 import kotlin.math.min
 
 /**
@@ -40,140 +40,114 @@
  * via [RuleController.addRule]. The rules are always applied only to activities that will be
  * started after the rules were set.
  *
+ * Note that regardless of whether the minimal requirements ([minWidthDp], [minHeightDp] and
+ * [minSmallestWidthDp]) are met or not, the callback set in
+ * [SplitController.setSplitAttributesCalculator] will still be called for the rule if the
+ * calculator is registered via [SplitController.setSplitAttributesCalculator].
+ * Whether this [SplitRule]'s minimum requirements are satisfied is dispatched in
+ * [SplitAttributesCalculatorParams.areDefaultConstraintsSatisfied] instead.
+ * The width and height could be verified in the [SplitAttributes] calculator callback
+ * as the sample linked below shows.
+ *
+ * It is useful if this [SplitRule] is supported to split the parent container in different
+ * directions with different device states.
+ *
+ * @sample androidx.window.samples.embedding.splitWithOrientations
  * @see androidx.window.embedding.SplitPairRule
  * @see androidx.window.embedding.SplitPlaceholderRule
  */
 open class SplitRule internal constructor(
+    tag: String? = null,
     /**
-     * The smallest value of width of the parent window when the split should be used, in DP.
+     * The smallest value of width of the parent task window when the split should be used, in DP.
      * When the window size is smaller than requested here, activities in the secondary container
      * will be stacked on top of the activities in the primary one, completely overlapping them.
      *
-     * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
-     * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+     * Uses `0` to always allow split regardless of the parent task width.
+     * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT].
      */
     @IntRange(from = 0)
     val minWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
 
     /**
-     * The smallest value of the smallest possible width of the parent window in any rotation
-     * when the split should be used, in DP. When the window size is smaller than requested
-     * here, activities in the secondary container will be stacked on top of the activities in
-     * the primary one, completely overlapping them.
+     * The smallest value of height of the parent task window when the split should be used, in DP.
+     * When the window size is smaller than requested here, activities in the secondary container
+     * will be stacked on top of the activities in the primary one, completely overlapping them.
+     * It is useful if it's necessary to split the parent window horizontally for this [SplitRule].
      *
-     * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT] if the app doesn't set.
-     * [SPLIT_MIN_DIMENSION_ALWAYS_ALLOW] means to always allow split.
+     * Uses `0` to always allow split regardless of the parent task height.
+     * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT].
+     *
+     * @see SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+     * @see SplitAttributes.LayoutDirection.BOTTOM_TO_TOP
+     */
+    @IntRange(from = 0)
+    val minHeightDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
+
+    /**
+     * The smallest value of the smallest possible width of the parent task window in any rotation
+     * when the split should be used, in DP. When the window size is smaller than requested here,
+     * activities in the secondary container will be stacked on top of the activities in the primary
+     * one, completely overlapping them.
+     *
+     * Uses `0` to always allow split regardless of the parent task smallest width.
+     * The default is [SPLIT_MIN_DIMENSION_DP_DEFAULT].
      */
     @IntRange(from = 0)
     val minSmallestWidthDp: Int = SPLIT_MIN_DIMENSION_DP_DEFAULT,
 
     /**
-     * The largest value of the aspect ratio, expressed as (height / width) in decimal form, of the
+     * The largest value of the aspect ratio, expressed as `height / width` in decimal form, of the
      * parent window bounds in portrait when the split should be used. When the window aspect ratio
-     * is greater than requested here, activities in the secondary container will stacked on top of
-     * the activities in the primary one, completely overlapping them.
+     * is greater than requested here, activities in the secondary container will be stacked on top
+     * of the activities in the primary one, completely overlapping them.
      *
      * This value is only used when the parent window is in portrait (height >= width).
      *
-     * The default is [SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT] if the app doesn't set, which is the
-     * recommend value to only allow split when the parent window is not too stretched in portrait.
+     * The default is [SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT], which is the recommend value to
+     * only allow split when the parent window is not too stretched in portrait.
      *
      * @see EmbeddingAspectRatio.ratio
-     * @see EmbeddingAspectRatio.alwaysAllow
-     * @see EmbeddingAspectRatio.alwaysDisallow
+     * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+     * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
      */
     val maxAspectRatioInPortrait: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT,
 
     /**
-     * The largest value of the aspect ratio, expressed as (width / height) in decimal form, of the
+     * The largest value of the aspect ratio, expressed as `width / height` in decimal form, of the
      * parent window bounds in landscape when the split should be used. When the window aspect ratio
-     * is greater than requested here, activities in the secondary container will stacked on top of
-     * the activities in the primary one, completely overlapping them.
+     * is greater than requested here, activities in the secondary container will be stacked on top
+     * of the activities in the primary one, completely overlapping them.
      *
      * This value is only used when the parent window is in landscape (width > height).
      *
-     * The default is [SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT] if the app doesn't set, which is
-     * the recommend value to always allow split when the parent window is in landscape.
+     * The default is [SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT], which is the recommend value to
+     * always allow split when the parent window is in landscape.
      *
      * @see EmbeddingAspectRatio.ratio
-     * @see EmbeddingAspectRatio.alwaysAllow
-     * @see EmbeddingAspectRatio.alwaysDisallow
+     * @see EmbeddingAspectRatio.ALWAYS_ALLOW
+     * @see EmbeddingAspectRatio.ALWAYS_DISALLOW
      */
     val maxAspectRatioInLandscape: EmbeddingAspectRatio = SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT,
 
     /**
-     * Defines what part of the width should be given to the primary activity.
-     *
-     * The default is `0.5` if the app doesn't set, which is to split with equal width.
+     * The default [SplitAttributes] to apply on the activity containers pair when the host task
+     * bounds satisfy [minWidthDp], [minHeightDp] and [minSmallestWidthDp] requirements.
      */
-    @FloatRange(from = 0.0, to = 1.0)
-    val splitRatio: Float = SPLIT_RATIO_DEFAULT,
-
-    /**
-     * The layout direction for the split. The value must be one of [LTR], [RTL] or [LOCALE].
-     * - [LTR]: It splits the task bounds vertically, and put the primary container on the left
-     *   portion, and the secondary container on the right portion.
-     * - [RTL]: It splits the task bounds vertically, and put the primary container on the right
-     *   portion, and the secondary container on the left portion.
-     * - [LOCALE]: It splits the task bounds vertically, and the direction is deduced from the
-     *   default language script of locale. The direction can be either [LTR] or [RTL].
-     */
-    @LayoutDirection
-    val layoutDirection: Int = LOCALE
-) : EmbeddingRule() {
+    val defaultSplitAttributes: SplitAttributes,
+) : EmbeddingRule(tag) {
 
     init {
         Preconditions.checkArgumentNonnegative(minWidthDp, "minWidthDp must be non-negative")
+        Preconditions.checkArgumentNonnegative(minHeightDp, "minHeightDp must be non-negative")
         Preconditions.checkArgumentNonnegative(
             minSmallestWidthDp,
             "minSmallestWidthDp must be non-negative"
         )
-        Preconditions.checkArgument(splitRatio in 0.0..1.0, "splitRatio must be in 0.0..1.0 range")
     }
 
-    @IntDef(LTR, RTL, LOCALE)
-    @Retention(AnnotationRetention.SOURCE)
-    internal annotation class LayoutDirection
-
-    /**
-     * Determines what happens with the associated container when all activities are finished in
-     * one of the containers in a split.
-     *
-     * For example, given that [SplitPairRule.finishPrimaryWithSecondary] is [FINISH_ADJACENT] and
-     * secondary container finishes. The primary associated container is finished if it's
-     * side-by-side with secondary container. The primary associated container is not finished
-     * if it occupies entire task bounds.
-     *
-     * @see SplitPairRule.finishPrimaryWithSecondary
-     * @see SplitPairRule.finishSecondaryWithPrimary
-     * @see SplitPlaceholderRule.finishPrimaryWithPlaceholder
-     */
     companion object {
         /**
-         * Never finish the associated container.
-         * @see SplitRule.Companion
-         */
-        const val FINISH_NEVER = 0
-        /**
-         * Always finish the associated container independent of the current presentation mode.
-         * @see SplitRule.Companion
-         */
-        const val FINISH_ALWAYS = 1
-        /**
-         * Only finish the associated container when displayed side-by-side/adjacent to the one
-         * being finished. Does not finish the associated one when containers are stacked on top of
-         * each other.
-         * @see SplitRule.Companion
-         */
-        const val FINISH_ADJACENT = 2
-
-        /**
-         * The default split ratio if it is not set by apps.
-         * @see SplitRule.splitRatio
-         */
-        internal const val SPLIT_RATIO_DEFAULT = 0.5f
-
-        /**
          * When the min dimension is set to this value, it means to always allow split.
          * @see SplitRule.minWidthDp
          * @see SplitRule.minSmallestWidthDp
@@ -183,8 +157,6 @@
         /**
          * The default min dimension in DP for allowing split if it is not set by apps. The value
          * reflects [androidx.window.core.layout.WindowWidthSizeClass.MEDIUM].
-         * @see SplitRule.minWidthDp
-         * @see SplitRule.minSmallestWidthDp
          */
         const val SPLIT_MIN_DIMENSION_DP_DEFAULT = 600
 
@@ -200,28 +172,72 @@
          * @see SplitRule.maxAspectRatioInLandscape
          */
         @JvmField
-        val SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT = alwaysAllow()
+        val SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT = ALWAYS_ALLOW
     }
 
     /**
-     * Defines whether an associated container should be finished together with the one that's
-     * already being finished based on their current presentation mode.
+     * Determines what happens with the associated container when all activities are finished in
+     * one of the containers in a split.
+     *
+     * For example, given that [SplitPairRule.finishPrimaryWithSecondary] is [ADJACENT] and
+     * secondary container finishes. The primary associated container is finished if it's
+     * adjacent to the secondary container. The primary associated container is not finished
+     * if it occupies entire task bounds.
+     *
+     * @see SplitPairRule.finishPrimaryWithSecondary
+     * @see SplitPairRule.finishSecondaryWithPrimary
+     * @see SplitPlaceholderRule.finishPrimaryWithPlaceholder
      */
-    @Retention(AnnotationRetention.SOURCE)
-    @IntDef(FINISH_NEVER, FINISH_ALWAYS, FINISH_ADJACENT)
-    internal annotation class SplitFinishBehavior
+    class FinishBehavior private constructor(
+        /** The description of this [FinishBehavior] */
+        private val description: String,
+        /** The enum value defined in `splitLayoutDirection` attributes in `attrs.xml` */
+        internal val value: Int,
+    ) {
+        override fun toString(): String = description
+
+        companion object {
+            /** Never finish the associated container. */
+            @JvmField
+            val NEVER = FinishBehavior("NEVER", 0)
+            /**
+             * Always finish the associated container independent of the current presentation mode.
+             */
+            @JvmField
+            val ALWAYS = FinishBehavior("ALWAYS", 1)
+            /**
+             * Only finish the associated container when displayed adjacent to the one being
+             * finished. Does not finish the associated one when containers are stacked on top of
+             * each other.
+             */
+            @JvmField
+            val ADJACENT = FinishBehavior("ADJACENT", 2)
+
+            @JvmStatic
+            internal fun getFinishBehaviorFromValue(
+                @IntRange(from = 0, to = 2) value: Int
+            ): FinishBehavior =
+                when (value) {
+                    NEVER.value -> NEVER
+                    ALWAYS.value -> ALWAYS
+                    ADJACENT.value -> ADJACENT
+                    else -> throw IllegalArgumentException("Unknown finish behavior:$value")
+                }
+        }
+    }
 
     /**
      * Verifies if the provided parent bounds satisfy the dimensions and aspect ratio requirements
      * to apply the rule.
      */
+    // TODO(b/265089843) remove after Build.VERSION_CODES.U released.
+    @OptIn(markerClass = [BuildCompat.PrereleaseSdkCheck::class])
     internal fun checkParentMetrics(context: Context, parentMetrics: WindowMetrics): Boolean {
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
             return false
         }
         val bounds = Api30Impl.getBounds(parentMetrics)
-        // TODO(b/257000820): Application displayMetrics should only be used as a fallback. Replace
-        // with Task density after we include it in WindowMetrics.
+        // TODO(b/265089843) replace with Build.VERSION.SDK_INT >= Build.VERSION_CODES.U
         val density = context.resources.displayMetrics.density
         return checkParentBounds(density, bounds)
     }
@@ -236,21 +252,24 @@
             return false
         }
         val minWidthPx = convertDpToPx(density, minWidthDp)
+        val minHeightPx = convertDpToPx(density, minHeightDp)
         val minSmallestWidthPx = convertDpToPx(density, minSmallestWidthDp)
         // Always allow split if the min dimensions are 0.
         val validMinWidth = minWidthDp == SPLIT_MIN_DIMENSION_ALWAYS_ALLOW || width >= minWidthPx
+        val validMinHeight = minHeightDp == SPLIT_MIN_DIMENSION_ALWAYS_ALLOW ||
+            height >= minHeightPx
         val validSmallestMinWidth = minSmallestWidthDp == SPLIT_MIN_DIMENSION_ALWAYS_ALLOW ||
             min(width, height) >= minSmallestWidthPx
         val validAspectRatio = if (height >= width) {
             // Portrait
-            maxAspectRatioInPortrait == alwaysAllow() ||
+            maxAspectRatioInPortrait == ALWAYS_ALLOW ||
                 height * 1f / width <= maxAspectRatioInPortrait.value
         } else {
             // Landscape
-            maxAspectRatioInLandscape == alwaysAllow() ||
+            maxAspectRatioInLandscape == ALWAYS_ALLOW ||
                 width * 1f / height <= maxAspectRatioInLandscape.value
         }
-        return validMinWidth && validSmallestMinWidth && validAspectRatio
+        return validMinWidth && validMinHeight && validSmallestMinWidth && validAspectRatio
     }
 
     /**
@@ -272,31 +291,33 @@
         if (this === other) return true
         if (other !is SplitRule) return false
 
+        if (!super.equals(other)) return false
         if (minWidthDp != other.minWidthDp) return false
+        if (minHeightDp != other.minHeightDp) return false
         if (minSmallestWidthDp != other.minSmallestWidthDp) return false
         if (maxAspectRatioInPortrait != other.maxAspectRatioInPortrait) return false
         if (maxAspectRatioInLandscape != other.maxAspectRatioInLandscape) return false
-        if (splitRatio != other.splitRatio) return false
-        if (layoutDirection != other.layoutDirection) return false
-
+        if (defaultSplitAttributes != other.defaultSplitAttributes) return false
         return true
     }
 
     override fun hashCode(): Int {
-        var result = minWidthDp
+        var result = super.hashCode()
+        result = 31 * result + minWidthDp
+        result = 31 * result + minHeightDp
         result = 31 * result + minSmallestWidthDp
         result = 31 * result + maxAspectRatioInPortrait.hashCode()
         result = 31 * result + maxAspectRatioInLandscape.hashCode()
-        result = 31 * result + splitRatio.hashCode()
-        result = 31 * result + layoutDirection
+        result = 31 * result + defaultSplitAttributes.hashCode()
         return result
     }
 
     override fun toString(): String =
         "${SplitRule::class.java.simpleName}{" +
-            " splitRatio=$splitRatio" +
-            ", layoutDirection=$layoutDirection" +
+            " tag=$tag" +
+            ", defaultSplitAttributes=$defaultSplitAttributes" +
             ", minWidthDp=$minWidthDp" +
+            ", minHeightDp=$minHeightDp" +
             ", minSmallestWidthDp=$minSmallestWidthDp" +
             ", maxAspectRatioInPortrait=$maxAspectRatioInPortrait" +
             ", maxAspectRatioInLandscape=$maxAspectRatioInLandscape" +
diff --git a/window/window/src/main/java/androidx/window/layout/ContextCompatHelper.kt b/window/window/src/main/java/androidx/window/layout/ContextCompatHelper.kt
new file mode 100644
index 0000000..2bc997d
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/layout/ContextCompatHelper.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.window.layout.util
+
+import android.app.Activity
+import android.content.Context
+import android.graphics.Rect
+import android.os.Build
+import android.view.WindowManager
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.annotation.UiContext
+import androidx.core.view.WindowInsetsCompat
+import androidx.window.layout.WindowMetrics
+
+@RequiresApi(Build.VERSION_CODES.N)
+internal object ContextCompatHelperApi24 {
+    fun isInMultiWindowMode(activity: Activity): Boolean {
+        return activity.isInMultiWindowMode
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+internal object ContextCompatHelperApi30 {
+
+    fun currentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        val wm = context.getSystemService(WindowManager::class.java)
+        val insets = WindowInsetsCompat.toWindowInsetsCompat(wm.currentWindowMetrics.windowInsets)
+        return WindowMetrics(wm.currentWindowMetrics.bounds, insets)
+    }
+
+    fun currentWindowBounds(@UiContext context: Context): Rect {
+        val wm = context.getSystemService(WindowManager::class.java)
+        return wm.currentWindowMetrics.bounds
+    }
+
+    fun currentWindowInsets(@UiContext context: Context): WindowInsetsCompat {
+        val wm = context.getSystemService(WindowManager::class.java)
+        return WindowInsetsCompat.toWindowInsetsCompat(wm.currentWindowMetrics.windowInsets)
+    }
+
+    fun maximumWindowBounds(@UiContext context: Context): Rect {
+        val wm = context.getSystemService(WindowManager::class.java)
+        return wm.maximumWindowMetrics.bounds
+    }
+
+    /**
+     * Computes the [WindowInsetsCompat] for platforms above [Build.VERSION_CODES.R], inclusive.
+     * @DoNotInline required for implementation-specific class method to prevent it from being
+     * inlined.
+     *
+     * @see androidx.window.layout.WindowMetrics.getWindowInsets
+     */
+    @DoNotInline
+    fun currentWindowInsets(activity: Activity): WindowInsetsCompat {
+        val platformInsets = activity.windowManager.currentWindowMetrics.windowInsets
+        return WindowInsetsCompat.toWindowInsetsCompat(platformInsets)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
index 3ae9ec8..242217a 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
@@ -18,9 +18,11 @@
 
 import android.app.Activity
 import android.content.Context
+import android.inputmethodservice.InputMethodService
 import android.util.Log
 import androidx.annotation.RestrictTo
 import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
+import androidx.annotation.UiContext
 import androidx.window.core.ConsumerAdapter
 import androidx.window.layout.adapter.WindowBackend
 import androidx.window.layout.adapter.extensions.ExtensionWindowLayoutInfoBackend
@@ -37,10 +39,48 @@
      * A [Flow] of [WindowLayoutInfo] that contains all the available features. A [WindowLayoutInfo]
      * contains a [List] of [DisplayFeature] that intersect the associated [android.view.Window].
      *
+     * This method exports the same content as
+     * [WindowLayoutInfo.windowLayoutInfo(activity: Activity)], but also supports non-Activity
+     * windows to receive [WindowLayoutInfo] updates. A [WindowLayoutInfo] value should be published
+     * when [DisplayFeature] have changed, but the behavior is ultimately decided by the hardware
+     * implementation. It is recommended to test the following scenarios:
+     *
+     *  * Values are emitted immediately after subscribing to this function.
+     *  * There is a long delay between subscribing and receiving the first value.
+     *  * Never receiving a value after subscription.
+     *
+     * A derived class may throw NotImplementedError if this method is not overridden.
+     * Obtaining a [WindowInfoTracker] through [WindowInfoTracker.getOrCreate] guarantees having a
+     * default implementation for this method.
+     *
+     * @param context a [UiContext] such as an [Activity], an [InputMethodService], or an instance
+     * created via [Context.createWindowContext] that listens to configuration changes.
+     * @see WindowLayoutInfo
+     * @see DisplayFeature
+     *
+     * @throws NotImplementedError when [Context] is not an [UiContext] or this method has no
+     * supporting implementation.
+     */
+    fun windowLayoutInfo(@UiContext context: Context): Flow<WindowLayoutInfo> {
+        val windowLayoutInfoFlow: Flow<WindowLayoutInfo>? = windowLayoutInfo((context as Activity))
+        return windowLayoutInfoFlow
+            ?: throw NotImplementedError(
+                message = "Must override windowLayoutInfo(context) and provide an implementation.")
+    }
+
+    /**
+     * A [Flow] of [WindowLayoutInfo] that contains all the available features. A [WindowLayoutInfo]
+     * contains a [List] of [DisplayFeature] that intersect the associated [android.view.Window].
+     *
      * The first [WindowLayoutInfo] will not be emitted until [Activity.onStart] has been called.
-     * which values you receive and when is device dependent. It is recommended to test scenarios
-     * where there is a long delay between subscribing and receiving the first value or never
-     * receiving a value, since it may differ between hardware implementations.
+     * which values you receive and when is device dependent.
+     *
+     * It is recommended to test the following scenarios since behaviors may differ between hardware
+     * implementations:
+     *
+     *  * Values are emitted immediately after subscribing to this function.
+     *  * There is a long delay between subscribing and receiving the first value.
+     *  * Never receiving a value after subscription.
      *
      * Since the information is associated to the [Activity] you should not retain the [Flow] across
      * [Activity] recreations. Doing so can result in unpredictable behavior such as a memory leak
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
index 16efaad..0796437 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoTrackerImpl.kt
@@ -18,6 +18,7 @@
 
 import android.app.Activity
 import android.content.Context
+import androidx.annotation.UiContext
 import androidx.core.util.Consumer
 import androidx.window.layout.adapter.WindowBackend
 import kotlinx.coroutines.channels.awaitClose
@@ -26,7 +27,7 @@
 
 /**
  * An implementation of [WindowInfoTracker] that provides the [WindowLayoutInfo] and
- * [WindowMetrics] for the given [Activity].
+ * [WindowMetrics] for the given [Activity] or [UiContext].
  *
  * @param windowMetricsCalculator a helper to calculate the [WindowMetrics] for the [Activity].
  * @param windowBackend a helper to provide the [WindowLayoutInfo].
@@ -37,9 +38,21 @@
 ) : WindowInfoTracker {
 
     /**
-     * A [Flow] of window layout changes in the current visual [Context].
-     *
-     * @see Activity.onAttachedToWindow
+     * A [Flow] of window layout changes in the current visual [UiContext]. A context has to be
+     * either an [Activity] or created with [Context#createWindowContext].
+     */
+    override fun windowLayoutInfo(@UiContext context: Context): Flow<WindowLayoutInfo> {
+        return callbackFlow {
+            val listener = Consumer { info: WindowLayoutInfo -> trySend(info) }
+            windowBackend.registerLayoutChangeCallback(context, Runnable::run, listener)
+            awaitClose {
+                windowBackend.unregisterLayoutChangeCallback(listener)
+            }
+        }
+    }
+
+    /**
+     * A [Flow] of window layout changes in the current visual [Activity].
      */
     override fun windowLayoutInfo(activity: Activity): Flow<WindowLayoutInfo> {
         return callbackFlow {
diff --git a/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt b/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
index bbf6d69..449c566 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
@@ -19,7 +19,6 @@
 import android.os.Build.VERSION_CODES
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope.TESTS
 import androidx.core.view.WindowInsetsCompat
 import androidx.window.core.Bounds
 import androidx.window.core.ExperimentalWindowApi
@@ -42,7 +41,7 @@
      * An internal constructor for [WindowMetrics]
      * @suppress
      */
-    @RestrictTo(TESTS)
+    @RestrictTo(RestrictTo.Scope.TESTS)
     constructor(
         bounds: Rect,
         insets: WindowInsetsCompat = WindowInsetsCompat.Builder().build()
diff --git a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
index 0de1501..f7181bb 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
@@ -16,14 +16,20 @@
 
 package androidx.window.layout
 
+import android.view.WindowMetrics as AndroidWindowMetrics
 import android.app.Activity
+import android.content.Context
+import android.inputmethodservice.InputMethodService
 import android.os.Build
 import android.view.Display
+import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import androidx.annotation.UiContext
+import androidx.core.view.WindowInsetsCompat
 import androidx.window.core.ExperimentalWindowApi
 
 /**
- * An interface to calculate the [WindowMetrics] for an [Activity].
+ * An interface to calculate the [WindowMetrics] for an [Activity] or a [UiContext].
  */
 interface WindowMetricsCalculator {
 
@@ -65,6 +71,24 @@
     fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics
 
     /**
+     * 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.
+     *
+     * On [Build.VERSION_CODES.Q] and older, a [UiContext] is either an [Activity] or an
+     * [InputMethodService]. On [Build.VERSION_CODES.R] and newer, a [UiContext] can also be one
+     * created via the [Context.createWindowContext] APIs.
+     *
+     * @see [computeCurrentWindowMetrics]
+     * @throws NotImplementedError if not implemented. The default implementation from [getOrCreate]
+     * is guaranteed to implement this method.
+     */
+    fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        throw NotImplementedError("Must override computeCurrentWindowMetrics(context) and" +
+            " provide an implementation.")
+    }
+
+    /**
      * 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.
@@ -76,6 +100,27 @@
      */
     fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics
 
+    /**
+     * 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.
+     *
+     * On [Build.VERSION_CODES.Q] and older, a [UiContext] is either an [Activity] or an
+     * [InputMethodService]. On [Build.VERSION_CODES.R] and newer, a [UiContext] can also be one
+     * created via the [Context.createWindowContext] APIs.
+     *
+     * @see [computeMaximumWindowMetrics]
+     * @throws NotImplementedError if not implemented. The default implementation from [getOrCreate]
+     * is guaranteed to implement this method.
+     */
+    fun computeMaximumWindowMetrics(@UiContext context: Context): WindowMetrics {
+        throw NotImplementedError("Must override computeMaximumWindowMetrics(context) and" +
+            " provide an implementation.")
+    }
+
     companion object {
 
         private var decorator: (WindowMetricsCalculator) -> WindowMetricsCalculator =
@@ -99,6 +144,18 @@
         fun reset() {
             decorator = { it }
         }
+
+        /**
+         * Converts [Android API WindowMetrics][AndroidWindowMetrics] to
+         * [Jetpack version WindowMetrics][WindowMetrics]
+         */
+        @Suppress("ClassVerificationFailure")
+        @RequiresApi(Build.VERSION_CODES.R)
+        internal fun translateWindowMetrics(windowMetrics: AndroidWindowMetrics): WindowMetrics =
+            WindowMetrics(
+                windowMetrics.bounds,
+                WindowInsetsCompat.toWindowInsetsCompat(windowMetrics.windowInsets)
+            )
     }
 }
 
diff --git a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculatorCompat.kt b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculatorCompat.kt
index 4fa733a..72e8ffa 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculatorCompat.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculatorCompat.kt
@@ -21,19 +21,24 @@
 import android.content.res.Configuration
 import android.graphics.Point
 import android.graphics.Rect
+import android.inputmethodservice.InputMethodService
 import android.os.Build
 import android.os.Build.VERSION_CODES
 import android.util.Log
 import android.view.Display
 import android.view.DisplayCutout
+import android.view.WindowManager
 import androidx.annotation.RequiresApi
+import androidx.annotation.UiContext
 import androidx.annotation.VisibleForTesting
 import androidx.core.view.WindowInsetsCompat
 import androidx.window.core.Bounds
 import androidx.window.layout.util.ActivityCompatHelperApi24.isInMultiWindowMode
-import androidx.window.layout.util.ActivityCompatHelperApi30.currentWindowBounds
-import androidx.window.layout.util.ActivityCompatHelperApi30.currentWindowInsets
-import androidx.window.layout.util.ActivityCompatHelperApi30.maximumWindowBounds
+import androidx.window.layout.util.ContextCompatHelperApi30.currentWindowBounds
+import androidx.window.layout.util.ContextCompatHelperApi30.currentWindowInsets
+import androidx.window.layout.util.ContextCompatHelperApi30.currentWindowMetrics
+import androidx.window.layout.util.ContextCompatHelperApi30.maximumWindowBounds
+import androidx.window.layout.util.ContextUtils.unwrapUiContext
 import androidx.window.layout.util.DisplayCompatHelperApi17.getRealSize
 import androidx.window.layout.util.DisplayCompatHelperApi28.safeInsetBottom
 import androidx.window.layout.util.DisplayCompatHelperApi28.safeInsetLeft
@@ -49,6 +54,42 @@
     private val TAG: String = WindowMetricsCalculatorCompat::class.java.simpleName
 
     /**
+     * Computes the current [WindowMetrics] for a given [Context]. The context can be either
+     * an [Activity], a Context created with [Context#createWindowContext], or an
+     * [InputMethodService].
+     * @see WindowMetricsCalculator.computeCurrentWindowMetrics
+     */
+    override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        // TODO(b/259148796): Make WindowMetricsCalculatorCompat more testable
+        if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
+            return currentWindowMetrics(context)
+        } else {
+            when (unwrapUiContext(context)) {
+                is Activity -> {
+                    return computeCurrentWindowMetrics(context as Activity)
+                }
+                is InputMethodService -> {
+                    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+
+                    // On older SDK levels, the app and IME could show up on different displays.
+                    // However, there isn't a way for us to figure this out from the application
+                    // layer. But, this should be good enough for now given the small likelihood of
+                    // IMEs showing up on non-primary displays on these SDK levels.
+                    @Suppress("DEPRECATION")
+                    val displaySize = getRealSizeForDisplay(wm.defaultDisplay)
+
+                    // IME occupies the whole display bounds.
+                    val imeBounds = Rect(0, 0, displaySize.x, displaySize.y)
+                    return WindowMetrics(imeBounds)
+                }
+                else -> {
+                    throw IllegalArgumentException("$context is not a UiContext")
+                }
+            }
+        }
+    }
+
+    /**
      * Computes the current [WindowMetrics] for a given [Activity]
      * @see WindowMetricsCalculator.computeCurrentWindowMetrics
      */
@@ -78,19 +119,30 @@
      * @see WindowMetricsCalculator.computeMaximumWindowMetrics
      */
     override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
+        return computeMaximumWindowMetrics(activity as Context)
+    }
+
+    /**
+     * Computes the maximum [WindowMetrics] for a given [UiContext]
+     * @See WindowMetricsCalculator.computeMaximumWindowMetrics
+     */
+    override fun computeMaximumWindowMetrics(@UiContext context: Context): WindowMetrics {
+        // TODO(b/259148796): Make WindowMetricsCalculatorCompat more testable
         val bounds = if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
-            maximumWindowBounds(activity)
+            maximumWindowBounds(context)
         } else {
+            val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
             // [WindowManager#getDefaultDisplay] is deprecated but we have this for
-            // compatibility with older versions
+            // compatibility with older versions, as we can't reliably get the display associated
+            // with a Context through public APIs either.
             @Suppress("DEPRECATION")
-            val display = activity.windowManager.defaultDisplay
+            val display = wm.defaultDisplay
             val displaySize = getRealSizeForDisplay(display)
             Rect(0, 0, displaySize.x, displaySize.y)
         }
         // TODO (b/233899790): compute insets for other platform versions below R
         val windowInsetsCompat = if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
-            computeWindowInsetsCompat(activity)
+            computeWindowInsetsCompat(context)
         } else {
             WindowInsetsCompat.Builder().build()
         }
@@ -408,13 +460,13 @@
     )
 
     /**
-     * Computes the current [WindowInsetsCompat] for a given [Activity].
+     * Computes the current [WindowInsetsCompat] for a given [Context].
      */
     @RequiresApi(VERSION_CODES.R)
-    internal fun computeWindowInsetsCompat(activity: Activity): WindowInsetsCompat {
+    internal fun computeWindowInsetsCompat(@UiContext context: Context): WindowInsetsCompat {
         val build = Build.VERSION.SDK_INT
         val windowInsetsCompat = if (build >= VERSION_CODES.R) {
-            currentWindowInsets(activity)
+            currentWindowInsets(context)
         } else {
             throw Exception("Incompatible SDK version")
         }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
index d799f4a..3524cb1 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/WindowBackend.kt
@@ -16,27 +16,32 @@
 package androidx.window.layout.adapter
 
 import android.app.Activity
+import android.content.Context
 import androidx.core.util.Consumer
 import androidx.window.layout.WindowLayoutInfo
 import java.util.concurrent.Executor
+import androidx.annotation.UiContext
 
 /**
  * Backing interface for [androidx.window.layout.WindowInfoTracker] instances that serve as the
  * default information supplier.
  */
 internal interface WindowBackend {
+
     /**
-     * Registers a callback for layout changes of the window for the supplied [Activity].
+     * Registers a callback for layout changes of the window for the supplied [UiContext].
      * Must be called only after the it is attached to the window.
+     * The supplied [UiContext] should correspond to a window or an area on the screen. It must be
+     * either an [Activity] or a [UiContext] created with [Context#createWindowContext].
      */
     fun registerLayoutChangeCallback(
-        activity: Activity,
+        @UiContext context: Context,
         executor: Executor,
         callback: Consumer<WindowLayoutInfo>
     )
 
     /**
-     * Unregisters a callback for window layout changes of the [Activity] window.
+     * Unregisters a callback for window layout changes.
      */
     fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>)
 }
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackend.kt
index 2c304b4..64e60f8 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionWindowLayoutInfoBackend.kt
@@ -16,12 +16,17 @@
 
 package androidx.window.layout.adapter.extensions
 
+import androidx.window.extensions.core.util.function.Consumer as OEMConsumer
 import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
 import android.app.Activity
+import android.content.Context
 import androidx.annotation.GuardedBy
+import androidx.annotation.UiContext
 import androidx.annotation.VisibleForTesting
 import androidx.core.util.Consumer
 import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
+import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.layout.WindowLayoutComponent
 import androidx.window.layout.WindowLayoutInfo
 import androidx.window.layout.adapter.WindowBackend
@@ -32,8 +37,9 @@
 
 /**
  * A wrapper around [WindowLayoutComponent] that ensures
- * [WindowLayoutComponent.addWindowLayoutInfoListener] is called at most once per activity while
- * there are active listeners.
+ * [WindowLayoutComponent.addWindowLayoutInfoListener] is called at most once per context while
+ * there are active listeners. Context has to be an [Activity] or a [UiContext] created with
+ * [Context#createWindowContext] or InputMethodService.
  */
 internal class ExtensionWindowLayoutInfoBackend(
     private val component: WindowLayoutComponent,
@@ -42,72 +48,117 @@
 
     private val extensionWindowBackendLock = ReentrantLock()
     @GuardedBy("lock")
-    private val activityToListeners = mutableMapOf<Activity, MulticastConsumer>()
+    private val contextToListeners = mutableMapOf<Context, MulticastConsumer>()
+
     @GuardedBy("lock")
-    private val listenerToActivity = mutableMapOf<Consumer<WindowLayoutInfo>, Activity>()
+    private val listenerToContext = mutableMapOf<Consumer<WindowLayoutInfo>, Context>()
+
     @GuardedBy("lock")
     private val consumerToToken = mutableMapOf<MulticastConsumer, ConsumerAdapter.Subscription>()
 
     /**
+     * The mapping from [MulticastConsumer] to Extensions Core version [Consumer]. This is used
+     * to translate [MulticastConsumer] to Extensions APIs after
+     * [WindowExtensions.VENDOR_API_LEVEL_2].
+     *
+     * @see WindowLayoutComponent.addWindowLayoutInfoListener
+     * @see WindowLayoutComponent.removeWindowLayoutInfoListener
+     */
+    @GuardedBy("lock")
+    private val consumerToOemConsumer =
+        mutableMapOf<MulticastConsumer, OEMConsumer<OEMWindowLayoutInfo>>()
+
+    /**
      * Registers a listener to consume new values of [WindowLayoutInfo]. If there was a listener
-     * registered for a given [Activity] then the new listener will receive a replay of the last
+     * registered for a given [Context] then the new listener will receive a replay of the last
      * known value.
-     * @param activity the host of a [android.view.Window]
+     * @param context the host of a [android.view.Window] or an area on the screen. Has to be an
+     * [Activity] or a [UiContext] created with [Context#createWindowContext] or InputMethodService.
      * @param executor an executor from the parent interface
      * @param callback the listener that will receive new values
      */
+    @OptIn(androidx.window.core.ExperimentalWindowApi::class)
     override fun registerLayoutChangeCallback(
-        activity: Activity,
+        @UiContext context: Context,
         executor: Executor,
         callback: Consumer<WindowLayoutInfo>
     ) {
         extensionWindowBackendLock.withLock {
-            activityToListeners[activity]?.let { listener ->
+            contextToListeners[context]?.let { listener ->
                 listener.addListener(callback)
-                listenerToActivity[callback] = activity
+                listenerToContext[callback] = context
             } ?: run {
-                val consumer = MulticastConsumer(activity)
-                activityToListeners[activity] = consumer
-                listenerToActivity[callback] = activity
+                val consumer = MulticastConsumer(context)
+                contextToListeners[context] = consumer
+                listenerToContext[callback] = context
                 consumer.addListener(callback)
-                val disposableToken = consumerAdapter.createSubscription(
-                    component,
-                    OEMWindowLayoutInfo::class,
-                    "addWindowLayoutInfoListener",
-                    "removeWindowLayoutInfoListener",
-                    activity
-                ) { value ->
-                    consumer.accept(value)
+                if (ExtensionsUtil.safeVendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+                    val consumeWindowLayoutInfo: (OEMWindowLayoutInfo) -> Unit = { value ->
+                        consumer.accept(value)
+                    }
+                    // The registrations above maintain 1-many mapping of Context-Listeners across
+                    // different subscription implementations.
+                    val disposableToken = if (context is Activity) {
+                        consumerAdapter.createSubscription(
+                            component,
+                            OEMWindowLayoutInfo::class,
+                            "addWindowLayoutInfoListener",
+                            "removeWindowLayoutInfoListener",
+                            context,
+                            consumeWindowLayoutInfo
+                        )
+                    } else {
+                        // Prior to WM Extensions v2 addWindowLayoutInfoListener only
+                        // supports Activities. Return empty WindowLayoutInfo if the
+                        // provided Context is not an Activity.
+                        consumer.accept(OEMWindowLayoutInfo(emptyList()))
+                        return@registerLayoutChangeCallback
+                    }
+                    consumerToToken[consumer] = disposableToken
+                } else {
+                    val oemConsumer = OEMConsumer<OEMWindowLayoutInfo> { info ->
+                        consumer.accept(info)
+                    }
+                    consumerToOemConsumer[consumer] = oemConsumer
+                    component.addWindowLayoutInfoListener(context,
+                        oemConsumer)
                 }
-                consumerToToken[consumer] = disposableToken
             }
         }
     }
 
     /**
-     * Unregisters a listener, if this is the last listener for an [Activity] then the listener is
+     * Unregisters a listener, if this is the last listener for a [UiContext] then the listener is
      * removed from the [WindowLayoutComponent]. Calling with the same listener multiple times in a
-     * row does not have an effect. @param callback a listener that may have been registered
+     * row does not have an effect.
+     * @param callback a listener that may have been registered
      */
     override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
         extensionWindowBackendLock.withLock {
-            val activity = listenerToActivity[callback] ?: return
-            val multicastListener = activityToListeners[activity] ?: return
+            val context = listenerToContext[callback] ?: return
+            val multicastListener = contextToListeners[context] ?: return
             multicastListener.removeListener(callback)
-            listenerToActivity.remove(callback)
+            listenerToContext.remove(callback)
             if (multicastListener.isEmpty()) {
-                consumerToToken.remove(multicastListener)?.dispose()
-                activityToListeners.remove(activity)
+                contextToListeners.remove(context)
+                if (ExtensionsUtil.safeVendorApiLevel < WindowExtensions.VENDOR_API_LEVEL_2) {
+                    consumerToToken.remove(multicastListener)?.dispose()
+                } else {
+                    val oemConsumer = consumerToOemConsumer.remove(multicastListener)
+                    if (oemConsumer != null) {
+                        component.removeWindowLayoutInfoListener(oemConsumer)
+                    }
+                }
             }
         }
     }
 
     /**
-     * Returns {@code true} there is any registered listener information, {@code false} otherwise.
+     * Returns {@code true} if all the collections are empty, {@code false} otherwise
      */
     @VisibleForTesting
     fun hasRegisteredListeners(): Boolean {
-        return !(activityToListeners.isEmpty() && listenerToActivity.isEmpty() &&
+        return !(contextToListeners.isEmpty() && listenerToContext.isEmpty() &&
             consumerToToken.isEmpty())
     }
 
@@ -117,7 +168,7 @@
      * value whenever a new consumer registers.
      */
     private class MulticastConsumer(
-        private val activity: Activity
+        private val context: Context
     ) : Consumer<OEMWindowLayoutInfo> {
         private val multicastConsumerLock = ReentrantLock()
         @GuardedBy("lock")
@@ -127,7 +178,7 @@
 
         override fun accept(value: OEMWindowLayoutInfo) {
             multicastConsumerLock.withLock {
-                lastKnownValue = translate(activity, value)
+                lastKnownValue = translate(context, value)
                 registeredListeners.forEach { consumer -> consumer.accept(lastKnownValue) }
             }
         }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapter.kt b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapter.kt
index 2ba93ca..ed9f74d 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapter.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/extensions/ExtensionsWindowLayoutInfoAdapter.kt
@@ -19,6 +19,9 @@
 import androidx.window.extensions.layout.FoldingFeature as OEMFoldingFeature
 import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
 import android.app.Activity
+import android.content.Context
+import android.os.Build
+import androidx.annotation.UiContext
 import androidx.window.core.Bounds
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.FoldingFeature.State.Companion.FLAT
@@ -27,11 +30,15 @@
 import androidx.window.layout.HardwareFoldingFeature.Type.Companion.FOLD
 import androidx.window.layout.HardwareFoldingFeature.Type.Companion.HINGE
 import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
 import androidx.window.layout.WindowMetricsCalculatorCompat.computeCurrentWindowMetrics
 
 internal object ExtensionsWindowLayoutInfoAdapter {
 
-    internal fun translate(activity: Activity, oemFeature: OEMFoldingFeature): FoldingFeature? {
+    internal fun translate(
+        windowMetrics: WindowMetrics,
+        oemFeature: OEMFoldingFeature,
+    ): FoldingFeature? {
         val type = when (oemFeature.type) {
             OEMFoldingFeature.TYPE_FOLD -> FOLD
             OEMFoldingFeature.TYPE_HINGE -> HINGE
@@ -43,17 +50,36 @@
             else -> return null
         }
         val bounds = Bounds(oemFeature.bounds)
-        return if (validBounds(activity, bounds)) {
+        return if (validBounds(windowMetrics, bounds)) {
             HardwareFoldingFeature(Bounds(oemFeature.bounds), type, state)
         } else {
             null
         }
     }
 
-    internal fun translate(activity: Activity, info: OEMWindowLayoutInfo): WindowLayoutInfo {
+    internal fun translate(
+        @UiContext context: Context,
+        info: OEMWindowLayoutInfo,
+    ): WindowLayoutInfo {
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            translate(computeCurrentWindowMetrics(context), info)
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && (context is Activity)) {
+            translate(computeCurrentWindowMetrics(context), info)
+        } else {
+            throw UnsupportedOperationException(
+                "Display Features are only supported after Q. Display features for non-Activity " +
+                    "contexts are not expected to be reported on devices running Q."
+            )
+        }
+    }
+
+    internal fun translate(
+        windowMetrics: WindowMetrics,
+        info: OEMWindowLayoutInfo
+    ): WindowLayoutInfo {
         val features = info.displayFeatures.mapNotNull { feature ->
             when (feature) {
-                is OEMFoldingFeature -> translate(activity, feature)
+                is OEMFoldingFeature -> translate(windowMetrics, feature)
                 else -> null
             }
         }
@@ -61,19 +87,17 @@
     }
 
     /**
-     * Validate the bounds for a [FoldingFeature] within a given [Activity]. Check the following
-     * <ul>
-     *     <li>Bounds are not 0</li>
-     *     <li>Bounds are either full width or full height</li>
-     *     <li>Bounds do not take up the entire window</li>
-     * </ul>
-     *
-     * @param activity housing the [FoldingFeature].
+     * Checks the bounds for a [FoldingFeature] within a given [WindowMetrics]. Validates the
+     * following:
+     *  - [Bounds] are not `0`
+     *  - [Bounds] are either full width or full height
+     *  - [Bounds] do not take up the entire [windowMetrics]
+     * @param windowMetrics Extracted from a [UiContext] housing the [FoldingFeature].
      * @param bounds the bounds of a [FoldingFeature]
-     * @return true if the bounds are valid for the [Activity], false otherwise.
+     * @return true if the bounds are valid for the [WindowMetrics], false otherwise.
      */
-    private fun validBounds(activity: Activity, bounds: Bounds): Boolean {
-        val windowBounds = computeCurrentWindowMetrics(activity).bounds
+    private fun validBounds(windowMetrics: WindowMetrics, bounds: Bounds): Boolean {
+        val windowBounds = windowMetrics.bounds
         if (bounds.isZero) {
             return false
         }
diff --git a/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt b/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
index fa9f015..79fd244 100644
--- a/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackend.kt
@@ -20,6 +20,7 @@
 import android.content.Context
 import android.util.Log
 import androidx.annotation.GuardedBy
+import androidx.annotation.UiContext
 import androidx.annotation.VisibleForTesting
 import androidx.core.util.Consumer
 import androidx.window.core.Version
@@ -54,37 +55,43 @@
     }
 
     override fun registerLayoutChangeCallback(
-        activity: Activity,
+        @UiContext context: Context,
         executor: Executor,
         callback: Consumer<WindowLayoutInfo>
     ) {
-        globalLock.withLock {
-            val windowExtension = windowExtension
-            if (windowExtension == null) {
-                if (DEBUG) {
-                    Log.v(TAG, "Extension not loaded, skipping callback registration.")
+        val activity = context as? Activity
+        activity?.let {
+            globalLock.withLock {
+                val windowExtension = windowExtension
+                if (windowExtension == null) {
+                    if (DEBUG) {
+                        Log.v(TAG, "Extension not loaded, skipping callback registration.")
+                    }
+                    callback.accept(WindowLayoutInfo(emptyList()))
+                    return
                 }
-                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)
-            } else {
-                // Latest info for the previously registered callback for activity
-                // and send it to the new activity
-                val lastInfo = windowLayoutChangeCallbacks.firstOrNull {
-                    activity == it.activity
-                }?.lastInfo
-                if (lastInfo != null) {
-                    callbackWrapper.accept(lastInfo)
+                // 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)
+                } else {
+                    // Latest info for the previously registered callback for activity
+                    // and send it to the new activity
+                    val lastInfo = windowLayoutChangeCallbacks.firstOrNull {
+                        activity == it.activity
+                    }?.lastInfo
+                    if (lastInfo != null) {
+                        callbackWrapper.accept(lastInfo)
+                    }
                 }
             }
+        } ?: run {
+            callback.accept(WindowLayoutInfo(emptyList()))
         }
     }
 
diff --git a/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelper.kt b/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelper.kt
deleted file mode 100644
index aafd1f9..0000000
--- a/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelper.kt
+++ /dev/null
@@ -1,55 +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.layout.util
-
-import android.app.Activity
-import android.graphics.Rect
-import android.os.Build
-import androidx.annotation.DoNotInline
-import androidx.annotation.RequiresApi
-import androidx.core.view.WindowInsetsCompat
-
-@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
-    }
-
-    /**
-     * Computes the [WindowInsetsCompat] for platforms above [Build.VERSION_CODES.R], inclusive.
-     * @DoNotInline required for implementation-specific class method to prevent it from being
-     * inlined.
-     *
-     * @see androidx.window.layout.WindowMetrics.getWindowInsets
-     */
-    @DoNotInline
-    fun currentWindowInsets(activity: Activity): WindowInsetsCompat {
-        val platformInsets = activity.windowManager.currentWindowMetrics.windowInsets
-        return WindowInsetsCompat.toWindowInsetsCompat(platformInsets)
-    }
-}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelperApi24.kt b/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelperApi24.kt
new file mode 100644
index 0000000..a4117f0
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/layout/util/ActivityCompatHelperApi24.kt
@@ -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 androidx.window.layout.util
+
+import android.app.Activity
+import android.os.Build
+import androidx.annotation.RequiresApi
+
+@RequiresApi(Build.VERSION_CODES.N)
+internal object ActivityCompatHelperApi24 {
+    fun isInMultiWindowMode(activity: Activity): Boolean {
+        return activity.isInMultiWindowMode
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/layout/util/ContextCompatHelper.kt b/window/window/src/main/java/androidx/window/layout/util/ContextCompatHelper.kt
new file mode 100644
index 0000000..eaafa91
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/layout/util/ContextCompatHelper.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.layout.util
+
+import android.content.Context
+import android.graphics.Rect
+import android.os.Build
+import android.view.WindowManager
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.annotation.UiContext
+import androidx.core.view.WindowInsetsCompat
+
+@RequiresApi(Build.VERSION_CODES.R)
+internal object ContextCompatHelper {
+
+    fun currentWindowBounds(@UiContext context: Context): Rect {
+        val wm = context.getSystemService(WindowManager::class.java)
+        return wm.currentWindowMetrics.bounds
+    }
+
+    fun maximumWindowBounds(@UiContext context: Context): Rect {
+        val wm = context.getSystemService(WindowManager::class.java)
+        return wm.maximumWindowMetrics.bounds
+    }
+
+    /**
+     * Computes the [WindowInsetsCompat] for platforms above [Build.VERSION_CODES.R], inclusive.
+     * @DoNotInline required for implementation-specific class method to prevent it from being
+     * inlined.
+     *
+     * @see androidx.window.layout.WindowMetrics.getWindowInsets
+     */
+    @DoNotInline
+    fun currentWindowInsets(@UiContext context: Context): WindowInsetsCompat {
+        val wm = context.getSystemService(WindowManager::class.java)
+        val platformInsets = wm.currentWindowMetrics.windowInsets
+        return WindowInsetsCompat.toWindowInsetsCompat(platformInsets)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/layout/util/ContextUtils.kt b/window/window/src/main/java/androidx/window/layout/util/ContextUtils.kt
new file mode 100644
index 0000000..070bdf4
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/layout/util/ContextUtils.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR 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.layout.util
+
+import android.app.Activity
+import android.content.Context
+import android.content.ContextWrapper
+import android.inputmethodservice.InputMethodService
+import androidx.annotation.UiContext
+
+internal object ContextUtils {
+    /**
+     * Given a [UiContext], check if it is a [ContextWrapper]. If so, we need to unwrap it and
+     * return the actual [UiContext] within.
+     */
+    @UiContext
+    internal fun unwrapUiContext(@UiContext context: Context): Context {
+        var iterator = context
+
+        while (iterator is ContextWrapper) {
+            if (iterator is Activity) {
+                // Activities are always ContextWrappers
+                return iterator
+            } else if (iterator is InputMethodService) {
+                // InputMethodService are always ContextWrappers
+                return iterator
+            } else if (iterator.baseContext == null) {
+                return iterator
+            }
+
+            iterator = iterator.baseContext
+        }
+
+        // TODO(b/259148796): This code path is not needed for APIs R and above. However, that is
+        //  not clear and also not enforced anywhere. Once we move to version-based implementations,
+        //  this ambiguity will no longer exist. Again for clarity, on APIs before R, UiContexts are
+        //  Activities or InputMethodServices, so we should never reach this point.
+        throw IllegalArgumentException("Context $context is not a UiContext")
+    }
+}
diff --git a/window/window/src/main/res/values/attrs.xml b/window/window/src/main/res/values/attrs.xml
index 96527f8..8ee9802 100644
--- a/window/window/src/main/res/values/attrs.xml
+++ b/window/window/src/main/res/values/attrs.xml
@@ -14,134 +14,221 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<resources>
-    <!-- Defines what part of the width should be given to the primary activity. Defaults to an
-    equal width split. -->
+<resources xmlns:xs="http://schemas.android.com/apk/res/android">
+    <!-- An attribute for Activity Embedding rules.
+         Defines what part of the Task bounds should be given to the primary container in split.
+         Values in range `(0.0, 1.0)` define the size of the primary container of the split relative
+         to the corresponding parent Task bounds.
+         The default is `0.5`, which is to split with equal width. -->
     <attr name="splitRatio" format="float" />
-    <!-- The smallest value of width of the parent window when the split should be used. -->
-    <attr name="splitMinWidthDp" format="integer" />
-    <!-- The smallest value of the smallest-width (sw) of the parent window in any rotation when
-    the split should be used. -->
-    <attr name="splitMinSmallestWidthDp" format="integer" />
-    <!-- The largest value of the aspect ratio, expressed as (height / width) in decimal form, of
-    the parent window bounds in portrait when the split should be used.
-    `0` or `alwaysAllow` means to always allow split in portrait.
-    `-1` or `alwaysDisallow` means to always disallow split in portrait.
-    Any other values less than 1 are invalid. -->
-    <attr name="splitMaxAspectRatioInPortrait"  format="float">
-        <!-- Special value to always allow split in portrait. -->
-        <enum name="alwaysAllow" value="0" />
-        <!-- Special value to always disallow split in portrait. -->
-        <enum name="alwaysDisallow" value="-1" />
-    </attr>
-    <!-- The largest value of the aspect ratio, expressed as (width / height) in decimal form, of
-    the parent window bounds in landscape when the split should be used.
-    `0` or `alwaysAllow` means to always allow split in landscape.
-    `-1` or `alwaysDisallow` means to always disallow split in landscape.
-    Any other values less than 1 are invalid. -->
-    <attr name="splitMaxAspectRatioInLandscape"  format="float">
-        <!-- Special value to always allow split in landscape. -->
-        <enum name="alwaysAllow" value="0" />
-        <!-- Special value to always disallow split in landscape. -->
-        <enum name="alwaysDisallow" value="-1" />
-    </attr>
-    <!-- The layout direction for the split. The value must be one of "ltr", "rtl" or "locale". -->
+    <!-- An attribute for Activity Embedding rules.
+         Defines the layout direction for the Activity Embedding split. -->
     <attr name="splitLayoutDirection" format="enum">
-        <!-- It splits the task bounds vertically, and the direction is deduced from the default
-        language script of locale, which can be either "ltr" or "rtl". -->
-        <enum name="locale" value="3" />
-        <!-- It splits the task bounds vertically, and put the primary container on the left
-        portion, and the secondary container on the right portion. -->
-        <enum name="ltr" value="0" />
-        <!-- It splits the task bounds vertically, and put the primary container on the right
-        portion, and the secondary container on the left portion. -->
-        <enum name="rtl" value="1" />
+        <!-- A layout direction that splits the task bounds vertically, and the direction is deduced
+             from the language script of locale. The direction can be either `rtl` or `ltr` -->
+        <enum name="locale" value="0" />
+        <!-- The primary container is placed on the left, and the secondary is on the right hand
+             side. -->
+        <enum name="ltr" value="1" />
+        <!-- The primary container is placed on the right, and the secondary is on the left hand
+             side. -->
+        <enum name="rtl" value="2" />
+        <!-- The primary container is placed on top, and the secondary is at the bottom. -->
+        <enum name="topToBottom" value="3" />
+        <!-- The primary container is placed on bottom, and the secondary is at the top. -->
+        <enum name="bottomToTop" value="4" />
     </attr>
+    <!-- An attribute for Activity Embedding rules.
+         An optional but unique string to identify a `SplitPairRule`, `SplitPlaceholderRule` or
+         `ActivityRule`. The suggested usage is to set the tag to be able to differentiate between
+         different rules in the callbacks.
+         For example, it can be used to compute the right `SplitAttributes` for the given split rule
+         in `SplitAttributesCalculator.computeSplitAttributesForParams`. -->
+    <attr name="tag" format="string" />
+    <!-- An attribute for Activity Embedding rules.
+         Background color of Activity Embedding window animation if the animation requires a
+         background.
+         The default is to use the theme's windowBackground. -->
+    <attr name="animationBackgroundColor" format="color" />
+
+    <!-- An attribute for Activity Embedding rules.
+         The smallest value of width of the parent Task bounds when the split should be used, in DP.
+         Uses `0` to always allow split regardless of the parent Task width.
+         The default is `600`. -->
+    <attr name="splitMinWidthDp" format="integer" />
+    <!-- An attribute for Activity Embedding rules.
+         The smallest value of height of the parent Task bounds when the split should be used, in
+         DP.
+         Uses `0` to always allow split regardless of the parent Task height.
+         The default is `600`. -->
+    <attr name="splitMinHeightDp" format="integer" />
+    <!-- An attribute for Activity Embedding rules.
+         The smallest value of the smallest possible width of the parent Task bounds in any rotation
+         when the split should be used, in DP.
+         Uses `0` to always allow split regardless of the parent Task smallest width.
+         The default is `600`. -->
+    <attr name="splitMinSmallestWidthDp" format="integer" />
+    <!-- An attribute for Activity Embedding rules.
+         The largest value of the aspect ratio, expressed as (height / width) in decimal form, of
+         the parent Task bounds in portrait when the split should be used.
+         Uses `0` or `alwaysAllow` to always allow split in portrait.
+         Uses `-1` or `alwaysDisallow` to always disallow split in portrait.
+         Any other values less than `1` are invalid.
+         The default is `1.4`. -->
+    <attr name="splitMaxAspectRatioInPortrait"  format="float">
+        <!-- Special value to always allow split in portrait regardless of the aspect ratio. -->
+        <enum name="alwaysAllow" value="0" />
+        <!-- Special value to always disallow split in portrait regardless of the aspect ratio. -->
+        <enum name="alwaysDisallow" value="-1" />
+    </attr>
+    <!-- An attribute for Activity Embedding rules.
+         The largest value of the aspect ratio, expressed as (width / height) in decimal form, of
+         the parent Task bounds in landscape when the split should be used.
+         Uses `0` or `alwaysAllow` to always allow split in landscape.
+         Uses `-1` or `alwaysDisallow` to always disallow split in landscape.
+         Any other values less than `1` are invalid.
+         The default is `alwaysAllow`. -->
+    <attr name="splitMaxAspectRatioInLandscape"  format="float">
+        <!-- Special value to always allow split in landscape regardless of the aspect ratio. -->
+        <enum name="alwaysAllow" value="0" />
+        <!-- Special value to always disallow split in landscape regardless of the aspect ratio. -->
+        <enum name="alwaysDisallow" value="-1" />
+    </attr>
+    <!-- An attribute for Activity Embedding rules.
+         Determines what happens with the primary container when all activities are finished in
+         the associated secondary container.
+         The default is `never`. -->
     <attr name="finishPrimaryWithSecondary" format="enum">
+        <!-- Never finish the primary container. -->
         <enum name="never" value="0" />
+        <!-- Always finish the primary container. -->
         <enum name="always" value="1" />
+        <!-- Only finish the primary container when the primary container is displayed adjacent to
+             the secondary container.
+             Does not finish the primary one when the secondary container is stacked on top of
+             the primary. -->
         <enum name="adjacent" value="2" />
     </attr>
-    <attr name="finishPrimaryWithPlaceholder" format="enum">
-        <enum name="always" value="1" />
-        <enum name="adjacent" value="2" />
-    </attr>
+
+    <!-- An attribute for Activity Embedding rules.
+         Determines what happens with the secondary container when all activities are finished
+         in the associated primary container.
+         The default is `always`. -->
     <attr name="finishSecondaryWithPrimary" format="enum">
+        <!-- Never finish the secondary container. -->
         <enum name="never" value="0" />
+        <!-- Always finish the secondary container. -->
         <enum name="always" value="1" />
+        <!-- Only finish the secondary container when the primary container is displayed adjacent to
+             the secondary container.
+             Does not finish the secondary one when the secondary container is stacked on top of
+             the primary. -->
+        <enum name="adjacent" value="2" />
+    </attr>
+    <!-- An attribute for Activity Embedding rules.
+         Determines what happens with the primary container when the associated placeholder
+         activity is being finished.
+         The default is `always`. -->
+    <attr name="finishPrimaryWithPlaceholder" format="enum">
+        <!-- Always finish the primary container. -->
+        <enum name="always" value="1" />
+        <!-- Only finish the primary container when the primary container is displayed adjacent to
+             the placeholder container.
+             Does not finish the primary one when the placeholder container is stacked on top of
+             the primary. -->
         <enum name="adjacent" value="2" />
     </attr>
 
-    <!-- Split configuration rules for activity pairs. Must contain at least one SplitPairFilter.
-    See androidx.window.embedding.SplitPairRule for complete documentation. -->
+    <!-- Attributes that are read when parsing a <SplitPairRule> tag, which defines the split
+         configuration rules for activity pairs.
+         Must contain at least one `SplitPairFilter`. -->
     <declare-styleable name="SplitPairRule">
-        <!-- When all activities are finished in the secondary container, the activity in the
-         primary container that created the split should also be finished. Defaults to "never". -->
-        <attr name="finishPrimaryWithSecondary" />
-        <!-- When all activities are finished in the primary container, the activities in the
-         secondary container in the split should also be finished. Defaults to "always". -->
-        <attr name="finishSecondaryWithPrimary" />
-        <!-- If there is an existing split with the same primary container, indicates whether the
-        existing secondary container on top and all activities in it should be destroyed when a new
-        split is created using this rule. Otherwise the new secondary will appear on top. Defaults
-         to "false". -->
+        <!-- An attribute for Activity Embedding rules.
+             If there is an existing split with the same primary container, indicates whether the
+             existing secondary container on top and all activities in it should be destroyed when a
+             new split is created using this rule. Otherwise the new secondary will appear on top.
+             The default is 'false'. -->
         <attr name="clearTop" format="boolean" />
+        <attr name="finishPrimaryWithSecondary" />
+        <attr name="finishSecondaryWithPrimary" />
         <attr name="splitRatio"/>
         <attr name="splitMinWidthDp"/>
+        <attr name="splitMinHeightDp"/>
         <attr name="splitMinSmallestWidthDp"/>
         <attr name="splitMaxAspectRatioInPortrait" />
         <attr name="splitMaxAspectRatioInLandscape" />
         <attr name="splitLayoutDirection"/>
+        <attr name="tag"/>
+        <attr name="animationBackgroundColor"/>
     </declare-styleable>
 
-    <!-- Configuration rules for split placeholders. Must contain at least one ActivityFilter for
-    the primary activity for which the rule should be applied.
-    See androidx.window.embedding.SplitPlaceholderRule for complete documentation. -->
+    <!-- Attributes that are read when parsing a <SplitPlaceholderRule> tag, which defines the split
+         configuration rules for split placeholders.
+         Must contain at least one `ActivityFilter` for the primary activity for which the rule
+         should be applied. -->
     <declare-styleable name="SplitPlaceholderRule">
-        <!-- Component name of the placeholder activity in the split. Must be non-empty. -->
+        <!-- An attribute for Activity Embedding rules.
+             Component name of the placeholder activity to launch in the split.
+             Must be non-empty. -->
         <attr name="placeholderActivityName" format="string" />
-        <!-- Determines whether the placeholder will show on top in a smaller window size after
-        it first appeared in a split with sufficient minimum width. -->
+        <!-- An attribute for Activity Embedding rules.
+             Determines whether the placeholder will show on top if Task window constraints are not
+             satisfied after it first appeared in a split with sufficient Task window constraints.
+             The default is `false`. -->
         <attr name="stickyPlaceholder" format="boolean" />
-        <!-- When all activities are finished in the secondary container, the activity in the
-         primary container that created the split should also be finished. Defaults to "always". -->
-        <attr name="finishPrimaryWithPlaceholder" />
+        <attr name="finishPrimaryWithPlaceholder"/>
         <attr name="splitRatio"/>
         <attr name="splitMinWidthDp"/>
+        <attr name="splitMinHeightDp"/>
         <attr name="splitMinSmallestWidthDp"/>
         <attr name="splitMaxAspectRatioInPortrait" />
         <attr name="splitMaxAspectRatioInLandscape" />
         <attr name="splitLayoutDirection"/>
+        <attr name="tag"/>
+        <attr name="animationBackgroundColor"/>
     </declare-styleable>
 
-    <!-- Filter used to find if a pair of activities should be put in a split. -->
+    <!-- Attributes that are read when parsing an <ActivityRule> tag, which defines the layout
+         configuration rules for individual activities. It takes precedence over `SplitPairRule`.
+         Must contain at least one `ActivityFilter`. -->
+    <declare-styleable name="ActivityRule">
+        <!-- An attribute for Activity Embedding rules.
+             Whether the activity should always be expanded on launch.
+             The default is `false`. -->
+        <attr name="alwaysExpand" format="boolean" />
+        <attr name="tag"/>
+    </declare-styleable>
+
+    <!-- Attributes that are read when parsing an <SplitPairFilter> tag, which defines the filter
+         for `SplitPairRule`. -->
     <declare-styleable name="SplitPairFilter">
-        <!-- Component name of the primary activity in the split. Must be non-empty. Can contain a
-         wildcard at the end or instead of package name and/or class name. -->
+        <!-- An attribute for Activity Embedding rules.
+             Component name of the primary activity in the split. Must be non-empty. Can contain a
+             wildcard at the end or instead of package name and/or class name. -->
         <attr name="primaryActivityName" format="string" />
-        <!-- Component name of the secondary activity in the split. Must be non-empty. Can contain a
-         wildcard at the end or instead of package name and/or class name. -->
+        <!-- An attribute for Activity Embedding rules.
+             Component name of the secondary activity in the split. Must be non-empty. Can contain a
+             wildcard at the end or instead of package name and/or class name. -->
         <attr name="secondaryActivityName" format="string" />
-        <!-- Action used for secondary activity launch. May be empty. Must not contain wildcards.
-         -->
+        <!-- An attribute for Activity Embedding rules.
+             Action used for the secondary activity launch. May be empty. Must not contain
+             wildcards.
+             When it is set, the filter only matches if the secondary activity is launched with an
+             intent with the given action. -->
         <attr name="secondaryActivityAction" format="string" />
     </declare-styleable>
 
-    <!-- Layout configuration rules for individual activities. Takes precedence over
-    SplitPairRule. Must contain at least one ActivityFilter.
-    See androidx.window.layout.ActivityRule for complete documentation. -->
-    <declare-styleable name="ActivityRule">
-        <!-- Whether the activity should always be expanded on launch. -->
-        <attr name="alwaysExpand" format="boolean" />
-    </declare-styleable>
-
-    <!-- Filter for ActivityRule. -->
+    <!-- Attributes that are read when parsing an <ActivityFilter> tag, which defines the filter
+         Filter for `ActivityRule` and `SplitPlaceholderRule`. -->
     <declare-styleable name="ActivityFilter">
-        <!-- Component name of the primary activity in the split. Must be non-empty. Can contain a
-         single wildcard at the end. -->
+        <!-- An attribute for Activity Embedding rules.
+             Component name of the launched activity. Must be non-empty. Can contain a single
+             wildcard at the end. -->
         <attr name="activityName" format="string" />
-        <!-- Action used for activity launch. May be empty. Must not contain wildcards.
-         -->
+        <!-- An attribute for Activity Embedding rules.
+             Action used for the activity launch. May be empty. Must not contain wildcards.
+             When it is set, the filter only matches if the activity is launched with an intent with
+             the given action. -->
         <attr name="activityAction" format="string" />
     </declare-styleable>
 </resources>
\ No newline at end of file
diff --git a/window/window/src/main/res/values/public.xml b/window/window/src/main/res/values/public.xml
new file mode 100644
index 0000000..70d9306
--- /dev/null
+++ b/window/window/src/main/res/values/public.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT 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>
+    <public name="splitRatio" type="attr" />
+    <public name="splitLayoutDirection" type="attr" />
+    <public name="tag" type="attr" />
+    <public name="animationBackgroundColor" type="attr" />
+
+    <public name="splitMinWidthDp" type="attr" />
+    <public name="splitMinHeightDp" type="attr" />
+    <public name="splitMinSmallestWidthDp" type="attr" />
+    <public name="splitMaxAspectRatioInPortrait" type="attr" />
+    <public name="splitMaxAspectRatioInLandscape" type="attr" />
+
+    <public name="finishPrimaryWithSecondary" type="attr" />
+    <public name="finishSecondaryWithPrimary" type="attr" />
+    <public name="finishPrimaryWithPlaceholder" type="attr" />
+
+    <public name="clearTop" type="attr" />
+    <public name="placeholderActivityName" type="attr" />
+    <public name="stickyPlaceholder" type="attr" />
+    <public name="alwaysExpand" type="attr" />
+    <public name="primaryActivityName" type="attr" />
+    <public name="secondaryActivityName" type="attr" />
+    <public name="secondaryActivityAction" type="attr" />
+    <public name="activityName" type="attr" />
+    <public name="activityAction" type="attr" />
+</resources>
\ No newline at end of file
diff --git a/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt b/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt
index 57709d2..cc18d1e 100644
--- a/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt
+++ b/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt
@@ -18,6 +18,8 @@
 
 import android.annotation.SuppressLint
 import android.app.Activity
+import android.content.Context
+import android.os.Build
 import org.mockito.kotlin.mock
 import java.util.function.Consumer
 import org.junit.Assert.assertEquals
@@ -38,7 +40,12 @@
         }
 
         @Suppress("UNUSED_PARAMETER")
-        fun addConsumer(a: Activity, c: Consumer<String>) {
+        fun addConsumer(context: Context, c: Consumer<String>) {
+            consumers.add(c)
+        }
+
+        @Suppress("UNUSED_PARAMETER")
+        fun addConsumer(activity: Activity, c: Consumer<String>) {
             consumers.add(c)
         }
 
@@ -85,6 +92,29 @@
     }
 
     @Test
+    fun testSubscribeByReflectionForContext() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            // java.util.function.Consumer#accept is supported after N.
+            return
+        }
+        val values = mutableListOf<String>()
+        val context = mock<Context>()
+        adapter.createSubscription(
+            listenerInterface,
+            String::class,
+            "addConsumer",
+            "removeConsumer",
+            context
+        ) { s: String ->
+            values.add(s)
+        }
+
+        assertEquals(1, listenerInterface.consumers.size)
+        listenerInterface.consumers.first().accept(value)
+        assertEquals(listOf(value), values)
+    }
+
+    @Test
     fun testDisposeSubscribe() {
         val values = mutableListOf<String>()
         val subscription = adapter.createSubscription(
@@ -102,6 +132,24 @@
     }
 
     @Test
+    fun testDisposeSubscribeForContext() {
+        val values = mutableListOf<String>()
+        val context = mock<Context>()
+        val subscription = adapter.createSubscription(
+            listenerInterface,
+            String::class,
+            "addConsumer",
+            "removeConsumer",
+            context
+        ) { s: String ->
+            values.add(s)
+        }
+        subscription.dispose()
+
+        assertTrue(listenerInterface.consumers.isEmpty())
+    }
+
+    @Test
     fun testToStringAdd() {
         val values = mutableListOf<String>()
         val consumer: (String) -> Unit = { s: String -> values.add(s) }
diff --git a/window/window/src/test/java/androidx/window/embedding/EmbeddingCompatTest.kt b/window/window/src/test/java/androidx/window/embedding/EmbeddingCompatTest.kt
index 9e42ae6..aa9e3f1 100644
--- a/window/window/src/test/java/androidx/window/embedding/EmbeddingCompatTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/EmbeddingCompatTest.kt
@@ -16,9 +16,14 @@
 
 package androidx.window.embedding
 
+import java.util.function.Consumer as JavaConsumer
+import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
 import android.app.Activity
 import androidx.window.core.ConsumerAdapter
+import androidx.window.core.ExtensionsUtil
 import androidx.window.core.PredicateAdapter
+import androidx.window.extensions.WindowExtensions.VENDOR_API_LEVEL_2
+import androidx.window.extensions.core.util.function.Consumer
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent
 import org.junit.Test
 import org.mockito.kotlin.any
@@ -28,6 +33,7 @@
 class EmbeddingCompatTest {
 
     private val component = mock<ActivityEmbeddingComponent>()
+    private val vendorApiLevel = ExtensionsUtil.safeVendorApiLevel
     private val embeddingCompat = EmbeddingCompat(
         component,
         EMBEDDING_ADAPTER,
@@ -35,6 +41,7 @@
         mock()
     )
 
+    @Suppress("Deprecation")
     @Test
     fun setSplitInfoCallback_callsActualMethod() {
         val callback = object : EmbeddingInterfaceCompat.EmbeddingCallbackInterface {
@@ -43,7 +50,11 @@
         }
         embeddingCompat.setEmbeddingCallback(callback)
 
-        verify(component).setSplitInfoCallback(any())
+        if (vendorApiLevel < VENDOR_API_LEVEL_2) {
+            verify(component).setSplitInfoCallback(any<JavaConsumer<List<OEMSplitInfo>>>())
+        } else {
+            verify(component).setSplitInfoCallback(any<Consumer<List<OEMSplitInfo>>>())
+        }
     }
 
     @Test
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt
new file mode 100644
index 0000000..96571cc
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/embedding/SplitAttributesTest.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.window.embedding
+
+import android.graphics.Color
+import androidx.window.core.WindowStrictModeException
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.BOTTOM_TO_TOP
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
+import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
+import androidx.window.embedding.SplitAttributes.SplitType
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertThrows
+import org.junit.Test
+
+/** Test class to verify [SplitAttributes] */
+class SplitAttributesTest {
+    @Test
+    fun testSplitAttributesEquals() {
+        val attrs1 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitEqually())
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        val attrs2 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(LOCALE)
+            .setAnimationBackgroundColor(0)
+            .build()
+        val attrs3 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(0)
+            .build()
+        val attrs4 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(Color.GREEN)
+            .build()
+        val attrs5 = SplitAttributes.Builder()
+            .setSplitType(SplitType.splitByHinge())
+            .setLayoutDirection(TOP_TO_BOTTOM)
+            .setAnimationBackgroundColor(Color.GREEN)
+            .build()
+
+        assertNotEquals(attrs1, attrs2)
+        assertNotEquals(attrs1.hashCode(), attrs2.hashCode())
+
+        assertNotEquals(attrs2, attrs3)
+        assertNotEquals(attrs2.hashCode(), attrs3.hashCode())
+
+        assertNotEquals(attrs3, attrs1)
+        assertNotEquals(attrs3.hashCode(), attrs1.hashCode())
+
+        assertNotEquals(attrs3, attrs4)
+        assertNotEquals(attrs3.hashCode(), attrs4.hashCode())
+
+        assertEquals(attrs4, attrs5)
+        assertEquals(attrs4.hashCode(), attrs5.hashCode())
+    }
+
+    @Test
+    fun testTypesEquals() {
+        val splitTypes = arrayOf(
+            SplitType.splitEqually(),
+            SplitType.expandContainers(),
+            SplitType.splitByHinge(),
+            SplitType.splitByHinge(SplitType.expandContainers())
+        )
+
+        for ((i, type1) in splitTypes.withIndex()) {
+            if (type1 is SplitType.RatioSplitType) {
+                assertEquals(
+                    "Two SplitTypes must regarded as equal if their ratios are the same.",
+                    type1, SplitType.ratio(type1.value)
+                )
+                assertEquals(type1.hashCode(), SplitType.ratio(type1.value).hashCode())
+            }
+            for ((j, type2) in splitTypes.withIndex()) {
+                if (i == j) {
+                    assertEquals(type1, type2)
+                    assertEquals(type1.hashCode(), type2.hashCode())
+                } else {
+                    assertNotEquals(type1, type2)
+                    assertNotEquals(type1.hashCode(), type2.hashCode())
+                }
+            }
+        }
+    }
+
+    @Test
+    fun testSplitRatioRatio() {
+        assertThrows(WindowStrictModeException::class.java) {
+            SplitType.ratio(-0.01f)
+        }
+        assertThrows(WindowStrictModeException::class.java) {
+            SplitType.ratio(0.0f)
+        }
+        SplitType.ratio(0.001f)
+        SplitType.ratio(0.5f)
+        SplitType.ratio(0.999f)
+        assertThrows(WindowStrictModeException::class.java) {
+            SplitType.ratio(1.0f)
+        }
+        assertThrows(WindowStrictModeException::class.java) {
+            SplitType.ratio(1.1f)
+        }
+    }
+
+    @Test
+    fun testLayoutDirectionEquals() {
+        val layoutDirectionList = arrayOf(
+            LOCALE,
+            LEFT_TO_RIGHT,
+            RIGHT_TO_LEFT,
+            TOP_TO_BOTTOM,
+            BOTTOM_TO_TOP,
+        )
+
+        for ((i, layoutDirection1) in layoutDirectionList.withIndex()) {
+            for ((j, layoutDirection2) in layoutDirectionList.withIndex()) {
+                if (i == j) {
+                    assertEquals(layoutDirection1, layoutDirection2)
+                    assertEquals(layoutDirection1.hashCode(), layoutDirection2.hashCode())
+                } else {
+                    assertNotEquals(layoutDirection1, layoutDirection2)
+                    assertNotEquals(layoutDirection1.hashCode(), layoutDirection2.hashCode())
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt b/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
index 8f15b16..06c6bbc 100644
--- a/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
+++ b/window/window/src/test/java/androidx/window/embedding/SplitInfoTest.kt
@@ -29,7 +29,8 @@
         val activity = mock<Activity>()
         val firstStack = ActivityStack(listOf(activity))
         val secondStack = ActivityStack(emptyList())
-        val info = SplitInfo(firstStack, secondStack, 0.5f)
+        val attributes = SplitAttributes()
+        val info = SplitInfo(firstStack, secondStack, attributes)
 
         assertTrue(info.contains(activity))
     }
@@ -39,7 +40,8 @@
         val activity = mock<Activity>()
         val firstStack = ActivityStack(emptyList())
         val secondStack = ActivityStack(listOf(activity))
-        val info = SplitInfo(firstStack, secondStack, 0.5f)
+        val attributes = SplitAttributes()
+        val info = SplitInfo(firstStack, secondStack, attributes)
 
         assertTrue(info.contains(activity))
     }
@@ -49,8 +51,9 @@
         val activity = mock<Activity>()
         val firstStack = ActivityStack(emptyList())
         val secondStack = ActivityStack(listOf(activity))
-        val firstInfo = SplitInfo(firstStack, secondStack, 0.5f)
-        val secondInfo = SplitInfo(firstStack, secondStack, 0.5f)
+        val attributes = SplitAttributes()
+        val firstInfo = SplitInfo(firstStack, secondStack, attributes)
+        val secondInfo = SplitInfo(firstStack, secondStack, attributes)
 
         assertEquals(firstInfo, secondInfo)
         assertEquals(firstInfo.hashCode(), secondInfo.hashCode())
diff --git a/window/window/src/test/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendUnitTest.kt b/window/window/src/test/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendUnitTest.kt
index a5d698f..f286aa1 100644
--- a/window/window/src/test/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendUnitTest.kt
+++ b/window/window/src/test/java/androidx/window/layout/adapter/sidecar/SidecarWindowBackendUnitTest.kt
@@ -73,6 +73,18 @@
     }
 
     @Test
+    public fun testRegisterLayoutChangeCallback_withContext() {
+        val backend = SidecarWindowBackend.getInstance(context)
+        backend.windowExtension = mock()
+
+        // Check registering the layout change callback
+        val consumer = mock<Consumer<WindowLayoutInfo>>()
+        val context = mock<Context>()
+        backend.registerLayoutChangeCallback(context, { obj: Runnable -> obj.run() }, consumer)
+        verify(consumer).accept(any())
+    }
+
+    @Test
     public fun testRegisterLayoutChangeCallback_noExtension() {
         val backend = SidecarWindowBackend.getInstance(context)
         backend.windowExtension = null
diff --git a/window/window/src/testUtil/java/androidx/window/layout/TestWindowMetricsCalculator.kt b/window/window/src/testUtil/java/androidx/window/layout/TestWindowMetricsCalculator.kt
index 9ec07b1..5206e1e 100644
--- a/window/window/src/testUtil/java/androidx/window/layout/TestWindowMetricsCalculator.kt
+++ b/window/window/src/testUtil/java/androidx/window/layout/TestWindowMetricsCalculator.kt
@@ -16,7 +16,9 @@
 package androidx.window.layout
 
 import android.app.Activity
+import android.content.Context
 import android.graphics.Rect
+import androidx.annotation.UiContext
 
 /**
  * Implementation of [WindowMetricsCalculator] for testing.
@@ -24,44 +26,62 @@
  * @see WindowMetricsCalculator
  */
 internal class TestWindowMetricsCalculator : WindowMetricsCalculator {
-    private var globalOverriddenBounds: Rect? = null
-    private val overriddenBounds = mutableMapOf<Activity, Rect?>()
-    private val overriddenMaximumBounds = mutableMapOf<Activity, Rect?>()
+    private var overrideBounds: Rect? = null
+    private var overrideMaxBounds: Rect? = null
+    private val currentBounds = mutableMapOf<Context, Rect>()
+    private val maxBounds = mutableMapOf<Context, Rect>()
 
     /**
-     * Overrides the bounds returned from this helper for the given context. Passing `null` [bounds]
-     * has the effect of clearing the bounds override.
+     * Sets the bounds returned from this helper for the given context.
      *
-     * Note: A global override set as a result of [.setCurrentBounds] takes precedence
-     * over the value set with this method.
+     * Note: An override set via [setOverrideBounds] takes precedence over the values set with
+     * this method.
      */
-    fun setCurrentBoundsForActivity(activity: Activity, bounds: Rect?) {
-        overriddenBounds[activity] = bounds
+    fun setBounds(@UiContext context: Context, currentBounds: Rect, maxBounds: Rect) {
+        this.currentBounds[context] = currentBounds
+        this.maxBounds[context] = maxBounds
     }
 
     /**
-     * Overrides the max bounds returned from this helper for the given context. Passing `null`
-     * [bounds] has the effect of clearing the bounds override.
+     * Clears the bounds that were set via [setBounds] for the given context.
      */
-    fun setMaximumBoundsForActivity(activity: Activity, bounds: Rect?) {
-        overriddenMaximumBounds[activity] = bounds
+    fun clearBounds(@UiContext context: Context) {
+        currentBounds.remove(context)
+        maxBounds.remove(context)
     }
 
     /**
-     * Overrides the bounds returned from this helper for all supplied contexts. Passing null
-     * [bounds] has the effect of clearing the global override.
+     * Overrides the bounds returned from this helper for all supplied contexts.
      */
-    fun setCurrentBounds(bounds: Rect?) {
-        globalOverriddenBounds = bounds
+    fun setOverrideBounds(currentBounds: Rect, maxBounds: Rect) {
+        overrideBounds = currentBounds
+        overrideMaxBounds = maxBounds
+    }
+
+    /**
+     * Clears the overrides that were set in [setOverrideBounds].
+     */
+    fun clearOverrideBounds() {
+        overrideBounds = null
+        overrideMaxBounds = null
     }
 
     override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
-        val bounds = globalOverriddenBounds ?: overriddenBounds[activity] ?: Rect()
+        return computeCurrentWindowMetrics(activity as Context)
+    }
+
+    override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        val bounds = overrideBounds ?: currentBounds[context] ?: Rect()
         return WindowMetrics(bounds)
     }
 
     override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
-        return WindowMetrics(overriddenMaximumBounds[activity] ?: Rect())
+        return computeMaximumWindowMetrics(activity as Context)
+    }
+
+    override fun computeMaximumWindowMetrics(@UiContext context: Context): WindowMetrics {
+        val bounds = overrideMaxBounds ?: maxBounds[context] ?: Rect()
+        return WindowMetrics(bounds)
     }
 
     /**
@@ -69,8 +89,9 @@
      * [.setCurrentBoundsForActivity].
      */
     fun reset() {
-        globalOverriddenBounds = null
-        overriddenBounds.clear()
-        overriddenMaximumBounds.clear()
+        overrideBounds = null
+        overrideMaxBounds = null
+        currentBounds.clear()
+        maxBounds.clear()
     }
 }
diff --git a/work/work-gcm/build.gradle b/work/work-gcm/build.gradle
index 4e9ee99..562422b0 100644
--- a/work/work-gcm/build.gradle
+++ b/work/work-gcm/build.gradle
@@ -32,9 +32,9 @@
 dependencies {
     api project(":work:work-runtime")
     implementation(libs.gcmNetworkManager)
-    annotationProcessor("androidx.room:room-compiler:2.5.0-beta01")
-    implementation("androidx.room:room-runtime:2.5.0-beta01")
-    androidTestImplementation("androidx.room:room-testing:2.5.0-beta01")
+    annotationProcessor("androidx.room:room-compiler:2.5.0")
+    implementation("androidx.room:room-runtime:2.5.0")
+    androidTestImplementation("androidx.room:room-testing:2.5.0")
 
     androidTestImplementation(project(":work:work-runtime-ktx"))
     androidTestImplementation(libs.testExtJunit)
diff --git a/work/work-inspection/build.gradle b/work/work-inspection/build.gradle
index 6b3612c..5385c55 100644
--- a/work/work-inspection/build.gradle
+++ b/work/work-inspection/build.gradle
@@ -30,7 +30,7 @@
     compileOnly("androidx.inspection:inspection:1.0.0")
     compileOnly(project(":lifecycle:lifecycle-runtime"))
     compileOnly(project(":work:work-runtime"))
-    compileOnly("androidx.room:room-runtime:2.5.0-beta01")
+    compileOnly("androidx.room:room-runtime:2.5.0")
     androidTestImplementation(project(":inspection:inspection-testing"))
     androidTestImplementation(project(":work:work-runtime"))
     androidTestImplementation(project(":work:work-runtime-ktx"))
diff --git a/work/work-inspection/src/androidTest/java/androidx/work/inspection/InspectorApp.kt b/work/work-inspection/src/androidTest/java/androidx/work/inspection/InspectorApp.kt
index 9de0fcc..cd39b13 100644
--- a/work/work-inspection/src/androidTest/java/androidx/work/inspection/InspectorApp.kt
+++ b/work/work-inspection/src/androidTest/java/androidx/work/inspection/InspectorApp.kt
@@ -20,16 +20,11 @@
 import androidx.work.Configuration
 
 class InspectorApp : Application(), Configuration.Provider {
-    lateinit var executor: DispatchingExecutor
-    override fun onCreate() {
-        super.onCreate()
-        executor = DispatchingExecutor()
-    }
+    val executor = DispatchingExecutor()
 
-    override fun getWorkManagerConfiguration(): Configuration {
-        return Configuration.Builder()
+    override val workManagerConfiguration: Configuration =
+        Configuration.Builder()
             .setExecutor(executor)
             .setTaskExecutor(executor)
             .build()
-    }
 }
diff --git a/work/work-lint/src/main/java/androidx/work/lint/WorkManagerIssueRegistry.kt b/work/work-lint/src/main/java/androidx/work/lint/WorkManagerIssueRegistry.kt
index 28e0e2f..ac9972b 100644
--- a/work/work-lint/src/main/java/androidx/work/lint/WorkManagerIssueRegistry.kt
+++ b/work/work-lint/src/main/java/androidx/work/lint/WorkManagerIssueRegistry.kt
@@ -25,7 +25,7 @@
 
 class WorkManagerIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
-    override val api = 13
+    override val api = 14
     override val issues: List<Issue> = listOf(
         BadConfigurationProviderIssueDetector.ISSUE,
         IdleBatteryChargingConstraintsDetector.ISSUE,
diff --git a/work/work-multiprocess/build.gradle b/work/work-multiprocess/build.gradle
index 67f4356..7b7697d 100644
--- a/work/work-multiprocess/build.gradle
+++ b/work/work-multiprocess/build.gradle
@@ -34,8 +34,8 @@
     api(libs.kotlinStdlib)
     api(libs.kotlinCoroutinesAndroid)
     api(libs.guavaListenableFuture)
-    implementation("androidx.core:core:1.1.0")
-    implementation("androidx.room:room-runtime:2.5.0-beta01")
+    implementation("androidx.core:core:1.9.0")
+    implementation("androidx.room:room-runtime:2.5.0")
     androidTestImplementation(libs.kotlinStdlib)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/work/work-runtime-ktx/api/current.ignore b/work/work-runtime-ktx/api/current.ignore
new file mode 100644
index 0000000..8aff62a
--- /dev/null
+++ b/work/work-runtime-ktx/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.work.ListenableFutureKt:
+    Removed class androidx.work.ListenableFutureKt
diff --git a/work/work-runtime-ktx/api/current.txt b/work/work-runtime-ktx/api/current.txt
index efdea4c..c3c6e5c 100644
--- a/work/work-runtime-ktx/api/current.txt
+++ b/work/work-runtime-ktx/api/current.txt
@@ -19,9 +19,6 @@
     method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
   }
 
-  public final class ListenableFutureKt {
-  }
-
   public final class OperationKt {
     method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
   }
diff --git a/work/work-runtime-ktx/api/public_plus_experimental_current.txt b/work/work-runtime-ktx/api/public_plus_experimental_current.txt
index efdea4c..c3c6e5c 100644
--- a/work/work-runtime-ktx/api/public_plus_experimental_current.txt
+++ b/work/work-runtime-ktx/api/public_plus_experimental_current.txt
@@ -19,9 +19,6 @@
     method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
   }
 
-  public final class ListenableFutureKt {
-  }
-
   public final class OperationKt {
     method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
   }
diff --git a/work/work-runtime-ktx/api/restricted_current.ignore b/work/work-runtime-ktx/api/restricted_current.ignore
new file mode 100644
index 0000000..8aff62a
--- /dev/null
+++ b/work/work-runtime-ktx/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.work.ListenableFutureKt:
+    Removed class androidx.work.ListenableFutureKt
diff --git a/work/work-runtime-ktx/api/restricted_current.txt b/work/work-runtime-ktx/api/restricted_current.txt
index efdea4c..c3c6e5c 100644
--- a/work/work-runtime-ktx/api/restricted_current.txt
+++ b/work/work-runtime-ktx/api/restricted_current.txt
@@ -19,9 +19,6 @@
     method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
   }
 
-  public final class ListenableFutureKt {
-  }
-
   public final class OperationKt {
     method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
   }
diff --git a/work/work-runtime-ktx/build.gradle b/work/work-runtime-ktx/build.gradle
index 9de4d41..f45007c 100644
--- a/work/work-runtime-ktx/build.gradle
+++ b/work/work-runtime-ktx/build.gradle
@@ -35,7 +35,7 @@
     androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation("androidx.room:room-testing:2.5.0-beta01")
+    androidTestImplementation("androidx.room:room-testing:2.5.0")
     testImplementation(libs.junit)
 }
 
diff --git a/work/work-runtime/api/current.ignore b/work/work-runtime/api/current.ignore
index 33b7b2f..45e9ef4 100644
--- a/work/work-runtime/api/current.ignore
+++ b/work/work-runtime/api/current.ignore
@@ -1,3 +1,7 @@
 // Baseline format: 1.0
+ChangedType: androidx.work.Configuration#getInitializationExceptionHandler():
+    Method androidx.work.Configuration.getInitializationExceptionHandler has changed return type from androidx.core.util.Consumer<java.lang.Throwable!> to androidx.core.util.Consumer<java.lang.Throwable>
+ChangedType: androidx.work.Configuration#getSchedulingExceptionHandler():
+    Method androidx.work.Configuration.getSchedulingExceptionHandler has changed return type from androidx.core.util.Consumer<java.lang.Throwable!> to androidx.core.util.Consumer<java.lang.Throwable>
 ChangedType: androidx.work.WorkInfo#getTags():
     Method androidx.work.WorkInfo.getTags has changed return type from java.util.Set<java.lang.String!> to java.util.Set<java.lang.String>
diff --git a/work/work-runtime/api/current.txt b/work/work-runtime/api/current.txt
index a44d623..6964c18 100644
--- a/work/work-runtime/api/current.txt
+++ b/work/work-runtime/api/current.txt
@@ -16,35 +16,50 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getInitializationExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
     method public androidx.work.RunnableScheduler getRunnableScheduler();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getSchedulingExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getSchedulingExceptionHandler();
     method public java.util.concurrent.Executor getTaskExecutor();
     method public androidx.work.WorkerFactory getWorkerFactory();
+    property public final String? defaultProcessName;
+    property public final java.util.concurrent.Executor executor;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? initializationExceptionHandler;
+    property public final androidx.work.InputMergerFactory inputMergerFactory;
+    property public final int maxJobSchedulerId;
+    property public final int minJobSchedulerId;
+    property public final androidx.work.RunnableScheduler runnableScheduler;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? schedulingExceptionHandler;
+    property public final java.util.concurrent.Executor taskExecutor;
+    property public final androidx.work.WorkerFactory workerFactory;
+    field public static final androidx.work.Configuration.Companion Companion;
     field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
   }
 
   public static final class Configuration.Builder {
     ctor public Configuration.Builder();
     method public androidx.work.Configuration build();
-    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
-    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
-    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
-    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
-    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
-    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
-    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String processName);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> exceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory inputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int maxSchedulerLimit);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int loggingLevel);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler runnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> schedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor taskExecutor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory workerFactory);
+  }
+
+  public static final class Configuration.Companion {
   }
 
   public static interface Configuration.Provider {
     method public androidx.work.Configuration getWorkManagerConfiguration();
+    property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
   public final class Constraints {
@@ -183,9 +198,6 @@
     method public abstract androidx.work.InputMerger? createInputMerger(String className);
   }
 
-  public final class InputMergerKt {
-  }
-
   public abstract class ListenableWorker {
     ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
     method public final android.content.Context getApplicationContext();
@@ -319,7 +331,13 @@
   }
 
   public final class WorkInfo {
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation, optional androidx.work.Constraints constraints);
     ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags);
+    method public androidx.work.Constraints getConstraints();
     method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
@@ -327,6 +345,7 @@
     method @IntRange(from=0L) public int getRunAttemptCount();
     method public androidx.work.WorkInfo.State getState();
     method public java.util.Set<java.lang.String> getTags();
+    property public final androidx.work.Constraints constraints;
     property public final int generation;
     property public final java.util.UUID id;
     property public final androidx.work.Data outputData;
diff --git a/work/work-runtime/api/public_plus_experimental_current.txt b/work/work-runtime/api/public_plus_experimental_current.txt
index a44d623..6964c18 100644
--- a/work/work-runtime/api/public_plus_experimental_current.txt
+++ b/work/work-runtime/api/public_plus_experimental_current.txt
@@ -16,35 +16,50 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getInitializationExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
     method public androidx.work.RunnableScheduler getRunnableScheduler();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getSchedulingExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getSchedulingExceptionHandler();
     method public java.util.concurrent.Executor getTaskExecutor();
     method public androidx.work.WorkerFactory getWorkerFactory();
+    property public final String? defaultProcessName;
+    property public final java.util.concurrent.Executor executor;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? initializationExceptionHandler;
+    property public final androidx.work.InputMergerFactory inputMergerFactory;
+    property public final int maxJobSchedulerId;
+    property public final int minJobSchedulerId;
+    property public final androidx.work.RunnableScheduler runnableScheduler;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? schedulingExceptionHandler;
+    property public final java.util.concurrent.Executor taskExecutor;
+    property public final androidx.work.WorkerFactory workerFactory;
+    field public static final androidx.work.Configuration.Companion Companion;
     field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
   }
 
   public static final class Configuration.Builder {
     ctor public Configuration.Builder();
     method public androidx.work.Configuration build();
-    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
-    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
-    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
-    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
-    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
-    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
-    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String processName);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> exceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory inputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int maxSchedulerLimit);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int loggingLevel);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler runnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> schedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor taskExecutor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory workerFactory);
+  }
+
+  public static final class Configuration.Companion {
   }
 
   public static interface Configuration.Provider {
     method public androidx.work.Configuration getWorkManagerConfiguration();
+    property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
   public final class Constraints {
@@ -183,9 +198,6 @@
     method public abstract androidx.work.InputMerger? createInputMerger(String className);
   }
 
-  public final class InputMergerKt {
-  }
-
   public abstract class ListenableWorker {
     ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
     method public final android.content.Context getApplicationContext();
@@ -319,7 +331,13 @@
   }
 
   public final class WorkInfo {
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation, optional androidx.work.Constraints constraints);
     ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags);
+    method public androidx.work.Constraints getConstraints();
     method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
@@ -327,6 +345,7 @@
     method @IntRange(from=0L) public int getRunAttemptCount();
     method public androidx.work.WorkInfo.State getState();
     method public java.util.Set<java.lang.String> getTags();
+    property public final androidx.work.Constraints constraints;
     property public final int generation;
     property public final java.util.UUID id;
     property public final androidx.work.Data outputData;
diff --git a/work/work-runtime/api/restricted_current.ignore b/work/work-runtime/api/restricted_current.ignore
index 33b7b2f..45e9ef4 100644
--- a/work/work-runtime/api/restricted_current.ignore
+++ b/work/work-runtime/api/restricted_current.ignore
@@ -1,3 +1,7 @@
 // Baseline format: 1.0
+ChangedType: androidx.work.Configuration#getInitializationExceptionHandler():
+    Method androidx.work.Configuration.getInitializationExceptionHandler has changed return type from androidx.core.util.Consumer<java.lang.Throwable!> to androidx.core.util.Consumer<java.lang.Throwable>
+ChangedType: androidx.work.Configuration#getSchedulingExceptionHandler():
+    Method androidx.work.Configuration.getSchedulingExceptionHandler has changed return type from androidx.core.util.Consumer<java.lang.Throwable!> to androidx.core.util.Consumer<java.lang.Throwable>
 ChangedType: androidx.work.WorkInfo#getTags():
     Method androidx.work.WorkInfo.getTags has changed return type from java.util.Set<java.lang.String!> to java.util.Set<java.lang.String>
diff --git a/work/work-runtime/api/restricted_current.txt b/work/work-runtime/api/restricted_current.txt
index a44d623..6964c18 100644
--- a/work/work-runtime/api/restricted_current.txt
+++ b/work/work-runtime/api/restricted_current.txt
@@ -16,35 +16,50 @@
   public final class Configuration {
     method public String? getDefaultProcessName();
     method public java.util.concurrent.Executor getExecutor();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getInitializationExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getInitializationExceptionHandler();
     method public androidx.work.InputMergerFactory getInputMergerFactory();
     method public int getMaxJobSchedulerId();
     method public int getMinJobSchedulerId();
     method public androidx.work.RunnableScheduler getRunnableScheduler();
-    method public androidx.core.util.Consumer<java.lang.Throwable!>? getSchedulingExceptionHandler();
+    method public androidx.core.util.Consumer<java.lang.Throwable>? getSchedulingExceptionHandler();
     method public java.util.concurrent.Executor getTaskExecutor();
     method public androidx.work.WorkerFactory getWorkerFactory();
+    property public final String? defaultProcessName;
+    property public final java.util.concurrent.Executor executor;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? initializationExceptionHandler;
+    property public final androidx.work.InputMergerFactory inputMergerFactory;
+    property public final int maxJobSchedulerId;
+    property public final int minJobSchedulerId;
+    property public final androidx.work.RunnableScheduler runnableScheduler;
+    property public final androidx.core.util.Consumer<java.lang.Throwable>? schedulingExceptionHandler;
+    property public final java.util.concurrent.Executor taskExecutor;
+    property public final androidx.work.WorkerFactory workerFactory;
+    field public static final androidx.work.Configuration.Companion Companion;
     field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
   }
 
   public static final class Configuration.Builder {
     ctor public Configuration.Builder();
     method public androidx.work.Configuration build();
-    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
-    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
-    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
-    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
-    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
-    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
-    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable!>);
-    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
-    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String processName);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> exceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory inputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int maxSchedulerLimit);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int loggingLevel);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler runnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.core.util.Consumer<java.lang.Throwable> schedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor taskExecutor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory workerFactory);
+  }
+
+  public static final class Configuration.Companion {
   }
 
   public static interface Configuration.Provider {
     method public androidx.work.Configuration getWorkManagerConfiguration();
+    property public abstract androidx.work.Configuration workManagerConfiguration;
   }
 
   public final class Constraints {
@@ -183,9 +198,6 @@
     method public abstract androidx.work.InputMerger? createInputMerger(String className);
   }
 
-  public final class InputMergerKt {
-  }
-
   public abstract class ListenableWorker {
     ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
     method public final android.content.Context getApplicationContext();
@@ -319,7 +331,13 @@
   }
 
   public final class WorkInfo {
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation, optional androidx.work.Constraints constraints);
     ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount, optional int generation);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress, optional int runAttemptCount);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData, optional androidx.work.Data progress);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags, optional androidx.work.Data outputData);
+    ctor public WorkInfo(java.util.UUID id, androidx.work.WorkInfo.State state, java.util.Set<java.lang.String> tags);
+    method public androidx.work.Constraints getConstraints();
     method public int getGeneration();
     method public java.util.UUID getId();
     method public androidx.work.Data getOutputData();
@@ -327,6 +345,7 @@
     method @IntRange(from=0L) public int getRunAttemptCount();
     method public androidx.work.WorkInfo.State getState();
     method public java.util.Set<java.lang.String> getTags();
+    property public final androidx.work.Constraints constraints;
     property public final int generation;
     property public final java.util.UUID id;
     property public final androidx.work.Data outputData;
diff --git a/work/work-runtime/build.gradle b/work/work-runtime/build.gradle
index 124033e..4912a2d 100644
--- a/work/work-runtime/build.gradle
+++ b/work/work-runtime/build.gradle
@@ -56,17 +56,16 @@
 }
 
 dependencies {
-    implementation("androidx.core:core:1.6.0")
-    ksp("androidx.room:room-compiler:2.5.0-beta01")
-    implementation("androidx.room:room-runtime:2.5.0-beta01")
-    androidTestImplementation("androidx.room:room-testing:2.5.0-beta01")
-    implementation("androidx.sqlite:sqlite-framework:2.3.0-beta01")
+    implementation("androidx.core:core:1.9.0")
+    ksp("androidx.room:room-compiler:2.5.0")
+    implementation("androidx.room:room-runtime:2.5.0")
+    androidTestImplementation("androidx.room:room-testing:2.5.0")
+    implementation("androidx.sqlite:sqlite-framework:2.3.0")
     api("androidx.annotation:annotation-experimental:1.0.0")
     api(libs.guavaListenableFuture)
-    api("androidx.lifecycle:lifecycle-livedata:2.1.0")
-    api("androidx.startup:startup-runtime:1.0.0")
-    implementation("androidx.core:core:1.1.0")
-    implementation("androidx.lifecycle:lifecycle-service:2.1.0")
+    api("androidx.lifecycle:lifecycle-livedata:2.5.1")
+    api("androidx.startup:startup-runtime:1.1.1")
+    implementation("androidx.lifecycle:lifecycle-service:2.5.1")
     api(libs.kotlinStdlib)
     androidTestImplementation(libs.multidex)
     androidTestImplementation(libs.truth)
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
index 7b40234..d13e1f3 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/WorkForegroundRunnableTest.kt
@@ -149,7 +149,7 @@
     }
 
     private fun getWorkerSpy(work: OneTimeWorkRequest) = spy(
-        configuration.mWorkerFactory.createWorkerWithDefaultFallback(
+        configuration.workerFactory.createWorkerWithDefaultFallback(
             context,
             work.workSpec.workerClassName,
             newWorkerParams(work)
@@ -176,7 +176,7 @@
         0,
         executor,
         taskExecutor,
-        configuration.mWorkerFactory,
+        configuration.workerFactory,
         progressUpdater,
         foregroundUpdater
     )
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
index 2fcecaa..3f33e97 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/WorkUpdateTest.kt
@@ -22,7 +22,6 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import androidx.test.filters.RequiresDevice
 import androidx.test.filters.SdkSuppress
 import androidx.work.WorkInfo.State
 import androidx.work.WorkManager.UpdateResult.APPLIED_FOR_NEXT_RUN
@@ -216,7 +215,6 @@
         workManager.awaitSuccess(requestId)
     }
 
-    @RequiresDevice // b/266498479
     @Test
     @MediumTest
     fun progressReset() {
@@ -230,7 +228,8 @@
         lateinit var runningObserver: Observer<WorkInfo>
         val liveData = workManager.getWorkInfoByIdLiveData(request.id)
         runningObserver = Observer {
-            if (it.state == State.RUNNING) {
+            // not only running, but setProgressAsync call was made
+            if (it.state == State.RUNNING && it.progress.size() != 0) {
                 runningLatch.countDown()
                 liveData.removeObserver(runningObserver)
             }
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
index ec2f13a..206fdc6 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/WorkManagerImplTest.java
@@ -20,6 +20,7 @@
 import static androidx.work.ExistingWorkPolicy.APPEND_OR_REPLACE;
 import static androidx.work.ExistingWorkPolicy.KEEP;
 import static androidx.work.ExistingWorkPolicy.REPLACE;
+import static androidx.work.NetworkType.CONNECTED;
 import static androidx.work.NetworkType.METERED;
 import static androidx.work.NetworkType.NOT_REQUIRED;
 import static androidx.work.WorkInfo.State.BLOCKED;
@@ -40,6 +41,7 @@
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.emptyCollectionOf;
+import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.isIn;
@@ -1172,6 +1174,24 @@
 
     @Test
     @MediumTest
+    public void testGetWorkInfoByIdSyncConstraints() throws Exception {
+        Constraints constraints = new Constraints.Builder()
+                .setRequiresCharging(true)
+                .setRequiredNetworkType(CONNECTED)
+                .build();
+        OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
+                .setInitialState(SUCCEEDED)
+                .setConstraints(constraints)
+                .build();
+        insertWorkSpecAndTags(work);
+
+        WorkInfo workInfo = mWorkManagerImpl.getWorkInfoById(work.getId()).get();
+        assertThat(workInfo.getId().toString(), is(work.getStringId()));
+        assertThat(workInfo.getConstraints(), equalTo(constraints));
+    }
+
+    @Test
+    @MediumTest
     public void testGetWorkInfoByIdSync_returnsNullIfNotInDatabase()
             throws ExecutionException, InterruptedException {
 
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/foreground/SystemForegroundDispatcherTest.kt b/work/work-runtime/src/androidTest/java/androidx/work/impl/foreground/SystemForegroundDispatcherTest.kt
index 22ac2bc..4ff0283 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/foreground/SystemForegroundDispatcherTest.kt
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/foreground/SystemForegroundDispatcherTest.kt
@@ -35,23 +35,23 @@
 import androidx.work.WorkerParameters
 import androidx.work.impl.Processor
 import androidx.work.impl.Scheduler
-import androidx.work.impl.WorkDatabase
-import androidx.work.impl.model.WorkGenerationalId
-import androidx.work.impl.WorkManagerImpl
 import androidx.work.impl.StartStopToken
+import androidx.work.impl.WorkDatabase
+import androidx.work.impl.WorkManagerImpl
 import androidx.work.impl.constraints.WorkConstraintsCallback
 import androidx.work.impl.constraints.WorkConstraintsTracker
 import androidx.work.impl.foreground.SystemForegroundDispatcher.createCancelWorkIntent
 import androidx.work.impl.foreground.SystemForegroundDispatcher.createNotifyIntent
 import androidx.work.impl.foreground.SystemForegroundDispatcher.createStartForegroundIntent
 import androidx.work.impl.foreground.SystemForegroundDispatcher.createStopForegroundIntent
-import androidx.work.impl.utils.StopWorkRunnable
+import androidx.work.impl.model.WorkGenerationalId
 import androidx.work.impl.utils.SynchronousExecutor
 import androidx.work.impl.utils.futures.SettableFuture
 import androidx.work.impl.utils.taskexecutor.InstantWorkTaskExecutor
 import androidx.work.impl.utils.taskexecutor.TaskExecutor
 import androidx.work.worker.TestWorker
 import com.google.common.util.concurrent.ListenableFuture
+import java.util.UUID
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Before
@@ -59,14 +59,13 @@
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers.any
 import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mockito.`when`
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.reset
 import org.mockito.Mockito.spy
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyZeroInteractions
-import java.util.UUID
+import org.mockito.Mockito.`when`
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
@@ -397,10 +396,7 @@
         val intent = createStartForegroundIntent(context,
             WorkGenerationalId(request.stringId, 0), metadata)
         dispatcher.onStartCommand(intent)
-        val stopWorkRunnable = StopWorkRunnable(
-            workManager, StartStopToken(WorkGenerationalId(request.stringId, 0)), false
-        )
-        stopWorkRunnable.run()
+        processor.stopWork(StartStopToken(WorkGenerationalId(request.stringId, 0)))
         val state = workDatabase.workSpecDao().getState(request.stringId)
         assertThat(state, `is`(WorkInfo.State.RUNNING))
         val stopAndCancelIntent = createCancelWorkIntent(context, request.stringId)
diff --git a/work/work-runtime/src/androidTest/java/androidx/work/impl/utils/ForceStopRunnableTest.java b/work/work-runtime/src/androidTest/java/androidx/work/impl/utils/ForceStopRunnableTest.java
index ddfb424..d008959 100644
--- a/work/work-runtime/src/androidTest/java/androidx/work/impl/utils/ForceStopRunnableTest.java
+++ b/work/work-runtime/src/androidTest/java/androidx/work/impl/utils/ForceStopRunnableTest.java
@@ -47,7 +47,6 @@
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.work.Configuration;
-import androidx.work.InitializationExceptionHandler;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkInfo;
 import androidx.work.impl.Scheduler;
@@ -206,6 +205,7 @@
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void test_InitializationExceptionHandler_migrationFailures() {
         mContext = mock(Context.class);
         when(mContext.getApplicationContext()).thenReturn(mContext);
@@ -214,7 +214,7 @@
         when(mWorkManager.getWorkDatabase()).thenReturn(mWorkDatabase);
         mRunnable = new ForceStopRunnable(mContext, mWorkManager);
 
-        InitializationExceptionHandler handler = mock(InitializationExceptionHandler.class);
+        Consumer<Throwable> handler = mock(Consumer.class);
         Configuration configuration = new Configuration.Builder(mConfiguration)
                 .setInitializationExceptionHandler(handler)
                 .build();
@@ -227,7 +227,7 @@
         ForceStopRunnable runnable = spy(mRunnable);
         doNothing().when(runnable).sleep(anyLong());
         runnable.run();
-        verify(handler, times(1)).handleException(any(Throwable.class));
+        verify(handler, times(1)).accept(any(Throwable.class));
     }
 
     @Test
diff --git a/work/work-runtime/src/main/java/androidx/work/Configuration.java b/work/work-runtime/src/main/java/androidx/work/Configuration.java
deleted file mode 100644
index a92a3fe..0000000
--- a/work/work-runtime/src/main/java/androidx/work/Configuration.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.work;
-
-import static androidx.work.impl.Scheduler.MAX_SCHEDULER_LIMIT;
-import static androidx.work.impl.utils.IdGeneratorKt.INITIAL_ID;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.os.Build;
-import android.util.Log;
-
-import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.core.util.Consumer;
-import androidx.work.impl.DefaultRunnableScheduler;
-import androidx.work.impl.Scheduler;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * The Configuration object used to customize {@link WorkManager} upon initialization.
- * Configuration contains various parameters used to setup WorkManager.  For example, it is possible
- * to customize the {@link Executor} used by {@link Worker}s here.
- * <p>
- * To set a custom Configuration for WorkManager, see
- * {@link WorkManager#initialize(Context, Configuration)}.
- */
-
-public final class Configuration {
-
-    /**
-     * The minimum number of system requests which can be enqueued by {@link WorkManager}
-     * when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
-     */
-    @SuppressLint("MinMaxConstant")
-    public static final int MIN_SCHEDULER_LIMIT = 20;
-
-    // Synthetic access
-    @SuppressWarnings("WeakerAccess")
-    final @NonNull Executor mExecutor;
-    @SuppressWarnings("WeakerAccess")
-    final @NonNull Executor mTaskExecutor;
-    @SuppressWarnings("WeakerAccess")
-    final @NonNull WorkerFactory mWorkerFactory;
-    @SuppressWarnings("WeakerAccess")
-    final @NonNull InputMergerFactory mInputMergerFactory;
-    @SuppressWarnings("WeakerAccess")
-    final @NonNull RunnableScheduler mRunnableScheduler;
-    @SuppressWarnings("WeakerAccess")
-    final @Nullable Consumer<Throwable> mExceptionHandler;
-    @SuppressWarnings("WeakerAccess")
-    final @Nullable Consumer<Throwable> mSchedulingExceptionHandler;
-    @SuppressWarnings("WeakerAccess")
-    final @Nullable String mDefaultProcessName;
-    @SuppressWarnings("WeakerAccess")
-    final int mLoggingLevel;
-    @SuppressWarnings("WeakerAccess")
-    final int mMinJobSchedulerId;
-    @SuppressWarnings("WeakerAccess")
-    final int mMaxJobSchedulerId;
-    @SuppressWarnings("WeakerAccess")
-    final int mMaxSchedulerLimit;
-    private final boolean mIsUsingDefaultTaskExecutor;
-
-    Configuration(@NonNull Configuration.Builder builder) {
-        if (builder.mExecutor == null) {
-            mExecutor = createDefaultExecutor(false /* isTaskExecutor */);
-        } else {
-            mExecutor = builder.mExecutor;
-        }
-
-        if (builder.mTaskExecutor == null) {
-            mIsUsingDefaultTaskExecutor = true;
-            // This executor is used for *both* WorkManager's tasks and Room's query executor.
-            // So this should not be a single threaded executor. Writes will still be serialized
-            // as this will be wrapped with an SerialExecutor.
-            mTaskExecutor = createDefaultExecutor(true /* isTaskExecutor */);
-        } else {
-            mIsUsingDefaultTaskExecutor = false;
-            mTaskExecutor = builder.mTaskExecutor;
-        }
-
-        if (builder.mWorkerFactory == null) {
-            mWorkerFactory = WorkerFactory.getDefaultWorkerFactory();
-        } else {
-            mWorkerFactory = builder.mWorkerFactory;
-        }
-
-        if (builder.mInputMergerFactory == null) {
-            mInputMergerFactory = NoOpInputMergerFactory.INSTANCE;
-        } else {
-            mInputMergerFactory = builder.mInputMergerFactory;
-        }
-
-        if (builder.mRunnableScheduler == null) {
-            mRunnableScheduler = new DefaultRunnableScheduler();
-        } else {
-            mRunnableScheduler = builder.mRunnableScheduler;
-        }
-
-        mLoggingLevel = builder.mLoggingLevel;
-        mMinJobSchedulerId = builder.mMinJobSchedulerId;
-        mMaxJobSchedulerId = builder.mMaxJobSchedulerId;
-        mMaxSchedulerLimit = builder.mMaxSchedulerLimit;
-        mExceptionHandler = builder.mExceptionHandler;
-        mSchedulingExceptionHandler = builder.mSchedulingExceptionHandler;
-        mDefaultProcessName = builder.mDefaultProcessName;
-    }
-
-    /**
-     * Gets the {@link Executor} used by {@link WorkManager} to execute {@link Worker}s.
-     *
-     * @return The {@link Executor} used by {@link WorkManager} to execute {@link Worker}s
-     */
-    public @NonNull Executor getExecutor() {
-        return mExecutor;
-    }
-
-    /**
-     * Gets the {@link Executor} used by {@link WorkManager} for all its internal business logic.
-     *
-     * @return The {@link Executor} used by {@link WorkManager} for all its internal business logic
-     */
-    @NonNull
-    public Executor getTaskExecutor() {
-        return mTaskExecutor;
-    }
-
-    /**
-     * Gets the {@link WorkerFactory} used by {@link WorkManager} to create
-     * {@link ListenableWorker}s.
-     *
-     * @return The {@link WorkerFactory} used by {@link WorkManager} to create
-     *         {@link ListenableWorker}s
-     */
-    public @NonNull WorkerFactory getWorkerFactory() {
-        return mWorkerFactory;
-    }
-
-    /**
-     * @return The {@link InputMergerFactory} used by {@link WorkManager} to create instances of
-     * {@link InputMerger}s.
-     */
-    public @NonNull InputMergerFactory getInputMergerFactory() {
-        return mInputMergerFactory;
-    }
-
-    /**
-     * @return The {@link RunnableScheduler} to keep track of timed work in the in-process
-     * scheduler.
-     */
-    @NonNull
-    public RunnableScheduler getRunnableScheduler() {
-        return mRunnableScheduler;
-    }
-
-    /**
-     * Gets the minimum logging level for {@link WorkManager}.
-     *
-     * @return The minimum logging level, corresponding to the constants found in
-     * {@link android.util.Log}
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public int getMinimumLoggingLevel() {
-        return mLoggingLevel;
-    }
-
-    /**
-     * Gets the first valid id used when scheduling work with {@link android.app.job.JobScheduler}.
-     *
-     * @return The first valid id (inclusive) used by {@link WorkManager} when creating new
-     *         instances of {@link android.app.job.JobInfo}s.  If the current {@code jobId} goes
-     *         beyond the bounds of the defined range of
-     *         ({@link Configuration.Builder#getMinJobSchedulerId()},
-     *         {@link Configuration.Builder#getMaxJobSchedulerId()}), it is reset to
-     *         ({@link Configuration.Builder#getMinJobSchedulerId()}).
-     */
-    public int getMinJobSchedulerId() {
-        return mMinJobSchedulerId;
-    }
-
-    /**
-     * Gets the last valid id when scheduling work with {@link android.app.job.JobScheduler}.
-     *
-     * @return The last valid id (inclusive) used by {@link WorkManager} when
-     *         creating new instances of {@link android.app.job.JobInfo}s.  If the current
-     *         {@code jobId} goes beyond the bounds of the defined range of
-     *         ({@link Configuration.Builder#getMinJobSchedulerId()},
-     *         {@link Configuration.Builder#getMaxJobSchedulerId()}), it is reset to
-     *         ({@link Configuration.Builder#getMinJobSchedulerId()}).
-     */
-    public int getMaxJobSchedulerId() {
-        return mMaxJobSchedulerId;
-    }
-
-    /**
-     * @return The {@link String} name of the process where work should be scheduled.
-     */
-    @Nullable
-    public String getDefaultProcessName() {
-        return mDefaultProcessName;
-    }
-
-    /**
-     * Gets the maximum number of system requests that can be made by {@link WorkManager} when using
-     * {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
-     *
-     * @return The maximum number of system requests which can be enqueued by {@link WorkManager}
-     *         when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @IntRange(from = Configuration.MIN_SCHEDULER_LIMIT, to = Scheduler.MAX_SCHEDULER_LIMIT)
-    public int getMaxSchedulerLimit() {
-        // We double schedule jobs in SDK 23. So use half the number of max slots specified.
-        if (Build.VERSION.SDK_INT == 23) {
-            return mMaxSchedulerLimit / 2;
-        } else {
-            return mMaxSchedulerLimit;
-        }
-    }
-
-    /**
-     * @return {@code true} If the default task {@link Executor} is being used
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public boolean isUsingDefaultTaskExecutor() {
-        return mIsUsingDefaultTaskExecutor;
-    }
-
-    /**
-     * @return the {@link Consumer<Throwable>} that is used to intercept
-     * exceptions caused when trying to initialize {@link WorkManager}.
-     */
-    @Nullable
-    public Consumer<Throwable> getInitializationExceptionHandler() {
-        return mExceptionHandler;
-    }
-
-    /**
-     * @return the {@link SchedulingExceptionHandler} that can be used to intercept exceptions
-     * caused when trying to schedule {@link WorkRequest}s.
-     */
-    @Nullable
-    public Consumer<Throwable> getSchedulingExceptionHandler() {
-        return mSchedulingExceptionHandler;
-    }
-
-    private @NonNull Executor createDefaultExecutor(boolean isTaskExecutor) {
-        return Executors.newFixedThreadPool(
-                // This value is the same as the core pool size for AsyncTask#THREAD_POOL_EXECUTOR.
-                Math.max(2, Math.min(Runtime.getRuntime().availableProcessors() - 1, 4)),
-                createDefaultThreadFactory(isTaskExecutor));
-    }
-
-    @NonNull
-    private ThreadFactory createDefaultThreadFactory(boolean isTaskExecutor) {
-        return new ThreadFactory() {
-            private final AtomicInteger mThreadCount = new AtomicInteger(0);
-
-            @Override
-            public Thread newThread(Runnable runnable) {
-                // Thread names are constrained to a max of 15 characters by the Linux Kernel.
-                String prefix = isTaskExecutor ? "WM.task-" : "androidx.work-";
-                return new Thread(runnable, prefix + mThreadCount.incrementAndGet());
-            }
-        };
-    }
-
-    /**
-     * A Builder for {@link Configuration}s.
-     */
-    public static final class Builder {
-
-        Executor mExecutor;
-        WorkerFactory mWorkerFactory;
-        InputMergerFactory mInputMergerFactory;
-        Executor mTaskExecutor;
-        RunnableScheduler mRunnableScheduler;
-        @Nullable Consumer<Throwable> mExceptionHandler;
-        @Nullable Consumer<Throwable> mSchedulingExceptionHandler;
-        @Nullable String mDefaultProcessName;
-
-        int mLoggingLevel;
-        int mMinJobSchedulerId;
-        int mMaxJobSchedulerId;
-        int mMaxSchedulerLimit;
-
-        /**
-         * Creates a new {@link Configuration.Builder}.
-         */
-        public Builder() {
-            mLoggingLevel = Log.INFO;
-            mMinJobSchedulerId = INITIAL_ID;
-            mMaxJobSchedulerId = Integer.MAX_VALUE;
-            mMaxSchedulerLimit = MIN_SCHEDULER_LIMIT;
-        }
-
-        /**
-         * Creates a new {@link Configuration.Builder} with an existing {@link Configuration} as its
-         * template.
-         *
-         * @param configuration An existing {@link Configuration} to use as a template
-         * @hide
-         */
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public Builder(@NonNull Configuration configuration) {
-            // Note that these must be accessed through fields and not the getters, which can
-            // otherwise manipulate the returned value (see getMaxSchedulerLimit(), for example).
-            mExecutor = configuration.mExecutor;
-            mWorkerFactory = configuration.mWorkerFactory;
-            mInputMergerFactory = configuration.mInputMergerFactory;
-            mTaskExecutor = configuration.mTaskExecutor;
-            mLoggingLevel = configuration.mLoggingLevel;
-            mMinJobSchedulerId = configuration.mMinJobSchedulerId;
-            mMaxJobSchedulerId = configuration.mMaxJobSchedulerId;
-            mMaxSchedulerLimit = configuration.mMaxSchedulerLimit;
-            mRunnableScheduler = configuration.mRunnableScheduler;
-            mExceptionHandler = configuration.mExceptionHandler;
-            mSchedulingExceptionHandler = configuration.mSchedulingExceptionHandler;
-            mDefaultProcessName = configuration.mDefaultProcessName;
-        }
-
-        /**
-         * Specifies a custom {@link WorkerFactory} for WorkManager.
-         *
-         * @param workerFactory A {@link WorkerFactory} for creating {@link ListenableWorker}s
-         * @return This {@link Builder} instance
-         */
-        public @NonNull Builder setWorkerFactory(@NonNull WorkerFactory workerFactory) {
-            mWorkerFactory = workerFactory;
-            return this;
-        }
-
-        /**
-         * Specifies a custom {@link InputMergerFactory} for WorkManager.
-         * @param inputMergerFactory A {@link InputMergerFactory} for creating {@link InputMerger}s
-         * @return This {@link Builder} instance
-         */
-        @NonNull
-        public Builder setInputMergerFactory(@NonNull InputMergerFactory inputMergerFactory) {
-            mInputMergerFactory = inputMergerFactory;
-            return this;
-        }
-
-        /**
-         * Specifies a custom {@link Executor} for WorkManager.
-         *
-         * @param executor An {@link Executor} for running {@link Worker}s
-         * @return This {@link Builder} instance
-         */
-        public @NonNull Builder setExecutor(@NonNull Executor executor) {
-            mExecutor = executor;
-            return this;
-        }
-
-        /**
-         * Specifies a {@link Executor} which will be used by WorkManager for all its
-         * internal book-keeping.
-         *
-         * For best performance this {@link Executor} should be bounded.
-         *
-         * For more information look at
-         * {@link androidx.room.RoomDatabase.Builder#setQueryExecutor(Executor)}.
-         *
-         * @param taskExecutor The {@link Executor} which will be used by WorkManager for
-         *                             all its internal book-keeping
-         * @return This {@link Builder} instance
-         */
-        public @NonNull Builder setTaskExecutor(@NonNull Executor taskExecutor) {
-            mTaskExecutor = taskExecutor;
-            return this;
-        }
-
-        /**
-         * Specifies the range of {@link android.app.job.JobInfo} IDs that can be used by
-         * {@link WorkManager}.  WorkManager needs a range of at least {@code 1000} IDs.
-         * <p>
-         * JobScheduler uses integers as identifiers for jobs, and WorkManager delegates to
-         * JobScheduler on certain API levels.  In order to not clash job codes used in the rest of
-         * your app, you can use this method to tell WorkManager the valid range of job IDs that it
-         * can use.
-         * <p>
-         * The default values are {@code 0} and {@code Integer#MAX_VALUE}.
-         *
-         * @param minJobSchedulerId The first valid {@link android.app.job.JobInfo} ID (inclusive).
-         * @param maxJobSchedulerId The last valid {@link android.app.job.JobInfo} ID (inclusive).
-         * @return This {@link Builder} instance
-         * @throws IllegalArgumentException when the size of the range is less than 1000
-         */
-        public @NonNull Builder setJobSchedulerJobIdRange(
-                int minJobSchedulerId,
-                int maxJobSchedulerId) {
-            if ((maxJobSchedulerId - minJobSchedulerId) < 1000) {
-                throw new IllegalArgumentException(
-                        "WorkManager needs a range of at least 1000 job ids.");
-            }
-
-            mMinJobSchedulerId = minJobSchedulerId;
-            mMaxJobSchedulerId = maxJobSchedulerId;
-            return this;
-        }
-
-        /**
-         * Specifies the maximum number of system requests made by {@link WorkManager}
-         * when using {@link android.app.job.JobScheduler} or {@link android.app.AlarmManager}.
-         * <p>
-         * By default, WorkManager might schedule a large number of alarms or JobScheduler
-         * jobs.  If your app uses JobScheduler or AlarmManager directly, this might exhaust the
-         * OS-enforced limit on the number of jobs or alarms an app is allowed to schedule.  To help
-         * manage this situation, you can use this method to reduce the number of underlying jobs
-         * and alarms that WorkManager might schedule.
-         * <p>
-         * When the application exceeds this limit, WorkManager maintains an internal queue of
-         * {@link WorkRequest}s, and schedules them when slots become free.
-         * <p>
-         * WorkManager requires a minimum of {@link Configuration#MIN_SCHEDULER_LIMIT} slots; this
-         * is also the default value. The total number of slots also cannot exceed {@code 50}.
-         *
-         * @param maxSchedulerLimit The total number of jobs which can be enqueued by
-         *                          {@link WorkManager} when using
-         *                          {@link android.app.job.JobScheduler}.
-         * @return This {@link Builder} instance
-         * @throws IllegalArgumentException if {@code maxSchedulerLimit} is less than
-         *                                  {@link Configuration#MIN_SCHEDULER_LIMIT}
-         */
-        public @NonNull Builder setMaxSchedulerLimit(int maxSchedulerLimit) {
-            if (maxSchedulerLimit < MIN_SCHEDULER_LIMIT) {
-                throw new IllegalArgumentException(
-                        "WorkManager needs to be able to schedule at least 20 jobs in "
-                                + "JobScheduler.");
-            }
-            mMaxSchedulerLimit = Math.min(maxSchedulerLimit, MAX_SCHEDULER_LIMIT);
-            return this;
-        }
-
-        /**
-         * Specifies the minimum logging level, corresponding to the constants found in
-         * {@link android.util.Log}.  For example, specifying {@link android.util.Log#VERBOSE} will
-         * log everything, whereas specifying {@link android.util.Log#ERROR} will only log errors
-         * and assertions.The default value is {@link android.util.Log#INFO}.
-         *
-         * @param loggingLevel The minimum logging level, corresponding to the constants found in
-         *                     {@link android.util.Log}
-         * @return This {@link Builder} instance
-         */
-        public @NonNull Builder setMinimumLoggingLevel(int loggingLevel) {
-            mLoggingLevel = loggingLevel;
-            return this;
-        }
-
-        /**
-         * Specifies the {@link RunnableScheduler} to be used by {@link WorkManager}.
-         * <br/>
-         * This is used by the in-process scheduler to keep track of timed work.
-         *
-         * @param runnableScheduler The {@link RunnableScheduler} to be used
-         * @return This {@link Builder} instance
-         */
-        @NonNull
-        public Builder setRunnableScheduler(@NonNull RunnableScheduler runnableScheduler) {
-            mRunnableScheduler = runnableScheduler;
-            return this;
-        }
-
-        /**
-         * Specifies the {@link InitializationExceptionHandler} that can be used to intercept
-         * exceptions caused when trying to initialize {@link WorkManager}.
-         *
-         * @param exceptionHandler The {@link InitializationExceptionHandler} instance.
-         * @return This {@link Builder} instance
-         *
-         * @hide kept around for migration period
-         */
-        @NonNull
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        public Builder setInitializationExceptionHandler(
-                @NonNull InitializationExceptionHandler exceptionHandler) {
-            mExceptionHandler = exceptionHandler::handleException;
-            return this;
-        }
-
-        /**
-         * Specifies a {@code Consumer<Throwable>} that can be used to intercept
-         * exceptions caused when trying to initialize {@link WorkManager}, that usually happens
-         * when WorkManager cannot access its internal datastore.
-         * <p>
-         * This exception handler will be invoked on a thread bound to
-         * {@link Configuration#getTaskExecutor()}.
-         *
-         * @param exceptionHandler an instance to handle exceptions
-         * @return This {@link Builder} instance
-         */
-        @NonNull
-        public Builder setInitializationExceptionHandler(
-                @NonNull Consumer<Throwable> exceptionHandler) {
-            mExceptionHandler = exceptionHandler;
-            return this;
-        }
-
-        /**
-         * Specifies a {@code Consumer<Throwable>} that can be used to intercept
-         * exceptions caused when trying to schedule {@link WorkRequest}s.
-         *
-         * It allows the application to handle a {@link Throwable} throwable typically
-         * caused when trying to schedule {@link WorkRequest}s.
-         * <p>
-         * This exception handler will be invoked on a thread bound to
-         * {@link Configuration#getTaskExecutor()}.
-         *
-         * @param schedulingExceptionHandler an instance to handle exceptions
-         * @return This {@link Builder} instance
-         */
-        @NonNull
-        public Builder setSchedulingExceptionHandler(
-                @NonNull Consumer<Throwable> schedulingExceptionHandler) {
-            mSchedulingExceptionHandler = schedulingExceptionHandler;
-            return this;
-        }
-
-        /**
-         * Designates the primary process that {@link WorkManager} should schedule work in.
-         *
-         * @param processName The {@link String} process name.
-         * @return This {@link Builder} instance
-         */
-        @NonNull
-        public Builder setDefaultProcessName(@NonNull String processName) {
-            mDefaultProcessName = processName;
-            return this;
-        }
-
-        /**
-         * Builds a {@link Configuration} object.
-         *
-         * @return A {@link Configuration} object with this {@link Builder}'s parameters.
-         */
-        public @NonNull Configuration build() {
-            return new Configuration(this);
-        }
-    }
-
-    /**
-     * A class that can provide the {@link Configuration} for WorkManager and allow for on-demand
-     * initialization of WorkManager.  To do this:
-     * <p><ul>
-     *   <li>Disable {@code androidx.work.WorkManagerInitializer} in your manifest</li>
-     *   <li>Implement the {@link Configuration.Provider} interface on your
-     *   {@link android.app.Application} class</li>
-     *   <li>Use {@link WorkManager#getInstance(Context)} when accessing WorkManger (NOT
-     *   {@link WorkManager#getInstance()})</li>
-     * </ul></p>
-     * <p>
-     * Note that on-demand initialization may delay some useful features of WorkManager such as
-     * automatic rescheduling of work following a crash and recovery from the application being
-     * force-stopped by the user or device.
-     *
-     * @see WorkManager#initialize(Context, Configuration) for manual initialization.
-     */
-    public interface Provider {
-
-        /**
-         * @return The {@link Configuration} used to initialize WorkManager
-         */
-        @NonNull Configuration getWorkManagerConfiguration();
-    }
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/Configuration.kt b/work/work-runtime/src/main/java/androidx/work/Configuration.kt
new file mode 100644
index 0000000..ce424d4
--- /dev/null
+++ b/work/work-runtime/src/main/java/androidx/work/Configuration.kt
@@ -0,0 +1,433 @@
+/*
+ * 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.work
+
+import android.os.Build
+import android.util.Log
+import androidx.annotation.IntRange
+import androidx.annotation.RestrictTo
+import androidx.core.util.Consumer
+import androidx.work.impl.DefaultRunnableScheduler
+import androidx.work.impl.Scheduler
+import androidx.work.impl.utils.INITIAL_ID
+import java.util.concurrent.Executor
+import java.util.concurrent.Executors
+import java.util.concurrent.ThreadFactory
+import java.util.concurrent.atomic.AtomicInteger
+import kotlin.math.max
+import kotlin.math.min
+
+/**
+ * The Configuration object used to customize [WorkManager] upon initialization.
+ * Configuration contains various parameters used to setup WorkManager.  For example, it is possible
+ * to customize the [Executor] used by [Worker]s here.
+ *
+ * To set a custom Configuration for WorkManager, see [WorkManager.initialize].
+ */
+class Configuration internal constructor(builder: Builder) {
+    /**
+     * The [Executor] used by [WorkManager] to execute [Worker]s.
+     */
+    val executor: Executor
+
+    /**
+     * The [Executor] used by [WorkManager] for all its internal business logic
+     */
+    val taskExecutor: Executor
+
+    /**
+     * The [WorkerFactory] used by [WorkManager] to create [ListenableWorker]s
+     */
+    val workerFactory: WorkerFactory
+
+    /**
+     * The [InputMergerFactory] used by [WorkManager] to create instances of
+     * [InputMerger]s.
+     */
+    val inputMergerFactory: InputMergerFactory
+
+    /**
+     * The [RunnableScheduler] to keep track of timed work in the in-process
+     * scheduler.
+     */
+    val runnableScheduler: RunnableScheduler
+
+    /**
+     * The exception handler that is used to intercept
+     * exceptions caused when trying to initialize [WorkManager].
+     */
+    val initializationExceptionHandler: Consumer<Throwable>?
+
+    /**
+     * The exception handler that can be used to intercept exceptions
+     * caused when trying to schedule [WorkRequest]s.
+     */
+    val schedulingExceptionHandler: Consumer<Throwable>?
+
+    /**
+     * The [String] name of the process where work should be scheduled.
+     */
+    val defaultProcessName: String?
+
+    /**
+     * The minimum logging level, corresponding to the constants found in [android.util.Log]
+     * @hide
+     */
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    val minimumLoggingLevel: Int
+
+    /**
+     * The first valid id (inclusive) used by [WorkManager] when creating new
+     * instances of [android.app.job.JobInfo]s.
+     *
+     * If the current `jobId` goes beyond the bounds of the defined range of
+     * ([Configuration.minJobSchedulerId], [Configuration.maxJobSchedulerId]), it is reset to
+     * ([Configuration.minJobSchedulerId]).
+     */
+    val minJobSchedulerId: Int
+
+    /**
+     * The last valid id (inclusive) used by [WorkManager] when
+     * creating new instances of [android.app.job.JobInfo]s.
+     *
+     * If the current `jobId` goes beyond the bounds of the defined range of
+     * ([Configuration.minJobSchedulerId], [Configuration.maxJobSchedulerId]), it is reset to
+     * ([Configuration.minJobSchedulerId]).
+     */
+    val maxJobSchedulerId: Int
+
+    /**
+     * The maximum number of system requests which can be enqueued by [WorkManager]
+     * when using [android.app.job.JobScheduler] or [android.app.AlarmManager]
+     * @hide
+     */
+    @get:IntRange(from = MIN_SCHEDULER_LIMIT.toLong(), to = Scheduler.MAX_SCHEDULER_LIMIT.toLong())
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    val maxSchedulerLimit: Int
+
+    /**
+     * @return `true` If the default task [Executor] is being used
+     * @hide
+     */
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    val isUsingDefaultTaskExecutor: Boolean
+
+    init {
+        executor = builder.executor ?: createDefaultExecutor(isTaskExecutor = false)
+        isUsingDefaultTaskExecutor = builder.taskExecutor == null
+        // This executor is used for *both* WorkManager's tasks and Room's query executor.
+        // So this should not be a single threaded executor. Writes will still be serialized
+        // as this will be wrapped with an SerialExecutor.
+        taskExecutor = builder.taskExecutor ?: createDefaultExecutor(isTaskExecutor = true)
+        workerFactory = builder.workerFactory ?: WorkerFactory.getDefaultWorkerFactory()
+        inputMergerFactory = builder.inputMergerFactory ?: NoOpInputMergerFactory
+        runnableScheduler = builder.runnableScheduler ?: DefaultRunnableScheduler()
+        minimumLoggingLevel = builder.loggingLevel
+        minJobSchedulerId = builder.minJobSchedulerId
+        maxJobSchedulerId = builder.maxJobSchedulerId
+        maxSchedulerLimit = if (Build.VERSION.SDK_INT == 23) {
+            // We double schedule jobs in SDK 23. So use half the number of max slots specified.
+            builder.maxSchedulerLimit / 2
+        } else {
+            builder.maxSchedulerLimit
+        }
+        initializationExceptionHandler = builder.initializationExceptionHandler
+        schedulingExceptionHandler = builder.schedulingExceptionHandler
+        defaultProcessName = builder.defaultProcessName
+    }
+
+    /**
+     * A Builder for [Configuration]s.
+     */
+    class Builder {
+        internal var executor: Executor? = null
+        internal var workerFactory: WorkerFactory? = null
+        internal var inputMergerFactory: InputMergerFactory? = null
+        internal var taskExecutor: Executor? = null
+        internal var runnableScheduler: RunnableScheduler? = null
+        internal var initializationExceptionHandler: Consumer<Throwable>? = null
+        internal var schedulingExceptionHandler: Consumer<Throwable>? = null
+        internal var defaultProcessName: String? = null
+        internal var loggingLevel: Int = Log.INFO
+        internal var minJobSchedulerId: Int = INITIAL_ID
+        internal var maxJobSchedulerId: Int = Int.MAX_VALUE
+        internal var maxSchedulerLimit: Int = MIN_SCHEDULER_LIMIT
+
+        /**
+         * Creates a new [Configuration.Builder].
+         */
+        constructor()
+
+        /**
+         * Creates a new [Configuration.Builder] with an existing [Configuration] as its
+         * template.
+         *
+         * @param configuration An existing [Configuration] to use as a template
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        constructor(configuration: Configuration) {
+            // Note that these must be accessed through fields and not the getters, which can
+            // otherwise manipulate the returned value (see getMaxSchedulerLimit(), for example).
+            executor = configuration.executor
+            workerFactory = configuration.workerFactory
+            inputMergerFactory = configuration.inputMergerFactory
+            taskExecutor = configuration.taskExecutor
+            loggingLevel = configuration.minimumLoggingLevel
+            minJobSchedulerId = configuration.minJobSchedulerId
+            maxJobSchedulerId = configuration.maxJobSchedulerId
+            maxSchedulerLimit = configuration.maxSchedulerLimit
+            runnableScheduler = configuration.runnableScheduler
+            initializationExceptionHandler = configuration.initializationExceptionHandler
+            schedulingExceptionHandler = configuration.schedulingExceptionHandler
+            defaultProcessName = configuration.defaultProcessName
+        }
+
+        /**
+         * Specifies a custom [WorkerFactory] for WorkManager.
+         *
+         * @param workerFactory A [WorkerFactory] for creating [ListenableWorker]s
+         * @return This [Builder] instance
+         */
+        fun setWorkerFactory(workerFactory: WorkerFactory): Builder {
+            this.workerFactory = workerFactory
+            return this
+        }
+
+        /**
+         * Specifies a custom [InputMergerFactory] for WorkManager.
+         *
+         * @param inputMergerFactory A [InputMergerFactory] for creating [InputMerger]s
+         * @return This [Builder] instance
+         */
+        fun setInputMergerFactory(inputMergerFactory: InputMergerFactory): Builder {
+            this.inputMergerFactory = inputMergerFactory
+            return this
+        }
+
+        /**
+         * Specifies a custom [Executor] for WorkManager.
+         *
+         * @param executor An [Executor] for running [Worker]s
+         * @return This [Builder] instance
+         */
+        fun setExecutor(executor: Executor): Builder {
+            this.executor = executor
+            return this
+        }
+
+        /**
+         * Specifies a [Executor] which will be used by WorkManager for all its
+         * internal book-keeping.
+         *
+         * For best performance this [Executor] should be bounded.
+         *
+         * For more information look at [androidx.room.RoomDatabase.Builder.setQueryExecutor].
+         *
+         * @param taskExecutor The [Executor] which will be used by WorkManager for
+         * all its internal book-keeping
+         * @return This [Builder] instance
+         */
+        fun setTaskExecutor(taskExecutor: Executor): Builder {
+            this.taskExecutor = taskExecutor
+            return this
+        }
+
+        /**
+         * Specifies the range of [android.app.job.JobInfo] IDs that can be used by
+         * [WorkManager].  WorkManager needs a range of at least `1000` IDs.
+         *
+         * JobScheduler uses integers as identifiers for jobs, and WorkManager delegates to
+         * JobScheduler on certain API levels.  In order to not clash job codes used in the rest of
+         * your app, you can use this method to tell WorkManager the valid range of job IDs that it
+         * can use.
+         *
+         * The default values are `0` and `Integer#MAX_VALUE`.
+         *
+         * @param minJobSchedulerId The first valid [android.app.job.JobInfo] ID (inclusive).
+         * @param maxJobSchedulerId The last valid [android.app.job.JobInfo] ID (inclusive).
+         * @return This [Builder] instance
+         * @throws IllegalArgumentException when the size of the range is less than 1000
+         */
+        fun setJobSchedulerJobIdRange(minJobSchedulerId: Int, maxJobSchedulerId: Int): Builder {
+            require(maxJobSchedulerId - minJobSchedulerId >= 1000) {
+                "WorkManager needs a range of at least 1000 job ids."
+            }
+            this.minJobSchedulerId = minJobSchedulerId
+            this.maxJobSchedulerId = maxJobSchedulerId
+            return this
+        }
+
+        /**
+         * Specifies the maximum number of system requests made by [WorkManager]
+         * when using [android.app.job.JobScheduler] or [android.app.AlarmManager].
+         *
+         * By default, WorkManager might schedule a large number of alarms or JobScheduler
+         * jobs.  If your app uses JobScheduler or AlarmManager directly, this might exhaust the
+         * OS-enforced limit on the number of jobs or alarms an app is allowed to schedule.  To help
+         * manage this situation, you can use this method to reduce the number of underlying jobs
+         * and alarms that WorkManager might schedule.
+         *
+         * When the application exceeds this limit, WorkManager maintains an internal queue of
+         * [WorkRequest]s, and schedules them when slots become free.
+         *
+         * WorkManager requires a minimum of [Configuration.MIN_SCHEDULER_LIMIT] slots; this
+         * is also the default value. The total number of slots also cannot exceed `50`.
+         *
+         * @param maxSchedulerLimit The total number of jobs which can be enqueued by
+         * [WorkManager] when using [android.app.job.JobScheduler].
+         * @return This [Builder] instance
+         * @throws IllegalArgumentException if `maxSchedulerLimit` is less than
+         * [Configuration.MIN_SCHEDULER_LIMIT]
+         */
+        fun setMaxSchedulerLimit(maxSchedulerLimit: Int): Builder {
+            require(maxSchedulerLimit >= MIN_SCHEDULER_LIMIT) {
+                "WorkManager needs to be able to schedule at least 20 jobs in JobScheduler."
+            }
+            this.maxSchedulerLimit = min(maxSchedulerLimit, Scheduler.MAX_SCHEDULER_LIMIT)
+            return this
+        }
+
+        /**
+         * Specifies the minimum logging level, corresponding to the constants found in
+         * [android.util.Log]. For example, specifying [android.util.Log.VERBOSE] will
+         * log everything, whereas specifying [android.util.Log.ERROR] will only log errors
+         * and assertions.The default value is [android.util.Log.INFO].
+         *
+         * @param loggingLevel The minimum logging level, corresponding to the constants found in
+         * [android.util.Log]
+         * @return This [Builder] instance
+         */
+        fun setMinimumLoggingLevel(loggingLevel: Int): Builder {
+            this.loggingLevel = loggingLevel
+            return this
+        }
+
+        /**
+         * Specifies the [RunnableScheduler] to be used by [WorkManager].
+         *
+         * This is used by the in-process scheduler to keep track of timed work.
+         *
+         * @param runnableScheduler The [RunnableScheduler] to be used
+         * @return This [Builder] instance
+         */
+        fun setRunnableScheduler(runnableScheduler: RunnableScheduler): Builder {
+            this.runnableScheduler = runnableScheduler
+            return this
+        }
+
+        /**
+         * Specifies a `Consumer<Throwable>` that can be used to intercept
+         * exceptions caused when trying to initialize {@link WorkManager}, that usually happens
+         * when WorkManager cannot access its internal datastore.
+         *
+         * This exception handler will be invoked on a thread bound to
+         * [Configuration.taskExecutor].
+         *
+         * @param exceptionHandler an instance to handle exceptions
+         * @return This [Builder] instance
+         */
+        fun setInitializationExceptionHandler(exceptionHandler: Consumer<Throwable>): Builder {
+            this.initializationExceptionHandler = exceptionHandler
+            return this
+        }
+
+        /**
+         * Specifies a `Consumer<Throwable>` that can be used to intercept
+         * exceptions caused when trying to schedule [WorkRequest]s.
+         *
+         * It allows the application to handle a [Throwable] throwable typically
+         * caused when trying to schedule [WorkRequest]s.
+         *
+         * This exception handler will be invoked on a thread bound to
+         * [Configuration.taskExecutor].
+         *
+         * @param schedulingExceptionHandler an instance to handle exceptions
+         * @return This [Builder] instance
+         */
+        fun setSchedulingExceptionHandler(
+            schedulingExceptionHandler: Consumer<Throwable>
+        ): Builder {
+            this.schedulingExceptionHandler = schedulingExceptionHandler
+            return this
+        }
+
+        /**
+         * Designates the primary process that [WorkManager] should schedule work in.
+         *
+         * @param processName The [String] process name.
+         * @return This [Builder] instance
+         */
+        fun setDefaultProcessName(processName: String): Builder {
+            defaultProcessName = processName
+            return this
+        }
+
+        /**
+         * Builds a [Configuration] object.
+         *
+         * @return A [Configuration] object with this [Builder]'s parameters.
+         */
+        fun build(): Configuration {
+            return Configuration(this)
+        }
+    }
+
+    /**
+     * A class that can provide the [Configuration] for WorkManager and allow for on-demand
+     * initialization of WorkManager.  To do this:
+     *
+     *  - Disable `androidx.work.WorkManagerInitializer` in your manifest
+     *  - Implement the [Configuration.Provider] interface on your [android.app.Application] class
+     *  - Use [WorkManager.getInstance] when accessing WorkManager (NOT [WorkManager.getInstance])
+     *
+     * Note that on-demand initialization may delay some useful features of WorkManager such as
+     * automatic rescheduling of work following a crash and recovery from the application being
+     * force-stopped by the user or device.
+     *
+     * @see WorkManager.initialize
+     */
+    interface Provider {
+        /**
+         * The [Configuration] used to initialize WorkManager
+         */
+        val workManagerConfiguration: Configuration
+    }
+
+    companion object {
+        /**
+         * The minimum number of system requests which can be enqueued by [WorkManager]
+         * when using [android.app.job.JobScheduler] or [android.app.AlarmManager].
+         */
+        const val MIN_SCHEDULER_LIMIT = 20
+    }
+}
+
+private fun createDefaultExecutor(isTaskExecutor: Boolean): Executor {
+    val factory = object : ThreadFactory {
+        private val threadCount = AtomicInteger(0)
+        override fun newThread(runnable: Runnable): Thread {
+            // Thread names are constrained to a max of 15 characters by the Linux Kernel.
+            val prefix = if (isTaskExecutor) "WM.task-" else "androidx.work-"
+            return Thread(runnable, "$prefix${threadCount.incrementAndGet()}")
+        }
+    }
+    return Executors.newFixedThreadPool(
+        // This value is the same as the core pool size for AsyncTask#THREAD_POOL_EXECUTOR.
+        max(2, min(Runtime.getRuntime().availableProcessors() - 1, 4)),
+        factory
+    )
+}
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/Constraints.kt b/work/work-runtime/src/main/java/androidx/work/Constraints.kt
index ebe81ed..63ee3f6 100644
--- a/work/work-runtime/src/main/java/androidx/work/Constraints.kt
+++ b/work/work-runtime/src/main/java/androidx/work/Constraints.kt
@@ -397,3 +397,7 @@
         val NONE = Constraints()
     }
 }
+
+internal const val CONSTRAINTS_COLUMNS = "required_network_type, requires_charging," +
+    "requires_device_idle, requires_battery_not_low, requires_storage_not_low, " +
+    "trigger_content_update_delay, trigger_max_content_delay, content_uri_triggers"
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java b/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.java
deleted file mode 100644
index f8acaba0b..0000000
--- a/work/work-runtime/src/main/java/androidx/work/InitializationExceptionHandler.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.work;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * An Exception Handler that can be used to determine if there were issues when trying
- * to initialize {@link WorkManager}.
- * <p>
- * This usually happens when WorkManager cannot access its internal datastore.
- *
- * @hide kept around for migration purposes. It will be removed soon
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public interface InitializationExceptionHandler {
-    /**
-     * Allows the application to handle a {@link Throwable} throwable typically caused when
-     * trying to initialize {@link WorkManager}.
-     * <p>
-     * This exception handler will be invoked a thread bound to
-     * {@link Configuration#getTaskExecutor()}.
-     *
-     * @param throwable The underlying throwable that was caused when trying to initialize
-     * {@link WorkManager}
-     */
-    void handleException(@NonNull Throwable throwable);
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/InputMergerFactory.kt b/work/work-runtime/src/main/java/androidx/work/InputMergerFactory.kt
index 36cb66b..5ed443f 100644
--- a/work/work-runtime/src/main/java/androidx/work/InputMergerFactory.kt
+++ b/work/work-runtime/src/main/java/androidx/work/InputMergerFactory.kt
@@ -57,11 +57,7 @@
         return inputMerger
     }
 }
-/**
- * A default [InputMergerFactory] with no custom behavior.
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-object NoOpInputMergerFactory : InputMergerFactory() {
+
+internal object NoOpInputMergerFactory : InputMergerFactory() {
     override fun createInputMerger(className: String) = null
 }
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkInfo.kt b/work/work-runtime/src/main/java/androidx/work/WorkInfo.kt
index 1111c32..3923f2b 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkInfo.kt
+++ b/work/work-runtime/src/main/java/androidx/work/WorkInfo.kt
@@ -24,7 +24,7 @@
  * current [State], output, tags, and run attempt count.  Note that output is only available
  * for the terminal states ([State.SUCCEEDED] and [State.FAILED]).
  */
-class WorkInfo(
+class WorkInfo @JvmOverloads constructor(
     /**
      * The identifier of the [WorkRequest].
      */
@@ -66,7 +66,12 @@
      * If this worker is currently running, it can possibly be of an older generation rather than
      * returned by this function if an update has happened during an execution of this worker.
      */
-    val generation: Int = 0
+    val generation: Int = 0,
+
+    /**
+     * [Constraints] of this worker.
+     */
+    val constraints: Constraints = Constraints.NONE,
 ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
@@ -77,6 +82,7 @@
         if (id != workInfo.id) return false
         if (state != workInfo.state) return false
         if (outputData != workInfo.outputData) return false
+        if (constraints != workInfo.constraints) return false
         return if (tags != workInfo.tags) false else progress == workInfo.progress
     }
 
@@ -88,13 +94,14 @@
         result = 31 * result + progress.hashCode()
         result = 31 * result + runAttemptCount
         result = 31 * result + generation
+        result = 31 * result + constraints.hashCode()
         return result
     }
 
     override fun toString(): String {
         return ("WorkInfo{id='$id', state=$state, " +
             "outputData=$outputData, tags=$tags, progress=$progress, " +
-            "runAttemptCount=$runAttemptCount, generation=$generation}")
+            "runAttemptCount=$runAttemptCount, generation=$generation, constraints=$constraints}")
     }
 
     /**
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/DefaultRunnableScheduler.java b/work/work-runtime/src/main/java/androidx/work/impl/DefaultRunnableScheduler.java
index 7437b58..1e25ac9 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/DefaultRunnableScheduler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/DefaultRunnableScheduler.java
@@ -21,7 +21,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
 import androidx.core.os.HandlerCompat;
 import androidx.work.RunnableScheduler;
 
@@ -40,11 +39,6 @@
         mHandler = HandlerCompat.createAsync(Looper.getMainLooper());
     }
 
-    @VisibleForTesting
-    public DefaultRunnableScheduler(@NonNull Handler handler) {
-        mHandler = handler;
-    }
-
     @NonNull
     public Handler getHandler() {
         return mHandler;
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
index d0f484a..6e487c3 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
@@ -716,7 +716,7 @@
             @Nullable WorkerParameters.RuntimeExtras runtimeExtras) {
         mWorkTaskExecutor
                 .executeOnTaskThread(
-                        new StartWorkRunnable(this, workSpecId, runtimeExtras));
+                        new StartWorkRunnable(mProcessor, workSpecId, runtimeExtras));
     }
 
     /**
@@ -725,7 +725,7 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public void stopWork(@NonNull StartStopToken workSpecId) {
-        mWorkTaskExecutor.executeOnTaskThread(new StopWorkRunnable(this, workSpecId, false));
+        mWorkTaskExecutor.executeOnTaskThread(new StopWorkRunnable(mProcessor, workSpecId, false));
     }
 
     /**
@@ -735,7 +735,7 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public void stopForegroundWork(@NonNull WorkGenerationalId id) {
-        mWorkTaskExecutor.executeOnTaskThread(new StopWorkRunnable(this,
+        mWorkTaskExecutor.executeOnTaskThread(new StopWorkRunnable(mProcessor,
                 new StartStopToken(id), true));
     }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
index 10aa523..2ed5d8d 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.kt
@@ -341,27 +341,30 @@
      */
     data class WorkInfoPojo(
         @ColumnInfo(name = "id")
-        var id: String,
+        val id: String,
 
         @ColumnInfo(name = "state")
-        var state: WorkInfo.State,
+        val state: WorkInfo.State,
 
         @ColumnInfo(name = "output")
-        var output: Data,
+        val output: Data,
 
         @ColumnInfo(name = "run_attempt_count")
-        var runAttemptCount: Int,
+        val runAttemptCount: Int,
 
         @ColumnInfo(name = "generation")
         val generation: Int,
 
+        @Embedded
+        val constraints: Constraints,
+
         @Relation(
             parentColumn = "id",
             entityColumn = "work_spec_id",
             entity = WorkTag::class,
             projection = ["tag"]
         )
-        var tags: List<String>,
+        val tags: List<String>,
 
         // This is actually a 1-1 relationship. However Room 2.1 models the type as a List.
         // This will change in Room 2.2
@@ -371,7 +374,7 @@
             entity = WorkProgress::class,
             projection = ["progress"]
         )
-        var progress: List<Data>,
+        val progress: List<Data>,
     ) {
         /**
          * Converts this POJO to a [WorkInfo].
@@ -387,7 +390,8 @@
                 output,
                 progress,
                 runAttemptCount,
-                generation
+                generation,
+                constraints
             )
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
index d24c710..937e2ce 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpecDao.kt
@@ -23,6 +23,7 @@
 import androidx.room.Query
 import androidx.room.Transaction
 import androidx.room.Update
+import androidx.work.CONSTRAINTS_COLUMNS
 import androidx.work.Data
 import androidx.work.WorkInfo
 import androidx.work.impl.model.WorkTypeConverters.StateIds.COMPLETED_STATES
@@ -148,7 +149,7 @@
      * @return A list of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id=:id")
+    @Query("SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id=:id")
     fun getWorkStatusPojoForId(id: String): WorkSpec.WorkInfoPojo?
 
     /**
@@ -159,8 +160,7 @@
      * @return A [List] of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count, generation " +
-        "FROM workspec WHERE id IN (:ids)")
+    @Query("SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN (:ids)")
     fun getWorkStatusPojoForIds(ids: List<String>): List<WorkSpec.WorkInfoPojo>
 
     /**
@@ -171,8 +171,7 @@
      * @return A [LiveData] list of [WorkSpec.WorkInfoPojo]
      */
     @Transaction
-    @Query("SELECT id, state, output, run_attempt_count, generation " +
-        "FROM workspec WHERE id IN (:ids)")
+    @Query("SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN (:ids)")
     fun getWorkStatusPojoLiveDataForIds(ids: List<String>): LiveData<List<WorkSpec.WorkInfoPojo>>
 
     /**
@@ -183,7 +182,7 @@
      */
     @Transaction
     @Query(
-        """SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN
+        """SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN
             (SELECT work_spec_id FROM worktag WHERE tag=:tag)"""
     )
     fun getWorkStatusPojoForTag(tag: String): List<WorkSpec.WorkInfoPojo>
@@ -197,7 +196,7 @@
      */
     @Transaction
     @Query(
-        """SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN
+        """SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN
             (SELECT work_spec_id FROM worktag WHERE tag=:tag)"""
     )
     fun getWorkStatusPojoLiveDataForTag(tag: String): LiveData<List<WorkSpec.WorkInfoPojo>>
@@ -210,7 +209,7 @@
      */
     @Transaction
     @Query(
-        "SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN " +
+        "SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN " +
             "(SELECT work_spec_id FROM workname WHERE name=:name)"
     )
     fun getWorkStatusPojoForName(name: String): List<WorkSpec.WorkInfoPojo>
@@ -224,7 +223,7 @@
      */
     @Transaction
     @Query(
-        "SELECT id, state, output, run_attempt_count, generation FROM workspec WHERE id IN " +
+        "SELECT $WORK_INFO_COLUMNS FROM workspec WHERE id IN " +
             "(SELECT work_spec_id FROM workname WHERE name=:name)"
     )
     fun getWorkStatusPojoLiveDataForName(name: String): LiveData<List<WorkSpec.WorkInfoPojo>>
@@ -387,4 +386,7 @@
 
     @Update
     fun updateWorkSpec(workSpec: WorkSpec)
-}
\ No newline at end of file
+}
+
+private const val WORK_INFO_COLUMNS = "id, state, output, run_attempt_count, generation" +
+    ", $CONSTRAINTS_COLUMNS"
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.java
deleted file mode 100644
index 6450c10..0000000
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.work.impl.utils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.work.WorkerParameters;
-import androidx.work.impl.StartStopToken;
-import androidx.work.impl.WorkManagerImpl;
-
-/**
- * A {@link Runnable} that can start work on the
- * {@link androidx.work.impl.Processor}.
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class StartWorkRunnable implements Runnable {
-
-    private WorkManagerImpl mWorkManagerImpl;
-    private StartStopToken mWorkSpecId;
-    private WorkerParameters.RuntimeExtras mRuntimeExtras;
-
-    public StartWorkRunnable(
-            @NonNull WorkManagerImpl workManagerImpl,
-            @NonNull StartStopToken workSpecId,
-            @Nullable WorkerParameters.RuntimeExtras runtimeExtras) {
-        mWorkManagerImpl = workManagerImpl;
-        mWorkSpecId = workSpecId;
-        mRuntimeExtras = runtimeExtras;
-    }
-
-    @Override
-    public void run() {
-        mWorkManagerImpl.getProcessor().startWork(mWorkSpecId, mRuntimeExtras);
-    }
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.kt b/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.kt
new file mode 100644
index 0000000..f37354a
--- /dev/null
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/StartWorkRunnable.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.work.impl.utils
+
+import androidx.annotation.RestrictTo
+import androidx.work.WorkerParameters
+import androidx.work.impl.Processor
+import androidx.work.impl.StartStopToken
+
+/**
+ * A [Runnable] that can start work on the
+ * [androidx.work.impl.Processor].
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+class StartWorkRunnable(
+    private val processor: Processor,
+    private val startStopToken: StartStopToken,
+    private val runtimeExtras: WorkerParameters.RuntimeExtras?
+) : Runnable {
+    override fun run() {
+        processor.startWork(startStopToken, runtimeExtras)
+    }
+}
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java
deleted file mode 100644
index c679e96..0000000
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.work.impl.utils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.work.Logger;
-import androidx.work.impl.StartStopToken;
-import androidx.work.impl.WorkManagerImpl;
-
-/**
- * A {@link Runnable} that requests {@link androidx.work.impl.Processor} to stop the work
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class StopWorkRunnable implements Runnable {
-
-    private static final String TAG = Logger.tagWithPrefix("StopWorkRunnable");
-
-    private final WorkManagerImpl mWorkManagerImpl;
-    private final StartStopToken mToken;
-    private final boolean mStopInForeground;
-
-    public StopWorkRunnable(
-            @NonNull WorkManagerImpl workManagerImpl,
-            @NonNull StartStopToken startStopToken,
-            boolean stopInForeground) {
-        mWorkManagerImpl = workManagerImpl;
-        mToken = startStopToken;
-        mStopInForeground = stopInForeground;
-    }
-    @Override
-    public void run() {
-        boolean isStopped;
-        if (mStopInForeground) {
-            isStopped = mWorkManagerImpl
-                    .getProcessor()
-                    .stopForegroundWork(mToken);
-        } else {
-            // This call is safe to make for foreground work because Processor ignores requests
-            // to stop for foreground work.
-            isStopped = mWorkManagerImpl
-                    .getProcessor()
-                    .stopWork(mToken);
-        }
-
-        Logger.get().debug(
-                TAG,
-                "StopWorkRunnable for " + mToken.getId().getWorkSpecId() + "; Processor"
-                + ".stopWork" + " = " + isStopped);
-
-    }
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.kt b/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.kt
new file mode 100644
index 0000000..c5af619
--- /dev/null
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.kt
@@ -0,0 +1,46 @@
+/*
+ * 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.work.impl.utils
+
+import androidx.annotation.RestrictTo
+import androidx.work.Logger
+import androidx.work.impl.Processor
+import androidx.work.impl.StartStopToken
+
+/**
+ * A [Runnable] that requests [androidx.work.impl.Processor] to stop the work
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+class StopWorkRunnable(
+    private val processor: Processor,
+    private val token: StartStopToken,
+    private val stopInForeground: Boolean
+) : Runnable {
+    override fun run() {
+        val isStopped = if (stopInForeground) {
+            processor.stopForegroundWork(token)
+        } else {
+            // This call is safe to make for foreground work because Processor ignores requests
+            // to stop for foreground work.
+            processor.stopWork(token)
+        }
+        Logger.get().debug(
+            Logger.tagWithPrefix("StopWorkRunnable"),
+            "StopWorkRunnable for ${token.id.workSpecId}; Processor.stopWork = $isStopped"
+        )
+    }
+}
diff --git a/work/work-runtime/src/test/java/androidx/work/WorkInfoTest.kt b/work/work-runtime/src/test/java/androidx/work/WorkInfoTest.kt
index fb08067..07662ef 100644
--- a/work/work-runtime/src/test/java/androidx/work/WorkInfoTest.kt
+++ b/work/work-runtime/src/test/java/androidx/work/WorkInfoTest.kt
@@ -33,4 +33,22 @@
         val info2 = WorkInfo(id = id, state = RUNNING, tags = setOf("a"), generation = 4)
         assertThat(info1 == info2).isFalse()
     }
+
+    @Test
+    fun testEqualityWithConstraints() {
+        val id = UUID.randomUUID()
+        val info1 = WorkInfo(
+            id = id,
+            state = RUNNING,
+            tags = setOf("a"),
+            constraints = Constraints(requiredNetworkType = NetworkType.CONNECTED)
+        )
+        val info2 = WorkInfo(
+            id = id,
+            state = RUNNING,
+            tags = setOf("a"),
+            constraints = Constraints(requiredNetworkType = NetworkType.NOT_ROAMING)
+        )
+        assertThat(info1 == info2).isFalse()
+    }
 }
\ No newline at end of file
diff --git a/work/work-testing/api/current.txt b/work/work-testing/api/current.txt
index 82764a4..40aebe82 100644
--- a/work/work-testing/api/current.txt
+++ b/work/work-testing/api/current.txt
@@ -46,6 +46,8 @@
     method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context, androidx.work.Configuration);
   }
 
 }
diff --git a/work/work-testing/api/public_plus_experimental_current.txt b/work/work-testing/api/public_plus_experimental_current.txt
index 82764a4..40aebe82 100644
--- a/work/work-testing/api/public_plus_experimental_current.txt
+++ b/work/work-testing/api/public_plus_experimental_current.txt
@@ -46,6 +46,8 @@
     method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context, androidx.work.Configuration);
   }
 
 }
diff --git a/work/work-testing/api/restricted_current.txt b/work/work-testing/api/restricted_current.txt
index 82764a4..40aebe82 100644
--- a/work/work-testing/api/restricted_current.txt
+++ b/work/work-testing/api/restricted_current.txt
@@ -46,6 +46,8 @@
     method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context);
     method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context);
+    method public static void initializeTestWorkManagerWithRealExecutors(android.content.Context, androidx.work.Configuration);
   }
 
 }
diff --git a/work/work-testing/build.gradle b/work/work-testing/build.gradle
index 7e10fd1..a4e7df7 100644
--- a/work/work-testing/build.gradle
+++ b/work/work-testing/build.gradle
@@ -24,8 +24,8 @@
 
 dependencies {
     api(project(":work:work-runtime-ktx"))
-    implementation("androidx.lifecycle:lifecycle-livedata-core:2.1.0")
-    implementation("androidx.room:room-runtime:2.5.0-beta01")
+    implementation("androidx.lifecycle:lifecycle-livedata-core:2.5.1")
+    implementation("androidx.room:room-runtime:2.5.0")
 
     androidTestImplementation("androidx.arch.core:core-testing:2.1.0")
     androidTestImplementation(libs.testExtJunit)
@@ -34,6 +34,8 @@
     androidTestImplementation(libs.espressoCore)
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.multidex)
 
     testImplementation(libs.truth)
     testImplementation(libs.testCore)
@@ -50,6 +52,9 @@
 
 android {
     namespace "androidx.work.testing"
+    defaultConfig {
+        multiDexEnabled = true
+    }
     lintOptions {
         // Too many Kotlin features require synthetic accessors - we want to rely on R8 to
         // remove these accessors
diff --git a/work/work-testing/src/androidTest/java/androidx/work/testing/TestSchedulerRealExecutorTest.kt b/work/work-testing/src/androidTest/java/androidx/work/testing/TestSchedulerRealExecutorTest.kt
new file mode 100644
index 0000000..848dd44
--- /dev/null
+++ b/work/work-testing/src/androidTest/java/androidx/work/testing/TestSchedulerRealExecutorTest.kt
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.work.testing
+
+import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.work.Constraints
+import androidx.work.ExistingWorkPolicy.REPLACE
+import androidx.work.NetworkType
+import androidx.work.OneTimeWorkRequest
+import androidx.work.OneTimeWorkRequestBuilder
+import androidx.work.PeriodicWorkRequestBuilder
+import androidx.work.WorkInfo
+import androidx.work.impl.WorkManagerImpl
+import androidx.work.impl.model.WorkSpec
+import androidx.work.testing.workers.CountingTestWorker
+import androidx.work.testing.workers.RetryWorker
+import androidx.work.testing.workers.TestWorker
+import com.google.common.truth.Truth.assertThat
+import java.util.UUID
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class TestSchedulerRealExecutorTest {
+    val context = ApplicationProvider.getApplicationContext<Context>()
+
+    init {
+        WorkManagerTestInitHelper.initializeTestWorkManagerWithRealExecutors(context)
+        CountingTestWorker.COUNT.set(0)
+    }
+
+    val wm = WorkManagerImpl.getInstance(context)
+    val handler = Handler(Looper.getMainLooper())
+    val driver = WorkManagerTestInitHelper.getTestDriver(context)!!
+
+    @Test
+    fun testWorker_withDependentWork_shouldSucceedSynchronously() {
+        val request = OneTimeWorkRequest.from(TestWorker::class.java)
+        val dependentRequest = OneTimeWorkRequest.from(TestWorker::class.java)
+        wm.beginWith(request).then(dependentRequest).enqueue()
+        awaitSuccess(dependentRequest.id)
+    }
+
+    @Test
+    fun testWorker_withConstraints_shouldSucceedAfterSetConstraints() {
+        val request = OneTimeWorkRequestBuilder<TestWorker>().setConstraints(
+            Constraints(requiredNetworkType = NetworkType.UNMETERED)
+        ).build()
+        wm.enqueue(request).result.get()
+        driver.setAllConstraintsMet(request.id)
+        awaitSuccess(request.id)
+    }
+
+    @Test
+    fun testWorker_withPeriodDelay_shouldRunAfterEachSetPeriodDelay() {
+        val request = PeriodicWorkRequestBuilder<CountingTestWorker>(10, TimeUnit.DAYS).build()
+        wm.enqueue(request).result.get()
+        val periodicLatch = CountDownLatch(1)
+        // TODO: specifically removing deduplication for periodic workers
+        // so runs aren't dedupped. We need periodicity data in workinfo
+        val workInfo = wm.workDatabase.workSpecDao().getWorkStatusPojoLiveDataForIds(
+            listOf("${request.id}"))
+        var expectedCounter = 1
+        val maxCount = 5
+        handler.post {
+            workInfo.observeForever {
+                val info = it.first()
+                val isEnqueued = info.state == WorkInfo.State.ENQUEUED
+                val counter = CountingTestWorker.COUNT.get()
+                if (isEnqueued && counter == maxCount) {
+                    periodicLatch.countDown()
+                } else if (isEnqueued && counter == expectedCounter) {
+                    expectedCounter++
+                    driver.setPeriodDelayMet(request.id)
+                }
+            }
+        }
+        assertThat(periodicLatch.await(10, TimeUnit.SECONDS)).isTrue()
+    }
+
+    @Test
+    fun testWorker_withPeriodicWorkerWithInitialDelay_shouldRun() {
+        val request = PeriodicWorkRequestBuilder<CountingTestWorker>(10, TimeUnit.DAYS)
+            .setInitialDelay(10, TimeUnit.DAYS).build()
+        wm.enqueue(request).result.get()
+        driver.setInitialDelayMet(request.id)
+        awaitPeriodicRunOnce(request.id)
+    }
+
+    @Test
+    fun testWorker_withPeriodicWorkerFlex_shouldRun() {
+        val request = PeriodicWorkRequestBuilder<CountingTestWorker>(
+            10, TimeUnit.DAYS, 1, TimeUnit.DAYS
+        ).build()
+        wm.enqueue(request).result.get()
+        awaitPeriodicRunOnce(request.id)
+    }
+
+    @Test
+    fun testWorker_afterSuccessfulRun_postConditions() {
+        val request = OneTimeWorkRequest.from(TestWorker::class.java)
+        wm.enqueue(request).result.get()
+        awaitSuccess(request.id)
+        driver.setAllConstraintsMet(request.id)
+        driver.setInitialDelayMet(request.id)
+    }
+
+    @Test
+    fun testWorkerUnique() {
+        val request1 = OneTimeWorkRequestBuilder<TestWorker>()
+            .setInitialDelay(1, TimeUnit.DAYS).build()
+        wm.enqueueUniqueWork("name", REPLACE, request1).result.get()
+        val request2 = OneTimeWorkRequestBuilder<TestWorker>()
+            .setInitialDelay(1, TimeUnit.DAYS).build()
+        wm.enqueueUniqueWork("name", REPLACE, request2).result.get()
+
+        try {
+            driver.setInitialDelayMet(request1.id)
+            throw AssertionError()
+        } catch (e: IllegalArgumentException) {
+            // expected
+        }
+        driver.setInitialDelayMet(request2.id)
+        awaitSuccess(request2.id)
+    }
+
+    @Test
+    fun testWorker_afterSuccessfulRun_throwsExceptionWhenSetPeriodDelayMet() {
+        val request = OneTimeWorkRequest.from(TestWorker::class.java)
+        wm.enqueue(request).result.get()
+        awaitSuccess(request.id)
+        try {
+            driver.setPeriodDelayMet(request.id)
+            throw AssertionError()
+        } catch (e: IllegalArgumentException) {
+            // expected
+        }
+    }
+
+    @Test
+    fun testOneTimeWorkerRetry() {
+        val request = OneTimeWorkRequest.from(RetryWorker::class.java)
+        wm.enqueue(request).result.get()
+        awaitReenqueuedAfterRetry(request.id)
+    }
+
+    @Test
+    fun testPeriodicWorkerRetry() {
+        val request = PeriodicWorkRequestBuilder<RetryWorker>(1, TimeUnit.DAYS).build()
+        wm.enqueue(request).result.get()
+        awaitReenqueuedAfterRetry(request.id)
+    }
+
+    private fun awaitSuccess(id: UUID) = awaitCondition(id) { it.state == WorkInfo.State.SUCCEEDED }
+
+    private fun awaitPeriodicRunOnce(id: UUID) = awaitCondition(id) {
+        it.state == WorkInfo.State.ENQUEUED && CountingTestWorker.COUNT.get() == 1
+    }
+
+    private fun awaitReenqueuedAfterRetry(id: UUID) = awaitCondition(id) {
+        it.state == WorkInfo.State.ENQUEUED && it.runAttemptCount == 1
+    }
+
+    private fun awaitCondition(id: UUID, predicate: (WorkSpec.WorkInfoPojo) -> Boolean) {
+        val latch = CountDownLatch(1)
+        // TODO: specifically removing deduplication for periodic workers
+        // so runs aren't dedupped. We need periodicity data in workinfo
+        val workInfo = wm.workDatabase.workSpecDao().getWorkStatusPojoLiveDataForIds(listOf("$id"))
+
+        handler.post {
+            workInfo.observeForever {
+                if (predicate(it.first())) {
+                    latch.countDown()
+                }
+            }
+        }
+        assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue()
+    }
+}
\ No newline at end of file
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestScheduler.kt b/work/work-testing/src/main/java/androidx/work/testing/TestScheduler.kt
index 84eb4f8..7369589 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestScheduler.kt
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestScheduler.kt
@@ -16,19 +16,17 @@
 @file:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 package androidx.work.testing
 
-import android.content.Context
 import androidx.annotation.GuardedBy
 import androidx.annotation.RestrictTo
 import androidx.work.Worker
-import androidx.work.impl.ExecutionListener
 import androidx.work.impl.Scheduler
-import androidx.work.impl.WorkDatabase
-import androidx.work.impl.model.WorkGenerationalId
-import androidx.work.impl.WorkManagerImpl
 import androidx.work.impl.StartStopTokens
-import androidx.work.impl.model.generationalId
+import androidx.work.impl.WorkDatabase
+import androidx.work.impl.WorkManagerImpl
+import androidx.work.impl.model.WorkGenerationalId
 import androidx.work.impl.model.WorkSpec
 import androidx.work.impl.model.WorkSpecDao
+import androidx.work.impl.model.generationalId
 import java.util.UUID
 
 /**
@@ -39,13 +37,11 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class TestScheduler(private val context: Context) : Scheduler, ExecutionListener {
+class TestScheduler(private val workManagerImpl: WorkManagerImpl) : Scheduler {
     @GuardedBy("lock")
     private val pendingWorkStates = mutableMapOf<String, InternalWorkState>()
-    @GuardedBy("lock")
-    private val terminatedWorkIds = mutableSetOf<String>()
     private val lock = Any()
-    private val mStartStopTokens = StartStopTokens()
+    private val startStopTokens = StartStopTokens()
 
     override fun hasLimitedSchedulingSlots() = true
 
@@ -57,16 +53,16 @@
         synchronized(lock) {
             workSpecs.forEach {
                 val state = pendingWorkStates.getOrPut(it.generationalId().workSpecId) {
-                    InternalWorkState(it)
+                    InternalWorkState(it, true)
                 }
-                toSchedule[it] = state
+                toSchedule[it] = state.copy(isScheduled = true)
             }
         }
         toSchedule.forEach { (originalSpec, state) ->
             // this spec is attempted to run for the first time
             // so we have to rewind the time, because we have to override flex.
             val spec = if (originalSpec.isPeriodic && state.periodDelayMet) {
-                WorkManagerImpl.getInstance(context).rewindLastEnqueueTime(originalSpec.id)
+                workManagerImpl.rewindLastEnqueueTime(originalSpec.id)
             } else originalSpec
             // don't even try to run a worker that WorkerWrapper won't execute anyway.
             // similar to logic in WorkerWrapper
@@ -78,24 +74,13 @@
         }
     }
 
+    // cancel called in two situations when:
+    // 1. a worker was cancelled via workManager.cancelWorkById
+    // 2. a worker finished (no matter successfully or not), see comment in
+    // Schedulers.registerRescheduling
     override fun cancel(workSpecId: String) {
-        // We don't need to keep track of cancelled workSpecs. This is because subsequent calls
-        // to enqueue() will no-op because insertWorkSpec in WorkDatabase has a conflict
-        // policy of @Ignore. So TestScheduler will _never_ be asked to schedule those
-        // WorkSpecs.
-        val tokens = mStartStopTokens.remove(workSpecId)
-        tokens.forEach { WorkManagerImpl.getInstance(context).stopWork(it) }
-        synchronized(lock) {
-            val internalWorkState = pendingWorkStates[workSpecId]
-            if (internalWorkState != null && !internalWorkState.isPeriodic) {
-                // Don't remove PeriodicWorkRequests from the list of pending work states.
-                // This is because we keep track of mPeriodDelayMet for PeriodicWorkRequests.
-                // `mPeriodDelayMet` is set to `false` when `onExecuted()` is called as a result of a
-                // successful run or a cancellation. That way subsequent calls to schedule() no-op
-                // until a developer explicitly calls setPeriodDelayMet().
-                pendingWorkStates.remove(workSpecId)
-            }
-        }
+        val tokens = startStopTokens.remove(workSpecId)
+        tokens.forEach { workManagerImpl.stopWork(it) }
     }
 
     /**
@@ -107,11 +92,10 @@
      */
     fun setAllConstraintsMet(workSpecId: UUID) {
         val id = workSpecId.toString()
+        val spec = loadSpec(id)
         val state: InternalWorkState
         synchronized(lock) {
-            if (id in terminatedWorkIds) return
-            val oldState = pendingWorkStates[id]
-                ?: throw IllegalArgumentException("Work with id $workSpecId is not enqueued!")
+            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
             state = oldState.copy(constraintsMet = true)
             pendingWorkStates[id] = state
         }
@@ -128,14 +112,13 @@
     fun setInitialDelayMet(workSpecId: UUID) {
         val id = workSpecId.toString()
         val state: InternalWorkState
+        val spec = loadSpec(id)
         synchronized(lock) {
-            if (id in terminatedWorkIds) return
-            val oldState = pendingWorkStates[id]
-                ?: throw IllegalArgumentException("Work with id $workSpecId is not enqueued!")
+            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
             state = oldState.copy(initialDelayMet = true)
             pendingWorkStates[id] = state
         }
-        WorkManagerImpl.getInstance(context).rewindLastEnqueueTime(id)
+        workManagerImpl.rewindLastEnqueueTime(id)
         scheduleInternal(WorkGenerationalId(id, state.generation), state)
     }
 
@@ -148,40 +131,34 @@
      */
     fun setPeriodDelayMet(workSpecId: UUID) {
         val id = workSpecId.toString()
+        val spec = loadSpec(id)
+        if (!spec.isPeriodic) throw IllegalArgumentException("Work with id $id isn't periodic!")
+
         val state: InternalWorkState
         synchronized(lock) {
-            val oldState = pendingWorkStates[id]
-                ?: throw IllegalArgumentException("Work with id $workSpecId is not enqueued!")
+            val oldState = pendingWorkStates[id] ?: InternalWorkState(spec, false)
             state = oldState.copy(periodDelayMet = true)
             pendingWorkStates[id] = state
         }
-        WorkManagerImpl.getInstance(context).rewindLastEnqueueTime(id)
+        workManagerImpl.rewindLastEnqueueTime(id)
         scheduleInternal(WorkGenerationalId(id, state.generation), state)
     }
 
-    override fun onExecuted(id: WorkGenerationalId, needsReschedule: Boolean) {
-        synchronized(lock) {
-            val workSpecId = id.workSpecId
-            val internalWorkState = pendingWorkStates[workSpecId] ?: return
-            if (internalWorkState.isPeriodic) {
-                pendingWorkStates[workSpecId] = internalWorkState.copy(
-                    periodDelayMet = !internalWorkState.isPeriodic,
-                    constraintsMet = !internalWorkState.hasConstraints,
-                )
-            } else {
-                pendingWorkStates.remove(workSpecId)
-                terminatedWorkIds.add(workSpecId)
-            }
-            mStartStopTokens.remove(workSpecId)
-        }
-    }
-
     private fun scheduleInternal(generationalId: WorkGenerationalId, state: InternalWorkState) {
         if (state.isRunnable) {
-            val wm = WorkManagerImpl.getInstance(context)
-            wm.startWork(mStartStopTokens.tokenFor(generationalId))
+            val token = synchronized(lock) {
+                pendingWorkStates.remove(generationalId.workSpecId)
+                startStopTokens.tokenFor(generationalId)
+            }
+            workManagerImpl.startWork(token)
         }
     }
+
+    private fun loadSpec(id: String): WorkSpec {
+        val workSpec = workManagerImpl.workDatabase.workSpecDao().getWorkSpec(id)
+            ?: throw IllegalArgumentException("Work with id $id is not enqueued!")
+        return workSpec
+    }
 }
 
 internal data class InternalWorkState(
@@ -191,19 +168,22 @@
     val periodDelayMet: Boolean,
     val hasConstraints: Boolean,
     val isPeriodic: Boolean,
+    /* means that TestScheduler received this workrequest in schedule(....) function */
+    val isScheduled: Boolean
 )
 
 internal val InternalWorkState.isRunnable: Boolean
-    get() = constraintsMet && initialDelayMet && periodDelayMet
+    get() = constraintsMet && initialDelayMet && periodDelayMet && isScheduled
 
-internal fun InternalWorkState(spec: WorkSpec): InternalWorkState =
+internal fun InternalWorkState(spec: WorkSpec, isScheduled: Boolean): InternalWorkState =
     InternalWorkState(
         generation = spec.generation,
         constraintsMet = !spec.hasConstraints(),
         initialDelayMet = spec.initialDelay == 0L,
-        periodDelayMet = true,
+        periodDelayMet = spec.periodCount == 0 && spec.runAttemptCount == 0,
         hasConstraints = spec.hasConstraints(),
-        isPeriodic = spec.isPeriodic
+        isPeriodic = spec.isPeriodic,
+        isScheduled = isScheduled,
     )
 
 private fun WorkManagerImpl.rewindLastEnqueueTime(id: String): WorkSpec {
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java b/work/work-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
index 787610a..f24a8da 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
@@ -27,6 +27,7 @@
 import androidx.work.impl.constraints.trackers.Trackers;
 import androidx.work.impl.utils.taskexecutor.SerialExecutor;
 import androidx.work.impl.utils.taskexecutor.TaskExecutor;
+import androidx.work.impl.utils.taskexecutor.WorkManagerTaskExecutor;
 
 import java.util.Collections;
 import java.util.List;
@@ -46,6 +47,14 @@
 
     TestWorkManagerImpl(
             @NonNull final Context context,
+            @NonNull final Configuration configuration
+    ) {
+        super(context, configuration,
+                new WorkManagerTaskExecutor(configuration.getTaskExecutor()), true);
+    }
+
+    TestWorkManagerImpl(
+            @NonNull final Context context,
             @NonNull final Configuration configuration,
             @NonNull final SerialExecutor serialExecutor
     ) {
@@ -65,6 +74,7 @@
                 configuration,
                 new TaskExecutor() {
                     Executor mSynchronousExecutor = new SynchronousExecutor();
+
                     @NonNull
                     @Override
                     public Executor getMainThreadExecutor() {
@@ -78,16 +88,13 @@
                     }
                 },
                 true);
-
-        // mScheduler is initialized in createSchedulers() called by super()
-        getProcessor().addExecutionListener(mScheduler);
     }
 
     @Override
     @NonNull
     public List<Scheduler> createSchedulers(@NonNull Context context,
             @NonNull Configuration configuration, @NonNull Trackers trackers) {
-        mScheduler = new TestScheduler(context);
+        mScheduler = new TestScheduler(this);
         return Collections.singletonList((Scheduler) mScheduler);
     }
 
diff --git a/work/work-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java b/work/work-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
index 8868300..cb3f365 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
@@ -46,7 +46,8 @@
 
     /**
      * Initializes a test {@link androidx.work.WorkManager} with a user-specified
-     * {@link androidx.work.Configuration}.
+     * {@link androidx.work.Configuration}, but using
+     * {@link SynchronousExecutor} instead of main thread.
      *
      * @param context The application {@link Context}
      * @param configuration The {@link androidx.work.Configuration}
@@ -73,6 +74,32 @@
     }
 
     /**
+     * Initializes a test {@link androidx.work.WorkManager} with a default configuration and
+     * real threading unlike {@link #initializeTestWorkManager(Context)} that uses a
+     * {@link SynchronousExecutor} as main thread and both executors
+     * (see {@link Configuration#getTaskExecutor()} and {@link Configuration#getExecutor()}).
+     *
+     * @param context The application {@link Context}
+     */
+    public static void initializeTestWorkManagerWithRealExecutors(@NonNull Context context) {
+        Configuration configuration = new Configuration.Builder().build();
+        WorkManagerImpl.setDelegate(new TestWorkManagerImpl(context, configuration));
+    }
+
+    /**
+     * Initializes a test {@link androidx.work.WorkManager} with a default configuration and
+     * real threading unlike {@link #initializeTestWorkManager(Context, Configuration)} that uses a
+     * {@link SynchronousExecutor} as main thread.
+     *
+     * @param context The application {@link Context}
+     * @param configuration The {@link androidx.work.Configuration}
+     */
+    public static void initializeTestWorkManagerWithRealExecutors(
+            @NonNull Context context, @NonNull Configuration configuration) {
+        WorkManagerImpl.setDelegate(new TestWorkManagerImpl(context, configuration));
+    }
+
+    /**
      * @return An instance of {@link TestDriver}. This exposes additional functionality that is
      * useful in the context of testing when using WorkManager.
      * @deprecated Call {@link WorkManagerTestInitHelper#getTestDriver(Context)} instead.